LCD an ATMehga16

Gast #230804
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!!
#230805
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
Gast #230806
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
Gast #230808
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
Gast #468424
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.
#468498
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.
Gast #468546
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.
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren