Forum: Mikrocontroller und Digitale Elektronik LCD Probleme KS0076


von Olli (Gast)


Lesenswert?

Hallo,

ich habe folgendes Problem:
Ich rufe die Zeit über eine RTC über I2c ab und möchte sie auf dem 
Display (Displaytech 404B / KS0076) ausgeben. Alles läuft wie geschmiert 
nur wenn die Sekunden von 19 auf 20 oder von 29 auf 30 springen, also 
immer wenn Sek mod 10 = 0 ist, dann bleibt mein µC hängen.
Ein weiters Phänomen ist, dass wenn ich es in der dritte und viert Zeile 
laufen lasse (egal welcher x-Wert) sich der µC nicht aufhängt. In der 
ersten und zweiten Zeile muss ich einen x-Wert von 20 überschreiten, 
damit sich der µC nicht aufhängt. Ich habe das ganze an zwei neuen und 
baugleichen Displays getestet und bei beiden der gleiche Fehler.
Mit einem andern Display (Poltech) läuft es ohne Problme.
Nun habe ich mir mal die lcd.h und lcd4x40.h von CodeVison vorgenommen 
und mal hier und da ein paar Änderungen vorgenommen und siehe da durch 
ein kleines delay_ms(1) konnte ich das Problem beheben. Leider ist das 
Ganze mehr oder weniger nach dem "try and error"-System abgelaufen und 
daher weiss ich leider nicht wieso und weshalb gerade an dieser Stelle 
das delay zur Problemlösung beigetragen hat hier ein Auszug der 
modifizierten (also schon mit meinem zusätzlichen delay_ms(1) ) 
lcd4x40.lib:

void _lcd_ready(void)
{
#asm
    ldi   r26,0xf                 ;set as input
    out   __lcd_direction,r26
    sbi   __lcd_port,__lcd_rd     ;RD=1
    cbi   __lcd_port,__lcd_rs     ;RS=0
    in    r26,__lcd_port
    lds   r27,__en1_msk
__lcd_busy:
#endasm
_lcd_delay();
#asm
    or    r26,r27
    out   __lcd_port,r26          ;EN=1
#endasm
_lcd_delay();
#asm
    in    r30,__lcd_pin
    andi  r26,0xf3
    out   __lcd_port,r26          ;EN=0
#endasm
_lcd_delay();
#asm
    or    r26,r27
    out   __lcd_port,r26          ;EN=1
#endasm
_lcd_delay();
#asm
    andi  r26,0xf3
    out   __lcd_port,r26          ;EN=0
#endasm
_lcd_delay();

//***************************************************
delay_ms(1);
//**************************************************

#asm
    sbrc  r30,__lcd_busy_flag
    rjmp  __lcd_busy
#endasm
}

Vielleicht lönnt Ihr mir ja helfen. Übrigens 900µS sind schon wieder 
zuwenig.

Gruß
Olli

von Olli (Gast)


Lesenswert?

PS: Mich würde interessieren, was dort in der _lcd_ready() eigentlich 
Schritt für Schritt abläuft

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.