Forum: Mikrocontroller und Digitale Elektronik LCD initialisieren mit ATmega8, kann mal einer draufschaun?


von Oliver D. (smasher)


Lesenswert?

Hallo,


ich habe ein kleines Problem.
Ich habe mir ein Programm zum initialisieren eines LC Displays im 4 Bit 
Modus geschrieben.
Es ist alles ordentlich angeschlossen und die Zeitabständer bei 16Mhz 
quarz mit AVR delay loop berechnet.

Leider geht das Display nur in den 1 Zeilen Modus und der Kursor blinkt.
Zur Kontrolle habe ich Leds angeschlossen und mir den Status zwischen 
einzelnen Befehlen anzuzeigen (also um zu sehen ob das Programm 
durchläuft).
Das geht für meinen Geschmack aber viel zu schnell. Und zwar so schnell, 
dass man es garnicht mitbekommt :(



Vielleicht kann es sich ja mal einer anschauen. Ich habe mir große Mühe 
zu geben ordentlich zu bleiben und gut zu kommentieren!


Dankeschön.

von Der M. (steinadler)


Lesenswert?

Code???

von Oliver D. (smasher)


Angehängte Dateien:

Lesenswert?

Anhang

von Oliver D. (smasher)


Lesenswert?

Und, keiner ne idee?

Habe versucht mich exakt an die wartezeiten zu halten bzw. diese eher zu 
verlängern.

von Thomas E. (feldweg)


Lesenswert?

Funktioniert ein Atmega8 mit 16MHz???
ich hab mir gedacht der geht nur bis 8MHz

von Oliver D. (smasher)


Lesenswert?

Ja denk schon.

von Thomas E. (feldweg)


Lesenswert?

ich wollt vorgestern meinen auch mit einem 16MHz betreiben, weil ich nur 
den einen quarz hatte aber ich hab
1. bei den Fuses-Einstellungen nicht 16MHz gefunden und
2. Im Internet auch nicht

ich kann es aber auch übersehen haben

als lösung würde ich an der Stelle den Internen takt auf 8 MHz stellen 
und dann mal ausprobieren... natürlich prog auch umändern

mfg

von Oliver D. (smasher)


Lesenswert?

hmm
Also im Datenblatt steht, dass er es kann!

von holger (Gast)


Lesenswert?

Du sprichst das Display nicht richtig an.
Schau dir deine Enable Routine noch mal an bzw. vergleiche hiermit:

http://www.mikrocontroller.net/articles/AVR-Tutorial:_LCD

von Thomas E. (feldweg)


Lesenswert?

Stimmt, auf Seite 25 englische Version.

Ausschnitt:
For resonators, the maximum frequency is 8 MHz with CKOPT unprogrammed 
and
16 MHz with CKOPT programmed.

CKOPT??
Ich kenn die Einstellung nicht aber würd mal darauf tippen...das da was 
fehlt

mfg

PS: Wenn ich schmarn schreibe tuts ma leid^^ bin noch nicht da checker

von Oliver D. (smasher)


Lesenswert?

Hi holger,

kannst du mir vielleicht genauer sagen, wo es harpert?

Ich bin nach der Anleitung von Sprut.de vorgegangen und habe so auch ein 
LC an meinem AT89S52 ans laufen bekommen.
Da funktioniert alles einwandfrei!

von Oliver D. (smasher)


Lesenswert?

Ja, coole sache.

von Oliver D. (smasher)


Lesenswert?

Keiner ne genaue ahnung woran es liegen könnte?

von autoexec (Gast)


Lesenswert?

CKOPT ist ein Fuse-Bit. Man kann ATMega8 meiner Erfahrung nach 
problemlos mit 16MHz (und sogar auf 20MHz übertaktet) betreiben. CKOPT 
muss dabei aber aktiviert sein, sonst läuft der AVR instabil (hatte ich 
auch schon).
16MHz gibt es aber nicht als Einstellung bei den Fusebits, das geht nur 
mit ext. Takt oder Quarz.

von holger (Gast)


Lesenswert?

>Hi holger,
>kannst du mir vielleicht genauer sagen, wo es harpert?

Schau doch noch mal genau hin (als Beispiel nur die erste Ausgabe):

    ldi temp, 0b00000011   ;Display 8 bit
    out lcd_port, temp     ;Daten aufs port legen
    rcall enable_routine   ;Daten ans Display �bergeben

Dann setz mal statt "rcall enable_routine" den Code dafür ein.
Die delays hab ich hier fürs bessere hinsehen weggelassen.

  ldi temp, 0b00000011   ;Display 8 bit
  out lcd_port, temp     ;Daten aufs port legen
  ldi temp, 0b10000000 ; Enable auf high setzen
  out lcd_port, temp   ; Aufs port schreiben

Fällt dir da gar nichts auf? Klar, Enable wird high, aber
was ist mit den Daten die du vorher ausgegeben hast?

Von einer zweifachen 4 Bit Ausgabe für Daten und Kommandos
nach dem Software Reset sehe ich auch nichts.

von Oliver D. (smasher)


Lesenswert?

Das mit der ausgabe nach der initialisierung ist mir erstmal garnicht 
wichtig!


Wichtig ist erstmal das display ans laufen zu bekommen.

Und ich stehe gerade leider aufm schlauch, was du mit " fällt dir 
garnichts auf" meinst.

Ich schreibe genau nach sprut.de anleitung die daten aufs display.

von Jürgen S. (starblue) Benutzerseite


Lesenswert?

Du überschreibst die Daten auf dem Port beim Enable.
Vielleicht ist der AVR ja schneller als der AT89, und die Hold-Time 
reicht nicht mehr.

Jürgen

von Oliver D. (smasher)


Lesenswert?

Achsoo,

sorry, das ist mir vorhin auch aufgefallen.

Mitlerweile habe ich es so stehen:
enable_routine:
      rcall short_delay
        sbi LCD_PORT,enable
      rcall short_delay
        cbi LCD_PORT, enable
      rcall short_delay

Ich bekomme das Display nun einigermaßen ans laufen.
Ich bekomme ne zweite Zeile angezeigt und kann auch das Blinken des 
Cursors ein und ausschalten.

Ein Zeichen gesendet bekomme ich aber nicht.

Ist es unbedingt notwendig, erst 2 Zeilig zu aktiveren, dann display 
ausschalten, display löschen, dann kursoreinstellung/shift einstellen 
und dann das display wieder einzuschalten?
Also damit das display ordentlich funktioniert?


Ich habe wie gesagt an position 0 einen kursor der blinkt, aber wenn ich 
ein zeichen sende, wird keines angezeigt und er springt auch nicht nach 
rechts.

von Simon K. (simon) Benutzerseite


Lesenswert?

Oliver D. wrote:
> Ist es unbedingt notwendig, erst 2 Zeilig zu aktiveren, dann display
> ausschalten, display löschen, dann kursoreinstellung/shift einstellen
> und dann das display wieder einzuschalten?
> Also damit das display ordentlich funktioniert?

Die 100%ig korrekte Methode steht in dem Datenblatt deines Controllers

> Ich habe wie gesagt an position 0 einen kursor der blinkt, aber wenn ich
> ein zeichen sende, wird keines angezeigt und er springt auch nicht nach
> rechts.

Falls HD44780: Hast du denn RS entsprechend gesetzt/gelöscht? Dadurch 
unterscheidet der Controller ob Daten/Kommandos reinkommen.

von Oliver D. (smasher)


Lesenswert?

Jop ich setze dann RS und starte die enable routine.

von Oliver D. (smasher)


Lesenswert?

Sooo habe die Nase jetzt voll.
Damals hatte ich auch so blöde Timingprobleme als ich den AT89S52 
genutzt habe!

Ich nehme mir jetzt mal mein Oszi und Messe die Zeiten exakt aus.
Das hatte damals auch Besserung gebracht ;)

