Hallo Leute! Und zwar seit 2 Tagen versuche ich mein LC-Display(HD44780) an AtMega8 Mikrocontroller anzuschließen und programmieren.Leider zeigt mein LCD nur schwarze Balken. Als Dateianhang sende ich mein Quelcode.Villeicht ist dder hilfreich! MfG Peter
Hier ist noch mal der Assembler-
Code!;------------------------------------------------------------------
--------
.include "m8def.inc"
;-----------------------------------------------------------------------
----
; Reset and Interrupt vector ; VNr. Beschreibung
rjmp main ; 1 POWER ON RESET
;-----------------------------------------------------------------------
----
; Start, Power ON, Reset
main: ldi r16,low(RAMEND)
out SPL,r16 ; Init Stackpointer LO
ldi r16,high(RAMEND)
out SPH,r16 ; Init Stackpointer HI
rcall LCD_init
;-----------------------------------------------------------------------
----
mainloop: rcall wait
ldi r16, 'T'
rcall LCD_data
ldi r16, 'e'
rcall LCD_data
ldi r16, 's'
rcall LCD_data
ldi r16, 't'
rcall LCD_data
rjmp mainloop
;=======================================================================
====
;hier Unterprogramme und Interruptroutinen zufügen
;-----------------------------------------------------------------------
----
wait: push r24
ldi r24,0x13 ; hier delay einstellen 13 = ca.
20yS
w1: subi r24,0x01
rcall wait20ms
brcc w1
pop r24
ret
;-----------------------------------------------------------------------
----
wait5ms: ldi r16, 255
ldi r17, 26
w5ms: dec r16
brne w5ms
dec r17
brne w5ms
ret
;-----------------------------------------------------------------------
----
wait20ms: ldi r16, 255
ldi r17,104
w20ms: dec r16
brne w20ms
dec r17
brne w20ms
ret
;-----------------------------------------------------------------------
----
LCD_init: sbi DDRD,4 ;LCD RS = OUT
sbi DDRD,5 ;LCD E = OUT
sbi DDRC,0 ;LCD D4 = OUT
sbi DDRC,1 ;LCD D5 = OUT
sbi DDRC,2 ;LCD D6 = OUT
sbi DDRC,3 ;LCD D7 = OUT
cbi PORTD,4 ;LDC RS = Low
;warte bis PowerUp
ldi r18,20
powerup: rcall wait5ms
dec r18
brne powerup ; Power-Up Wartezyklus min 30 ms
; sende init 1
ldi r16, 0b00100000 ; 4 Bit Modus aktivieren
out PORTD, r16
rcall LCD_enable ; Enable-Impuls
rcall wait5ms
ldi r16, 0b00101000
rcall LCD_cmd ; Function Set 4 Bit, 2
Zeilen, 5x7
rcall LCD_off
rcall LCD_clear
ldi r16, 0x06
rcall LCD_cmd ; Entry Mode Set,
increase+shifted
rcall LCD_on
ret
;-----------------------------------------------------------------------
----
LCD_data: ldi r18,0b0000100 ;RS = hi
rjmp LCD_out
;-----------------------------------------------------------------------
----
LCD_cmd: ldi r18,0b0000000 ;RS = lo
LCD_out: mov r17, r16
swap r17
andi r16, 0b11110000
or r16,r18
andi r17, 0b11110000
or r17,r18
out PORTD, r16
rcall LCD_enable
out PORTD, r17
rcall LCD_enable
rcall wait5ms
ret
;-----------------------------------------------------------------------
----
LCD_enable: sbi PORTD, 5 ; Enable high
nop ; kurz warten
nop
nop
cbi PORTD, 5 ; Enable wieder low
ret
;-----------------------------------------------------------------------
----
LCD_clear: ldi r16, 0b00000001 ; Display löschen
rcall LCD_cmd
rcall wait5ms
ret
;-----------------------------------------------------------------------
----
LCD_off: ldi r16, 0b00001000
rcall LCD_cmd
rcall wait5ms
ret
;-----------------------------------------------------------------------
----
LCD_on: ldi r16, 0x0E
rcall LCD_cmd
rcall wait5ms
ret
Hi! > sbi DDRD,4 ;LCD RS = OUT > sbi DDRD,5 ;LCD E = OUT > sbi DDRC,0 ;LCD D4 = OUT > sbi DDRC,1 ;LCD D5 = OUT > sbi DDRC,2 ;LCD D6 = OUT > sbi DDRC,3 ;LCD D7 = OUT > cbi PORTD,4 ;LDC RS = Low soweit ok, aber nun > ldi r16, 0b00100000 ; 4 Bit Modus aktivieren > out PORTD, r16 > rcall LCD_enable ; Enable-Impuls und nun das beste >LCD_enable: sbi PORTD, 5 ; Enable high > nop ; kurz warten > nop > nop > cbi PORTD, 5 ; Enable wieder low > ret Die Daten sollten doch auf Port C raus. Oder wie jetzt? Mache mal Ordnung, dann klapts auch mitm Init. Viel Erfolg, Uwe
Hallo Leute!
Und zwar seit 2 Tagen versuche ich mein LC-Display(HD44780) an AtMega8
Mikrocontroller anzuschließen und programmieren.Leider zeigt mein LCD
nur schwarze Balken.
Als Dateianhang sende ich mein Quelcode.Villeicht ist dder hilfreich!
MfG Peter
Hier ist der Code
.include "m8def.inc"
;-----------------------------------------------------------------------
----
; Reset and Interrupt vector ; VNr. Beschreibung
rjmp main ; 1 POWER ON RESET
;-----------------------------------------------------------------------
----
; Start, Power ON, Reset
main: ldi r16,low(RAMEND)
out SPL,r16 ; Init Stackpointer LO
ldi r16,high(RAMEND)
out SPH,r16 ; Init Stackpointer HI
rcall LCD_init
;-----------------------------------------------------------------------
----
mainloop: rcall wait
ldi r16, 'T'
rcall LCD_data
ldi r16, 'e'
rcall LCD_data
ldi r16, 's'
rcall LCD_data
ldi r16, 't'
rcall LCD_data
rjmp mainloop
;=======================================================================
====
;hier Unterprogramme und Interruptroutinen zufügen
;-----------------------------------------------------------------------
----
wait: push r24
ldi r24,0x13 ; hier delay einstellen 13 = ca.
20yS
w1: subi r24,0x01
rcall wait20ms
brcc w1
pop r24
ret
;-----------------------------------------------------------------------
----
wait5ms: ldi r16, 255
ldi r17, 26
w5ms: dec r16
brne w5ms
dec r17
brne w5ms
ret
;-----------------------------------------------------------------------
----
wait20ms: ldi r16, 255
ldi r17,104
w20ms: dec r16
brne w20ms
dec r17
brne w20ms
ret
;-----------------------------------------------------------------------
----
LCD_init: sbi DDRD,4 ;LCD RS = OUT
sbi DDRD,5 ;LCD E = OUT
sbi DDRC,0 ;LCD D4 = OUT
sbi DDRC,1 ;LCD D5 = OUT
sbi DDRC,2 ;LCD D6 = OUT
sbi DDRC,3 ;LCD D7 = OUT
cbi PORTD,4 ;LDC RS = Low
;warte bis PowerUp
ldi r18,20
powerup: rcall wait5ms
dec r18
brne powerup ; Power-Up Wartezyklus min 30 ms
; sende init 1
ldi r16, 0b00100000 ; 4 Bit Modus aktivieren
out PORTD, r16
rcall LCD_enable ; Enable-Impuls
rcall wait5ms
ldi r16, 0b00101000
rcall LCD_cmd ; Function Set 4 Bit, 2
Zeilen, 5x7
rcall LCD_off
rcall LCD_clear
ldi r16, 0x06
rcall LCD_cmd ; Entry Mode Set,
increase+shifted
rcall LCD_on
ret
;-----------------------------------------------------------------------
----
LCD_data: ldi r18,0b0000100 ;RS = hi
rjmp LCD_out
;-----------------------------------------------------------------------
----
LCD_cmd: ldi r18,0b0000000 ;RS = lo
LCD_out: mov r17, r16
swap r17
andi r16, 0b11110000
or r16,r18
andi r17, 0b11110000
or r17,r18
out PORTD, r16
rcall LCD_enable
out PORTD, r17
rcall LCD_enable
rcall wait5ms
ret
;-----------------------------------------------------------------------
----
LCD_enable: sbi PORTD, 5 ; Enable high
nop ; kurz warten
nop
nop
cbi PORTD, 5 ; Enable wieder low
ret
;-----------------------------------------------------------------------
----
LCD_clear: ldi r16, 0b00000001 ; Display löschen
rcall LCD_cmd
rcall wait5ms
ret
;-----------------------------------------------------------------------
----
LCD_off: ldi r16, 0b00001000
rcall LCD_cmd
rcall wait5ms
ret
;-----------------------------------------------------------------------
----
LCD_on: ldi r16, 0x0E
rcall LCD_cmd
rcall wait5ms
ret
Stefan "stefb" B. wrote:
> Spiel mal am Kontrast rum.
der Kontrast wirds sein ... so wars bei mir damals auch :)
Hallo, beim Initialisieren der Ports setzt Du RS auf L, E bleibt aber H. Eigentlich ist die Grundstellung von E aber L... Die Initsequenz des 44780 beginnt mit 3x 0x30, bei 4-Bit Anschluß also nur 3x die 0x3 an den Daten. Dazwischen Wartezeiten wie im Datenblatt und natürlich den Takt an E nicht vergessen. Die Umschaltung auf 4 Bit erflogt erst danach. Warum schickst Du ständig in main "Test" ans Display? Das zeigt nach dem ersten Mal sowieso Test an, wenn nichts verändert wird. Gruß aus Berlin Michael
Hallo stefb B. hab gerade am Kontrast bishen rum gespiel.aber ändert sich trotzdem nix!
Peter Friedman wrote: > Hallo stefb B. > hab gerade am Kontrast bishen rum gespiel.aber ändert sich trotzdem > nix! Seltsam, dass sich gar nix ändert, das würde auf eine nicht arbeitende Kontrasteinstellung hindeuten. Normalerweise werden die schwarzen Teile immer schwächer und irgendwann sind sie nicht mehr sichtbar, wenn man den Kontrast runterdreht. Wenn man Glück hat, werden dabei die eigentlichen Zeichen sichtbar, d.h. vorher hatte man die Anzeige nur kontrastmäßig übersteuert. Wenn man Pech hat, werden keine Zeichen (alles verschwindet) oder seltsame, irre Zeichen sichtbar. Das ist dann der Fall, wenn das LCD nicht richtig angesteuert wurde. Insgesamt können Software- (Tipps von Uwe und Michael eingearbeitet?, Taktrate? Taktrate verifiziert, damit Warteschleifen korrekt sind?) und Hardwareprobleme (Geplanter aufbau: Schaltplanskizze?, tatsächlicher Aufbau: Kontrolle lose Leitungen etc.!, Datenblatt genau dieses Displays?) vorliegen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.