Atmega8 LCD funzt nicht

K

Klaus-Peter Preuss

Guest
Hallo.
Mit Atmega bin ich Anfänger, habe aber früher Z80 mit Assembler
programmiert.
Als erstes Project will ich eine LCD Anzeige einbinden. Der Atmega8 läuft
mit ext. Quarz(12MHz). PortB Bit0-2 wird für RS;RW;E verwendet, PortD für
die 8 Datenbits. Das Timing der Impulse kann ich mit einem Oszi anzeigen. Es
scheint IO.
Untenstehend das Programm
;
.INCLUDE "m8def.inc" ; mit Portdeklaration
.DEF akku = r16 ; Arbeitsregister
.DEF zaehl_L = r17 ; Zähler Low
.DEF Zaehl_H = r18 ; dto. High
.Def Schl_Z = r19 ; Schleifenzähler

#define takt 12000000
#define ms2 takt/1500
#define ms18 takt/183
#define us120 takt/12000

;RS = B0;RW=B1;E=B2
;Data über DPort
.CSEG ; Programmsegment im Flash
rjmp start ; RESET-Einsprung



.ORG $10 ; Interrupteinspruenge uebergangen
;*******************************************************************


start: ldi akku,LOW(RAMEND); Endadresse des SRAM
out SPL,akku ; nach Stapelzeiger
ldi akku,HIGH(RAMEND)
out SPH,akku
ldi akku,0b00000111 ; Die unteren 3
out DDRb,akku ; sind Steuerungs- Ausgang für LCD
ser akku ;
out DDRD,akku ; ist Ausgang für LCD Daten
rcall LCDini

schlei: ldi schl_z,15 ; 15 x 'A' ausgeben
sl2: ldi akku,'A'
rcall dataus
dec schl_z
brne sl2 ; noch keine 15
ldi akku,$01 ; Display clear
rcall komaus
rcall w2
ldi akku,$02 ; Cursor home
rcall komaus
rcall w2
rjmp schlei ; und nochmal




;*******************************************************************

LCDini: rcall w18 ; 16 ms warten
cbi portb,Pb2 ; E auf low
cbi portB,Pb1 ; RW auf low, LCD liest
cbi portB,Pb0 ; RS auf low, LCD auf Empfang
ldi Akku,$30 ; INIT laut Datenblatt 3x
rcall komaus ; 1.
rcall w2 ; 3 x 2ms = 6ms warten
rcall w2
rcall w2
rcall komaus ; 2.
rcall u120 ; min 238 ľs warten
rcall komaus ; 3.
ldi akku,$38 ; 8 bit 2 Zeilen
rcall komaus
ldi akku,$0e ; Display off
rcall komaus
ldi akku,$01 ; Display clear
rcall komaus
rcall w2
ldi akku,$07 ; Entry mode Set
rcall komaus
ldi akku,$02 ; Cursor home
rcall komaus
rcall w2
ldi akku,$0F ; Display on
rcall komaus
ret


;********************************************************************

komaus: rcall w2 ; 2ms warten
cbi portb,Pb0 ; RS auf Low, LCD soll Kommandos lesen
sbi portb,Pb2 ; E auf High
cbi portb,Pb1 ; RW auf Low
rcall w2
out portd,akku ; Daten ausgeben
; Hier muß noch 1 ľsek gewartet werden.
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cbi portb,Pb2 ; E auf low, Kommando übernehmen
ret

;********************************************************************
; Über R16 werden die Daten ausgegeben
dataus: rcall w2 ; 2ms warten
sbi portb,pb0 ; RS high: Daten
sbi portb,pb2 ; E high
cbi portb,pb1 ; RW auf low, LCD soll lesen
out portd,AKku ; Daten auf Port D
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
cbi portb,pb2 ; E auf low. Daten übernehmen
rcall w2
ret


;********************************************************************
; Zeitverzoegerung

Warte: dec zaehl_L
brne warte
dec zaehl_H
brne Warte
pop zaehl_H ; Register zurück
pop zaehl_L
ret

;********************************************************************
; 18 ms warten
w18: push zaehl_L ; Register retten
push zaehl_H
ldi zaehl_L,low(ms18)
ldi zaehl_h,high(ms18)
rjmp warte

;********************************************************************
; 2 ms warten
w2: push zaehl_L ; Register retten
push zaehl_H
ldi zaehl_L,low(ms2)
ldi zaehl_h,high(ms2)
rjmp warte

;********************************************************************
; ms warten
u120: push zaehl_L ; Register retten
push zaehl_H
ldi zaehl_L,low(us120)
ldi zaehl_h,high(us120)
rjmp warte

;********************************************************************

Kann mir jemand auf die Sprünge helfen?
Schließe ich die LCD Anzeige nur spannungsmäßig an, passiert nichts. Ist das
richtig?
Scließe ich die Ports komplett an, bleibt ebenfalls alles dunkel.
Verwende AVR STudio und Ponyprog.
Danke im voraus
Klaus-Peter
 
