Witam,
Panowie proszę o jakąś pomoc, jak już wspominałem w którymś poście jesem świeżynka jeśli chodzi o C ale rzuciłem się na zrobienie własnej obsługi LCD no i gdy ją robię tak że linia RW jest na stałe do GND i działam tylko na opóźnieniach to wszysko chula.... ale gdy chcę odczytywać Busy Flag to masakra
.... wiem wiem temat był wałkowany na elektrodzie nie raz. Przczytałem chyba wszytskie posty. Były i w asm i w C .... ale jakoś mi to nie pomaga - może ja robię jakiś jeszcze dziwaczny błąd, którego sam nie umiem zauważyć.
tak więc procek to jakiś tam ATtiny2313 , oscylator 4MHz (ustawione fuse bity prawidłowo) Jak mówię bez odczytu BF wszystko działa ale jeśli teraz w funkcjach do odczytu wstawiam skok do funkcji, która ma poczekać na BF=0 to dzieją się dziwne krzaczki na ekranie.
AHA - b.ważne mam magistralę 4 bitową, więc zakładam, że przy odczycie BF najpierw trzeba zatrzasnąć starszy półbajt a potem młodszy. Ale to na podstawie tego starszego trzeba odczytać BF:
oto mój nieszczęsny fragment kodu i co najważniejsze, jeśli zaremuję tylko tą pętlę WHILE(1) a wstawione mam po zapisie do LCD nadal delay(120us) to wszystko chula a gdy włączam tę pętlę to nie działa
wstawiłem komentarze i starałem się tak to zrobić jak m.inn w jakimś starszym poście tu na elektrodzie kolega ZUMEK komuś tłumaczył - ale u mnie coś jest nie tak
Panowie proszę o jakąś pomoc, jak już wspominałem w którymś poście jesem świeżynka jeśli chodzi o C ale rzuciłem się na zrobienie własnej obsługi LCD no i gdy ją robię tak że linia RW jest na stałe do GND i działam tylko na opóźnieniach to wszysko chula.... ale gdy chcę odczytywać Busy Flag to masakra
tak więc procek to jakiś tam ATtiny2313 , oscylator 4MHz (ustawione fuse bity prawidłowo) Jak mówię bez odczytu BF wszystko działa ale jeśli teraz w funkcjach do odczytu wstawiam skok do funkcji, która ma poczekać na BF=0 to dzieją się dziwne krzaczki na ekranie.
AHA - b.ważne mam magistralę 4 bitową, więc zakładam, że przy odczycie BF najpierw trzeba zatrzasnąć starszy półbajt a potem młodszy. Ale to na podstawie tego starszego trzeba odczytać BF:
oto mój nieszczęsny fragment kodu i co najważniejsze, jeśli zaremuję tylko tą pętlę WHILE(1) a wstawione mam po zapisie do LCD nadal delay(120us) to wszystko chula a gdy włączam tę pętlę to nie działa
// Oczekiwanie na wyzerowanie flagi zajętości przez wyświetlacz LCD
void lcd_WaitBF(void)
{
// Ustawienie pinów portu LCD jako wejścia
DDR(LCD_DPORT) &= ~((1<<LCD_D4)|(1<<LCD_D5)|(1<<LCD_D6)|(1<<LCD_D7));
// Wyłączanie PuulUp
PORT(LCD_DPORT) &= ~((1<<LCD_D4)|(1<<LCD_D5)|(1<<LCD_D6)|(1<<LCD_D7));
// Wyzerowanie linii RS
PORT(LCD_RSPORT) &= ~(1<<LCD_RS);
nop();
// Ustawienie linii RW w stan wysoki
PORT(LCD_RWPORT) |= (1<<LCD_RW);
// Wyzerowanie linii E
PORT(LCD_EPORT) &= ~(1<<LCD_E);
_delay_us(0.25);
while( 1 )
{
// Zatrzaśnięcie danych z wyświetlacza - linia E = 1
PORT(LCD_EPORT) |= (1<<LCD_E);
//_delay_us(0.25);
nop();
nop();
// Odczytanie danych ze starszej części bajtu czyli tam gdzie jest BF (0x80)
//if ( (PIN(LCD_DPORT) & (1<<LCD_D7)) == 0 ) break;
PORT(LCD_EPORT) &= ~(1<<LCD_E);
//_delay_us(0.25);
nop();
nop();
PORT(LCD_EPORT) |= (1<<LCD_E);
//_delay_us(0.25);
nop();
nop();
nop();
nop();
PORT(LCD_EPORT) &= ~(1<<LCD_E);
//_delay_us(0.25);
nop();
nop();
}
_delay_us(0.25);
// Wyzerowanie linii E
PORT(LCD_EPORT) &= ~(1<<LCD_E);
// Wyzerowanie linii RW
PORT(LCD_RWPORT) &= ~(1<<LCD_RW);
// Ustawienie pinów portu jako wyjścia
DDR(LCD_DPORT) |= ((1<<LCD_D4)|(1<<LCD_D5)|(1<<LCD_D6)|(1<<LCD_D7));
_delay_us(0.25);
}wstawiłem komentarze i starałem się tak to zrobić jak m.inn w jakimś starszym poście tu na elektrodzie kolega ZUMEK komuś tłumaczył - ale u mnie coś jest nie tak