mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD initialisierung atmega 8 in asm


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!!!

Sorry für den hundertausendsten Post um die Initialisierung eines LCD´s. 
Vielleicht will mal jemand über das Programm schauen, denn die 
Initialisierung funktioniert nicht und ich finde den Fehler leider 
nicht. Das Display bleibt nach dem Laden "weiß" und zeigt weder einen 
Cursor, noch ein blinken, noch sonstiges. Die Codes habe ich aus der 
Tabelle des TUT.
Die LCD routine (nein, das komplette programm) aus dem TUT funktioniert 
einwandfrei, also gehe ich davon aus, das die Hardware stimmt.

ok, ich hoffe ihr könnt mir weiterhelfen, bin hier fast am verzweifeln, 
danke schonmal im voraus.

Gruß, gast

Autor: Gast (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
habe ich den anhang vergessen?!

ups

Autor: Karl B. (gustav)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Der Micha (steinadler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In deinem Prog fehlen doch die Interruptroutinen (also wenigstens ein 
RETI). Ich hab nichtmal ein .ORG gefunden.

Autor: Karl B. (gustav)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, so wie ich es sehe, wird RS-Bit erst direkt gesetzt und dann auch 
mit  swap eventuell durch die Daten am Port wieder gelöscht, oder?:
Ich würde auch erst im "zweiten" Durchgang swappen. Ports werden von 0 
aus gezählt?
Meine Überlegung:
Also erst Daten, dann RS high, dann Enable high-low, etwas Pause, dann 
RS low. Pause für Busy.

Dein Prog:
sbi PORTD, PIN_RS //RS = high; daten
         mov r18, r17
         swap r17
         andi r17, 0b00001111
         out PORTD, r17 //daten auf ausgang

(Wozu setzt Du Port B und C als Eingänge?
Ist mir zunächst nicht klar.  Aber - egal...)

Mein Vorschlag zur Güte:
.......

.def temp = r18
.def temp1 = r19

.equ impuls = portd
.equ daten = portb
Datenuebernahme:

mov  temp1, temp    ;"Kopie" des Wertes aus  temp
; fuer ;weitere ;Operation unten
andi   temp, 0b11110000  ;unteres Nibble ausblenden
out   daten, temp
sbi   impuls, 1   ; RS setzen
sbi  impuls, 0   ; Enable high
rcall  Verzoegerung
cbi  impuls, 0   ; Enable low
rcall    Verzoegerung
cbi  impuls, 1   ; RS löschen
swap   temp1      ;Nibble-Vertauschen, Wert
;aus ;temp ;kopiert, s.o.
andi  temp1, 0b11110000           ;unteres Nibble ausblenden
out  daten, temp1    ;unteres Nibble aus temp1
sbi   impuls, 1   ; RS setzen
sbi  impuls, 0   ; Enable high
rcall  Verzoegerung
cbi  impuls, 0   ; Enable low
rcall  Verzoegerung
cbi   impuls, 1   ; RS löschen
rcall Verzoegerung
ret

Autor: Oliver D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich weiß das gerade ein LCD für den Anfänger eine kleine Herausforderung 
ist, da LCDs ein recht genaues timing erfordern.
Wenn du einen HD44780 controller benutzt, schlage ich dir vor mehrere 
Delay schleifen zu erzeugen.
Einmal 16ms, einmal 5ms einmal 2ms und ein "short_delay" mit vielleicht 
20 nops.


Bei mir waren bisher immer timingfehler schuld.
Wenn das display erstmal initialisiert ist, ist der rest ein 
kinderspiel.



Also erstmal ordentliches timing machen :)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver D. wrote:
> ich weiß das gerade ein LCD für den Anfänger eine kleine Herausforderung
> ist, da LCDs ein recht genaues timing erfordern.

Quatsch, das Timing ist völlig unkritsich.

Du mußt nur die Mindestzeiten einhalten, das ist alles.
Wenn da z.B. 46µs steht, sollten es mindestens 46µs sein, also 100µs 
geht auch.
Es hat natürlich keinen Zweck, statt 100µs 10ms zu schreiben, das ist 
reine Zeitverschwendung (schadet aber nicht, sondern macht Deinen MC nur 
träge).

Kurz und gut, Du mußt Dir als allererstes mal ein Delaymacro schreiben, 
was mit der Definition der Taktfrequenz die als Argument übergebene Zeit 
minimal verbraucht.


> ein "short_delay" mit vielleicht
> 20 nops.

Das ist Bullsh**, was sollen denn die 20 NOPs sein?
1µs bei 20MHz, 20µs bei 1MHz oder wie.

Der Assembler hat nen Präprozessor und den läßt Du es richtig 
ausrechnen.
Pi * Daumen 20 NÖPchen hi und da, muß einfach schief gehen.

Fange bloß nicht an, irgendwelche Schleifenzähler in Stein zu meißeln, 
d.h. statt der Formel direkt den Wert für XX MHz einzutragen.
Dann fängst Du nämlich bei Quarz = YY MHz nochmal ganz von vorne an.


Ist zwar schon uralt:

Beitrag "AVR: Delay 7 ... 65542 Zyklen"


Peter

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.