Hallo Leute!
Habe widermal ein problem!
Ich habe mir ein AV1624 Display zugelegt!
Mit der Hilfe des Tutorial habe ich mir eine Code geschrieben.
Jedoch das Display zeigt nur eine Zeile an und diese ist komplett
ausgefüllt!
Dies ist mein code:
;DATUM
;xx
;Version x.x
;######################
;includierte Files
;######################
.include "M16def.inc"
;######################
;Variablen festlegen
;######################
.def TEMP2=R16
.def TEMP1=R17
.def TEMP3=R18
.def temp=R19
;.def x=R20
;#######################
;Interuptadressen
;#######################
rjmp Init ; External Reset
rjmp unusedISR ; External Interupt Request 0
rjmp unusedISR ; External Interupt Request 1
rjmp unusedISR ; Timer/Counter2 Compare Match
rjmp unusedISR ; Timer/Counter2 Oberflow
rjmp unusedISR ; Timer/Counter1 Capture Event
rjmp unusedISR ; Timer/Counter1 Compare Match A
rjmp unusedISR ; Timer/Counter1 Compare Match B
rjmp unusedISR ; Timer/Counter1 Overflow
rjmp unusedISR ; Timer/Counter0 Overflow
rjmp unusedISR ; Serial Transfer Complete
rjmp unusedISR ; USART, Rx Complete
rjmp unusedISR ; USART Data Registry Empty
rjmp unusedISR ; USART, Tx Complete
rjmp unusedISR ; ADC Complete
rjmp unusedISR ; EEPROM Ready
rjmp unusedISR ; Analog Comperator
rjmp unusedISR ; 2-wire Serial Interface
rjmp unusedISR ; External Interrupt Request 2
rjmp unusedISR ; Timer/Counter0 Compare Match
rjmp unusedISR ; Store Programm Memory Ready
;#######################
init:
;#######################
;Ports Initialisieren
;#######################
ldi TEMP, 0xff ;1 Ausgänge, 0 Eingänge
out DDRA, TEMP
ldi TEMP, 0xff ;1 Ausgänge, 0 Eingänge
out DDRB, TEMP
ldi TEMP, 0xff ;1 Ausgänge, 0 Eingänge
out DDRC, TEMP
;ldi TEMP, 0b000000000 ;1 Ausgänge, 0 Eingänge
;out DDRD, TEMP
;ldi TEMP, 0b000000000 ;1 Ausgänge, 0 Eingänge
;out DDRE, TEMP
;#########################
;Interrupt Vector - GICR
;#########################
ldi TEMP,0b00000001
out GICR,TEMP
ldi TEMP,0b00000000
out GICR,TEMP
;#########################
;SFIOR Datenblatt S. 55ff
;#########################
ldi TEMP,0b00000000
out SFIOR,TEMP
;#########################
;External Interrupts - MCUCR - MCUCSR -GICR Datenblatt S. 66ff
;#########################
ldi TEMP,0b00000000 ;Interrupt Sense Control von INT0
andi TEMP,0b00001111
in R17,MCUCR
or TEMP,R17
out MCUCR,TEMP
ldi TEMP,0b00000000
out MCUCSR,TEMP
ldi TEMP,0b00000000
andi TEMP,0b11100000
in R17,GICR
or TEMP,R17
out GICR,TEMP
;#########################
;Timer/Counter0 - TCCR0
;#########################
ldi TEMP,0b00000000
out TCCR0,TEMP
ldi TEMP,0x00 ;Output Compare Register
out OCR0,TEMP
ldi TEMP,0b00000000
out TIMSK,TEMP
;##########################
;Timer/Counter1 - TCCR1A - TCCR1B Datenblatt S. 87ff
;##########################
ldi TEMP,0b00000000
;
out TCCR1A,TEMP
ldi TEMP,0b00000000
andi TEMP,0b11011111
out TCCR1B,TEMP
ldi TEMP,0x00 ;|
out OCR1AH,TEMP ;|Output Compare Register A
;|
ldi TEMP,0x00 ;|
out OCR1AL,TEMP ;|
ldi TEMP,0x00 ;|
out OCR1BH,TEMP ;|Output Compare Register B
;|
ldi TEMP,0x00 ;|
out OCR1BL,TEMP ;|
ldi TEMP,0b00000000
andi TEMP,0b00111100
in R17,TIMSK
or TEMP,R17
out TIMSK,TEMP
;#######################
;STACKPOINTER
;#######################
ldi TEMP, HIGH(RAMEND)
out SPH, TEMP
ldi TEMP, LOW(RAMEND)
out SPL, TEMP
;Display init
;Power on
;#######################
;MAIN
;#######################
ldi temp1, 0xFF ; Port D = Ausgang
out DDRD, 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
;#######################
;Unterprogramme
;#######################
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 PORTD, 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 PORTD, 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 RS=0
mov temp2, temp1
swap temp1
andi temp1, 0b00001111
out PORTD, temp1
rcall lcd_enable
andi temp2, 0b00001111
out PORTD, temp2
rcall lcd_enable
rcall delay50us
ret
; erzeugt den Enable-Puls
;
; Bei höherem Takt (>= 8 MHz) kann es notwendig sein,
; vor dem Enable High 1-2 Wartetakte (nop) einzufügen.
; Siehe dazu Beitrag "Re: Bitte helft mir. Schon wieder AtMega16"
lcd_enable:
sbi PORTD, 5 ; Enable high
nop ; 3 Taktzyklen warten
nop
nop
cbi PORTD, 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 PORTD, 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 PORTD, temp1
rcall lcd_enable
rcall delay5ms
ldi temp1, 0b00101000 ; 4Bit 2 Zeilen 5x8
rcall lcd_command
ldi temp1, 0b00001100 ; Display ein Cursor aus
kein Blinken
rcall lcd_command
ldi temp1, 0b00000100 ; inkrement / kein Scrollen
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
;#######################
;Interrupts
;#######################
;eint_0:
;reti
;eint_1:
;reti
;eint_2:
;reti
unusedISR:
reti
Wäre super wenn mir jemand helfen kann!
Danke
mcrluni
>Ok dann hilft mir halt keiner!
Naja, ASM mögen halt nicht so viele.
Wie hast du dein Display denn angeschlossen ?
Sag jetzt bitte nicht: "Genau wie im Tutorial"
Schau noch mal ganz genau nach. Keine Pindreher drin ?
Kurzschlüsse,offene Leitungen ausgeschlossen ?
Hallo,
schlecht kommentiert, wo ist das Display angeschlossen?
Zur Fehlersuche zu lang, der hanze Timerkram ist für das Display doch
erstmal unnötig, also raus damit, wir lesen das hier schließlich
freiwillig in unserer Freizeit und da ist ewiges Suchen, um Wichtiges
von Unwichtigen zu trennen, eher nervend.
So nach dem Vorwort:
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 PORTD, 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 PORTD, temp2 ; ausgeben
rcall lcd_enable ; Enable-Routine aufrufen
rcall delay50us ; Delay-Routine aufrufen
ret ; zurück zum Hauptprogramm
Ich kann nur vermuten, daß an PD4 RS vom Display liegt,
ein
.equ LCD_RS = PD4
und dann
sbr temp1, 1<<LCD_RS
würde es merklich lesbarer machen.
Wenn ich richtig vermute:
Bei der Ausgabe des unteren Nibble wird RS dann nicht gesetzt!
Weiter habe ich noch nicht geschaut.
Gruß aus Berlin
Michael
Hallo, sorry, ist natürlich so richtig, habe die Zeile einfach übersehen... Daran kann es also nicht liegen. init sieht eigentlich ok aus, RW hast Du fest auf GND gelegt? Das Display hat wirklich einen HD44780 als Controller drauf, nicht einen (oft nur teilweise) kompatiblen? Gruß aus Berlin Michael
Hallo! hab auch bei einem Display das gleiche Problem, nur hat es vorher schon längere Zeit funktioniert. Keine Ahnung warum es nicht mehr funzt... sollte jemand eine Lösung haben, bitte antworten! mfg
Hallo, gerade mal gegoogelt, wenn es das AV1624 von Ana Vision ist, sagt ein kurz-Datenblatt, daß ich gerade gefunden habe, Kontroller wäre ein KS0066 oder kompatibler? Die Initialisierung des KS0066 stimmt nicht 100% mit dem HD44780 überein. Vielleicht hilft Dir das hier weiter: Beitrag "KS0066U oder Ähnliche --- LCD Treiber" Gruß aus Berlin Michael
Also erstmal danke
ok dann versuch ichs nochmal! gg
Code:
; 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 PORTD, 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 PORTD, temp1
rcall lcd_enable
rcall delay5ms
ldi temp1, 0b00101000 ; 4Bit 2 Zeilen 5x8
rcall lcd_command
ldi temp1, 0b00001100 ; Display ein Cursor aus
;kein Blinken
rcall lcd_command
ldi temp1, 0b00000100 ; inkrement / kein Scrollen
rcall lcd_command
ret
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 PORTD, 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 PORTD, 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 RS=0
mov temp2, temp1
swap temp1
andi temp1, 0b00001111
out PORTD, temp1
rcall lcd_enable
andi temp2, 0b00001111
out PORTD, temp2
rcall lcd_enable
rcall delay50us
ret
R/W habe ich vergessen auf GND zu legen, jedoch ändert dies auch nichts.
Restliche belegung:
DB7 - pd3
db6 - pd2
db5 - pd1
db4 - pd0
rs - pd4
e - pd3
Danke für die vorherigen Einträge! Hoffe i könnt mir jetzt weiterhelfen!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.