Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // ***********************************************************************
- //
- // Demo program pro vyuku predmetu APPS (09/2012)
- // Petr Olivka, katedra informatiky, FEI, VSB-TU Ostrava
- // email:petr.olivka@vsb.cz
- //
- // Priklad pouzit vyvojoveho nastroje AVR-KIT:
- // ovladani sbernice I2C
- //
- // ***********************************************************************
- int main()
- {
- // inicializace prostredi
- avrkit_init();
- printf( "AVR-KIT ready...\n\n" );
- // uvedeni sbernice do klidoveho stavu
- I2C_Init();
- // zacatek komunikace
- char adress = 0b10110000 | 0b1110;
- //nastvení kontinuálního měření
- I2C_Start();
- char ACK = !I2C_Vystup( adress | 0 );
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup(0xAC);
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup(0);
- if (!ACK)
- return 0;
- I2C_Stop();
- //Nastavení horní meze termostatu
- I2C_Start();
- ACK = !I2C_Vystup( adress | 0 );
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup(0xA1);
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup(25);
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup(128); //25,5°C
- if (!ACK)
- return 0;
- I2C_Stop();
- //Nastavení spodní meze termostatu
- I2C_Start();
- ACK = !I2C_Vystup( adress | 0 );
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup(0xA2);
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup(27);
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup(0); //27°C
- if (!ACK)
- return 0;
- I2C_Stop();
- //nastartování měření teploty
- I2C_Start();
- ACK = !I2C_Vystup( adress | 0 );
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup(0xEE);
- if (!ACK)
- return 0;
- I2C_Stop();
- //čtneí teploty
- while(1){
- I2C_Start();
- ACK = !I2C_Vystup( adress | 0 );
- if (!ACK)
- return 0;
- ACK = !I2C_Vystup( 0xAA );
- if (!ACK)
- return 0;
- I2C_Start();
- ACK = !I2C_Vystup( adress | 1 );
- if (!ACK)
- return 0;
- char receive = I2C_Vstup();
- I2C_Ack();
- char receiveHalf = I2C_Vstup();
- I2C_NAck();
- printf("%d,%d\n\n",receive,(receiveHalf > 0 ) ? 5 : 0 );
- I2C_Stop();
- delay_ms(500);
- }
- }
- void puvodni_obsah_mainu() {
- //zápis čísla na expandér což se zobrazí na LEDkách a následné přečtení
- if(ACK){
- char run = 1;
- while(run != 0){
- if(I2C_Vystup(run))
- break;
- run <<= 1;
- delay_ms(10);
- }
- ACK = !I2C_Vystup(67);
- }
- if (!ACK)
- return 0;
- I2C_Start();
- ACK = !I2C_Vystup( 0b01000000 | 0b0000 | 0b1);
- if(ACK){
- char receive = I2C_Vstup();
- I2C_Ack();
- printf("%d",receive);
- }
- }
- //************************************************************************
- //************************************************************************
- // sbernice I2C (low level) - ovladani signalu SDA a SCL
- void I2C_delay() { delay_ms( 1 ); }
- // nastaveni signalu SDA
- void I2C_SDA( char value )
- {
- if ( value ) I2C_PORT |= ( 1 << SDA_PIN );
- else I2C_PORT &= ~( 1 << SDA_PIN );
- I2C_delay();
- }
- // cteni signalu SDA
- char I2C_getSDA( void )
- {
- char r = ( I2C_PIN & ( 1 << SDA_PIN ) ) != 0;
- I2C_delay();
- return r;
- }
- // nastaveni signalu SCL
- void I2C_SCL( char value )
- {
- if ( value ) I2C_PORT |= ( 1 << SCL_PIN );
- else I2C_PORT &= ~( 1 << SCL_PIN );
- I2C_delay();
- }
- //************************************************************************
- // Principy komunikace na sbernici I2C jsou popsany v technickych listech
- // u kazdeho zarizeni pro toto rozhrani.
- // inicializace sbernice
- void I2C_Init()
- {
- I2C_DDR |= ( 1 << SDA_PIN ) | ( 1 << SCL_PIN );
- I2C_SCL( 1 );
- I2C_SDA( 1 );
- }
- // oznameni zacatku komunikace
- void I2C_Start()
- {
- I2C_SDA( 1 );
- I2C_SCL( 1 );
- I2C_SDA( 0 );
- I2C_SCL( 0 );
- }
- // oznameni ukonceni komunikace
- void I2C_Stop()
- {
- I2C_SCL( 0 );
- I2C_SDA( 0 );
- I2C_SCL( 1 );
- I2C_SDA( 1 );
- }
- // odeslani potvrzovaci bitu ACK
- void I2C_Ack()
- {
- I2C_SCL( 0 );
- I2C_SDA( 0 );
- I2C_SCL( 1 );
- I2C_SCL( 0 );
- }
- // odeslani potvrzovaciho bitu NACK
- void I2C_NAck()
- {
- I2C_SCL( 0 );
- I2C_SDA( 1 );
- I2C_SCL( 1 );
- I2C_SCL( 0 );
- }
- char I2C_getACK()
- {
- I2C_SDA( 1 );
- // nastavit SDA_PIN jako vstupni
- I2C_DDR &= ~( 1 << SDA_PIN );
- I2C_SCL( 1 );
- char ret = I2C_getSDA();
- I2C_SCL( 0 );
- I2C_DDR |= ( 1 << SDA_PIN );
- return ret;
- }
- // odeslani 8 bitove hodnoty
- char I2C_Vystup( unsigned char value )
- {
- char mask = 0x80;
- // odeslani bitu, MSB jako prvni
- for ( int i = 0; i < 8; i++ )
- {
- I2C_SDA( value & mask );
- mask >>= 1;
- I2C_SCL( 1 );
- I2C_SCL( 0 );
- }
- return I2C_getACK();
- }
- // precteni 8 bitove hodnoty
- unsigned char I2C_Vstup()
- {
- unsigned char value = 0;
- // klidovy stav na lince
- I2C_SDA( 1 );
- // nastavit SDA_PIN jako vstupni
- I2C_DDR &= ~( 1 << SDA_PIN );
- // prijem bitu, MSB jako prvni
- for ( int i = 0; i < 8; i++ )
- {
- value <<= 1;
- I2C_SCL( 1 );
- if ( I2C_getSDA() ) value |= 1;
- I2C_SCL( 0 );
- }
- // nastavit SDA_PIN zpet jako vystupni
- I2C_DDR |= ( 1 << SDA_PIN );
- return value;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement