Hallo Leute,
ich habe mal wieder ein Problem ;-)
Ich habe mir vor kurzem ein Display von Pollin gekauft. Das war sehr
billig und hat 4 Zeilen mit jeweils 16 Zeichen. Der Controller ist ein
M50530. Soweit habe ich mich mit dem Controller angefreundet und
eigentlich funktionieren meine Routinen, um das Display zu beschreiben
auch soweit.
ABER, folgendes Problem tritt auf:
Wenn ich mein STK500 ausschalte, dann funktioniert nach einem
Einschalten anscheinend die Initialisierung nicht. Das Display zeigt nur
eine Reihe striche an.
Ist der ISP Stecker für meinen 8515 eingeseteckt, so muss ich etwa 20 -
30 mal auf Reset drücken (und auch noch ganz schnell nacheinander) bis
endlich eine Initialisierung stattgefunden hat. Drück ich dann noch ein
paar mal mehr Reset, ist die Displayanzeige wieder weg und die
Initialisierung schlägt wieder fehl.
Ist der ISP Stekcer nicht aufgesteckt, so muss ich genau einmal auf
reset drücken, dann klappt die Initialisierung- Drücke ich
anschschließend nochmal auf Reset, funktioniert die Initialisierung
wieder nicht und ich sehe nur einen Strich in einer Zeile (also in jedem
5x8 block sieht man dann einen Strich). Drücke ich anschließend nochmal
auf Reset, erscheint die Displayanzeige wieder ganz normal. Es ist also
ein ständiger Wechsel von "Display ist initialisiert" und "Display ist
nicht initialisiert".
Ich weiß nicht so recht woran das liegt oder was ich falsch mache! Ich
gebe euch nochmal die Daten, die ihr ja wahrscheinlich wissen müsst, um
mir hoffentlich zu helfen.
Also ich benutze das STK500 mit dem 8515. Das Display ist von Pollin
(LCD-Modul HLM8070 Bestnr: 120 387) mit einem M50530 Controller. Ich
betreibe es im 4 Bit - Modus. Alle Steuerleitungen (ex, OC1, OC2, R/W)
und die Datenleitungen (DB4 ... DB7) sind an einem Port angeschlossen.
Zur Initialisierung benutze ich diese Routine:
1 | void lcd_init( void ){
|
2 | LCD_DDR_D4 = 1;
|
3 | LCD_DDR_D5 = 1;
|
4 | LCD_DDR_D6 = 1;
|
5 | LCD_DDR_D7 = 1;
|
6 | LCD_DDR_OC1 = 1;
|
7 | LCD_DDR_OC2 = 1;
|
8 | LCD_DDR_EX = 1;
|
9 | LCD_DDR_RW = 1;
|
10 |
|
11 | LCD_EX = 0;
|
12 | LCD_OC1 = 0;
|
13 | LCD_OC2 = 0;
|
14 | LCD_RW = 0;
|
15 |
|
16 | lcd_nibble( 0xD0 ); // SF 4 Bit Modus aktivieren
|
17 | lcd_command( 0xD8 ), // SF 4 Bit Modus, Font = 8, DT = 1
|
18 | lcd_command( 0x50 ); // SE Cursor increas nach jedem write signal
|
19 | lcd_command( 0x01); // Clear and home
|
20 | _delay_ms(2);
|
21 | lcd_command( 0x3A ); // Display on, cursor on, cursor blink
|
22 | }
|
Ich habe über alle Portausgänge eine Bitstruktur gelegt, sodass ich
jedes Bit einzeln ansprechen kann.
Die Routinen lcd_nibble und lcd_command sehen wie folgt aus:
1 | static void lcd_nibble( u8 d ){
|
2 | LCD_D4 = 0; if( d & 1<<4 ) LCD_D4 = 1;
|
3 | LCD_D5 = 0; if( d & 1<<5 ) LCD_D5 = 1;
|
4 | LCD_D6 = 0; if( d & 1<<6 ) LCD_D6 = 1;
|
5 | LCD_D7 = 0; if( d & 1<<7 ) LCD_D7 = 1;
|
6 |
|
7 | LCD_EX = 1;
|
8 | _delay_us( 1 ); // Für 1 us das EX Signal auf high lassen
|
9 | LCD_EX = 0;
|
10 | _delay_us( 1 ); // 1 us warten
|
11 | }
|
12 |
|
13 | static void lcd_byte( u8 d ){
|
14 | lcd_nibble( d );
|
15 | lcd_nibble( d<<4 );
|
16 | _delay_us(40);
|
17 | }
|
18 |
|
19 | void lcd_command( u8 d ){
|
20 | lcd_byte( d );
|
21 | _delay_ms(2);
|
22 | }
|
In meiner main Funktion steht vor der Initialisierung des Displays noch
ein Delay von 2 * 50 ms.
Ich hoffe ihr könnt mir helfen.
MfG BlueMorph
PS: Vielleicht kann mir ja auch sagen, warum meine read_busy() Funktion
nicht richtig funktioniert.
1 | static void lcd_read_busy (void){
|
2 |
|
3 | LCD_DDR_BUSY = 0; // Busy Pin als Eingang setzen
|
4 | LCD_RW = 1; // RW auf high
|
5 |
|
6 | while(1){
|
7 | LCD_EX = 1;
|
8 | _delay_us( 1 ); // Für 1 us das EX Signal auf high lassen
|
9 | if (LCD_BUSY != 1) break;
|
10 | LCD_EX = 0;
|
11 | _delay_us( 1 );
|
12 | }
|
13 |
|
14 | LCD_RW = 0;
|
15 | LCD_DDR_BUSY = 1;
|
16 | }
|