mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Warum funktioniert dieses LCD-Programm nicht?


Autor: Florian Glaser (suffix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe versucht, die Routinen hier ausm Wiki für den 
8Bit-Betriebsmodus umzuschrieben.

PORTD ist der Datenport.
PORTB ist zum kontrollieren von RS und EN da.

Bitte schaut euch einma meine Programme an, fragt bei unlaren Befehlen 
und weißt auf Fehler hin, damit ich einen Sofrware-Fehler ausschließen 
kann, wobei die Hardware funktionieren sollte.
;lcd-routines.asm 

.equ LCD_PORT = PORTD
.equ LCD_CTRL_PORT = PORTB
.equ PIN_EN = 0
.equ PIN_RS = 1
.equ XTAL = 4000000



;LCD enablen
lcd_enable:  sbi LCD_CTRL_PORT, PIN_EN    ; Enable high
             nop                          ; 3 Taktzyklen warten
             nop
             nop
             cbi LCD_CTRL_PORT, PIN_EN    ; Enable wieder low
             ret                          ; Und wieder zurück


;kurze Pause
delay50us:   push r16                     ; 50us Pause
      ldi  r16, ( XTAL * 50 / 3 ) / 1000000
delay50us_:
             dec  r16
             brne delay50us_
      pop  r16
             ret                          ; wieder zurück
 
;Längere Pause für manche Befehle
delay5ms:  push r16                     ; 5ms Pause
      push r17
             ldi  r16, ( XTAL * 5 / 607 ) / 1000
WGLOOP0:     ldi  r17, $C9
WGLOOP1:     dec  r17
             brne WGLOOP1
             dec  r16
             brne WGLOOP0
      pop  r17
      pop  r16
             ret                          ; wieder zurück


 ; Sendet den Befehl zur Löschung des Displays
lcd_clear:
           push  r16
           ldi   r16,0b00000001       ; Display löschen
           rcall lcd_command
           rcall delay5ms
           pop   r16
           ret

 ; Cursor Home
lcd_home:
           push  r16
           ldi   r16,    0b00000010     ; Cursor Home
           rcall lcd_command  
           rcall delay5ms
           pop   r16
           ret
  

 ; Initialisierung: muss ganz am Anfang des Programms aufgerufen werden
lcd_init:
           push  r16
       push   r17
       push  r18
           ldi   r18,6
powerupwait:
           rcall delay5ms
           dec   r18
           brne  powerupwait
           ldi   r16,      0b00000011   ; muss 3mal hintereinander gesendet
           out   LCD_PORT, r16          ; werden zur Initialisierung
           rcall lcd_enable             ; 1
           rcall delay5ms
           rcall lcd_enable             ; 2
           rcall delay5ms
           rcall lcd_enable             ; und 3!
           rcall delay5ms

           ldi   r16,      0b00111000   ; 4 Bot, 2 Zeilen
           rcall lcd_command
           ldi   r16,      0b00001100   ; Display on, Cursor off
           rcall lcd_command
           ldi   r16,      0b00000100   ; endlich fertig
           rcall lcd_command

           pop   r18
       pop   r17
       pop   r16
           ret


lcd_data:

       push  r17
           push  r18

           sbi   LCD_CTRL_PORT, PIN_RS

           out   LCD_PORT, r16           ; ausgeben
           rcall lcd_enable              ; Enable-Routine aufrufen

           rcall delay50us               ; Delay-Routine aufrufen

           pop   r18
           pop   r17
           ret                           ; zurück zum Hauptprogramm


lcd_command:

       push  r17
           push  r18

           cbi   LCD_CTRL_PORT, PIN_RS

           out   LCD_PORT, r16           ; ausgeben
           rcall lcd_enable              ; Enable-Routine aufrufen

           rcall delay50us               ; Delay-Routine aufrufen

           pop   r18
           pop   r17
           ret                           ; zurück zum Hauptprogramm

       .EXIT
;testfile.asm
    .include "m16def.inc"
    .CSEG          ;Flash-Speicher verwenden
    .def akku = r16
    rjmp start        ;Interrupts überspringen
    .ORG $2A
start:   ldi  akku,LOW(RAMEND)  ;Stapel initialisieren
    out  SPL,akku
    ldi akku,HIGH(RAMEND)
    out SPH,akku
    ser akku
    out DDRB,akku
    out DDRD,akku 
    rcall lcd_init
    rcall lcd_clear
    ldi akku,'T'
    rcall lcd_data
loop:  rjmp loop
    .include "lcd_routines.asm"
    .EXIT
[/avrasm]

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert denn das Programm nicht?

Autor: jack (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Quatsch, sollte heißen:
Wie äußert sich denn der Fehler?

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder was macht das Programm und was nicht...

geht z. B. das enable (scope)

Wird das Display initialisiert ?

Gruss Otto

Autor: Suffix (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
 Aso, das hatte ich ganz vergessen. Das display bleibt einfach aus und 
macht nichts. Die enable und die rs leitung gehen 2mal kurz auf high und 
bleiben dann high. Datenleitungen gehen auch mehrmalsauf high und 
bleiben es dann. Sieht so aus, als würde er mitten im programm hängen 
bleiben. Mfg suffix

Autor: ich (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Probier das mal aus

Autor: Florian Glaser (suffix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was braucht man denn für dieses skript für vorraussetzungen an Hardware 
und was muss man wann wohin schreiben, um zb ein einfaches T auszugeben?

Hat noch jemand einen Vorschlag, was bei meinem Skript nicht stimmen 
könnte?

Autor: Stefan Wimmer (wswbln)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Florian Glaser wrote:

>            ldi   r16,      0b00111000   ; 4 Bot, 2 Zeilen

...was sind "4 Bot"??  ;-)

Schaltest Du das Display in den 4-Bit-Modus (sorry, hab' gerade kein 
Datenblatt greifbar)? - dann klappt's mit dem 8-Bit Port nicht so gut...

Autor: Florian Glaser (suffix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
das ist noch aus dem Originaltext. das soll schon 4bit heißen, aebr laut 
http://www.mikrocontroller.net/articles/HD44780 stellt man mit diesem 
befehl den 8bit-modus ein. Mit Display hat 4*20 Zeichen, aber eigentlich 
sollte es doch auch erstmal mit 2 Zeilen klappen?

Ich habe das Originalprogramm für den 4bit-Modus mit entsprechender 
Beschaltung getestet. Das funktionierte wunderbar, das ist es ja, was 
mich frustiert. Mein Programm ist soweit ok?

Autor: Florian Glaser (suffix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner was gefunden?

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

powerupwait:
           rcall delay5ms
           dec   r18
           brne  powerupwait
           ldi   r16,      0b00000011   ; muss 3mal hintereinander 
gesendet
           out   LCD_PORT, r16          ; werden zur Initialisierung
           rcall lcd_enable             ; 1

wenn das Dein Code ist, stimmt es nicht.
Du sendest 3x 0x03, Du musst aber 3x 0x30 also 0b00110000 senden...
Danach die 0x38 ist dann ok.

Gruß aus Berlin
Michael

Autor: Florian Glaser (suffix)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da hast du natürlich recht. Habe ich eben korrigiert, funktioniert 
wunderbar! Danke für eure Hilfe!

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.