von Oliver D. (smasher)


Angehängte Dateien:

Lesenswert?

So, jetzt funktionierts.

Habe die Wartezeiten mal genau ausgemessen.


Lag wohl nur am Timing :(
Zum Glück klappts jetzt :)

von holger (Gast)


Lesenswert?

>Lag wohl nur am Timing :(
>Zum Glück klappts jetzt :)

Wirklich? Dein Code sieht immer noch scheisse aus.

von spess53 (Gast)


Lesenswert?

Hi

Kann Holger nur zustimmen.

>  ldi temp, 0b10000000 ; Enable auf high setzen
>  out lcd_port, temp   ; Aufs port schreiben

Für jedes andere Projekt unbrauchbar!

MfG Spess

von Oliver D. (smasher)


Lesenswert?

@holger:

Wieso?



@Spess:

Genau das habe ich geändert.

von spess53 (Gast)


Lesenswert?

Hi

Du überschreibst um ein Bit zu setzen, den gesamten Port. Mag zwar jetzt 
funktionieren. Aber wenn da noch andere Sachen dranhängen geht das nicht 
mehr.

MfG Spess

von holger (Gast)


Lesenswert?

>Genau das habe ich geändert.

Aber nicht in dem Code den du angehängt hast ;)

von Oliver D. (smasher)


Lesenswert?

Sorry, war wieder nicht der aktuelle Code ;)


Also ich habe mir jetzt mal angewöhnt dann z.B.folgendes zu nutzen:

sbr temp, 1<<rs
, wobei dann rs bei mir pin 4 ist, den ich oben unter .equ stehen habe.
Ich hoffe, dass das zum besseren Stil beiträgt, denn die anderen pins 
werden ja nicht angerührt  :)

von spess53 (Gast)


Lesenswert?

Hi

Wenn die Adresse deines IO-Registers <32 ist, kannst du direkt mit 'sbi' 
und 'cbi' auf die Bits zugreifen. Beachte aber, daß die Bitadressierung 
anders als bei 'sbr/cbr' ist.

MfG Spess

von uCWorld (Gast)


Lesenswert?

Also,

sbi PORTD, 1
ergibt 0b00000010

cbi PORTD, 4
ergibt 0bxxx0xxxx

korrekt?

von Oliver D. (smasher)


Lesenswert?

Ok :)

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.