Forum: Mikrocontroller und Digitale Elektronik LCD an ATMehga16


von nick01 (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

"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

von nick01 (Gast)


Lesenswert?

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

von Rick Dangerus (Gast)


Lesenswert?

Jein.
IMO sind beim Initialisieren trotzdem Wartezeiten notwendig. Guck mal
im Tutorial oder suche mal bei google (+HD44780 +initsequenz o.ä.).

Rick

von Gerald (Gast)


Lesenswert?

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

von Peter (Gast)


Lesenswert?

Weis jemand wie lange das Enable-Bit gesetzt bleiben muss, dazu steht 
leider nichts genaues im Datenblatt :( ...

von Peter (Gast)


Lesenswert?

Halt, ich habs gefunden.

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

s/Was/Wann/g ;-)

von Jörn P. (jonnyp)


Lesenswert?

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.

von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

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.

von johnny.m (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.