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

[ATmega88] [ATmega88][asm] - LCD HD44780 nie wyświetla danych, co sprawdzić?

grysek 06 Wrz 2009 12:35 6898 30
REKLAMA
  • #1 6986199
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Witam

    Napsiałem program obsługi LCD ze sterownikiem HD44780. Lecz niestety na wyświetlaczu nic wogóle się nie pojawia. Wydaję mi się że wszystko zrobiłem dobrze i dlatego tutaj piszę bo nie wiem co jest nie tak.

    Informacje czerpałem stąd:
    http://stud.wsi.edu.pl/~sikrolb/artykuly-obsluga_lcd.html
    http://radzio.dxp.pl/hd44780/hd44780_podstawy.htm

    Program w załączniku
    proszę o pomoc
    Załączniki:
    • LCDv1.rar (945 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #2 6989232
    psooya
    Poziom 38  
    Posty: 5341
    Pomógł: 376
    Ocena: 574
    Może mój soft pomoże?
    Ja używam 4 linii DB a u ciebie chyba jest ich 8. Co z linia R/W i podpięciem linii kontrastu? Może zapodaj schemat podłączenia ?
    Załączniki:
    • wilgoc.txt (11.78 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • REKLAMA
  • #3 6990851
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Dzieki za gotowca;p ale czy mógłbyś mi wskazać błędy jakie mam w swoim programie? Wyświetlacz inicjuje na tryb 8-bitowy dlatego też wykorzystuje wszystkie linie danych. Schemat daję poniżej.

    Kiedy podłącze sam wyswietlacz do zasilania to świeci się górny rząd no więc kontrast mam chyba dobrze ustawiony.

    [ATmega88] [ATmega88][asm] - LCD HD44780 nie wyświetla danych, co sprawdzić?
  • #5 6990884
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Tak odłączam. Z moich obserwacji wynika jeszcze że po inicjacji gaśnie górny rząd znaków i wyświetlacz jest czysty, to chyba oznacza że jest zainicjowany poprawnie nie?
  • REKLAMA
  • #7 6990922
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    To w takim razie dlaczego nie wyswietla znaków które mu wyślę? Porblem może być w opóźnieniach? Bo nie mam pojecia gdzie go szukać :|
  • #9 6991982
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Dodałem kondensator i opóźnienia przy strobowaniu ale nic nie pomogło :| ma ktos może jeszcze jakieś wskazówki? Każda sugestia może sie przydać
    Opóźnienia są ok, strobowanie też więc juz nie mam pojęcia co jest nie tak ;/
  • #11 6992319
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Mógłbys powiedziec jasniej o co Ci chodzi?;p bo nic nie rozumiem z tego co napisałeś hehe
  • #12 6992422
    Mat_91
    Poziom 25  
    Posty: 908
    Pomógł: 77
    Ocena: 16
    Kolega Balu miał chyba na myśli to iż np obliczyłeś sobie opóźnienia dla 8MHz a procek chodzi sobie legalnie na 1MHz co za tym idzie opóźnienia są dosłownie bee :)
  • #14 6993000
    psooya
    Poziom 38  
    Posty: 5341
    Pomógł: 376
    Ocena: 574
    Ja tak patrzyłem w kod i muszę przyznać, że nie wiem co się dzieje :-p ale to dla tego ze dawno nie programowałem tego LCD a i czasu mam mało. Z tego co widzę i proponuję to wyraźnie jawnie podać LCDkowi od której linii i kolumny ma zacząć wpisywać te znaki. Być może wpisują ci się poza obszar widoczności. Tu przypomnę każdy LCDek z HD44780 i podobnym składa się z tak jakby 1 linii 80 znakowej. A więc jeśli mamy LCD 2x16 znaków dzielimy 80 znaków na 2 uzyskując po 40 znaków na linie z tego tylko pierwsze 16 jest widoczne a pozostałe dopiero po użyciu funkcji przesuwania tekstu (uwaga do LCD 1x16 znaków tam niestety jest inaczej i ta metoda liczenia się nie sprawdza). Proponuje podać lokację 128 oznaczającą pierwszą linie i pierwszy znak w każdym LCDku.
    Pozdrawiam
  • #15 6994189
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Skoro już używasz 8 bitowego sterowania lcd, to proponuje nie bawić się z opóźnieniami tylko sprawdzać znacznik BF w wyświetlaczu, zamiast tej diodki na PC2, podłącz linia r/w wyswietlacza i sprawdzaj jego gotowość do przyjecia danych.
  • #16 6994836
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Program napisany jest na 8Mhz i tak też jest taktowany procesor ;p nie popełniłem w tym błędu.

    psooya tez właśnie sie zastanawiałem czy to nie przez cos takiego właśnie, ale jak mam podać jednostkę lokacji jako 128 skoro adres jest 7 bitowy?
    Jeśli bede sprawdzał flagę zajętości wyświetlacza to wtedy opóźnienia będą zbędne? Nawet podczas inicjalizacji?
  • REKLAMA
  • #18 6995949
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Moja inicjacja wygląda tak, nie ma w niej żadnych opóźnień,
    tylko sprawdzanie BF.
     		ser		r24                                 
    		out		DDRB,r24	; port B - wyjscia           
    		out		DDRC,r24	; port D - wyjscia
    ;-------------------------------------------------		
    		ldi		r24,$38		; interf.8-bit, 2 wiersze      
    		rcall	lcd_cont
    		ldi		r24,$0c 	; display on, reszta off
    		rcall	lcd_cont
    		ldi		r24,1 		; display clear                  
    		rcall	lcd_cont
    
  • #19 6996570
    psooya
    Poziom 38  
    Posty: 5341
    Pomógł: 376
    Ocena: 574
    Wygląda na ok ta inicjalizacja. Teraz wysłać do LCD rozkaz:
    ldi r24, 128 ; pozycja kursora na lokację 00
    rcall lcd_cont ; tu linia RS w stanie niskim musi być
    potem ustaw RS na 1
    i wyślij jeden raz znak na LCD
    Powinno działać. Mnie z waitami działało dobrze i to w 4 bitach. Poza tym mógłbyś użyć oscylatora RC 1MHz na początek dzięki czemu nawet nie trzeba nopów dla strobu "E"
    Pozdrawiam
  • #20 6999709
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Spróbuje jeszcze bez tych opóźnień bo jak dotychaczas nic się nie poprawiło. LCD po inicjalizacji dalej czysty :|

    adamwesola możesz pokazać co masz w procedurze 'lcd_cont'? Tam jest sprawdzanie flagi zajętości wyświetlacza?
  • #21 7000922
    psooya
    Poziom 38  
    Posty: 5341
    Pomógł: 376
    Ocena: 574
    A tak zapytam: Dodałeś ustawienie kursora na odpowiednią pozycję ? Dwa jak masz inny LCD to podłącz bo czasem zdarza się że nie działa poprawnie mimo iż jest nowy (sam raz taki miałem i doprowadził mnie do szału z projektem). Kolejną sprawą jest to żebyś zamieścił soft po wprowadzonych zmianach. Niestety nie będzie mnie przez 2 tygodnie i nie wiem czy będę mógł dalej pomagać. Jeśli nie uda ci się przez 2 tyg to napiszę Ci po powrocie teki soft. To będzie czysta przyjemność :-)
    Pozdrawiam
  • Pomocny post
    #22 7000954
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Masz tu całą procedurę obsługi lcd w trybie 8+3 (tak to nazywam).
    Do r24 (lub zmień na co Ci pasuje) ładujesz to co ma iść na wyświetlacz i... hula.
    Załączniki:
    • grysek.zip (596 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #23 7010270
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Dzięki za program;p zaraz go wgram i powiem co i jak

    Niestety nie mam drugiego wyświetlacza żeby na nim to sprawdzić;/ ale komenda 'Lcd' bascomie działa idealnie na tym wyświetlaczu więc sądze że wszystko jest z nim ok

    EDIT

    Niestety dalej to samo. Wyświetlacz się inicjuje ale niestety nie wyświetla nic tylko same pustki. Strasznie to dziwne - zupełnie jakby miał problem z odbiorem znaków.
    adamwesola sprawdzałeś ten program u siebie, na swoim wyświetlaczu?
  • Pomocny post
    #24 7014610
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Cześć.
    Program ten, sprawdzany był na attiny2313
    Jak próbowałem go na at90s2313, to działał jak dołożyłem mu 6 x nop.
    Ewentualnie spróbuj mu dać kilkadziesiąt ms czasu przed inicjalizacją.
    Czy na pewno masz dobrze ustawiony CKSEL ? na wewnetrzny oscylator, PB6 i 7 to również końcówki zewn.oscylatora
    A to jest właśnie wersja z dołożonymi nop'ami.
    Załączniki:
    • grysek.zip (610 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #25 7016390
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Masz rację, problem był z właśnie opóźnieniem sygnału strobującego a właściwie jego brakiem i w Twoim i w moim programie. Teraz zegar ustawiony na 1Mhz (8 + dzielnik) dodałem kilka nop'ów i działa. :D

    Teraz problem pozostał z tym że nie zawsze jak podłącze do zasilania to działa. Czy ktoś wie w czym może być problem? Pownienem dać jeszcze opóźnienie przed inicjaizacją?
  • #26 7016449
    krzych41
    Poziom 15  
    Posty: 43
    Pomógł: 15
    Ocena: 3
    Tak. Około 15 ms.
  • #27 7016499
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Pomyłka - opóźnienia pomogły tylko w moim programie. W Twoim natomiast wyświetlacz inicjuje się ale nie wyświetla, czyli to co było - nawet po dodaniu opóźnienia też się nic nie poprawiło :|
  • #28 7017786
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Cóż, szkoda że się nie udało, moje ulubione procki to PIC i z nimi rozwiązuję różne problemy, avr-ków nawet nie mam, Twój przypadek (mega88) sprawdzałem tylko w symulatorze.
  • #29 7017929
    grysek
    Poziom 19  
    Posty: 424
    Pomógł: 37
    Ocena: 10
    Ale i tak wielkie dzieki. Po dodaniu tych opoźnień do mojego programu wyświetlacz zaczął fajnie wyświetlać wiec postanowiłem napisać procedurę wyświetlania zmiennej i wykodziłem coś takiego:

    wyslij_znak:
     sbi 		PORTC, RS 
     rcall		strobe
     cbi		PORTC, RS
    ret
    
    wyslij_cyfre:
     add		data, const
     rcall		wyslij_znak
     sub		data, const
    ret
    
    dzielenie_10:
     mov		r21, data
     mov		r22, r21
     lsr		r22
     lsr		r22
     mov		r23, r21
     lsr		r23
     lsr		r23
     lsr		r23
     lsr		r23
     mov		r24, r21
     lsr		r24
     lsr		r24
     lsr		r24
     lsr		r24
     lsr		r24
     lsr		r24
     mov		r25, r21
     lsr		r25
     lsr		r25
     lsr		r25
     lsr		r25
     lsr		r25
     lsr		r25
     lsr		r25
     lsr		r25
     sub		r21, r22
     add		r21, r23
     sub		r21, r24
     add		r21, r25
     lsr		r21
     lsr		r21
     lsr		r21
    ret
    
    wyslij_zmienna:
     rcall		dzielenie_10
     mov 		r23, data
     mov		data, r21
     rcall		wyslij_cyfre
     ldi		r22, 10
     mul		data, r22
     sub		r23, r0
     mov 		data, r23
     rcall		wyslij_cyfre
    ret


    Procedura ta ma wyświetlać zawartość rejestru 'data' w zakresie od 0-99. I wyświetla liczby oprócz liczb w których liczba jedności to 9 (19,29...itd). Czy ktoś ma jakieś pomysły co jest nie tak?
  • Pomocny post
    #30 7026870
    adamwesola
    Poziom 24  
    Posty: 499
    Pomógł: 71
    Ocena: 22
    Jak rozumiem, procedura ma dokonać konwersji bajtu "data", na dwie cyfry bcd i je wyświetlić ?
    Najważniejsza w tym jest sama konwersja, ja robię to tak :
    		clr		data_hi
    		ldi		r22,0Ah
    powt: sbc		data,r22
    		brcc	koniec
    		inc		data_hi
    		rjmp	powt
    koniec:	adc		data,r22	;odjeto za duzo		

    Dziesiątki otrzymasz w "data_hi", jednostki w "data"
    Moja znajomość asemblera avr jest nikła, przetłumaczyłem ja z listą rozk. w ręku, z asemblera pic-owego, więc przyjrzyj się znacznikowi carry, czy nie potrzebne gdzies clc/sec.

Podsumowanie tematu

✨ Dyskusja dotyczy problemu z wyświetlaczem LCD sterowanym przez mikrokontroler ATmega88 w trybie 8-bitowym, gdzie wyświetlacz HD44780 inicjuje się poprawnie (górny rząd znaków gaśnie po inicjalizacji), lecz nie wyświetla przesyłanych danych. Poruszono kwestie prawidłowego podłączenia linii R/W, kontrastu oraz konieczności ustawienia kursora na właściwą pozycję (adres 128d jako pierwszy znak linii). Zwrócono uwagę na znaczenie opóźnień i ich dopasowania do rzeczywistej częstotliwości taktowania procesora (np. 1 MHz zamiast 8 MHz), co wpływa na poprawne strobowanie sygnału E. Zaproponowano zamiast opóźnień monitorowanie flagi zajętości (BF) wyświetlacza poprzez linię R/W, co eliminuje konieczność stosowania nopów. Wskazano również na potrzebę dodania opóźnienia około 15 ms przed inicjalizacją LCD. Autor ostatecznie potwierdził, że problemem były niewystarczające opóźnienia przy strobowaniu, które po korekcie pozwoliły na poprawne wyświetlanie znaków. Dodatkowo omówiono procedurę konwersji wartości liczbowych na format BCD i ich wyświetlanie na LCD w asemblerze AVR. Wskazano, że problem może też wynikać z nieprawidłowego ustawienia oscylatora (CKSEL) i konieczności stosowania nopów dla stabilizacji sygnałów.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA