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?
Hi, danke für die schnelle Antwort erstmal. Also das Programm hab umgestellt auf den 32.
Die Pinbelegung für das LCD habe ich identisch mit dem 8 gemacht, also für das LCD.
>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.
void lcdInit() { // Port D = Ausgang DDRD=0xff; PORTD=0; // warten bist LCD-Controller gebootet waitMs(50); // SOFT-RESET PORTD = 0b00110000;// 0x30; sbi(PORTD,3); cbi(PORTD,3); waitMs(5); PORTD = 0b00110000;// 0x30; sbi(PORTD,3); cbi(PORTD,3); waitMs(1); PORTD = 0b00110000;// 0x30; sbi(PORTD,3); cbi(PORTD,3); waitMs(5); // 4-BitModus einschalten PORTD=0x20; // Schreibsignal sbi(PORTD,3); cbi(PORTD,3); waitMs(5); // ab hier im 4-Bit-Modus lcdCmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit lcdCmd(0x06); // Entry Mode lcdOn(); lcdClear(); } hier mal die init
das komische ist halt dass nur die erste Zeile mit gefüllten Kästchen dargestellt wird.
>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!
Also JTAG hab ich abgeschaltet. Die Frequenz ist 3,6864 MHZ. Hier mal den Code: #define F_CPU 3686400 #include <avr\io.h> ////////////////////////////////////// // LCD ////////////////////////////////////// void lcdSend(char data) { // aktuelles RS ermitteln char rs=PORTD; rs&=4; // High-Teil senden char tmp=data; tmp&=0xf0; tmp|=rs; PORTD=tmp; // Schreibsignal sbi(PORTD,3); cbi(PORTD,3); // Low-Teil senden tmp=data; tmp&=0x0f; tmp*=16; tmp|=rs; PORTD=tmp; // Schreibsignal sbi(PORTD,3); cbi(PORTD,3); // verarbeiten lassen waitMs(1); } //---------------------------------------------------------------------- ----- // lcdCmd(..) - sendet ein Kommando an LCD // PE: cmd=Kommando-Byte //---------------------------------------------------------------------- ----- void lcdCmd(char cmd) { cbi(PORTD,2); // RS löschen = Kommando lcdSend(cmd); // senden } //---------------------------------------------------------------------- ----- // lcdWrite(..) - sendet ein Zeichen (Daten) an LCD // PE: text=Zeichen //---------------------------------------------------------------------- ----- void lcdWrite(const char text) { sbi(PORTD,2); // RS setzen = Daten lcdSend(text); // senden } //---------------------------------------------------------------------- ----- // lcdWrite(..) - sendet eine Zeichenkette an LCD // Die Zeichenkette muss mit 0x00 abgeschlossen sein // PE: pText=Zeiger auf Zeichenkette //---------------------------------------------------------------------- ----- void lcdWrite(const char* pText) { while(pText[0]!=0) { lcdWrite(pText[0]); pText++; } } //---------------------------------------------------------------------- ----- // lcdWrite(..) - sendet eine Zeichenkette an LCD // PE: pText=Zeiger auf Zeichenkette // count=Anzahl der zu sendenden Zeichen //---------------------------------------------------------------------- ----- void lcdWrite(const char* pText, int count) { while(count!=0) { lcdWrite(pText[0]); pText++; count--; } } //---------------------------------------------------------------------- ----- // lcdHome(..) - Cursor auf Position 1,1 //---------------------------------------------------------------------- ----- void lcdHome() { lcdCmd(0x02); waitMs(2); // warten } //---------------------------------------------------------------------- ----- // lcdClear(..) - löscht die Anzeige im LCD //---------------------------------------------------------------------- ----- void lcdClear() { lcdCmd(0x01); waitMs(2); // warten } //---------------------------------------------------------------------- ----- // lcdOn(..) - schaltet das LCD an //---------------------------------------------------------------------- ----- void lcdOn() { lcdCmd(0b00001100);//0x0E);Cursor aus } //---------------------------------------------------------------------- ----- // lcdOff(..) - schaltet das LCD aus //---------------------------------------------------------------------- ----- void lcdOff() { lcdCmd(0x08); } //---------------------------------------------------------------------- ----- // lcdGoto(..) - setzt die Cursorposition // PE: row = Zeile 1..2 // col = Spalte 1..16 //---------------------------------------------------------------------- ----- void lcdGoto(int row, int col) { row--; // Null-basierend row&=0x01; // sicherheitshalber row*=0x40; // Zeile nach Bit 6 bringen col--; // Null-basierend col&=0x0f; // sicherheitshalber char tmp=row|col; tmp|=0x80; // Cursor setzen lcdCmd(tmp); // senden /* switch(row) { case 1: row=0x00; break; case 2: row=0x40; break; case 3: row=0x14; break; default: case 4: row=0x54; } col--; if(col>19) col =19; char tmp=row|col; tmp|=0x80; lcdCmd(tmp); */ } //---------------------------------------------------------------------- ----- // lcdInit(..) - Schaltet die Ports und Initialisiert das LCD //---------------------------------------------------------------------- ----- void lcdInit() { // Port D = Ausgang DDRD=0xff; PORTD=0; // warten bist LCD-Controller gebootet waitMs(50); // SOFT-RESET PORTD = 0b00110000;// 0x30; sbi(PORTD,3); cbi(PORTD,3); waitMs(5); PORTD = 0b00110000;// 0x30; sbi(PORTD,3); cbi(PORTD,3); waitMs(1); PORTD = 0b00110000;// 0x30; sbi(PORTD,3); cbi(PORTD,3); waitMs(5); // 4-BitModus einschalten PORTD=0x20; // Schreibsignal sbi(PORTD,3); cbi(PORTD,3); waitMs(5); // ab hier im 4-Bit-Modus lcdCmd(0x28); // Funktions-Set: 2 Zeilen, 5x7 Matrix, 4 Bit lcdCmd(0x06); // Entry Mode lcdOn(); lcdClear(); } int main(){ lcdInit(); while(1){ //menu_(); lcdGoto(1,1); lcdWrite("Test"); } return 0; }
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.
>Gleicher Effekt wie zuvor.
D0-D3 vom LCD liegen auf GND. War das beim Atmega8 auch so?
Lass die mal in der Luft hängen. Ich schliess die nie an.
>Ich versuchs mal, war aber beim 8er au so.
Dann lass das so und such nach Kurzschlüssen oder
schlechten Lötstellen.
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
Hi
>Aber warum sind die Balken in der ersten Zeile?
Das Display wird nicht initialisiert.
MfG Spess
>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.
Aber was kann das sein, das Layout hab ich ja mal angehängt, für das LCD ist ja nicht viel dran.
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
In der Zeit, in der ich deine Software überprüft habe, hast Du ja schon das Layout gepostet.Hätte viel Zeit gespart!
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.
Die WaitMs() müßte in der <avr\io.h> stehen. Habe ich nicht selbst geschrieben.
>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.
Passt es vom Layout her, oder habe ich da die Ports falsch angeschlossen? Meiner Meinung her nicht.
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.
RS = 1 => Data (merkwürdig-aber o.k.) Ich hatte das umgekehrt in Erinnerung(ist schon lange her!)
> 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
Ja da hat du recht habs grad nochmal nachgeprüft. Danke dass es dir aufgefallen ist. Was passiert eigentlich wenn man den RESET weg läßt?
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 ;-)
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.