- LiTime Speicher und Akkus         
Seite 1 von 6 123 ... LetzteLetzte
Ergebnis 1 bis 10 von 53

Thema: LCD-Probleme

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473

    LCD-Probleme

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hallo

    Ich sitze jetzt schon einige Tage an meinem Code und es stellt sich allmählich eine gewisse Betriebsblindheit ein.
    Findet jemand den Fehler in meinem Code?


    Folgendes Problem: Ich habe hier ein 2x16-LCD, das jedoch keine Zeichen anzeigen will.
    Ich kann es zwar initialisieren (obere Balkenreihe verschwindet), jedoch zeigt es keine Zeichen an.

    Kann mal wer über den Code rüberschauen?

    Code:
    .equ LCD_DAT_PORT       =PORTC    ;Port für Datenleitungen definieren
    .equ LCD_STRG_PORT      =PORTA    ;Port definieren, an dem RS, RW und E angeschlossen sind
    .equ LCD_DDR            =DDRC     ;Datenrichtungsregister LCD-Datenport
    .equ LCD_PIN            =PINC     ;Pin-Register LCD-Datenport
    .equ LCD_E              =7        ;Enable-Pin definieren
    .equ LCD_RS             =5        ;Register-Select-Pin definieren
    .equ LCD_RW             =6        ;Read-Write-Pin definieren
    .equ Schlussmarke       =0        ;Schlussmarke für längeren Text, ASCII-Wert
    .def LCD_Puffer			=R16      ;Register für Daten/Befehlübergabe
    .def LCD_TMP1			=R17      ;Arbeitsregister für LCD-Routinen, wird bei Verwendung auf dem Stack gesichert
    .def LCD_TMP2			=R18      ;Arbeitsregister für LCD-Routinen, wird bei Verwendung auf dem Stack gesichert
    .equ LCD_FunctionSet    =0b00101110    ;FunctionSet: 0b001 DL N F * *     DL=8/4-Bit, N=1/2 Zeilen, 5x8/5x10  
    .equ LCD_Display        =0b00001000    ;Display Ein/Aus: 0b00001 D C B    D=Display Ein/Aus, C=Kursor Ein/Aus, B=Blinken Ein/Aus
    .equ LCD_EntryMode      =0b00000110    ;Entry Mode Set: 0b000001 I S      I=Kursor Laufrichtung, S=Shift Ein/Aus
    
    
    ;============
    ;Ports konfigurieren
    ;Stack initialisieren, usw
    ;============
    
    
    rcall LCD_initialisieren
    rcall Warte_50ms
    rcall Warte_50ms
    
    ldi LCD_Puffer, 'W'
    rcall LCD_Befehluebergabe
    rcall Warte_50ms
    
    Ende:
    rjmp Ende
    
    
    ;==================================================================
    ;..................................................................
    ;LCD initialisieren - 8-Bit-Modus
    ;..................................................................
    ;==================================================================
    
    LCD_initialisieren:
    
         push LCD_TMP1
         
         ldi LCD_TMP1, 0b00110000
         out LCD_DAT_PORT, LCD_TMP1
         rcall LCD_Enable
         rcall Warte_1ms
         rcall Warte_1ms
         rcall Warte_1ms
         rcall Warte_1ms
         rcall Warte_10us
         
         ldi LCD_TMP1, 0b00110000
         out LCD_DAT_PORT, LCD_TMP1
         rcall LCD_Enable
         rcall Warte_100us
         
         ldi LCD_TMP1, 0b00110000
         out LCD_DAT_PORT, LCD_TMP1
         rcall LCD_Enable
         
         ldi LCD_TMP1, LCD_FunctionSet      ;Function Set
         out LCD_DAT_PORT, LCD_TMP1
         rcall LCD_Enable
         rcall Warte_10us
         rcall Warte_10us
         rcall Warte_25us
         
         ldi LCD_TMP1, LCD_Display          ;Display und Kursor einstellen
         out LCD_DAT_PORT, LCD_TMP1
         rcall LCD_Enable
         rcall Warte_10us
         rcall Warte_10us
         rcall Warte_25us
         
         ldi LCD_TMP1, LCD_EntryMode       ;Entry Mode Set
         out LCD_DAT_PORT, LCD_TMP1
         rcall LCD_Enable
         rcall Warte_1ms
         rcall Warte_1ms
    
    	 pop LCD_TMP1
    
         ret
    
    
    ;==================================================================
    ;..................................................................
    ;LCD Befehl uebergeben
    ;..................................................................
    ;==================================================================
    
    LCD_Befehluebergabe:
         out LCD_DAT_PORT, LCD_Puffer
         cbi LCD_STRG_PORT,LCD_RS
    	 nop
    	 nop
    	 nop
         rcall LCD_Enable
         rcall LCD_BusyFlag
         ret 
    
    
    ;==================================================================
    ;..................................................................
    ;LCD Daten uebergeben
    ;..................................................................
    ;==================================================================
    
    LCD_Datenuebergabe:
         out LCD_DAT_PORT, LCD_Puffer
         sbi LCD_STRG_PORT,LCD_RS
    	 nop
    	 nop
    	 nop
         rcall LCD_Enable
         rcall LCD_BusyFlag
         cbi LCD_STRG_PORT,LCD_RS
         ret 
    
    
    ;==================================================================
    ;..................................................................
    ;LCD Enable-Routine
    ;..................................................................
    ;==================================================================
    
    LCD_Enable:
         sbi LCD_STRG_PORT, LCD_E
    	 nop
    	 nop
    	 nop
         cbi LCD_STRG_PORT, LCD_E
         ret
    
    
    ;==================================================================
    ;..................................................................
    ;LCD Busyflag abwarten
    ;..................................................................
    ;==================================================================
    
    LCD_BusyFlag:
         push LCD_TMP1
         ldi LCD_TMP1, 0b00000000           ;Portpin 7 als Eingang konfigurieren um das BF auszulesen
    	 cbi LCD_STRG_PORT,LCD_RS
         sbi LCD_STRG_PORT,LCD_RW
         out LCD_DDR, LCD_TMP1
         
    LCD_WarteBF:                            ;Warteschleife, wird verlassen sobald Pin 7 gesetzt wird
         sbic LCD_PIN, 7
         jmp LCD_WarteBF
         
         ldi LCD_TMP1, 0b11111111
         out LCD_DDR, LCD_TMP1
         pop LCD_TMP1
         ret

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    47
    Beiträge
    456
    Was für ein Kontroller ist es denn?

    KS0073? HD47780?

    Welcher Mode? 4Bit? (ok, wohl 8 bit)

    Hast du die Kontrastspannung richtig eingestellt?

    Edit: Passt N? muss es 1 sein? 2 zeilen .. richtig?
    .equ LCD_FunctionSet =0b00101110 ;FunctionSet: 0b001 DL N F * * DL=8/4-Bit, N=1/2 Zeilen, 5x8/5x10

    Stimmt die Startadresse an die du schreibst?
    Geändert von schorsch_76 (14.09.2014 um 19:39 Uhr)

  3. #3
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Danke für deine Antwort

    Was für ein Kontroller ist es denn?
    Das ist die Preisfrage.
    Ich hatte mal vor einigen Jahren das gleiche Display, und da schien es ein KS0066U zu sein, allerdings hat das gleiche Programm bei einem neugekauften LCD nicht mehr funktioniert. Der funktionierenden Init nach muß es allerdings ein HD44780 sein.

    Welcher Mode? 4Bit? (ok, wohl 8 bit)
    Genau, 8 Bit.

    Hast du die Kontrastspannung richtig eingestellt?
    Definitiv ja, habs mit nem Poti auch mehrmals durchprobiert.

    Edit: Passt N? muss es 1 sein? 2 zeilen .. richtig?
    Was meinst du mit den ersten beiden Fragen?
    Ja, es ist ein 2x16-LCD. Falsche Verdrahtung/Lötbrücken/fehlerhafte Leitung kann ich ebenso ausschliessen.

    Stimmt die Startadresse an die du schreibst?
    Die wird doch nach "Cursor auf Anfang" automatisch auf die erste Position gesetzt, oder? Den Befehl hab ich auch schon mehrmals ausprobiert.

  4. #4
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    47
    Beiträge
    456
    Ich meine "FunctionSet".
    .equ LCD_FunctionSet =0b00101110 ;FunctionSet: 0b001 DL N F * * DL=8/4-Bit, N=1/2 Zeilen, 5x8/5x10

    - - - Aktualisiert - - -

    Ich habe letzte Woche auch ein Display in Betrieb genommen. Es hat mit der 47780 Init Sequenz nicht funktioniert. Es war ein KS0073. Ich habe dann ein einfaches Programm geschrieben was ohne irgendeine Logic einfach die Bytes rausgejuckelt hat. Dann hatte ich eine Sequenz die funktioniert hat. Allerdings war meines 4 Bit Mode...

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Du hast Recht, das stimmt nicht ganz. Ich hab da auf gut Glück was ausprobiert und es nicht wieder rückgängig gemacht bevor ich den Code gepostet habe.

    Aber mit dem richtigen Wert funktioniert das auch nicht.
    Code:
    .equ LCD_FunctionSet    =0b00111000    ;FunctionSet: 0b001 DL N F * *     DL=8/4-Bit, N=1/2 Zeilen, 5x8/5x10

  6. #6
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    47
    Beiträge
    456
    Kannst du nach der Init Sequenz einfach beliebig viele Zeichen rausschreiben? Dann sollte der Cursor "irgendwann" wieder im sichtbaren Bereich sein. So hatte ich festgestellt, das mein function set nicht richtig war...

    Falls es ein reiner HD47780 ist, hast du mal die Lib von Fleury ausprobiert?

  7. #7
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Ich habe mal ein 'W' in Dauerschleife ins LCD geschickt, das LCD stellt sich immer noch stur:

    Code:
    rcall LCD_initialisieren
    rcall Warte_50ms
    rcall Warte_50ms
    
    Ende:
    cbi PINA, 1
    ldi LCD_Puffer, 'W'
    rcall LCD_Datenuebergabe
    rcall Warte_50ms
    rcall Warte_50ms
    rcall Warte_50ms
    
    sbi PINA, 1
    
    rjmp Ende

    Die Bibliothek von Fleury ist doch C-Code...oder? Ich hab für AVRs gerade keinen C-Compiler zur Hand.

  8. #8
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    47
    Beiträge
    456
    Nach meinem HD47780 Datasheet ist das die richtige Sequenz für den 8 Bit mode ...

    Klicke auf die Grafik für eine größere Ansicht

