Hallo,
ich habe an einen Mega32 ein 2x16 LCD angeschlossen, und zwar an PORT D.
Das Display zeigt aber nur die erste Zeile mit ausgefüllten Kästn an,
die zweite ist dunkel. Das Programm hab ich vom meinem Mega8 übernommen,
dort hat alles funktioniert. Weiß jemand warum es beim 32 nicht geht,
also auf die Pinbelegung habe ich geachtet.
>Weiß jemand warum es beim 32 nicht geht,
Das Programm ist falsch.
>also auf die Pinbelegung habe ich geachtet.
Das haben schon viele gesagt;) Programm auch für
Atmega32 compiliert?
>Taktung? Evtl. stimmen Delays nicht mehr.
Oder Wackelkontakt, Kurzschluß, Display kaputt, CPU kaputt, Pins
vertauscht,
Programm falsch. Ohne weitere Infos wie Pinbelegung und Sourcecode
kann man nichts mehr dazu sagen.
>das komische ist halt dass nur die erste Zeile mit gefüllten Kästchen>dargestellt wird.
Das ist nicht komisch, das LCD wird nicht initialisiert.
Pins falsch angeschlossen oder Timing stimmt nicht.
BTW: Ich schaue mir nur vollständige Codes mit kompletter
Pinbelegung an. Vieleicht schicke ich dir dann sogar
eine HEX mit der du mal probieren kannst ob nicht doch
Pins falsch angeschlosssen sind.
-die "schwarzen Kästchen" sind ein Indiez, das das LCD nicht
initialisiert wurde.
Du gibst keine Auskunft über die CPU-Frequ., daher ist es nicht möglich,
Deine Delay-Zeiten einzuordnen.
Ebenso die Funktion lcdCmd . Wie realisiert?(SPI?);
Und noch ein Tip zu gerne gemachten Fehlern.-die Fuses.
-oder JTAG noch dran. oder...weis der Fuchs was!
Das hier
> sbi(PORTD,3);> cbi(PORTD,3);
macht schon mal die geforderte Mindest-E-Pulslänge von 500 µs nicht,
selbst nicht bei dem relativ langsamen Takt von ca. 3 MHz.
>macht schon mal die geforderte Mindest-E-Pulslänge von 500 µs nicht,
Nu übertreib mal nicht;) 500ns tuns auch.
>Muss ich die Zeit verlängern?
Ja. Versuch mal die HEX im Anhang.
Andy schrieb:> Also JTAG hab ich abgeschaltet.> Die Frequenz ist 3,6864 MHZ.
Hast du die kontrolliert?
> waitMs(1);
Die Funktion waitMs würde ich gerne mal sehen
>Wie müßte die Initialisierung aussehen? Oder was hab ich falsch gemacht?
Bis auf das zu kurze Timing bei Enable nicht.
Wenn mein Code bei dir nicht läuft, dann stimmt was mit der
Hardware nicht.
Hab auch schon Displays getauscht und wo anders getestet. Was ich
festgestellt habe ist wenn ich ein 4 Zeiliges ranhänge ist die erste
Zeile und die dritte mit Kästchen gefüllt????????????
>Aber was kann das sein, das Layout hab ich ja mal angehängt, für das LCD>ist ja nicht viel dran.
Prüf die Leitungen mal auf Kurzschluss zu GND. GND geht da ja recht
knapp unter der Leiste vorbei. Ansonsten mal testen ob eine
Leitung gar keinen Kontakt hat.
Hi
>Was ich festgestellt habe ist wenn ich ein 4 Zeiliges ranhänge ist die erste>Zeile und die dritte mit Kästchen gefüllt????????????
Weil beide Zeilen für den Displaykontroller zu ersten Zeile zählen. Also
das gleiche Ergebnis wie bei einem zweizeiligen.
MfG Spess
-mal sehen:
RS oder Command/Data bei Dir PD2;
CLK oder Clock PD3;(oder CS?)
R/W wahrscheinlich fest verdrahtet auf Write?
CE oder Chip enable auch fest verdrahtet, worauf auch immer?
RS = 1 => Data (merkwürdig-aber o.k.)
Für Dich wäre es ein leichtes gewesen, die Pinbelegung ebenfalls
darzustellen, -ich musste erst suchen!
PD4-7 Datenport;
Welches Display?
Nehme mal an , die INI-Routine stimmt(lt.Datenblatt)
Die Funktion lcdSend() wird sowohl für Kommandos als auch für Daten zum
Datentransfer benutzt, sodas RS ausmaskiert wird um dann entsprechend
"verodert" zu werden.
Einen Chip-enable sehe ich nicht, -aber Du sagst ja, die Software läuft!
Auf den ersten Blick, --o.K.;
Blieben die Fuses?
Was für ein Display ist denn das?(4x20) --Typ/Bezeichnung;
OK.
Klartext.
Die gefüllten Kästchenzeilen malt das Display immer hin!
Die sind so etwas wie eine Einschaltkontrolle. Solange das LCD keine
vernünftige Initialisierung von deinem Programm bekommen hat, macht es
diese Kästchenzeilen hin. Zb auch deshalb, damit man erst mal den
Kontrast am LCD einstellen kann und weiß, dass es an ist.
Daher: Wundere dich nicht über die Kästchenzeilen.
Die sagen nur aus, dass dein LCD nicht richtig initialisiert ist. Das
kann wegen Timing sein, das kann sein, weil eine Leitung nicht richtrig
verbunden ist, das kann sein weil du einen Anschlussfehler hast.
Und nein: komm jetzt nicht damit, das am Mega8 auch alles gleich war.
Irgendwas ist anderes. Sonst würde dein LCD nämlich funktionioeren. QED
Hi
>Einen Chip-enable sehe ich nicht, -aber Du sagst ja, die Software läuft!
Text-LCDs haben normalerweise kein explizites CS. Die Steuerleitungen
sind RS, R/W und E.
MfG Spess
Ist ein Blau/Weiß Display.
Ich wundere mich nur weil ich alles so angeschlossen hab wie beim 8er.
Und jetzt habe ich eben den Verdacht dass es beim 32er anders sein muss.
Die leitungen habe ich alle Überprüft. Direkt vom Controller zum Display
gemessen. Die stimmen.
Nochmal.
Wie sieht die waitMs aus?
Hast du die Taktfrequenz überprüft?
> Und jetzt habe ich eben den Verdacht dass es beim 32er anders sein muss.
Diesen Verdacht kannst du ad acta legen.
>Und jetzt habe ich eben den Verdacht dass es beim 32er anders sein muss.>Die leitungen habe ich alle Überprüft. Direkt vom Controller zum Display>gemessen. Die stimmen.
Wirklich? Auch keine Kurzschlüsse zwischen den Pins?
Im Anhang mal eine Datei die für 16MHz compiliert wurde.
Damit sollte es keinerlei Timing Probleme geben.
Und du benutzt jetzt erstmal nur diese Datei zum testen.
Um deinen Code kümmern wir uns später.
Andy schrieb:> Die WaitMs() müßte in der <avr\io.h> stehen. Habe ich nicht selbst> geschrieben.
ALso in meinem io.h ist keine drinnen.
Wozu auch. Die mitgelieferten Funktion heisst _delay_ms und ist in
delay.h
Andy schrieb:> Hat das etwas zu bedeuten auf dem Controller steht Mega32 16PU
Du suchst an den völlig falschen Stellen.
Du kannst es ruhig glauben:
Entweder deine Hardware oder deine Software ist fehlerhaft.
Du deine Software nicht schlecht aussieht und auch auf einem Mega8
funktioniert hat, wird es wohl die Hardware sein. Kurzschluss,
Kabelbruch, kalte Lötstelle. Irgend sowas.
Andy schrieb:> Passt es vom Layout her, oder habe ich da die Ports falsch> angeschlossen? Meiner Meinung her nicht.
Dein Code ist zwar maximal unübersichtlich, aber IMHO müsste er mit der
Pinbelegung übereinstimmen.
An deiner Stelle würde ich aber mit Testprogrammen die Pinbelegung
durchprobieren. Den RS Pin auf 1 und mit dem Voltmeter kontrollieren, ob
am LCD auch wirklich nur der RS Pin auf 1 gegangen ist.
Dassselbe dann mit dem E Pin und den Datenpins.
Alle anderen Pins müssen jeweils auf 0 bleiben.
>Bei der Projektgenerierung hast du auch sicher Mega32 eingestellt?
Ist uninteressant wenn er meine HEX Datei benutzt.
Wir drehen uns sonst im Kreis.
>Ja aber durchgemessen hab ich alles.
Kann ich nicht so recht glauben.
>Funktioniert immer noch nicht.
Du hast ein Hardwareproblem wenn meine HAX Datei nicht funktioniert.
Such den Fehler dort. Vieleicht ist dein Atmega32 am PORTD inzwischen
tot.
So, noch mal zum abchecken:
ALLE, und ich meine ALLE Leitungen folgendermaßen
durchmessen:
1) Kurzschluß auf GND
2) Leitungen haben Verbindung vom uC Sockel bis zum LCD
3) Es gibt keine Kurzschlüsse zwischen den Leitungen
4) Trenn die Leitungen D0-D3 am LCD doch mal auf.
Noch ein paar Fragen:
Das LCD was du jetzt benutzen möchtest hat am Atmega8 funktioniert?
Welches LCD genau ist das?
holger schrieb:>>Bei der Projektgenerierung hast du auch sicher Mega32 eingestellt?>> Ist uninteressant wenn er meine HEX Datei benutzt.> Wir drehen uns sonst im Kreis.
holger.
Kannst du bitte auch das C File zur Anschaung posten, damit der Rest
einen Überblick hat, was du abtestest.
> Du hast ein Hardwareproblem
Denk ich auch.
Irgendwo eine kalte oder einen kurzen.
> Such den Fehler dort. Vieleicht ist dein Atmega32 am PORTD inzwischen> tot.
Wenn sich nichts weiter ergibt: Vorschlag - Ein möglichst einfaches
Testprogramm, dass nur die 0x03 samt RS und E-Toggle rausgibt. Und zwar
im 5 Sekundentakt, damit man mit dem Voltmeter mitkommt.
> Ist uninteressant wenn er meine HEX Datei benutzt.> Wir drehen uns sonst im Kreis.>holger.>Kannst du bitte auch das C File zur Anschaung posten, damit der Rest>einen Überblick hat, was du abtestest.
Bitte sehr. Das nehm ich wenn ich den Anfängern mal schnell
ne HEX zum probieren bastel. Es gibt schönere LCD Libs.
So ich hab den Fehler. Ersteinmal Danke an alle für die guten Tipps und
Hilfen. Habe das Datenblatt des 32er noch bisle studiert und etwas
gefunden. Es war der RESET-Widerstand, beim 8er habe ich ein 10k
genommen und so auch beim 32er, im Datenblatt steht aber RESET 30-50k.
Habe dann mal den RESET durchgezwickt und siehe da es kommt Text.
Vielen Dank nochmal an alle!!!!!!
Hi
>Es war der RESET-Widerstand, beim 8er habe ich ein 10k>genommen und so auch beim 32er, im Datenblatt steht aber RESET 30-50k.>Habe dann mal den RESET durchgezwickt und siehe da es kommt Text.
Falsche Interpretation. So wie ich das sehe, geht dein Resetwiderstand
nach
Masse und nicht nach VCC.
MfG Spess
Hi
>Was passiert eigentlich wenn man den RESET weg läßt?
Das RESET-Pin hat einen internen Pull-Up (die von dir oben erwähnten
30-50k).
In bestimmten Umgebungen kann das etwas zu groß sein und der Controller
macht durch Störungen unkontrollierte Resets. Mit einem kleineren
externen Pull-Up, und evtl. einem Kondensator nach GND, lässt sich das
vermeiden.
MfG Spess
Na das nenne ich mal die Platzhirsche hier an der Nase herumgeführt. Den
anstehenden Reset jedenfalls hatte niemand im Blick, obgleich schon alle
Standardfehler aufgezählt wurden.
kann passieren, zeigt nur das man gar nicht so simpel denken kann wie es
machmal kommt. Nach dem Proggen hat keines deiner Programme auch nur
einen Wank gemacht.
hehe
Deshalb lasse ich immer irgendwo ne sinnlos Led als Living ligth
blinken.
Zur Not missbrauche ich den Pin der für die Hintergrundimmung gedacht
ist und lasse den blinken ;-) so weis ich das was läuft.
Auch das Oszi ist stets in Reichweite um aktivitäten auf den Ports zu
testen.
MfG Winne ;-)