Problem z programowaniem wyswuetlacza LCD

Aug 19, 2003 4 Replies

Witam.



Ucze sie programowac procesor AVR. Mam zestaw uruchomieniowy AVT 992. Procesor, ktory programuje to AVR AT90S8535. Napisalem program w C (avr-gcc), ktory najpierw inicjalizuje wyswietlacz LCD, a nastepnie ma wypisac znak. Ustawiam migajacy kursor, 4-bitowy interfejs, przechodzenie kursora w prawo po wypisaniu znaku. Czynnosci te wykonywane sa prawidlowo. Nastepnie wypisuje znak. Poniewaz mam interfejs 4-bitowy, ustawiam RS i wysylam dwa razy po 4 bity. W efekcie uzyskuje 2 znaki (a nie jeden, jak mozna by sie tego spodziewac). Po sprawdzeniu w tabeli znakow, wynika, ze 4 bity ustawione byly na 1111 a kolejne 4 odpowiadaja tym ustawionym przeze mnie. Wyglada to na tryb 8 bitowy, mimo tego ze ustawialem tryb 4 bitowy. Bylbym wdzieczny za ogledziny kodu i wskazanie, gdzie popelnilem blad. Z gory dziekuje za okazana pomoc.



P4-PB7 = bity danych PB3 = enable PB2 = RS



#define __AVR_AT90S8535__ #include <avr/io.h>



void czekaj(void) { int i, j;



for (i = 0; i < 1000; i++) for (j = 0; j < 1000; j++) ; }



int main(void) { int i;



outp(0xff, DDRB);



for (i =0; i < 3;i++) { outp(0, PORTB); sbi(PORTB, PB4|PB5); sbi(PORTB, PB3); czekaj(); }



/* tryb 4-bitowy */ outp(0, PORTB); sbi(PORTB, PB5); sbi(PORTB, PB3); // enable czekaj();


/* ustawienia w trybie 4-bitowym */ outp(0, PORTB); sbi(PORTB, PB5|PB4); sbi(PORTB, PB3); // enable czekaj();



outp(0, PORTB); sbi(PORTB, 0); sbi(PORTB, PB3); czekaj();



/* kursor */ outp(0, PORTB); sbi(PORTB, PB3); czekaj();



outp(0, PORTB); sbi(PORTB, PB7|PB6|PB5|PB4); // miganie, itp. sbi(PORTB, PB3); czekaj();



/* czyszczenie ekranu */ outp(0, PORTB); sbi(PORTB, PB3); czekaj();



outp(0, PORTB); sbi(PORTB, PB4); sbi(PORTB, PB3); czekaj();



/* wypisz znak */ outp(0, PORTB); sbi(PORTB, PB2); // RS sbi(PORTB, PB5); sbi(PORTB, PB3); // enable czekaj(); cbi(PORTB, PB3);



outp(0,PORTB); sbi(PORTB, PB2); sbi(PORTB, PB6); sbi(PORTB, PB3); czekaj(); cbi(PORTB, PB3); outp(0, PORTB);



return 0; }


W efekcie uzyskuje na ekranie



/0



i migajacy po tych znakach kursor.



Trix.


Czasem na rozmaite k³opoty pomaga sterowanie w nieco inny sposób.

Ty robisz tak:

1° wystawiasz dan± 2° wystawiasz Enable 3° kasujesz obydwa (ca³y port) 4° wystawiasz nowe dane itd.

Spróbuj tak:

1° wystawiasz dan± 2° wystawiasz Enable 3° kasujesz Enable 4° wystawiasz nowe dane itd

ewentualny wait state wstaw po 2° Ka¿dy z tych punktów to oczywi¶cie osobna, pojedyncza instrukcja w kodzie.

Powodzenia Bartosz Sarama

Dzieki za odpowiedz. Zrobilem tak jak napisales. Teraz za ekranie pojawia sie

8 znakow (mam wyswietlacz 1x16), ktore sa jakimis smieciami (wszystkie znaki sa takie same). Dalej nie daje sobie rady.

Trix.

Masz podci±gniêty port dodatkowym R10K do VCC? Zablokowane zasilanie 100nF + 4,7uF? Robisz poprawn± inicjacjê LCD - jak w nocie katalogowej (3 krotn± czy ile tam)?

Zwiêksz czas oczekiwania nawet do 10s (czas wystawienia Enable = 1 i po opadniêciu Enable te¿!) - wtedy zobaczysz dok³adnie co siê po kolei dzieje :-)

Pozdrawiam Bartosz Sarama

Wed, 20 Aug 2003 11:48:51 +0200 jednostka biologiczna o nazwie "Trix" snipped-for-privacy@polbox.com wyslala do portu 119 jednego z serwerow news nastepujace dane:

przede wszystkim:

- odpusc sobie na razie tryb 4-ro bitowy, przesylaj wszystkie 8 bitow.

- resetuj wyswietlacz po uruchomieniu procka. Resetowanie polega na przeslaniu rozkazu o kodzie 0x30 i zaczekaniu kilkudziesieciu milisekund. Dla pewnosci mozna resetowanie powtorzyc jeszcze z raz albo dwa.

Wrzucam Ci na priv mojej produkcji biblioteczke obslugi wyswietlacza. Wprawdzie jest dla 8051, ale powinienes zalapac co i jak.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required