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.