Forum: Mikrocontroller und Digitale Elektronik LCD Display funktioniert nur wenn ich den uC Flashe


von C. H. (hedie)


Angehängte Dateien:

Lesenswert?

Guten Morgen zusammen....


Ich habe ein bisschen ein merkwürdiges Problem.

Auf meinem Print habe ich einen Atmega16 mit einem 12Mhz Quarz.
Dazu ein Display mit einem KS0066 Controller welches ich im 4Bit Mode 
betreibe.


Nun das Problem. Wenn ich Aus Eclipse mit AVRDude den uC Flashe, so 
funktioniert das Display zu 90% einwandfrei. Wenn ich danach jedoch den 
ISP anschluss entferne und wieder anstecke (Power Off -> On) dann geht 
das Display nicht mehr. Es initialisiert sich (Balken sind weg) aber es 
zeigt keinen Text an.

Flashe ich den Controller wieder dann geht es wieder. Jedoch nur direkt 
nach dem Flashen. Am Controller liegt es nicht, denn der macht den Rest 
welcher nach dem LCD Init kommt problemlos. Das Display ist auch nicht 
defekt, habe es auf einem Anderen Print getestet.

Hoffe ihr habt tipps...

Anbei der Schaltplan

Hier die Initialisierung
1
#define LCD_RW_1  PORTC |= (1<<PC3)
2
#define LCD_RW_0  PORTC &= ~(1<<PC3)
3
#define LCD_RS_1  PORTC |= (1<<PC2)
4
#define LCD_RS_0  PORTC &= ~(1<<PC2)
5
#define LCD_E_1    PORTB |= (1<<PB4)
6
#define LCD_E_0    PORTB &= ~(1<<PB4)
7
8
///////////////////Port Konfiguration
9
// Ist in wirklichkein im main drinn
10
11
DDRA = 0x00;
12
DDRB = 0x1C;
13
DDRC = 0xFF;
14
DDRD = 0xB0;
15
16
17
void send_char(unsigned char ucData)
18
{
19
  LCD_RW_0;  //Write
20
  LCD_RS_1;  //Daten
21
22
  PORTC = (PORTC & 0x0F) | (ucData & 0xF0);  //High Nibble
23
  _delay_us(100);
24
  LCD_E_1;
25
  _delay_us(500);
26
  LCD_E_0;
27
  _delay_us(500);
28
29
  _delay_ms(5);
30
31
  PORTC = (PORTC & 0x0F) | ((ucData << 4) & 0xF0);  //High Nibble
32
  _delay_us(100);
33
  LCD_E_1;
34
  _delay_us(500);
35
  LCD_E_0;
36
  _delay_us(500);
37
}
38
39
void send_cmd(unsigned char ucData)
40
{
41
  LCD_RW_0;  //Write
42
  LCD_RS_0;  //Command
43
44
  PORTC = (PORTC & 0x0F) | (ucData & 0xF0);  //High Nibble
45
  _delay_us(100);
46
  LCD_E_1;
47
  _delay_us(500);
48
  LCD_E_0;
49
  _delay_us(500);
50
51
  _delay_ms(5);
52
53
  PORTC = (PORTC & 0x0F) | ((ucData << 4) & 0xF0);  //High Nibble
54
  _delay_us(100);
55
  LCD_E_1;
56
  _delay_us(500);
57
  LCD_E_0;
58
  _delay_us(500);
59
}
60
61
void lcd_zeile(unsigned char ucZeile, unsigned char ucPos)
62
{
63
  send_cmd(0x80 + ((ucZeile * 0x40) - 0x40) + ucPos);
64
  _delay_ms(10);
65
}
66
67
void lcd_init(void)
68
{
69
  _delay_ms(1000);
70
71
  send_cmd(0x20);
72
  _delay_ms(50);
73
74
  send_cmd(0x28);
75
  _delay_ms(50);
76
77
  send_cmd(0x28);
78
  _delay_ms(50);
79
80
  send_cmd(0x28);
81
  _delay_ms(50);
82
83
  send_cmd(0x0C);
84
  _delay_ms(50);
85
86
  send_cmd(0x01);
87
  _delay_ms(50);
88
89
  send_cmd(0x06);
90
  _delay_ms(50);
91
92
  send_cmd(0x28);
93
  _delay_ms(50);
94
95
  send_cmd(0x02);
96
  _delay_ms(10);
97
98
  lcd_zeile(1,1);
99
  send_char('T');
100
  send_char('e');
101
  send_char('s');
102
  send_char('t');
103
104
}

