-
        

Ergebnis 1 bis 4 von 4

Thema: LCD Problem

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.03.2005
    Ort
    gerne in den Bergen
    Alter
    33
    Beiträge
    429

    LCD Problem

    Anzeige

    Hallo Leute

    ich habe wieder einmal ein problem! mein LCD ist "blind". bzw zeigt nichts an...

    mein testprogramm besteht aus dem Tutorial von mikrocontroller.net. Das einzige das ich geändert habe, ist den Ausgangsport auf PORTB umgestellt! Aber ich habe jetzt bereits alles (kontrast, verkabelung, ISPmkII abgesteckt...) überprüft und es funktioniert immer noch nicht!

    Der Enable Pin ist auf dem gleichen wie MOSI! könnte das mein Fehler sein???


    Code:
    .include "m16def.inc"
     
    .def temp1 = r16
    .def temp2 = r17
    .def temp3 = r18
    
    
    .equ LCD_PORT = PORTB
    .equ LCD_DDR  = DDRB
    .equ PIN_E    = 5
    .equ PIN_RS   = 4
    
    
     
     
               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 LCD_DDR, temp1
     
               rcall lcd_init     ; Display initialisieren
               rcall lcd_clear    ; Display löschen
     
     
               ldi temp1, 'T'     ; Zeichen anzeigen
               rcall lcd_data
     
               ldi temp1, 'e'     ; Zeichen anzeigen
               rcall lcd_data
               
               ldi temp1, 's'     ; Zeichen anzeigen
               rcall lcd_data
     
               ldi temp1, 't'     ; Zeichen anzeigen
               rcall lcd_data
     
    loop:
               rjmp loop
    
    
    
    
     
     ;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<<PIN_RS         ; entspricht 0b00010000
               out LCD_PORT, 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<<PIN_RS         ; entspricht 0b00010000
               out LCD_PORT, 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 LCD_PORT, temp1
               rcall lcd_enable
               andi temp2, 0b00001111
               out LCD_PORT, temp2
               rcall lcd_enable
               rcall delay50us
               ret
     
     ; erzeugt den Enable-Puls
    lcd_enable:
               sbi LCD_PORT, PIN_E          ; Enable high
               nop                          ; 3 Taktzyklen warten
               nop
               nop
               cbi LCD_PORT, PIN_E          ; 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   temp1, 0xFF            ; alle Pins am Ausgabeport auf Ausgang
               out   LCD_DDR, temp1
     
               ldi   temp3,6
    powerupwait:
               rcall delay5ms
               dec   temp3
               brne  powerupwait
               ldi   temp1,    0b00000011   ; muss 3mal hintereinander gesendet
               out   LCD_PORT, 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   LCD_PORT, temp1
               rcall lcd_enable
               rcall delay5ms
               ldi   temp1, 0b00101000      ; 4 Bot, 2 Zeilen
               rcall lcd_command
               ldi   temp1, 0b00001100      ; Display on, Cursor off
               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
     
     ; Sendet den Befehl: Cursor Home
    lcd_home:
               ldi   temp1, 0b00000010      ; Cursor Home
               rcall lcd_command
               rcall delay5ms
               ret

  2. #2
    Benutzer Stammmitglied
    Registriert seit
    23.03.2007
    Beiträge
    38
    Der Enable Pin ist auf dem gleichen wie MOSI! könnte das mein Fehler sein???
    So lange der SPI interface ausgeschaltet ist und wie gesagt der Programmer nicht angeschlossen sind steht die ganze PORTB als normale i/o port zur verfügung.

    Martin.

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    15.03.2005
    Ort
    gerne in den Bergen
    Alter
    33
    Beiträge
    429
    ja SPI ist ausgeschalten... tja vielleicht sollte ich weiter tüfteln, wenn ich meine aufnahmeprüfung bestanden habe! aber ich gebe nicht auf!
    könnte es auch sein dass die Befehle doch nicht kompatibel zu meinem lcd sind! es ist zwar HD447... kompatibel!!!

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    23.03.2007
    Beiträge
    38
    Das LCD hat bestimmt einen typen-nummer darauf: damit kann mann meist einen datenblatt finden und dann die befehlsatz vergleichen mit was im programm zum LCD geht, ob es also 44780 kompatibel ist. Auch die LCD anschlusse wurde ich vergleichen mit der wiki.

    Auch zu beachten: bei 4 bit modus wirden LCD anschlusse DB4 bis DB7 benützt und die sind verbunden mit PB0 bis PB3 (kann schon verwirrend sein).

    Martin.

Berechtigungen

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