Witam,
Mam problem z odpaleniem TWI w atmedze. Procesor taktowany wewnętrznym oscylatorem 8MHz. Do procesora podłączony zegar RTC PCF8563. Testowałem różne warienty pull-upów od 1k do 10k.
Wklejam kod programu:
W większości przypadków program zostaje w pętli oczekując na dane. Na wyświetlaczu pojawia się e2, wiec nie dostajemy potwierdzenia adresu od slave'a.
Kilkukrotnie udało mi się odczytać pierwsze 8 bitów danych z zegarka. Dane zgadzają się z dokumentacją. Jednak w większości przypadków program wisi na tej pętli. Siedzę przy tym już drugi dzień i nie bardzo wiem gdzie szukać błędów.
Oczywiście przeczytałem podobne tematy.
Z góry dzięki za pomoc.
Pozdrawiam
Mam problem z odpaleniem TWI w atmedze. Procesor taktowany wewnętrznym oscylatorem 8MHz. Do procesora podłączony zegar RTC PCF8563. Testowałem różne warienty pull-upów od 1k do 10k.
Wklejam kod programu:
TWBR =0b00001000;
DDRD=0xff;
DDRC=0x07;
LCD_init();
char buff[3];
LCD_sendText("LCD test!");
_delay_ms(5000);
LCD_sendCommand(LCDcom_clear);
TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != TW_START) LCD_sendText("e1");
TWDR = 0xA3;
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT)));
if ((TWSR & 0xF8) != TW_MR_SLA_ACK) LCD_sendText("e2");
TWCR = (1<<TWINT) | (1<<TWEN);
while (!(TWCR & (1<<TWINT))); // <- Tutaj program się zapętla
if ((TWSR & 0xF8) != TW_MR_DATA_ACK) LCD_sendText("e3");
LCD_sendText(itoa((int)(TWDR),buff,16));
TWCR = (1<<TWINT) | (1<<TWEN) | (1<<TWSTO);
W większości przypadków program zostaje w pętli oczekując na dane. Na wyświetlaczu pojawia się e2, wiec nie dostajemy potwierdzenia adresu od slave'a.
Kilkukrotnie udało mi się odczytać pierwsze 8 bitów danych z zegarka. Dane zgadzają się z dokumentacją. Jednak w większości przypadków program wisi na tej pętli. Siedzę przy tym już drugi dzień i nie bardzo wiem gdzie szukać błędów.
Oczywiście przeczytałem podobne tematy.
Z góry dzięki za pomoc.
Pozdrawiam