avr gcc i2c problem

Feb 08, 2006 0 Replies

Witam mam problem z uk³±dem ds1307 jest to RTC napisa³em sobie procedurki do obs³ugi i niestetu nie dzia³aja a w bascomie mi dzia³a wiec sprzet jest ok



prosi³bym o naprowadzenie na przyczyne problemu oto kod



#define sda 2 #define scl 3 #define ddr_i2c DDRD #define port_i2c PORTD #define opuz_i2c 10



void czekaj_i2c(unsigned char taui2c) { do { asm("nop"); }while(--taui2c!=0); }



unsigned char I2C_read(unsigned char ack) { unsigned char i; unsigned char b = 0; ddr_i2c &= ~ (1<<sda); //sda=1 port_i2c |= 1<<sda; czekaj_i2c(opuz_i2c); for (i=0; i<8; i++) // czytanie 8 bitów { port_i2c |= 1 << scl ; //scl=1 ddr_i2c &= ~(1 << scl); czekaj_i2c(opuz_i2c); b <<= 1; if (bit_is_set(port_i2c,sda)) b |= 1; port_i2c &= ~( 1 << scl ); //scl=0 ddr_i2c |= 1 << scl; czekaj_i2c(opuz_i2c); } if (ack == 0) { port_i2c &=~( 1<<sda); //sda=0 ddr_i2c |=1 << sda; } else { port_i2c |= 1<<sda; //sda=0 ddr_i2c &=~(1 << sda); }



czekaj_i2c(opuz_i2c); port_i2c |= 1 << scl ; //scl=1 ddr_i2c &= ~(1 << scl); czekaj_i2c(opuz_i2c); port_i2c &= ~( 1 << scl ); //scl=0 ddr_i2c |= 1 << scl; czekaj_i2c(opuz_i2c); port_i2c &=~( 1<<sda); //sda=0 ddr_i2c |= 1<<sda; czekaj_i2c(opuz_i2c); return(b); }



void I2C_start(void) { port_i2c |= 1 << sda; //sda,scl=1 port_i2c |= 1 << scl; ddr_i2c &= ~ (1<< sda); ddr_i2c &= ~(1 << scl); czekaj_i2c(opuz_i2c); port_i2c &= ~(1 << sda); //sda=0 ddr_i2c |= 1<< sda; czekaj_i2c(opuz_i2c); port_i2c &= ~(1 << scl); //scl=0 ddr_i2c |= 1<< scl; czekaj_i2c(opuz_i2c); }



void I2C_stop(void) { port_i2c &=~( 1 << sda ); //sda,scl=0 port_i2c &=~( 1 << scl ); ddr_i2c |=1 << sda; ddr_i2c |= 1 << scl; czekaj_i2c(opuz_i2c); port_i2c |= 1 << scl; //scl=1 ddr_i2c &=~(1 << scl); czekaj_i2c(opuz_i2c); port_i2c |= 1 << sda; //sda=1 ddr_i2c &=~(1 << sda); czekaj_i2c(opuz_i2c); }



unsigned char I2C_write(unsigned char b) { unsigned char i; port_i2c &=~( 1 << sda ); //sda,scl=0 port_i2c &=~( 1 << scl ); ddr_i2c |=1 << sda; ddr_i2c |= 1 << scl; for (i=0; i<8; i++) // zapis 8 bit·w { if (b & 0x80) { port_i2c |= 1<<sda; //sda=1 ddr_i2c &=~(1 << sda); } else { port_i2c &=~( 1<<sda); //sda=0 ddr_i2c |=1 << sda; } czekaj_i2c(opuz_i2c); port_i2c |= 1 << scl ; //scl=1 ddr_i2c &= ~(1 << scl); czekaj_i2c(opuz_i2c); port_i2c &= ~( 1 << scl ); //scl=0 ddr_i2c |= 1 << scl; b <<= 1; // przesu½ o 1 bit } port_i2c |= 1<<sda; //sda=1 ddr_i2c &=~(1 << sda); czekaj_i2c(opuz_i2c); port_i2c |= 1 << scl ; //scl=1 ddr_i2c &= ~(1 << scl); czekaj_i2c(opuz_i2c); i=0xFF; do { if (bit_is_clear(port_i2c,sda)) break; // je?eli jest potwierdzenie czekaj_i2c(opuz_i2c); i-- ; } while(i>0); port_i2c &= ~( 1 << scl ); //scl=0 ddr_i2c |= 1 << scl; czekaj_i2c(opuz_i2c); return(i); }


Pozdrawiam AzaZeL



Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required