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

Atmega16 i LCD na HD44780 - wyświetla czarny rząd zamiast kursora

Tomasz321 20 Lip 2006 10:34 2486 17
  • #1 2835990
    Tomasz321
    Poziom 12  
    Posty: 94
    Pomógł: 5
    Ocena: 9
    Mój problem polega na tym że miast mi się wyświetlać kursor wyświetla mi się cala górna linijka, kontrast mogę regulować bez problemu ale nie mogę wysterować go tak żeby cokolwiek pokazywał programy mam napisany ok. Nie wiem co może być przyczyna czy może jest uszkodzony. Wyświetlacz na sterowniku HD44780.

    Dodam również ze wyjscia z up dzialają bo sprawdziłem na innym programie wczytując do niego progam do obslugi wyswietlacza LED i dziala ok. brak mi już pomyslu co może być nie tak.

    Próbowałem również uruchomić go na innym porcie i tez tylko cały rząd czarnych prostokącików :(

    Program jest asemblerze z książki wszytkie wcześniejsze działały bez problemu.

    Może ktoś miał podobny problem.
  • #2 2836003
    Sentinel18
    Poziom 17  
    Posty: 283
    Pomógł: 11
    Ocena: 7
    czarna linijka pokazuje co ze wszytko jest ok z wyswietlaczem to jest taki niby samo test wyswietlacza, jesli tylko to sie pojawia znaczy ze LCD nie widzi sterowania od procka... hmmm

    sprawdz moze delaye, czasy impulsow.. itd...
  • #3 2836116
    Tomasz321
    Poziom 12  
    Posty: 94
    Pomógł: 5
    Ocena: 9
    Aha czyli chodzi tu o to ze nie przetwarza tych danych bo za szybko otrzymuje je od up w tym programie co mam to są tam już wprowadzone opóźnienia i z tej książki wynika ze to działa na próbę spróbowałem załadować inny i też nie daje rady.

    Wiec pobawię się tymi opóźnieniami może to pomoże mam notę aplikacyjna tego sterownika spróbuje ustawić je tak jak tam opisują, chodź w tej książce dobrze to opisali i ustawili ale może wkradł im się tam błąd

    Z LED-em nie miałem tyle problemów ale LCD...
  • #4 2836362
    Sentinel18
    Poziom 17  
    Posty: 283
    Pomógł: 11
    Ocena: 7
    nota aplikacyjna to podstawa, ja wsze robie wszystko wa noty i wtedy jestempewnie ze wszytko jest dobrze....
  • #5 2838035
    Zaquadnik
    Poziom 27  
    Posty: 998
    Pomógł: 103
    Ocena: 25
    Jakby co, to tu masz obsługę LCD na ATmega16, tryb 4 linii danych ;)

    
    .include "m16def.inc"
    
    .equ RS = PB4
    .equ E = PB3
    .equ DB4 = PB2
    .equ DB5 = PB1
    .equ DB6 = PB0
    .equ DB7 = PA0
    
    
    		ldi R16,high(RAMEND)
    		out SPH,R16
    		ldi R16,low(RAMEND)
    		out SPL,R16
    		ldi R16,0x1F
    		out DDRB,R16
    		ldi R16,0x01
    		out DDRA,R16
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call LCDInit
    		call LCDclear
    		ldi R16,0x31
    		call LCDznak
    		call LCDnextLine
    		ldi R16,0x32
    		call LCDznak
    		call LCDclear
    		ldi R16,0x33
    		call LCDznak
    		call LCDnextLine
    		ldi R16,0x34
    		call LCDznak
    
    Prog:
    		call LCDshiftRight
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		call DlugaPauza
    		jmp Prog
    
    ;----------------------------------------------
    ;         PROCEDURY
    ;----------------------------------------------
    
    ;================================
    LCDInit:
    		push R18
    		push R16
    		cbi PORTB,RS
    		cbi PORTB,E
    		call SendDrei
    		call DlugaPauza
    		call SendDrei
    		call KrotkaPauza
    		call KrotkaPauza
    		call SendDrei
    		call KrotkaPauza
    		call KrotkaPauza
    		call SendZwei
    		call KrotkaPauza
    		call KrotkaPauza
    		ldi R16,0x28
    		call Send2nibbles		
    		call KrotkaPauza
    		call KrotkaPauza
    		ldi R16,0x06
    		call Send2nibbles
    		call KrotkaPauza
    		call KrotkaPauza
    		ldi R16,0x0C
    		call Send2nibbles
    		call KrotkaPauza
    		call KrotkaPauza
    		ldi R16,0x03
    		call Send2nibbles
    		call KrotkaPauza
    		call KrotkaPauza
    		sbi PORTB,RS
    		pop R16
    		pop R18
    		ret
    ;================================
    
    ;================================
    LCDclear:
    		push R16
    		push R18
    		cbi PORTB,RS
    		ldi R16,0x01
    		call Send2nibbles
    		call DlugaPauza
    		sbi PORTB,RS
    		pop R18
    		pop R16
    		ret
    ;================================
    
    ;================================
    LCDhome:
    		push R16
    		push R18
    		cbi PORTB,RS
    		ldi R16,0x02
    		call Send2nibbles
    		call DlugaPauza
    		sbi PORTB,RS
    		pop R18
    		pop R16
    		ret
    ;================================
    
    ;================================
    LCDnextLine:
    		push R16
    		push R18
    		cbi PORTB,RS
    		ldi R16,0xC0
    		call Send2nibbles
    		call KrotkaPauza
    		sbi PORTB,RS
    		pop R18
    		pop R16
    		ret
    ;================================
    		
    ;================================
    LCDznak:
    		push R18
    		sbi PORTB,RS
    		call Send2nibbles
    		call KrotkaPauza
    		cbi PORTB,RS
    		pop R18
    		ret
    ;================================
    
    ;================================
    LCDshiftLeft:
    		push R16
    		push R18
    		cbi PORTB,RS
    		ldi R16,0x18
    		call Send2nibbles
    		call KrotkaPauza
    		sbi PORTB,RS
    		pop R18
    		pop R16
    		ret
    ;================================
    	
    ;================================
    LCDshiftRight:
    		push R16
    		push R18
    		cbi PORTB,RS
    		ldi R16,0x1C
    		call Send2nibbles
    		call KrotkaPauza
    		sbi PORTB,RS
    		pop R18
    		pop R16
    		ret
    ;================================
    
    ;================================
    Send2nibbles:
    		push R17
    		push R19
    		ldi R17,0x00
    		cbi PORTB,E
    		cbi PORTB,DB4
    		cbi PORTB,DB5
    		cbi PORTB,DB6
    		cbi PORTA,DB7
    		bst R16,7
    		bld R17,0
    		ldi R19,0x00
    		in R19,PORTA
    		or R17,R19
    		out PORTA,R17
    		ldi R17,0x00
    		bst R16,6
    		bld R17,0
    		bst R16,5
    		bld R17,1
    		bst R16,4
    		bld R17,2
    		ldi R19,0x00
    		in R19,PORTB				
    		or R17,R19
    		out PORTB,R17
    		sbi PORTB,E
    		ldi R18,0x03
    		call Pauza
    		cbi PORTB,E
    
    		cbi PORTB,DB4
    		cbi PORTB,DB5
    		cbi PORTB,DB6
    		cbi PORTA,DB7
    
    		bst R16,3
    		bld R17,0
    		ldi R19,0x00
    		in R19,PORTA
    		or R17,R19
    		out PORTA,R17
    		ldi R17,0x00
    		bst R16,2
    		bld R17,0
    		bst R16,1
    		bld R17,1
    		bst R16,0
    		bld R17,2
    		ldi R19,0x00
    		in R19,PORTB
    		or R17,R19
    		out PORTB,R17
    		sbi PORTB,E
    		ldi R18,0x03
    		call Pauza
    		cbi PORTB,E
    		pop R19
    		pop R17
    		ret
    ;================================
    
    
    ;================================
    SendDrei:
    		push R18
    		cbi PORTB,DB6
    		cbi PORTA,DB7
    		sbi PORTB,DB4
    		sbi PORTB,DB5
    		sbi PORTB,E
    		ldi R18,0x03
    		call Pauza
    		cbi PORTB,E
    		pop R18
    		ret
    ;================================
    
    
    ;================================
    SendZwei:
    		push R18
    		cbi PORTB,DB6
    		cbi PORTA,DB7
    		cbi PORTB,DB4
    		sbi PORTB,DB5
    		sbi PORTB,E
    		ldi R18,0x03
    		call Pauza
    		cbi PORTB,E
    		pop R18
    		ret
    ;================================
    
    ;================================
    DlugaPauza:
    		push R19
    		push R20
    		ldi R20,0x6E
    	Etap2:
    		ldi R19,0xFF
    	Etap1:
    		dec R19
    		brne Etap1
    		dec R20
    		brne Etap2
    		pop R20
    		pop R19
    		ret
    ;=================================
    
    ;=================================
    KrotkaPauza:
    		push R18
    		ldi R18,0xFF
    		call Pauza
    		ldi R18,0xFF
    		call Pauza
    		pop R18
    		ret
    ;=================================
    
    ;=================================
    Pauza:
    	nop
    	nop
    	nop
    	dec R18
    	brne Pauza
    	ret
    ;=================================
    

    Jest też prosty program demonstrujący działanie LCD ;)
    Aha, całość działa bez problemów na kwarcu 16MHz :) Na wolniejszym tym bardziej ruszy :) A czarna linia na LCD oznacza, że jest on niezainicjalizowany.
    Pozdrawiam :)
  • #6 2838489
    lbugiera
    Poziom 21  
    Posty: 348
    Pomógł: 45
    Ocena: 5
    Jeśli używasz któregoś z pinów PC2-PC5, to musisz wyłaczyć JTAG'a programując odpowiedni fuse bit. Może to jest przyczyną ?

    Pozdrawiam
    Boogie
  • #7 2840399
    Tomasz321
    Poziom 12  
    Posty: 94
    Pomógł: 5
    Ocena: 9
    Dzieki za poswiecenie mi czasu Smile

    Ale mi cos nie chce ruszyć pomimo załadowania tego programu Sad i już dla pewności wole się zapytać może cos źle podpinam według tej procedury trochę ją zmodyfikowałem bo robię to na płytce drukowanej i nie mam tyle pojedynczych kabelków bo robię to na pinach ( w celu szybkiej implementacji tego programu i jego sprawdzenia).

    .equ RS = PB1 ; to do portu PB1
    .equ E = PB2 ; to do portu PB2
    .equ DB4 = PB3 ; to do portu PB3
    .equ DB5 = PB4 ; to do portu PB4
    .equ DB6 = PB5 ; to do portu PB5
    .equ DB7 = PA6 ; to do portu PB6

    Podmieniłem już nawet up i dalej nic się nie wyświetla

    P.s. Nie używam zadnego z portów PC0...7 wiec to chyba nie ta przyczyna ale dziekuję za radę

    Tu zamieszczam jak mam podpęty ten LCD ale wydaje mi sie ze jest ok
    Załączniki:
    • Atmega16 i LCD na HD44780 - wyświetla czarny rząd zamiast kursora LCD.JPG (18.99 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #8 2841620
    johny_w
    Poziom 24  
    Posty: 673
    Pomógł: 80
    Ocena: 63
    Zwróć uwagę na deklaracje które podałeś. D4, D5 i D6 masz podpięte pod PB, a linię D7 masz ustawioną jako podpiętą pod port A (PA). A zakładam że fizycznie cały LCD masz podpięty pod port B.

    I jeszcze jedno. Programy do obsługi LCD z reguły są tak skonstruowane, że D4-D7 muszą być podpięte pod 4 starsze bity portu (np. PB4-PB7). Nawet jeśli zadeklarujesz podpięcie pod PB3-PB6 program może nie działać prawidłowo.
  • #9 2841771
    Tomasz321
    Poziom 12  
    Posty: 94
    Pomógł: 5
    Ocena: 9
    Tak było słusznie zauważyłeś źle to miałem podpięte u mnie wygląda to tak:

    RS -> PD1
    E -> PD2
    DB4 -> PD4
    DB5 ->PD5
    DB6 ->PD6
    DB7 ->PD7

    (->==podpięte)

    wiec się wziołem za przeróbkę tego programiku powyżej, żeby było już dobrze, ale niestety nie ruszyło mi to, może źle cos pozmieniałem. Załączam program jak to teraz u mnie wygląda może ktoś znajdzie jakieś niedociągnięcia.

    
    .include "m16def.inc"
    
    .equ RS = PD1
    .equ E = PD2
    .equ DB4 = PD4
    .equ DB5 = PD5
    .equ DB6 = PD6
    .equ DB7 = PD7
    
    
          ldi R16,high(RAMEND)
          out SPH,R16
          ldi R16,low(RAMEND)
          out SPL,R16
          ldi R16,0x1F
          out DDRD,R16
          ldi R16,0x01
          out DDRD,R16
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call LCDInit
          call LCDclear
          ldi R16,0x31
          call LCDznak
          call LCDnextLine
          ldi R16,0x32
          call LCDznak
          call LCDclear
          ldi R16,0x33
          call LCDznak
          call LCDnextLine
          ldi R16,0x34
          call LCDznak
    
    Prog:
          call LCDshiftRight
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          call DlugaPauza
          jmp Prog
    
    ;----------------------------------------------
    ;         PROCEDURY
    ;----------------------------------------------
    
    ;================================
    LCDInit:
          push R18
          push R16
          cbi PORTD,RS
          cbi PORTD,E
          call SendDrei
          call DlugaPauza
          call SendDrei
          call KrotkaPauza
          call KrotkaPauza
          call SendDrei
          call KrotkaPauza
          call KrotkaPauza
          call SendZwei
          call KrotkaPauza
          call KrotkaPauza
          ldi R16,0x28
          call Send2nibbles      
          call KrotkaPauza
          call KrotkaPauza
          ldi R16,0x06
          call Send2nibbles
          call KrotkaPauza
          call KrotkaPauza
          ldi R16,0x0C
          call Send2nibbles
          call KrotkaPauza
          call KrotkaPauza
          ldi R16,0x03
          call Send2nibbles
          call KrotkaPauza
          call KrotkaPauza
          sbi PORTD,RS
          pop R16
          pop R18
          ret
    ;================================
    
    ;================================
    LCDclear:
          push R16
          push R18
          cbi PORTD,RS
          ldi R16,0x01
          call Send2nibbles
          call DlugaPauza
          sbi PORTD,RS
          pop R18
          pop R16
          ret
    ;================================
    
    ;================================
    LCDhome:
          push R16
          push R18
          cbi PORTD,RS
          ldi R16,0x02
          call Send2nibbles
          call DlugaPauza
          sbi PORTD,RS
          pop R18
          pop R16
          ret
    ;================================
    
    ;================================
    LCDnextLine:
          push R16
          push R18
          cbi PORTD,RS
          ldi R16,0xC0
          call Send2nibbles
          call KrotkaPauza
          sbi PORTD,RS
          pop R18
          pop R16
          ret
    ;================================
          
    ;================================
    LCDznak:
          push R18
          sbi PORTD,RS
          call Send2nibbles
          call KrotkaPauza
          cbi PORTD,RS
          pop R18
          ret
    ;================================
    
    ;================================
    LCDshiftLeft:
          push R16
          push R18
          cbi PORTD,RS
          ldi R16,0x18
          call Send2nibbles
          call KrotkaPauza
          sbi PORTD,RS
          pop R18
          pop R16
          ret
    ;================================
       
    ;================================
    LCDshiftRight:
          push R16
          push R18
          cbi PORTD,RS
          ldi R16,0x1C
          call Send2nibbles
          call KrotkaPauza
          sbi PORTD,RS
          pop R18
          pop R16
          ret
    ;================================
    
    ;================================
    Send2nibbles:
          push R17
          push R19
          ldi R17,0x00
          cbi PORTD,E
          cbi PORTD,DB4
          cbi PORTD,DB5
          cbi PORTD,DB6
          cbi PORTD,DB7
          bst R16,7
          bld R17,0
          ldi R19,0x00
          in R19,PORTD
          or R17,R19
          out PORTD,R17
          ldi R17,0x00
          bst R16,6
          bld R17,0
          bst R16,5
          bld R17,1
          bst R16,4
          bld R17,2
          ldi R19,0x00
          in R19,PORTD            
          or R17,R19
          out PORTD,R17
          sbi PORTD,E
          ldi R18,0x03
          call Pauza
          cbi PORTD,E
    
          cbi PORTD,DB4
          cbi PORTD,DB5
          cbi PORTD,DB6
          cbi PORTD,DB7
    
          bst R16,3
          bld R17,0
          ldi R19,0x00
          in R19,PORTD
          or R17,R19
          out PORTD,R17
          ldi R17,0x00
          bst R16,2
          bld R17,0
          bst R16,1
          bld R17,1
          bst R16,0
          bld R17,2
          ldi R19,0x00
          in R19,PORTD
          or R17,R19
          out PORTD,R17
          sbi PORTD,E
          ldi R18,0x03
          call Pauza
          cbi PORTD,E
          pop R19
          pop R17
          ret
    ;================================
    
    
    ;================================
    SendDrei:
          push R18
          cbi PORTD,DB6
          cbi PORTD,DB7
          sbi PORTD,DB4
          sbi PORTD,DB5
          sbi PORTD,E
          ldi R18,0x03
          call Pauza
          cbi PORTD,E
          pop R18
          ret
    ;================================
    
    
    ;================================
    SendZwei:
          push R18
          cbi PORTD,DB6
          cbi PORTD,DB7
          cbi PORTD,DB4
          sbi PORTD,DB5
          sbi PORTD,E
          ldi R18,0x03
          call Pauza
          cbi PORTD,E
          pop R18
          ret
    ;================================
    
    ;================================
    DlugaPauza:
          push R19
          push R20
          ldi R20,0x6E
       Etap2:
          ldi R19,0xFF
       Etap1:
          dec R19
          brne Etap1
          dec R20
          brne Etap2
          pop R20
          pop R19
          ret
    ;=================================
    
    ;=================================
    KrotkaPauza:
          push R18
          ldi R18,0xFF
          call Pauza
          ldi R18,0xFF
          call Pauza
          pop R18
          ret
    ;=================================
    
    ;=================================
    Pauza:
       nop
       nop
       nop
       dec R18
       brne Pauza
       ret
    ;================================= 
    
  • #10 2842369
    johny_w
    Poziom 24  
    Posty: 673
    Pomógł: 80
    Ocena: 63
    No, niedociągnięć to trochę jest. Przede wszystkim zaraz przed pierwszym rozkazem asemblera (u Ciebie deklaracja stosu) powinieneś dać

    - tak dla pewności. Po drugie, źle ustawiasz port LCD. (out DDRD). Powtarzasz to polecenie dwa razy i w efekcie tylko PD0 zostaje ustawiony jako wyjście - reszta linii portu D jest jako wejście. W twoim przypadku powinno być tak:
    ldi r16, 0b11110011
    out DDRD, r16

    Po dużych zmianach w procedurach do LCD udało mi się go zainicjować. Później straciłem cierpliwość. Jako pomoc dodaję swoje procedurki obsługi wyświetlacza. Diałają na 100%. Wystarczy tylko zdefiniować odpowiednio port. Pisałem to na kwarcu 11Mhz, jeśli masz szybszy musisz tylko zwiększyć opóźnienia. Program jest dla LCD 16x2. Powodzenia...
    Załączniki:
    • lcd.txt (2.29 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #11 2842456
    Tomasz321
    Poziom 12  
    Posty: 94
    Pomógł: 5
    Ocena: 9
    Dzięki za procedurze :) mam pytanie dokładnie ustawienie tych wejść jak chce podpinać pod port PD bo z twojej procedurki widzę ze są zdefiniowane dwa tory danych na portach PC, do których mają być podpięte linie danych wyświetlacza ( rozumiem ze mam je sobie sam ustalić) – z tego wynika ze linie danych są na dwóch portach a nie na czterech, a linia 3 (E) i 2 (RS) na porcie PC3..2:

    .EQU LCDCTRL = PORTC
    .EQU LCDPORT = PORTC
    .EQU E = 3 ;numer bitu (nie wartość!!!)
    .EQU RS = 2 ;jak wyżej

    Wiem ze to są pytania typu banał ale mimo wszystko wole się pytać, bo walczę już z tym wyświetlaczem dość długo ( i powoli mi się już zaczyna to mieszać), więc wole pytać żebym później czegoś źle nie zrobił sorki za taką dociekliwość, bo podejrzewam ze może ten wyświetlacz padł, albo coś źle podpinam, wyświetlacz mam podpięty jak podałem na zdjęciu w ten sposób staram się wyeliminować jak najwięcej błędów, które mogłem popełnić.
    Dodatkowo dzięki temu, że ktoś już uruchomił podobny LCD na Atmega16 wtedy będę miał pewność ze musi działać jak nie tzn. ze padł chyba wyświetlacz pomimo tego że wyświetla ten rząd prostokątów jeszcze raz dzięki :)

    P.s.Dodam jeszcze ze używam kwarcu wewnętrznego mikrokontrolera 1MHz.

    Dzięki za pomoc :)
  • #12 2842881
    johny_w
    Poziom 24  
    Posty: 673
    Pomógł: 80
    Ocena: 63
    No, no. Kłania się podstawowa wiedza nt. uC AVR. Polecam zająć się najpierw jakimś kursem (znajdziesz w sieci) a później dopiero brać się za LCD.

    Wyświetlacz mam zdefiniowany na porcie C, ponieważ tak jest on u mnie podpięty. Musisz sobie zmienić te definicje. LCDCTRL tyczy się portu, do którego podpięte są linie sterujące (E, RS), a LCDPORT tyczy się tego, gdzie są linie danych. W tym przypadku jest to ten sam port. Program działa tak, że D4-D7 muszą na liniach D4-D7 procesora.

    Błędnie podałem Ci konfigurację portu, powinno być:
    ldi r16, 0b11110110
    out DDRD, r16

    Tłumaczył nie będę ponieważ nie da się opisać tego w dwóch słowach. Pozdrawiam
  • #13 2842900
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Skoro tak rzucacie procedurkami , to i ja wrzucę swoją.Po zdefiniowaniu bitów i portów przyłączonego LCD , działa w trybie 4bit na dowolnych I/O proca.

    Piotrek

    PS
    Definicje pinów i ich portów oraz FCPU należy dostosować do swoich warunków ;)
    Załączniki:
    • LCD4bit.txt (3.05 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #14 2843294
    Tomasz321
    Poziom 12  
    Posty: 94
    Pomógł: 5
    Ocena: 9
    Dziękuje wam wszystkim bardzo za zaangażowanie :)

    Co do kursów to mam ich trochę zacząłem od książki „Mikrokontrolery AVR ATmega w praktyce” no i ta książeczka jest super i tam właśnie natknąłem się na program wyświetlacza LCD powinien działać ale u mnie nie chce ruszyć wiec zacząłem pytać na forum przed oczywiście uprzednim przestudiowaniu innych tematów żeby nie powielać nie potrzebnie pytań. Dodam że wszystkie inne ruszyły od strzała.

    I tu pojawia się moje pytanie co może ja źle robię ze ten wyświetlacz mi nie działa wcześniejsze programy ruszyły mi bez problemu wiec dlatego zadałem że tak powiem dość banalne pytanie, więc podejrzewam ze może mam jakiś trefny wyświetlacz, a nie mam go jak sprawdzić więc wpadłem na pomysł może wyśle tego .hex i ktoś go przetestuje u siebie i jeśli ruszy to będę miał pewność ze ten wyświetlacz padł.

    Ale kontrast działa...


    A może to źle podłączyłem dlatego wysłałem schemacik.

    Ilość błędów jakie mogłem popełnić jest mnoga, ale co do podłączania LCD nie jest skomplikowane, więc wnioskuje ze to chyba nie w tym problem.

    Jednym słowem „tonący brzytwy się chwyta”

    Więc załączam ten go .hex może ktoś poświeci chwile i go u siebie uruchomi.

    Podpięcia:

    RS,E -> PD0,PD1
    D4...D7 -> PD4...PD7

    Albo jeśli mógłby ktoś wysłać swojego hex-a i jak to ma podpięte wtedy bym mógł u siebie sprawdzić.

    Procedury są super dziękuje za wszystkie jeszcze raz (tylko szkoda ze u mnie nie ruszyły- ale kody są ok):)

    P.s. Według tych procedur to wyswietlacz podpinam tak:

    .equ RS = PC2 ; do portu PC2
    .equ EN = PC3 ; do portu PC3
    .equ DB4 = PC4 ; do portu PC4
    .equ DB5 = PC5 ; do portu PC5
    .equ DB6 = PD7 ; do portu PD7
    .equ DB7 = PA7 ; do portu PA7

    to tak dla pewnosci czy jest wszytko ok :)
    Załączniki:
    • p5 - wyswietlacz lcd.rar (1.17 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #15 2843403
    johny_w
    Poziom 24  
    Posty: 673
    Pomógł: 80
    Ocena: 63
    Ok. Sam na początku się męczyłem żeby LCD uruchomić. Niby wszystko proste a jednak działać nie chciało. Oto hex który wyświetla znak '!'. Działa - sprawdzałem. LCD skonfigurowany tak jak podałeś:

    RS - PD0
    E - PD1
    D4...D7 - PD4...PD7

    Jednak nie podałeś chyba jaki masz LCD. Moja procka jest na 16x2. Przez chwilę pomyślałem że może kontrast? Ale jeśli widzisz czarne kwadraty to chyba jest ok (może jednak spróbuj?). A może z atmegą coś nie tak? Działa Ci inny program, np. zapalenie LED, itp.? Wiem, pisałeś że działał, ale może teraz nie działa?

    Może linie na uC masz ubite? Sprawdź miernikiem. Ustaw cały port D na wyjścia, stan na wysoki - zmierz, stan na niski - zmierz. Stan niski to 0V, stan wysoki to 5V.

    No i może upewnij się wg. noty atmega czy na pewno dobrze podłączyłeś wyświetlacz.

    Nic innego nie przychodzi mi na myśl.
    Załączniki:
    • lcdm16-2.rar (413 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • Pomocny post
    #16 2843419
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    Tomasz321 napisał:

    Albo jeśli mógłby ktoś wysłać swojego hex-a i jak to ma podpięte wtedy bym mógł u siebie sprawdzić.

    P.s. Według tych procedur to wyswietlacz podpinam tak:

    .equ RS = PC2 ; do portu PC2
    .equ EN = PC3 ; do portu PC3
    .equ DB4 = PC4 ; do portu PC4
    .equ DB5 = PC5 ; do portu PC5
    .equ DB6 = PD7 ; do portu PD7
    .equ DB7 = PA7 ; do portu PA7

    Z powyższymi ustawieniami może Ci nie chodzić , bo zapewne nie wyłączyłeś JTAG-a.Dołączam HEX-a (zmień *.txt/*.hex) skompilowanego dla:
    RS,E -> PD0,PD1
    D4...D7 -> PD4...PD7
    i FCPU=1MHz

    Piotrek
    Załączniki:
    • LCD.txt (714 Bajtów) Musisz być zalogowany, aby pobrać ten załącznik.
  • #17 2844098
    Tomasz321
    Poziom 12  
    Posty: 94
    Pomógł: 5
    Ocena: 9
    Jeszcze raz Dzięki :)

    Ale cóż nie chce mi to działać mimo tych programów, więc wydaje mi się ze wyświetlacz jest padnięty :(

    Schemat jak mam go podpięty jest u góry może ktoś coś zauważy, ale jest podpięty ok.

    Co do wyjść to sprawdziłem je i tez wystawiane tam są stany niskie jak i wysoki po za tym zmieniłem mikrokontroler na nowy i tez nic, to decyduje o tym ze ten wyświetlacz jest chyba padnięty

    Na koniec mam jeszcze jedne pomysł, który mi pozostaje może ktoś zamieści schemacik jak ma podpięty ten nieszczęsny wyświetlacz.

    Bo może wy macie podpięte w inny sposób, a mam tak jak podane jest na rysunku a ten schemat pochodzi z książki.

    A jak to już nie pomoże to kupie nowy może ruszy, bo według tych programów powinno działać, jednym słowem powoli mnie ten LCD powala na ziemie :(

    Dziękuje za odpowiedzi :)

    P.s. Napisałem program migająca dioda do sprawdzenia tych portów, żeby wyeliminować usterkę mikrokontrolera tego typu czy może nie da się wygenerować na tych portach jakiegoś sygnału strobującego, i wszystko ok., więc pozostają tylko dwa błędy albo źle podpięty (dla pewności byłbym wdzięczny jakby ktoś fachowym okiem na ten mój schemacik rzucił okiem i powiedział czy wszystko w porządku) albo wyświetlacz padnięty (i chyba to drugie :()

    P.S.2. Jeszcze sprawdziłem w ten sposób te pogramy wyłączając wyświetlacz:

    Na wyjściu RS podpiąłem diodę LED powinna mieć stan wysoki ok. 5V wiec powinna świecić ( u mnie świeci jest ok. :))

    A na wyjściu E podpiąłem podobnie i tam powinno mi to mignąć, ale to już nie takie proste, bo ten impuls powinien mieć stan wysoki przez ok. 230ns, a czas trwania zbocza w sygnale E maks. 20ns min dioda może się nie zapalić, ale poradziłem sobie w ten sposób podpiąłem pod oscyloskop i mam przebieg prostokątny.
  • #18 2846853
    Tomasz321
    Poziom 12  
    Posty: 94
    Pomógł: 5
    Ocena: 9
    Witajcie!

    W końcu po długiej niezłomnej walce i pomocy was działa jupi udało się a przyczyna była dość prozaiczna, nie było styku do wyświetlacza, nie zauważyłem jednej istotnej sprawy a mianowicie ze wyświetlacz ten ma przelotek a jest na płytce dwu stronnej, przyjąłem ze tak jest (przynajmniej tak powinno być... Jeśli jest płytka robiona fabrycznie do wyświetlacza, cóż nie było:(), i to był ten błąd :( i nie działał mi. Ale już wszystko ok. :)

    Dzięki za programy są ok.

    Pozdrawiam i dziękuje za rady :)

Podsumowanie tematu

✨ Problem dotyczył wyświetlacza LCD sterowanego przez mikrokontroler Atmega16 z kontrolerem HD44780, który zamiast kursora wyświetlał czarny, pełny górny rząd. Przyczyną było brak prawidłowego sterowania sygnałami z mikrokontrolera do LCD, co skutkowało brakiem poprawnej inicjalizacji wyświetlacza. Dyskusja wskazała na konieczność prawidłowego ustawienia portów i pinów mikrokontrolera, zwłaszcza linii danych D4-D7 oraz sygnałów RS i E, a także na odpowiednie opóźnienia (delay) w komunikacji. Zwrócono uwagę na wyłączenie funkcji JTAG, jeśli wykorzystywane są piny PC2-PC5, oraz na poprawne ustawienie kierunku portów (DDR). Wskazano, że programy do obsługi LCD często wymagają podłączenia linii danych do czterech wyższych bitów jednego portu. Po wielu próbach i korektach okazało się, że problemem był brak styku na płytce drukowanej, spowodowany brakiem przelotek na dwustronnej płytce, co uniemożliwiało prawidłowe połączenie wyświetlacza. Po naprawie połączeń wyświetlacz zaczął działać poprawnie. W dyskusji udostępniono przykładowe procedury i programy w asemblerze do obsługi LCD w trybie 4-bitowym, które działają na Atmega16 przy różnych konfiguracjach pinów i częstotliwościach taktowania.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA