logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[AVR][C] - ponownie problem z odczytem BF dla zwykłego LCD

mirekk36 26 Maj 2008 14:08 1638 5
REKLAMA
  • #1 5182598
    mirekk36
    Poziom 42  
    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

    // 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
  • REKLAMA
  • #2 5182638
    Freddie Chopin
    Specjalista - Mikrokontrolery
    porada nie na temat, ale zamiast malo eleganckiego break; mozesz petle zrobic mniej wiecej tak:

    
    do
    {
    ...
    } while(PIN(LCD_DPORT) & (1<<LCD_D7));
    


    zawsze to ladniej [;

    0x41 0x56 0x45!!
  • REKLAMA
  • #3 5186413
    rrenio
    Poziom 11  
    u mnie na 3 wyswietlaczach bf nigdy nie dzialal zastosowalem opoznienie czasowe inaczej nie szlo
    pozdrawiam
  • REKLAMA
  • #4 5186834
    mirekk36
    Poziom 42  
    rrenio --> ooo proszę - to może i ja mam taki typ wyświetlacza? chociaż w jego dokumentacji niby piszą, że BF powinien działać. No ale zawsze to jakaś uwaga może i cenna bo całą dosłownie noc straciłem na walce z tym BF'em kocim. Ale jeszcze spróbuję go może w asemblerze namacać bo tu w C nie jestem poprostu do końca pewien czy ja gdzieś jakiegoś błędu nie robię że tak powiem "językowego"
  • REKLAMA
  • #6 5186897
    mirekk36
    Poziom 42  
    Freddie a mogę w takim razie poprosić o jakieś sugestie jak to sobie napisać ??? czy może jakiś mały fragmencik kodu, który dałby chociaż mi troszkę do myślenia i pokombinowania?
REKLAMA