Name:	2014-09-14_20:06:43.png
Hits:	6
Größe:	86,9 KB
ID:	29048

    Ich hab dein LCD_initialisieren mal angesehen. Ist sicher RS und RW auf 0 bevor du Enable togglest? Schreib hier mal sicherheitshalber 0 raus auf LCD_STRG_PORT...
    Passen auch die DDRs für die beiden Ports?

    Ansonsten ist mir nichts aufgefallen ...

    - - - Aktualisiert - - -

    Ahh .. du wartest nur 4.01ms und nicht 4.1 ms ... zwar wenig unterschied ... aber ... naja ... könnte sein. Mach mal 5 oder 10 draus.

  9. #9
    Erfahrener Benutzer Roboter Genie Avatar von White_Fox
    Registriert seit
    04.10.2011
    Beiträge
    1.473
    Moment...soll RS nicht auf HIGH gezogen werden beim Daten übergeben?

    Ansonsten sind sowohl RS als auch RW auf LOW-Pegel vor der Init auf LOW gezogen.
    Das hier ist das komplette Hauptprogramm:
    Code:
    ;Ports als Ausgang konfigurieren
    ldi R16, 0b11111111
    out DDRC, R16
    out DDRA, R16
    ldi R16, 0b00000000
    out LCD_DAT_PORT, R16
    out LCD_STRG_PORT, R16
    
    ;Stack
    ldi R16, LOW(RAMEND)
    out SPL, R16
    ldi R16, HIGH(RAMEND)
    out SPH, R16
    
    rcall Warte_50ms
    sbi PINA, 0
    
    rcall LCD_initialisieren
    rcall Warte_50ms
    rcall Warte_50ms
    
    Ende:
    cbi PINA, 1
    ldi LCD_Puffer, 'W'
    rcall LCD_Datenuebergabe
    rcall Warte_50ms
    rcall Warte_50ms
    rcall Warte_50ms
    
    sbi PINA, 1
    
    rjmp Ende
    PortA ( da hängen E, RS und RW dran) und PORTC werden komplett mit 0x00 beschrieben, direkt nach der Festlegung der Datenrichtung.
    An A0 und A1 hängen bloß je eine LED.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist Avatar von schorsch_76
    Registriert seit
    25.03.2012
    Ort
    Kurz vor Neuschwanstein
    Alter
    47
    Beiträge
    456
    RS muss beim initialisieren 0 sein. Siehe meinen Anhang. Auch RW.

    - - - Aktualisiert - - -

    Beim Daten schreiben muss RS 1 und RW 0 sein. Aber erst nach der initialisierung.

Seite 1 von 6 123 ... LetzteLetzte

Ähnliche Themen

  1. riesige LCD Probleme
    Von Ineedhelp im Forum AVR Hardwarethemen
    Antworten: 8
    Letzter Beitrag: 23.05.2008, 16:53
  2. Probleme mit LCD
    Von Mr Bean im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 25.10.2007, 10:10
  3. Probleme mit LCD
    Von Jigger im Forum Elektronik
    Antworten: 5
    Letzter Beitrag: 18.02.2007, 14:56
  4. LCD Probleme
    Von dpressedp im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 11.01.2007, 14:56
  5. harte LCD-Probleme
    Von Lemonsquash im Forum Elektronik
    Antworten: 3
    Letzter Beitrag: 21.10.2006, 22:55

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiTime Speicher und Akkus