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