LCD initialisieren mit ATmega8, kann mal einer draufschaun?

OP #918677
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.
#918706
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
#918721
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
Gast #918877
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.
Gast #919075
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.
OP #919250
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.
OP #919281
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.
Persönliche Seite #919301
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.
OP #919775
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  :)

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