mikrocontroller.net

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


Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Code???

Autor: Oliver D. (smasher)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anhang

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und, keiner ne idee?

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

Autor: Thomas Eichstetter (feldweg)
Datum:

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

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja denk schon.

Autor: Thomas Eichstetter (feldweg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hmm
Also im Datenblatt steht, dass er es kann!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Eichstetter (feldweg)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, coole sache.

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Keiner ne genaue ahnung woran es liegen könnte?

Autor: autoexec (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jürgen S. (starblue) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jop ich setze dann RS und starte die enable routine.

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: Oliver D. (smasher)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So, jetzt funktionierts.

Habe die Wartezeiten mal genau ausgemessen.


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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Lag wohl nur am Timing :(
>Zum Glück klappts jetzt :)

Wirklich? Dein Code sieht immer noch scheisse aus.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@holger:

Wieso?



@Spess:

Genau das habe ich geändert.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Genau das habe ich geändert.

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

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht 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  :)

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: uCWorld (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also,

sbi PORTD, 1
ergibt 0b00000010

cbi PORTD, 4
ergibt 0bxxx0xxxx

korrekt?

Autor: Oliver D. (smasher)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.