www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD zeigt nur schwarze Balken


Autor: Peter Friedman (peterfr)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Friedman (peterfr)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spiel mal am Kontrast rum.

Autor: Uwe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Friedman (peterfr)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benutzer Name (benutzername)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan "stefb" B. wrote:
> Spiel mal am Kontrast rum.


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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Friedman (peterfr)
Datum:

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

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.