Danke schonmal

von Sesk K. (zeborok)


Lesenswert?

Versuche mal die Wartezeiten bei/nach Initialisierung etwas länger zu 
machen. Ich hatte so ein ähnliches Phänomen mit einem EA-DOGM. Das ging 
immer nur nach abziehen des ISP-Steckers.

Gruß

von spess53 (Gast)


Lesenswert?

Hi

> _delay_ms(1000);

The maximal possible delay is 262.14 ms / F_CPU in MHz.

Deine Wartezeit vor der Initialisierung passt nicht.

MfG Spess

von C. H. (hedie)


Lesenswert?

Danke für die Antwort...

Jetzt habe ich bemerkt das er das Display wenn ich nicht gerade geflasht 
habe gar nicht intialisiert....

Also Nach dem flashen alles TipTop einmal PowerOff und wieder On wird 
das display nicht mehr initialisiert...

Habe auch bereits mit AVR Studio den Inhalt des uC geprüft... Des ist 
konsistent also sollte der Atmega wirklich OK sein...

Wie kann das sein, das das Display nur nach dem Flashen initialisiert 
wird und sonst nicht?

von spess53 (Gast)


Lesenswert?

Hi

>Wie kann das sein, das das Display nur nach dem Flashen initialisiert
>wird und sonst nicht?

Weil dann das Display schon eingeschaltet ist. Beim Power-On versucht 
der Controller das Display zu initialisieren bevor es bereit ist.

MfG Spess

von Peter D. (peda)


Lesenswert?

Deine Initialisierung ist falsch.
Nach einem Reset ist das LCD im 8Bit-Mode oder unbekannt (manuelles 
Reset irgendwo).
Die Funktion send_cmd() kann also nicht funktionieren.
Die Initialisierung bis zum Erreichen des 4Bit-Mode benötigt eine 
Funktion, die nur ein Nibble sendet.

Siehe:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=102296


Peter

von C. H. (hedie)


Lesenswert?

spess53 schrieb:
> Weil dann das Display schon eingeschaltet ist. Beim Power-On versucht
> der Controller das Display zu initialisieren bevor es bereit ist.
>
> MfG Spess

Das weiss ich, aber ich warte 2 Sekunden nach dem Power On bis ich 
initialisiere.

Zudem noch was merkwürdiges was beweist das es nichts mit dem Power-On 
zu tun hat.

Ich habe den Code so geändert:

ich intialisiere identisch

Dann gebe ich zwei A aus
1
send_char('A');
2
send_char('A');
3
_delay_ms(2000);
4
send_cmd(0x01); //Löschen des Displays
5
_delay_ms(100);
6
send_char('G');

Wenn ich nach dem Flashen den Controller Resette, dann gehts bei ersten 
Reset (Display intialisiert sich und es wird AA angezeigt danach G) beim 
Zweiten Reset initialisiert es sich auch zeigt jedoch nur ein D an. und 
nach den 2 Sekunden gibts einen Balken es hat sich also deinitialisiert

Dieses spiel kann man nun ewig machen... Also beim nächsten reset gehts 
wieder dann wieder nicht dann gehts wieder etc....

von C. H. (hedie)


Lesenswert?

Peter Dannegger schrieb:
> Deine Initialisierung ist falsch.
> Nach einem Reset ist das LCD im 8Bit-Mode oder unbekannt (manuelles
> Reset irgendwo).
> Die Funktion send_cmd() kann also nicht funktionieren.
> Die Initialisierung bis zum Erreichen des 4Bit-Mode benötigt eine
> Funktion, die nur ein Nibble sendet.

Vielen Dank für den Tipp!

Mit 0x20 geht man ja in den 4Bit mode oder?

Also soll ich einfach einmal 0x2 an DB4 - DB7 legen und Enable clocken?
Oder was muss ich genau senden?

Ich sehe das problem welches du ansprichts, ich sende als initialisierug 
zuerst 0x2 dann 0x0

EDIT////////////////////////

Vielen Vielen Dank!

Es lag wirklich daran :) Es funktioniert nun einwandfrei.... 10000000000 
Dank :)

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.