Hallo, ich versuche seit zwei Tagen ein Standard-LCD an einem ATMEGA16 zu betreiben und schaffe es einfach nicht. Ich habe mit AVRStudio4 folgendes Programm geschrieben: .include "m16def.inc" .def TEMP = R16 .def DATA = R17 .CSEG RJMP START .ORG $10 START: LDI TEMP,LOW(RAMEND) ;Stack-Initialisierung OUT SPL,TEMP LDI TEMP,HIGH(RAMEND) OUT SPH,TEMP RCALL DINIT LDI DATA,'U' RCALL WRTCHAR RJMP ENDE DINIT: RCALL BUSY LDI DATA,0x38 ;0x38 = 8bit-Mode RCALL WRTCMD LDI DATA,0x0E ;0x0E = Display on, cursor on RCALL WRTCMD LDI DATA,0x02 ;0x02 = cursor at home position RCALL WRTCMD LDI DATA,0x01 ;0x01 = display clear RCALL WRTCMD RET WRTCMD: RCALL BUSY CBI PORTA,PA0 ;RS = 0 -> command ;SBI PORTA,PA2 ;Enable = 1 CBI PORTA,PA1 ;RW = 0 -> write OUT PORTB,DATA ;Kommando aus Register DATA auf PortB ausgeben RCALL PULSE_EN ;CBI PORTA,PA2 ;Enable = 0 RCALL BUSY RET WRTCHAR: SBI PORTA,PA0 ;RS = 0 -> command ;SBI PORTA,PA2 ;Enable = 1 CBI PORTA,PA1 ;RW = 0 -> write OUT PORTB,DATA ;Zeichen aus Register DATA auf PortB ausgeben RCALL PULSE_EN ;CBI PORTA,PA2 ;Enable = 0 RCALL BUSY RET BUSY: CBI PORTA,PA0 ;RS = 0 -> command SBI PORTA,PA2 ;Enable = 1 SBI PORTA,PA1 ;RW = 1 -> read IN R18,PORTB ;PortB in Register R18 ablegen ROL R18 ;Register nach links Rotieren (falls Bit7=1 -> C=1) CBI PORTA,PA2 ;Enable = 0 BRCS BUSY RET PULSE_EN: SBI PORTA,PA2 NOP NOP NOP CBI PORTA,PA2 RET ENDE: RJMP ENDE .EXIT __________________________________________________________ Sieht jemand einen Fehler? Bin für jeden Tipp dankbar!!
"Sieht jemand einen Fehler?" Ja, der Fehler ist: Du hast das Datenblatt nicht gelesen. Da steht nämlich groß und breit die richtige Initsequenz drin und auch, daß zwischen den Kommandos entsprechende Wartezeiten einzufügen sind. Ich glaube auch der RW-Pin muß vor E gesetzt werden. Und vor dem Lesen noch 1 oder 2 NOPs einfügen. Bzw. guck Dir mal meinen ATTiny12 Code an. Da ergibt sich durch das Schieben automatisch eine Wartezeit, so daß ich für die Datenbytes kein Busy-Wait brauche. Die langen Initwartezeiten müssen natürlich mit einer Warteschleife gemacht werden. Peter
Hi Peter, Ich habe das Enablen ja über ein Unterprogramm PULSE_EN gemach - nach dem RS und RW setzen, habe ja ein ";" davor! Die Warteschleife sollte doch entfallen, wenn ich immer das Busy-Flag abfrage, oder? nick01
Jein. IMO sind beim Initialisieren trotzdem Wartezeiten notwendig. Guck mal im Tutorial oder suche mal bei google (+HD44780 +initsequenz o.ä.). Rick
Hallo, also ich habe meine Displays am ATmega 16 zum Laufen gebracht nachdem ich mich an Init-Anweisungen mit den entsprechenden Zeiten vom Datenblatt gehalten habe, als Grundlage habe ich das Datenblatt KS0066U verwendet. Die Displays laufen im 8Bit-Modus und stammen von Reichelt. Wichtig ist das Einhalten der Zeitschleifen, sonst geht garnichts. Gruss Gerald
Weis jemand wie lange das Enable-Bit gesetzt bleiben muss, dazu steht leider nichts genaues im Datenblatt :( ...
> Die Warteschleife sollte doch entfallen, wenn ich immer das Busy-Flag > abfrage, oder? In der Initsequenz steht die Busy-Abfrage noch nicht zur Verfügung. Was Busy frühstens abfragbar ist, steht auch im Datenblatt LCD-Controller.
Das Busy Flag steht schon zur Verfügung, dafür ist es ja da. Aber peter dannegger hat schon Recht mit dem Blick ins Datenblatt. Schau dir mal das Timing Diagramm mit den Zeiten an, die sind im Verleich zu den häufig benutzten Taktfrequenzen der Atmega äußerst lahm (E Cycle Time 1µs). Wenn du deinen MC mit 1MHz oder weniger taktest kommst du vielleicht hin. (Teste das mal). Sonst helfen nur die hier bereits erwähnten Zeitschleifen.
Die Initsequenzen, die ich bisher gesehen habe, legen mir nahe, dass das
Busyflag (BF) in der Initialisierungssequenz nicht von Anfang an zur
Verfügung steht und eigene Wartezeiten unabhängig vom BF notwendig sind.
Zur Verdeutlichung was ich meine, habe ich einen Screenshot aus dem
Datenblatt vom HD44780 angehängt. Ich lese das so, dass die Wartezeiten
>15ms, >4.1ms und >100µs selbst eingerichtet werden müssen.
Hey Leute, der Thread ist mehr als ein Jahr alt... Den hat Peter nur wieder ausgegraben
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.