Witam. Chciałem uruchomić na własną rękę sprzętowe TWI w ATMEGA16. Napisałem prostą bibliotekę zgodną z dokumentacją. Program wykonuje "start" i wysłanie adresu, następnie podczas odczytu z zegarka zapętla się. Obsługuję zegarek PCF8583P. W/g dokumentacji PHILIPSA można od razu czytać z zegarka wysyłając [adres][1](163 = 0xA3) -> READ [auto increment]
KOD BIBLIOTEKI -------------
MAIN
Błąd występuje po pierwszym wywołaniu "data = twiRead(1);" zapętla się czekając na zakończenie operacji "while(!(TWCR & (1 << TWINT)));". Co należy zrobić i gdzie jest błąd ?
KOD BIBLIOTEKI -------------
#include <avr/io.h>
///////////////////////////////////////////////////
void twiStart(unsigned char address) {
TWCR=((1<<TWINT) | (1<<TWSTA) | (1<<TWEN));
while(!(TWCR & (1 << TWINT)));
TWDR = address;
TWCR=((1<<TWINT) | (1<<TWEN));
while(!(TWCR & (1 << TWINT)));
}
///////////////////////////////////////////////////
void twiStop() {
TWCR=((1<<TWINT) | (1<<TWSTO) | (1<<TWEN));
while ((TWCR & (1<<TWSTO)));
}
///////////////////////////////////////////////////
void twiSend(unsigned char data) {
TWDR = data;
TWCR=((1<<TWINT) | (1<<TWEN));
while(!(TWCR & (1 << TWINT)));
}
///////////////////////////////////////////////////
char twiRead(char ack) {
if (ack == 1) {
TWCR = ((1<<TWINT) | (1 << TWEN) | (1 << TWEA)); // ustawia TWCR->TWINT i TWEN
} else {
TWCR = ((1<<TWINT) | (1 << TWEN));
}
while(!(TWCR & (1 << TWINT)));
return TWDR;
}
///////////////////////////////////////////////////
MAIN
#include <avr/io.h>
#include <avr/delay.h>
#include <stdlib.h>
#include <dodane/mojLCD.h>
///////////////////////////////////////////////////////
static void lcd_print(char *str) {
unsigned char i=0;
while(str[i]!=0) {
lcdData(str[i]);
i++;
}
}
///////////////////////////////////////////////////////
int main(void) {
char address = 0xA3, data; // bajt [adres][1]
char charTable[10]="";
lcd_init();
twiStart(address);
lcd_print("addrOK ");
data = twiRead(1);
lcd_print("d1 "); <-- to nigdy sie nie pojawia...
data = twiRead(1);
lcd_print("d2 ");
twiStop();
itoa(data,charTable,10);
lcd_print("RTC ");
lcd_print(charTable);
_delay_ms(1000);
lcdCommand(HD44780_HOME);
while(1) {
}
return 0;
}
Błąd występuje po pierwszym wywołaniu "data = twiRead(1);" zapętla się czekając na zakończenie operacji "while(!(TWCR & (1 << TWINT)));". Co należy zrobić i gdzie jest błąd ?