Hallo zusammen! Ich weiss, "schon wieder einer mit ner typischen Anfängerfrage". Aber ich hab die Forensuche benutzt und bin zu keinem Ergebnis gekommen. Aaaalso: Ich brauche für einen bestimmten Zweck einen Atmega8 mit LCD. Dazu hab ich mir das STK500 mit ausreichend ATmega8s, falls ich was fraggen sollte und ein HD44780-"kompatibles" Display mit Controller vom Pollin besorgt ( http://www.pollin.de/shop/dt/MDg0OTc4OTk-/Bauelemente/Aktiv/Displays/LCD_Modul_DATAVISION_DV_20208.html Pinbelegung unter http://www.pollin.de/shop/downloads/D120519D.PDF ). Diese weicht etwas vom Standard ab. Nun ein 8pin-Datenkabel entsprechend der Anleitung im Tutorial und den Angaben auf dem pdf verlötet und auf PortD aufgesteckt. Die Routinen zur Ansteuerung und ausgabe des "test"-Textes auf den Controller gepackt und ablaufen lassen. Erwartungsgemäß hat es nicht auf Anhieb funktioniert. Was passiert ist Folgendes: Nach Einschalten des LCDs wird die obere Zeile schwarz (uninitialisierter Zustand, soweit ok). Resette ich den atmega8 und lasse mein Programm laufen, so wird das Display geleert, also ein Display clear ausgeführt. Keine Anzeige, kein Cursor, nix. Zuerst habe ich die Wartefunktion verlängert, um träges reagieren auszuschliessen, hat nix gebracht. Dann habe ich mein Debugging so versucht, dass ich die relevanten Befehle in der Funktion "lcd_init" einzeln auskommentiert und geändert habe. Ich rufe nur die "lcd_init" auf, um andere Sachen auszuschliessen. Nach dem dreifachen Initialisieren des LCD wird "0b00000010" (4bit modus) und "0b00101000" als Befehl gesendet. Danach ist das display leer. Es wird keine "display_clear" ausgeführt. Versuche, den Cursor an und blinkend zu schalten ("0b00001111" nach dem init mit 4bit, 5x7 Zeilen) oder irgendwas auszugeben, erbrachten kein Resultat. Könnt ihr mir bitte helfen? Bin nach ca 1 Woche rumtüfteln echt ratlos.
Das Display hat 20 Pins, PortD hat 8, eine Versorgung min.2. Aber wer ist mit wem verbunden? Poste Schaltbild und Code damit man weis über was man redet ;) avr
Sorry, du hast natürlich recht. Die lcd_routines ist bis auf lcd_init unverändert aus dem Tutorial übernommen. Pinbelegung sollte selbsterklärend sein. Ich hab ein Steckbrett mit 9V batterie, mach mir mit Vorwiderstand 5,7v fürs backlight, Kontrast auf Masse, kann man gut erkennen. die 5V-Schiene mache ich mir mit der Stromversorgung aus Tutorial 1.1.2.
Wenn du den Kontrast direkt auf GND hast ist die Wahrscheinlichkeit das du nichts siehts sehr groß. Ich nehme an das im Tutorial da ein Poti eingezeichnet ist.
Gehts nur mir so oder sieht man den ASM Code wirklich durch die rosa Brille;) Wie kommt das 0xFF 0xFE an den Anfang der Datei?
>Gehts nur mir so oder sieht man den ASM Code wirklich durch die >rosa Brille;) Wie kommt das 0xFF 0xFE an den Anfang der Datei? Boah und eine Million Nullbytes;) Schick das lcd_routines.asm nochmal.
@ Bene Ries (psychodead) >Die lcd_routines ist bis auf lcd_init unverändert aus dem Tutorial >übernommen. Dir ist hoffentlich klar, dass dein Programm KEINERLEI Textausgabe macht. Nur den Init, der löscht das LCD. MFG Falk
Okay, danke für die Antworten 1. Kontrast auf GND: Sollte kein Problem sein, ich seh genug (schwarzer balken zu Beginn). Da muss scheints nur Spannung drauf, wenns zu dunkel ist. @holger: Ihr sprecht in Rätseln! Nullbytes sind leere Zeilen oder watt? @Falk: Eigentlich sollte lcd_init mit Zeile 137: ldi temp1, 0b00001111 ; Display on, Cursor on, Cursor blink doch einen blinkenden Cursor hinterlassen? Auch wenn ich danach mit lcd_data irgendwas ausgeben will, wie das im Tut vorgeführt ist, tut sich nüscht. ( http://www.mikrocontroller.net/sourcecode/tutorial/lcd-test.asm )
>@holger: Ihr sprecht in Rätseln! Nullbytes sind leere Zeilen oder watt?
Deine lcd_routines.asm ist im Arsch. Die geht so nie und nimmer durch
den Assembler. Womit hast du die bearbeitet?
Ähm, das AVM studio, textedit, notepad++ . Ich hab beide Dateien mit den Originalen aus dem Tut ersetzt. Ändert aber nichts am Ergebnis. Sind die so okay?
Originalroutine: lcd_data: mov temp2, temp1 ; "Sicherungskopie" für ; die Übertragung des 2.Nibbles swap temp1 ; Vertauschen andi temp1, 0b00001111 ; oberes Nibble auf Null setzen sbr temp1, 1<<4 ; entspricht 0b00010000 (Anm.1) out PORTD, temp1 ; ausgeben rcall lcd_enable ; Enable-Routine aufrufen ; 2. Nibble, kein swap da es schon ; an der richtigen stelle ist andi temp2, 0b00001111 ; obere Hälfte auf Null setzen sbr temp2, 1<<4 ; entspricht 0b00010000 out PORTD, temp2 ; ausgeben rcall lcd_enable ; Enable-Routine aufrufen rcall delay50us ; Delay-Routine aufrufen ret ; zurück zum Hauptprogramm Deine Routine: lcd_data: push temp2 push temp3 mov temp2, temp1 ; "Sicherungskopie" für ; die Übertragung des 2.Nibbles swap temp1 ; Vertauschen andi temp1, 0b00001111 ; oberes Nibble auf Null setzen sbr temp1, 1<<PIN_RS ; entspricht 0b00010000 in temp3, LCD_PORT andi temp3, 0x80 or temp1, temp3 out LCD_PORT, temp1 ; ausgeben rcall lcd_enable ; Enable-Routine aufrufen ; 2. Nibble, kein swap da es schon ; an der richtigen stelle ist andi temp2, 0b00001111 ; obere Hälfte auf Null setzen sbr temp2, 1<<PIN_RS ; entspricht 0b00010000 or temp2, temp3 out LCD_PORT, temp2 ; ausgeben rcall lcd_enable ; Enable-Routine aufrufen rcall delay50us ; Delay-Routine aufrufen pop temp3 pop temp2 ret ; zurück zum Hauptprogramm Am besten steigst du mal auf das Original um und versuchst dann erstmal zu verstehen was da gemacht wird.
Funktioniert die HEX Datei im Anhang? Ist für dein Pinout compiliert.
Naja, die Funktion von lcd_data ist ja schön erklärt: die beiden Teile des zu übertragenden Bytes einzeln in 4bit-Brocken an den Controller schicken. Der Unterschied (die zweite Funktion ist auch original, nur nach dem "Code aufräumen" Einschub) ist eben die Benutzung der Konstanten PIN_RS, die aber auch 4 ist. Aber worauf willst du hinaus? Sie tun im Prinzip doch dasselbe? Bei deiner .hex passiert Folgendes: nach ca 4 sec wird das Display gelöscht, der Ursprungszustand mit der oberen Zeile komplett schwarz erscheint nach weiteren 3sec wieder.
Ich tu mir generell schwer dabei, die Sache zu debuggen. Wie kann ich denn dabei vorgehen? Der Code scheint ja iO zu sein, aber wie kann man schrittweise dem hd44780-Controller seine Initialisierung beibringen und Prüfen, ob die Einzelschritte erfolgreich waren?
>Der Code scheint ja iO zu sein, aber wie kann man schrittweise dem >hd44780-Controller seine Initialisierung beibringen und Prüfen, ob die >Einzelschritte erfolgreich waren? Wenn zwei verschiedene Programme nicht laufen, liegt es wohl nahe das das LCD nicht korrekt angeschlossen ist. Meine HEX Datei kommt von einem C Programm;)
Bene Ries schrieb: > Ich tu mir generell schwer dabei, die Sache zu debuggen. Wie kann ich > denn dabei vorgehen? Du könntest zb die LCD Leitungen mit zusätzlichen LED bestücken (zb direkt am LCD) und dann im Programm nach jeder Ausgabe aufs Port eine Wartezeit von ein paar Sekunden einbauen. Das ist dann ein 'Poor mans Logic-Analyzer'. Aber seis drum: Zumindest kannst du nachverfolgen welche Signale in welcher Reihenfolge kommen und daraus dann deine Schlüsse ziehen.
Also ich habe die Verdrahtung des LCDs nochmals überprüft und auch durchgemessen, ob keine kalten Lötstellen oder so drin sind. Das ist soweit alles iO. Einen neuen Atmega8 hab ich auch eingesetzt, um einen beschädigten Controller auszuschliessen. Beim Test mit Holgers Code und dem Originalcode trat etwas Merkwürdiges auf: Nach dem Initialisieren zeigte Das Display kurzzeitig in beiden Reihen einige Zeichen, ne Menge "<" sowie anderen Kram. Dieses Verhalten konnte ich aber nicht reproduzieren. Sehr merkwürdig...?! Da es mir langsam schlicht zu dumm wird, hab ich mir Displays mit Original HD44780 und nicht nur "kompatiblen" Controller bestellt. Irgendwie hab ich das Ding im Verdacht, dass es nicht genau das macht was es soll.
>Bei deiner .hex passiert Folgendes: nach ca 4 sec wird das Display >gelöscht, Das könnte das Delay mit 255ms sein. Programmiert für 16MHz. Falls dein uC mit internem 1MHz RC läuft passt die Zeit. Das Display wird gelöscht, also ist die Reset Sequenz in Ordnung. > der Ursprungszustand mit der oberen Zeile komplett schwarz >erscheint nach weiteren 3sec wieder. Vieleicht macht dein 9V Block mit der Hintergrundbeleuchtung nach kurzer Zeit schlapp. Mach die mal ab. Und dann stell mal eine Kontrastspannung < 1V ein. Nicht direkt an Masse! Dann ist alles schwarz.
Hallo Holger! AFAIK hab ich den auf 4Mhz laufen, kann mich aber auch irren. Ich hab die Hintergrundbeleuchtung weg und mit ner Spannungsweiche an den Kontrast 0,45V gelassen. Ergebnis dasselbe. Ich kann durchaus Zeichen erkennen, siehe das merkwürdige Zahlengehäxel. Daran liegts also nicht. Hab den 9V mal im betrieb durchgemessen, der hatte noch 7,8V (ist ein Akku, kann auch voll aufgeladen nur 8,4V haben. Danke für Deine Hilfe, hoffentlich klappts mit dem Original-hd44780! P.S.: Die Fußball-WM-Verrückten auf der Strasse vor meiner Wohnung beginnen mir mit ihrem Geschrei langsam auf den Sack zu gehen :-/
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.