Klaus-Peter Preuss schrieb:
Hallo.
Mit Atmega bin ich Anfänger, habe aber früher Z80 mit Assembler
programmiert. Als erstes Project will ich eine LCD Anzeige einbinden.
Welche LCD Anzeige ? Mit welchem Controller ?
Und nein, ich habe den Code nicht durchgelesen ;-)

Kann mir jemand auf die Sprünge helfen?
Schließe ich die LCD Anzeige nur spannungsmäßig an, passiert nichts. Ist das
richtig?
Die LCDs mit HD44780 zeigen eine Art "Testbild" d.h bei z.B. 4 zeiligem
LCD eine Reihe/Balken hell,dann dunkel, hell, dunkel.

Scließe ich die Ports komplett an, bleibt ebenfalls alles dunkel.
Schonmal am Kontrast gedreht ?
Gruß Andy
 
Hallo Andy.
Danke für die schnelle Antwort. Ich wag es gar nicht zuzugeben. Der
Kontrastregler muß ganz auf Anschlag gedreht werden, dann blinkt der Cursor.
Habe zwar vorher schon dran gedreht, aber nie bis zum Anschlag.
Schon ein kleiner Fortschritt. Sonst geht noch nichts. Da kann ich dann
probieren.
Ich habe zwei Anzeigen. Eine mit dem HD44780 und eine mit dem KS0070B. Von
der Initialisierung und Ansteuerung sind sie gleich. Was mich stutzig
machte, war, dass bei keiner was zu sehen war.

Vieln Dank
Klaus-Peter


"Andreas Weber" <spam@tech-chat.de> schrieb im Newsbeitrag
news:43b14c0e$0$26921$9b4e6d93@newsread4.arcor-online.net...
Klaus-Peter Preuss schrieb:
Hallo.
Mit Atmega bin ich Anfänger, habe aber früher Z80 mit Assembler
programmiert. Als erstes Project will ich eine LCD Anzeige einbinden.

Welche LCD Anzeige ? Mit welchem Controller ?
Und nein, ich habe den Code nicht durchgelesen ;-)

Kann mir jemand auf die Sprünge helfen?
Schließe ich die LCD Anzeige nur spannungsmäßig an, passiert nichts. Ist
das
richtig?

Die LCDs mit HD44780 zeigen eine Art "Testbild" d.h bei z.B. 4 zeiligem
LCD eine Reihe/Balken hell,dann dunkel, hell, dunkel.

Scließe ich die Ports komplett an, bleibt ebenfalls alles dunkel.

Schonmal am Kontrast gedreht ?
Gruß Andy
 
In article <43b148ab$0$25464$9b622d9e@news.freenet.de>,
"Klaus-Peter Preuss" <keine@keine.net> writes:
Hallo.
Mit Atmega bin ich Anfänger, habe aber früher Z80 mit Assembler
programmiert.
Es sieht aus als läuft dir der stack weg. Du pushst 1 mal popst dann 2mal.
Deshalb könnte auf dem oszi müll zu sehen sein.
Versuchs mal mit einer blinkenden LED oder benutze einen Ausgang als
trigger in dem momment in dem bestimmte daten anliegen sollen.

;********************************************************************
; Zeitverzoegerung

Warte: dec zaehl_L
brne warte
dec zaehl_H
brne Warte
pop zaehl_H ; Register zurück
pop zaehl_L
ret

;********************************************************************
; 18 ms warten
w18: push zaehl_L ; Register retten
push zaehl_H
ldi zaehl_L,low(ms18)
ldi zaehl_h,high(ms18)
rjmp warte

;********************************************************************
; 2 ms warten
w2: push zaehl_L ; Register retten
push zaehl_H
ldi zaehl_L,low(ms2)
ldi zaehl_h,high(ms2)
rjmp warte

;********************************************************************
; ms warten
u120: push zaehl_L ; Register retten
push zaehl_H
ldi zaehl_L,low(us120)
ldi zaehl_h,high(us120)
rjmp warte

;********************************************************************
--
MFG Gernot
 
Hallo Gernot.

Ist nicht so.
Gepusht wird nur beim Aufruf der Verzögerungsschleife, je nach Verzögerung.
Diese rufen 'Warte' auf, in der wieder gepopt wird.
Scheint noch ein Wurm in der Datau zu sein, den das 'A' bekomme ich nicht
auf die LCD.
Lt. Simulator müßte es klappen. Wahrscheinlich ein Timingproblem.

Danke
Klaus-Peter

"Gernot Fink" <g.fink@gmx.net> schrieb im Newsbeitrag
news:41da54F1ecgl8U1@individual.net...
In article <43b148ab$0$25464$9b622d9e@news.freenet.de>,
"Klaus-Peter Preuss" <keine@keine.net> writes:
Hallo.
Mit Atmega bin ich Anfänger, habe aber früher Z80 mit Assembler
programmiert.

Es sieht aus als läuft dir der stack weg. Du pushst 1 mal popst dann 2mal.
Deshalb könnte auf dem oszi müll zu sehen sein.
Versuchs mal mit einer blinkenden LED oder benutze einen Ausgang als
trigger in dem momment in dem bestimmte daten anliegen sollen.

;********************************************************************
; Zeitverzoegerung

