Forum: Mikrocontroller und Digitale Elektronik LCD zeigt nur schwarze Balken


von Peter F. (peterfr)


Angehängte Dateien:

Lesenswert?

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

von Peter F. (peterfr)


Lesenswert?

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

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Spiel mal am Kontrast rum.

von Uwe (Gast)


Lesenswert?

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

von Peter F. (peterfr)


Lesenswert?

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

von Benutzer N. (benutzername)


Lesenswert?

Stefan "stefb" B. wrote:
> Spiel mal am Kontrast rum.


der Kontrast wirds sein ... so wars bei mir damals auch :)

von Michael U. (amiga)


Lesenswert?

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

von Peter F. (peterfr)


Lesenswert?

Hallo stefb  B.
hab gerade am Kontrast bishen rum gespiel.aber ändert sich trotzdem 
nix!

von Stefan B. (stefan) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.