Witam.
biolyvilk napisał(a):
Oto wyniki:
wartość binarna TWCR = 1000100
wartość ack = 1
wartość argumentu funkcji while = 1
Wniosek jest taki że do bitu TWEA nie została przypisana wartość 1. Pytanie tylko czemu?
Jeśli nie pomyliłeś się w przepisaniu wartości TWCR to bit TWEA jest ustawiony na 1 bo to bit 6 czyli Twój pierwszy z lewej.
Zauważ ze masz zapisane tylko 7 bitów czyli ósmy najstarszy jest 0 i się pewnie nie wyświetlił (nie wiem jak wygląda Twoja funkcja lcd_value ale może być tak, że nie wyświetla wiodących zer). Ten najstarszy bit to TWINT. Wprawdzie wpisywana jest w tej linii :
TWCR = (1<<TWINT)|(ack<<TWEA)|(1<<TWEN);
do niego wartość 1 ale jak na szybko zerknąłem do noty i dobrze ją zrozumiałem to flaga ta jest zerowana poprze właśnie wpisanie do niej jedynki. Stąd wynika że odczyty masz poprawne.
Teraz pętla while będzie się wykonywać do momentu aż flaga TWINT nie będzie miała wartości 1 a zostanie to ustawione hardware'owo kiedy interfejs TWI zakończy swoją bieżącą pracę czyli odczyt danego bajtu. Od strony logicznej więc wszystko jest ok. Jeśli nie wychodzi Ci z pętli oznacza to że interfejs TWI nie może zakończyć odbioru.
Problem może być więc z fizycznym połączeniem/działaniem PCF-a lub też softwareowy - jeśli możesz to pokaż z jakimi parametrami wywołujesz funkcję TWI_read_buf.
Pozdrawiam
Jarek
ps.
To że wyrzucasz negację z while i otrzymujesz te same wartości dla poszczególnych prametrów jest normalne ale nie świadczy o tym że masz połączenie z pcf-em. W takim przypadku program odczytuje jakąś przypadkową wartość znajdującą się w rejestrze TWDR.