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
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