Forum: Compiler & IDEs 2te Zeile des Displays nach Reset weg


von Thomas (Gast)


Lesenswert?

Hej,

Ich habe folgendes Problem, dass ich nachdem ich meinen Code via 
AVRStudio und AVRISP MKII in einem ATmega32 übertrage, alles 
funktioniert wie es soll.
Also erste sowie zweite Zeile des Displays wird korrekt angezeigt.

Nachdem ich aber das Programmierkabel ziehe und den Strom einmal aus- 
und anschalte ist die zweite Zeile verschwunden! Hat jemand schonmal so 
ein Problem gehabt und weiss wie man das lösen kann?

Zur Ansteuerung des Displays benutze ich Peter Fleurys lib. Danke 
hierfür an ihn!

Ausgabe erfolgt in Code folgendermaßen:
1
lcd_init(LCD_DISP_ON);  // display initialisiert, cursor off
2
lcd_clrscr();  //display löschen
3
lcd_puts("Hallo\n");
4
nms_pause(1000);  // Sekunde Wartezeit
5
...
6
lcd_clrscr();
7
lcd_puts("Codetyp waehlen:\n");
8
lcd_puts("Code0");

wobei hier z.B. Code0 nicht sichtbar ist nach Reset. Davor schon :(

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Das Problem könnte ein Timingproblem sein.

Der LCD-Controller hat ein eigenes (Hardware-)Reset bei Power-On. Das 
Zeitverhalten beim Power-On kann mit/ohne Programmierkabel 
unterschiedlich sein, wenn die Versorgungsspannung unterschiedlich 
schnell hochfährt. Daten dazu stehen im LCD-Datenblatt.

Dein Software-Reset (lcd_init) sollte nach der (Hardware-)Reset-Sequenz 
einsetzen. Es kann sein, dass du ohne Programmierkabel zu früh lcd_init 
aufrufst und Teile des Software-Resets nicht beachtet werden, weil der 
LCD-Controller noch in der (Hardware-)Reset-Sequenz steckt.

Ich würde mal vor lcd_init eine Wartezeit einbauen.

von Thomas (Gast)


Lesenswert?

Habe mal nach deinem Tipp 10Sekunden vor lcd_init(LCD_DISP_ON); 
gewartet, hat allerdings leider nichts geholfen :/

Beim Display handelt es sich um das LCD 162C BL von Reichelt.

ABER, durch Dich angespo*rnt hab ich noch ein bischen rumprobiert und 
meinen Fehler gefunden und zwar mag das Display es scheinbar ungern wenn 
man den Displayport initialisiert. Und zwar hatte ich das folgendermaßen 
gemacht:
1
void init()
2
{
3
  //Datenrichtung festlegen
4
  DDRA = 0xfe;   // PortA 4-7 Ausgang ( debugLEDs), PA3 & PA1 Ausgang ( unbenutzt ), PA2 Ausgang ( Sender ), PA0 Eingang (Receiver)  
5
  DDRB = 0xff;   // PortB Ausgang, Standard auf HIGH, da unbenutzt bis auf ICSP
6
  //DDRC = 0xff;   // PortC Ausgang -> LCD Ansteuerung( PD7 unbeschaltet )
7
  DDRD = 0xC0;  // PortD Eingang bis auf unbeschaltete PD6 & PD7
8
  
9
  //Ausgangswerte festlegen
10
  PORTA = 0xff;  // alles HIGH bis auf PA0, da Eingang -> intern PullupAktiv  
11
  PORTB = 0xff;  // alles HIGH, ausser ICSP unbenutzt
12
  //PORTC = 0xff;  // alles HIGH, PD7 unbeschaltet
13
  PORTD = 0;     // PD6 & PD7 auf LOW für Rest interner PullupDeaktiv da schon Pullup extern realisiert 
14
15
  //LCD-Initialisieren
16
  PORTA &= ~(1<<LED_RT1);  // init beginn
17
  //nms_pause(1000);
18
  lcd_init(LCD_DISP_ON);  // display initialisiert, cursor off
19
  lcd_clrscr();  //display löschen
20
  lcd_puts("Hallo\n");
21
  nms_pause(1000);  // Sekunde Wartezeit
22
  PORTA |= (1<<LED_RT1);  //init komplett
23
}

Das Display hängt an PORTC und zeigte die 2te Zeile nicht an wenn die 
Deklarationen DDRC = 0xff; und PORTC = 0xff; nichtauskommentiert waren. 
Jetzt ohne diese 2 Zeilen funktionierts. Das Delay vor lcd_init war auch 
nicht nötiig.
Warum jetzt allerdings bei gleichem Code der ISPStecker einen 
Unterschied macht, weiss ich immernoch nicht :D

Danke Dir!

von Thomas (Gast)


Lesenswert?

das Wort anges....t mag das Forum nicht, es enthält Spam, erkennbar an 
dem Teilwort zwischendrin :D deswegen das *

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
Noch kein Account? Hier anmelden.