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][asm] - Sterowanie LCD

grysek 06 Wrz 2009 12:35 6769 30
REKLAMA
  • #1 6986199
    grysek
    Poziom 19  
    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
  • REKLAMA
  • #3 6990851
    grysek
    Poziom 19  
    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][asm] - Sterowanie LCD
  • #5 6990884
    grysek
    Poziom 19  
    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  
    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ć :|
  • REKLAMA
  • #9 6991982
    grysek
    Poziom 19  
    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  
    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  
    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 :)
  • REKLAMA
  • #14 6993000
    psooya
    Poziom 38  
    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
  • #16 6994836
    grysek
    Poziom 19  
    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?
  • #18 6995949
    adamwesola
    Poziom 24  
    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  
    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  
    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  
    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
  • #23 7010270
    grysek
    Poziom 19  
    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  
    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.
  • #25 7016390
    grysek
    Poziom 19  
    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  
    Tak. Około 15 ms.
  • #27 7016499
    grysek
    Poziom 19  
    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 :|
  • #29 7017929
    grysek
    Poziom 19  
    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  
    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.
REKLAMA