Forum: Mikrocontroller und Digitale Elektronik Problem mit Displaycontroler M50530 und der Initialisierung


von Neb N. (bluemorph)


Lesenswert?

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
}

von Neb N. (bluemorph)


Lesenswert?

hat keiner eine Idee???

von Karl (Gast)


Lesenswert?

Kommt mir irgendwie bekannt vor bei diesem Controller. Ist aber schon ne 
Weile her. Spannungsversorgung vom LCD erst nach dem µC einschalten 
vielleicht?

von Sven L. (friemler)


Lesenswert?

versuche mal das hier:
1
 static void lcd_byte( u8 d ){
2
   lcd_nibble( d );
3
   _delay_us(40);
4
   lcd_nibble( d<<4 );
5
   _delay_us(40);
6
 }

von Hannes Lux (Gast)


Lesenswert?

> hat keiner eine Idee???

Dieses Display habe ich nicht, ich setze aber oft das 8x24 mit M50530 
ein. Ich lasse dem LCD etwas Zeit, bevor ich es initialisiere und wieder 
etwas Zeit, bevor ich es zum ersten mal anspreche. Damit gibt es keine 
Probleme. Die Textausgabe erfolgt allerdings über einen 
Bildschirmspeicher im AVR-SRAM im Zeitraster von 1ms ohne Auswertung des 
Busy-Flags.

...

von gast (Gast)


Lesenswert?

ich habe auch das selbe Problem. Allerdings bin ich ein totaler Newbie. 
Ich weiß nicht einmal wie man den M50530 auf 4 bit modus umschaltet. Aus 
den Source code werde ich einfach nicht schlau.

>  LCD-Routinen
>  für Samsung 2138a mit M50530-Controller
>  24 x 8 Zeichen
>
>  Copyright 2003-04 by Daniel Jelkmann
>/*
>// setzt 4-Bit-Mode und initialisiert das LCD
>// muss als erstes aufgerufen werden, bevor das LCD angesteuert werden >kann
>void LCD_init(void)
>// alle Leitungen auf Ausgang schalten
>  LCD_DDR = 0xFF;
>  SET FUNCTION MODE
>  input:
>  OC1              0
>  OC2              0
>  RW               0
>  DB7,DB6          1
>  DB5    I/O 8/4   (1 = 8 bit, 0 = 4 bit)
>  DB4    FONT 8/12 (1 = 5x8 fonts, 0 = 5x12 fonts)
>  DB3,DB2          DUTY
>  DB1,DB0          RAM
>*/
>
>LCD_sendByte(216, 0);  //LCD_sendByte(216, 0);// DB7, DB6, DB4, DB3


Kann jemand mir bitte helfen

von Gast (Gast)


Lesenswert?

hallo Zusammen,

ich habe versucht, LCD mit M5053 von Pollin zu initialisieren und sehe 
nur eine gestrichelte Linie auf dem Display !

Was muß es anzeigen wenn 's richtig initilisiert wurde.

Danke

von Moritz (Gast)


Lesenswert?

Gleiches Problem , gestrichelte Linie... Normal sollte ein blinkender 
Cursor (zumindest bei meiner einstellung) erscheinen.
1
Init_Lcd()
2
3
   'Initialisierung       SF
4
   Call Lcd_sendbyte(&B11111011)
5
   'Bit 8-7 Immer auf 1
6
   'Bit 6   1 = 8bit-mode 0 = 4bit-mode
7
   'Bit 5   1 = 8x5       0 = 8x12
8
   'Bit 4-3 Duty-Mode (1-4 Lines)
9
   'Bit 2-1 RAM-Teilung (DD CG)
10
   '----------------------------
11
   'Cursor einstellen     SE
12
   Call Lcd_sendbyte(&B01010000)
13
   'Bit 8-7 Immer 0 1
14
   'Bit 6-4 Cursor Address Changes
15
   'Bit 3-1 Start Address Changes
16
   '----------------------------
17
   'Display               SD
18
   Call Lcd_sendbyte(&B00111010)
19
   'Bit 8-6 Immer 0 0 1
20
   'Bit 5   ON/OFF Display
21
   'Bit 4   ON/OFF Cursor
22
   'Bit 3   ON/OFF Underline Bit
23
   'Bit 2   ON/OFF Blinking Cursor
24
   'Bit 1   ON/OFF Blinking Charakter
25
   '----------------------------
26
   'Underline            SU
27
   Call Lcd_sendbyte(&B00001100)
28
   'Bit 8-5 Immer 0
29
   'Bit 4-3 Immer 1
30
   'Bit 2   ON/OFF Underline Func.
31
   'Bit 1   ON/OFF Setting/Reseting
32
   '----------------------------
Das ist meine Initialisierung , zum abschluss hab ich noch ein CLS(CH) 
übertragen. Danach erscheint dann die gestrichelte Linie =/.

Das ich inititaliert habe erkenne ich doch daran , das während der 
Sekunde wartezeit vor dem Init_LCD() der Bildschirm 1 1/2 Zeilen 
komplett anzeigt .

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.