Mega32 LCD geht nicht

Gast #1813245
Lesenswert?

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.
Gast #1813262
Lesenswert?

>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.
Gast #1813265
Lesenswert?

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
Gast #1813279
Lesenswert?

>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.
Gast #1813286
Lesenswert?

-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!
Gast #1813297
Lesenswert?

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;
}
Gast #1813356
Lesenswert?

>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.
Gast #1813372
Lesenswert?

>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.
Gast #1813375
Lesenswert?

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
Gast #1813376
Lesenswert?

-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;
#1813379
Lesenswert?

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
Gast #1813387
Lesenswert?

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.
Angehängte Dateien:
Gast #1813405
Lesenswert?

>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.
Angehängte Dateien:
#1813407
Lesenswert?

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.
#1813426
Lesenswert?

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.
Gast #1813430
Lesenswert?

>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?
#1813435
Lesenswert?

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.
Gast #1813466
Lesenswert?

> 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.
Angehängte Dateien:
Gast #1813638
Lesenswert?

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!!!!!!
Gast #1813661
Lesenswert?

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
Gast #1813703
Lesenswert?

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
(Firma: Nisch-Aufzüge) Persönliche Seite #1813905
Lesenswert?

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 ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren