-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: LCD will nicht so ganz ?!

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    27
    Beiträge
    339

    LCD will nicht so ganz ?!

    Anzeige

    Hallo,
    ich hab jetzt mal wieder so ein typisches Problem von einem Anfänger, bei dem man nicht einmal weiß, woran es denn liegt.
    Ich würde mich sehr freuen, wenn mir einige von euch helfen könnten.

    Ich habe ein LCD und habe noch nie ein solches mit meinem Atmega8 angesteuert. Ich habe jetzt ersteinmal folgende Verbindungen vorgenommen:
    • 1 -> Vss -> GND
      2 -> Vdd-> +5V
      3 -> Vo -> -3V
      4 -> RS -> PC4 am AVR
      5 -> RW -> GND
      6 -> E -> PC5 am AVR
      7 -> DB0-> GND
      8 -> DB1-> GND
      9 -> DB2-> GND
      10-> DB3-> GND
      11-> DB4-> PC0 am AVR
      12-> DB5-> PC1 am AVR
      13-> DB6-> PC2 am AVR
      14-> DB7-> PC3 am AVR

    Wie man vermutlich schon erkennen kann, möchte ich das LCD im 4-Bit Modus ansprechen.
    Wenn ich den Strom am Display anschalte sehe ich auch schwarze Balken, wie es üblich ist und auch soll. Ich kann das Display jedoch nicht ansprechen. Zurzeit verwende ich folgenden Assembler-Code von www.mikrocontroller.net:
    Code:
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ;;                 LCD-Routinen                ;;
    ;;                 ============                ;;
    ;;              (c)andreas-s@web.de            ;;
    ;;                                                    ;;
    ;; 4bit-Interface                                       ;;
    ;; DB4-DB7:       PC0-PC3                      ;;
    ;; RS:                PC4                          ;;
    ;; E:                  PC5                          ;;
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    
     
     
     ;sendet ein Datenbyte an das LCD
    lcd_data:
               mov temp2, temp1             ;"Sicherungskopie" für
                                            ;die Übertragung des 2.Nibbles
               swap temp1                   ;Vertauschen
               andi temp1, 0b00001111       ;oberes Nibble auf Null setzen
               sbr temp1, 1<<4              ;entspricht 0b00010000
               out PORTC, temp1             ;ausgeben
               rcall lcd_enable             ;Enable-Routine aufrufen
                                            ;2. Nibble, kein swap da es schon
                                            ;an der richtigen stelle ist
               andi temp2, 0b00001111       ;obere Hälfte auf Null setzen 
               sbr temp2, 1<<4              ;entspricht 0b00010000
               out PORTC, temp2             ;ausgeben
               rcall lcd_enable             ;Enable-Routine aufrufen
               rcall delay50us              ;Delay-Routine aufrufen
               ret                          ;zurück zum Hauptprogramm
    
     ;sendet einen Befehl an das LCD
    lcd_command:                            ;wie lcd_data, nur ohne RS zu setzen
               mov temp2, temp1
               swap temp1
               andi temp1, 0b00001111
               out PORTC, temp1
               rcall lcd_enable
               andi temp2, 0b00001111
               out PORTC, temp2
               rcall lcd_enable
               rcall delay50us
               ret
    
     ;erzeugt den Enable-Puls
    lcd_enable:
               sbi PORTC, 5                 ;Enable high
               nop                          ;3 Taktzyklen warten
               nop
               nop
               cbi PORTC, 5                 ;Enable wieder low
               ret                          ;Und wieder zurück                     
    
     ;Pause nach jeder Übertragung
    delay50us:                              ;50us Pause
               ldi  temp1, $42
    delay50us_:dec  temp1
               brne delay50us_
               ret                          ;wieder zurück
    
     ;Längere Pause für manche Befehle
    delay5ms:                               ;5ms Pause
               ldi  temp1, $21
    WGLOOP0:   ldi  temp2, $C9
    WGLOOP1:   dec  temp2
               brne WGLOOP1
               dec  temp1
               brne WGLOOP0
               ret                          ;wieder zurück
    
     ;Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
    lcd_init:
               ldi	temp3,50
    powerupwait:
               rcall	delay5ms
               dec	temp3
               brne	powerupwait
               ldi temp1, 0b00000011        ;muss 3mal hintereinander gesendet
               out PORTC, temp1             ;werden zur Initialisierung
               rcall lcd_enable             ;1
               rcall delay5ms
               rcall lcd_enable             ;2
               rcall delay5ms
               rcall lcd_enable             ;und 3!
               rcall delay5ms
               ldi temp1, 0b00000010        ;4bit-Modus einstellen
               out PORTC, temp1
               rcall lcd_enable
               rcall delay5ms
               ldi temp1, 0b00101000        ;noch was einstellen...
               rcall lcd_command
               ldi temp1, 0b00001100        ;...nochwas...
               rcall lcd_command
               ldi temp1, 0b00000100        ;endlich fertig
               rcall lcd_command
               ret
    
     ;Sendet den Befehl zur Löschung des Displays
    lcd_clear:
               ldi temp1, 0b00000001   ;Display löschen
               rcall lcd_command
               rcall delay5ms
               ret
    und
    Code:
    .include "m8def.inc"
    
    .def temp1 = r16
    .def temp2 = r17
    .def temp3 = r18
    
    
               ldi temp1, LOW(RAMEND)      ; LOW-Byte der obersten RAM-Adresse
               out SPL, temp1
               ldi temp1, HIGH(RAMEND)     ; HIGH-Byte der obersten RAM-Adresse
               out SPH, temp1
    
               ldi temp1, 0xFF    ;Port D = Ausgang
               out DDRC, temp1
    
               rcall lcd_init     ;Display initialisieren
               rcall lcd_clear    ;Display löschen
    
               ldi temp1, 'A'     ;Zeichen anzeigen
               rcall lcd_data
    
               ldi temp1, 'B'     ;Zeichen anzeigen
               rcall lcd_data
               
               ldi temp1, 'C'     ;Zeichen anzeigen
               rcall lcd_data
    
               ldi temp1, 'D'     ;Zeichen anzeigen
               rcall lcd_data
    
    loop:
               rjmp loop
    
    .include "lcd-routines.asm"            ;LCD-Routinen werden hier eingefügt
    Leider hat das nichts am LCD verändert. Es sind immernoch nur die Balken zu sehen.

    Ich weiß nicht, ob es an dem Code oder an der Hardware liegt, da mein LCD etwas anders ist. Aus diesem Grund habe ich einmal Datenblatt und Ansteuerhinweis unten angefügt !


    Ich hoffe, dass mir jemand bei meinem Problem helfen kann, da ich gerne mal "normale" Zeichen auf meinem LC-Display sehen möchte.
    **********************
    MFG
    ProgDom
    Angehängte Dateien Angehängte Dateien

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    27
    Beiträge
    339
    Ich dachte mir, das das Interesse an so einem Problem nicht sehr groß sein würde, aber kann sich nicht doch jemand einmal mit dem Problem befassen ?
    Ich wäre sehr sehr dankbar.

    *************
    MFG
    ProgDom

  3. #3
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.02.2005
    Ort
    Salzburg
    Alter
    37
    Beiträge
    464
    Ich kann dir leider nicht helfen, da ich nur in Bascom programmiere.
    In Bascom müsstest du die pins einzeln konfigurieren und dann gehts auch.
    Such einfach mal nach "LCD" im Forum.

    Robert

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    28
    Beiträge
    1.461
    Hi ProgDom

    Ich würde dir ja helfen, aber mit ASM kenne ich mich leider ÜBERHAUPT nicht aus!

    Nur die Standardsachen:
    - Kontrast?!
    - Kabel
    - Spannungen
    - Sicher, dass man für 4-Bit die unteren 4 auf GND legen muss?
    - Dein Atmel noch ganz (hatt ich auch schon, ESD)

    Ganz liebe Grüße,
    Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Mit Bascom hätte ich evtl auch helfen können

    Den Beitrag habe ich schon gelesen, hachdem du das erste mal geschrieben hast.
    Und eigentlich sollte es ja nicht so sein, das sich einige nicht auf das Anfängerniveau runterlassen und deshlab nicht antworten.

    Mal ganz blöd gefragt, die Masse vom LCD ist mit Masse vom AVR verbunden?
    Der Code von MC.net wird wohl richtig sein, wenn er da steht. Und wenndu schwarze Balken auf dem LCD siehst, ist Kontrast auch vorhanden.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    27
    Beiträge
    339
    Das Problem scheint wohl unlösbar zu sein, da ich aufgrund meiner mangelnden Elektronikkenntnisse ein Fehler gemacht habe.

    Marco78 hatte mich bereits vor einiger Zeit darauf hingewiesen, doch irgendwie habe ich deien Antwort leider nie gesehen, sry !!!
    http://www.roboternetz.de/phpBB2/zei...?t=7221&lcd+5v Der letzte Beitrag.
    Ich werde dann mal doch die Schaltung bauen. Blöd nur, dass ich diese wichtige Antwort nie gesehen habe, ärgert mich sehr, aber thx !!!

  7. #7
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    27
    Beiträge
    339
    Ich bin zur Zeit noch am überlegen, ob die Kondensatoren in der Schaltung http://www.roboternetz.de/phpBB2/download.php?id=2305 Kerkos oder Elkos sind ?! Was sollen das denn wohl sein ?

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    28
    Beiträge
    1.461
    HI

    Das sind ELKOs wenn mich nicht alles täuscht!
    Aber wiso willst du einen Temperaturausgleich für deinen Kontrast haben?

    Ganz liebe Grüße,
    Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    22.08.2004
    Ort
    484..
    Alter
    27
    Beiträge
    339
    Das wird kein Temperaturausgleich, sondern eine Möglichkeit ein -5V an die Steuerelektronik eines +5V und GND Atmega8 anzuschließen.
    Weil aufgrund der folgenden Umstände kann man anders ein -5V LCD nicht in die Schaltung integrieren:
    Je nachdem wie das LCD angeschlossen ist, hat man 4 oder 8 Datenleitungen (die Steuerleitungen lassen wir mal außen vor)
    Diese werden mit bestimmten Spannunge angesprochen. Sagen wir mal alles bis 1V ist low und alles über 3V ist High.
    Und diese Spannung bezieht sich auf Masse (GND) und zwar auf die, die am LCD angeschlossen ist.
    Aber diese Masse ist ja schon um 5V positiver als die Masse der restlichen Elektronik.
    Weil die Masse für's LCD im Prinzip ja auch 5V hast.
    Wenn der µC oder was auch immer das LCD anspricht und +5V für High ausgibt, sind das für die LCD-Elektronik nur 0V. Wenn vom µC 0V für Low ausgegeben wird, kommen am LCD -5V an. Weil es unterschiedliche Massepotentiale sind.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.06.2004
    Ort
    Bad Schussenried in Oberschwaben
    Alter
    28
    Beiträge
    1.461
    Hi

    Achso... *oops*
    Müssten Elkos sein!

    Grüße;
    Tobi
    http://www.tobias-schlegel.de
    "An AVR can solve (almost) every problem" - ts

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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