Warte: dec zaehl_L
brne warte
dec zaehl_H
brne Warte
pop zaehl_H ; Register zurück
pop zaehl_L
ret

;********************************************************************
; 18 ms warten
w18: push zaehl_L ; Register retten
push zaehl_H
ldi zaehl_L,low(ms18)
ldi zaehl_h,high(ms18)
rjmp warte

;********************************************************************
; 2 ms warten
w2: push zaehl_L ; Register retten
push zaehl_H
ldi zaehl_L,low(ms2)
ldi zaehl_h,high(ms2)
rjmp warte

;********************************************************************
; ms warten
u120: push zaehl_L ; Register retten
push zaehl_H
ldi zaehl_L,low(us120)
ldi zaehl_h,high(us120)
rjmp warte

;********************************************************************

--
MFG Gernot
 
Klaus-Peter Preuss schrieb:

Hallo Klaus,

<Code abgeschnippelt>

ldi akku,$0e ; Display off
rcall komaus
ldi akku,$01 ; Display clear
rcall komaus
rcall w2
ldi akku,$07 ; Entry mode Set
mach hier mal ein $06. Das unterste Bit ist das SHIFT bit,
das bedeutet deine AAAAs werden nach links rausgeschoben.
Ich hab die Änderung auf $06 gemacht und mal simuliert, sieht dann mit
hapsim so aus:
http://www.tech-chat.de/klaus_peter_lcd.gif
 
Halo NG,
bin erst kürzlich über Hapsim gestolpert:
http://www.helmix.at/hapsim/index.htm
Ist OpenSource und habe es eben das erste mal laufen lassen um
Klaus-Peters Programm zu debuggen. Wäre doch sicherlich einen Eintrag in
die FAQ wert, oder?

Gruß Andy
 
Hallo Andy,

danke für die Hilfe. Habe das HAPSIM heruntergeladen nund werde es
ausprobieren. Eine Anzeige ist inzwischen da, aber noch nicht so, wie ich
mir das vorstelle. Da wird mir HAPSIM sicher helfen.

Ein neues Problem habe ich noch. Habe im DATASegment folgendes angelegt:
..DSEG
OK: .DB "Hallo World "
mit
ld zl,low(ok*2)
ld zh,(high(ok*2)
lpm r16,z+

will ich r16 mit dem Byte, auf das Z zeigt laden. Aber Pustekuchen. Habe
auch in der Simulation Hyroglyphen.

Ich teste mal weiter, wenn Du etwas weißt ? bitte sehr.

Melde mich morgen wieder.

Klaus-Peter

"Andreas Weber" <spam@tech-chat.de> schrieb im Newsbeitrag
news:43b1aa3a$0$26919$9b4e6d93@newsread4.arcor-online.net...
Halo NG,
bin erst kürzlich über Hapsim gestolpert:
http://www.helmix.at/hapsim/index.htm
Ist OpenSource und habe es eben das erste mal laufen lassen um
Klaus-Peters Programm zu debuggen. Wäre doch sicherlich einen Eintrag in
die FAQ wert, oder?

Gruß Andy
 
Klaus-Peter Preuss schrieb:
Hallo Andy,
danke für die Hilfe. Habe das HAPSIM heruntergeladen nund werde es
ausprobieren. Eine Anzeige ist inzwischen da, aber noch nicht so, wie ich
mir das vorstelle.
Kommen nun die AAAAs ?

Ein neues Problem habe ich noch. Habe im DATASegment folgendes angelegt:
.DSEG
OK: .DB "Hallo World "
mit
ld zl,low(ok*2)
ld zh,(high(ok*2)
lpm r16,z+
..CSEG
OK: .DB "Hallo World "

dann mit:

ldi ZL,low(OK)
ldi ZH,high(OK)

Z-Pointer laden und mit:

lpm r16,z+
rcall dataus

Zeichen raushauen. Keine Erklärung hier, selbst nachvollziehen (nur
soviel: DSEG ist SRAM)

Ich teste mal weiter, wenn Du etwas weißt ? bitte sehr.
siehe oben.
Und bitte ToFu abstellen. Man schreibt unter dem zitierten Text weiter.
Ich programmiere übrigens schon seit 2 Jahren die AVRs NICHT mehr in
Assembler sondern in C mit AVR-GCC http://winavr.sourceforge.net/
Möchte auch nicht wirklich zurück, es sei denn es ist sehr zeitkritisch
oder man hat mit dem Resourcen(Ram etc.) zu knapp kalkuliert.
Gruß Andy
 
Klaus-Peter Preuss wrote:


Ich habe zwei Anzeigen. Eine mit dem HD44780 und eine mit dem KS0070B.
Ich würde sowas in C machen, schon allein weil ich kein Atmega-Assembler kann ;)

Jedenfalls war mein erstes "Projekt" auch so eine Ansteuerung, die war in ca. 2h
aufgesteckt und funktionstüchtig (allerdings mit #include <lcd.h> oder so)...

guck Dir mal avr-gcc an, GNU-Software ist einfach gut ;-)
und auf www.linuxfocus.org gibts nette Artikel über die AVRs

mfG
 

Welcome to EDABoard.com

Sponsor

Back
Top