PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe an DIsplay klappt nciht richtig / komischer fehler



NetBlade
03.05.2008, 19:54
Hallo!

Ich habe ein Problem mit einem 2x16 Display (Dogmatrix display).
Ansteuer will ich das mit nem R8C13 im 8bit modus.

Ich kann das display initialisieren, und habe eine test rutine geschreiben,
die dann einfach nur auf dem display ruter zaelen soll, indem sie immer ein cls macht und dann den naechsten wert ausgiebt. Die Rutine faengt bei 5000 an und bei 4997 bricht das ganze dann aus unerfindlichen gruenden ab. Ich habe in der schleife mal bevor er 4996 ausgiebt was anderes ausgeben lassen und konnte feststellen, das er danach noch irgent welche sonderzeichen schreibt. Wenn ich den controller resete passiert das selbe, und die sonderzeichen sind nur semi zufaellig das sind immer die selben.

Muss ich die datenleitungen irgent wie auf masse klemmen? oder muss ich die internen pullups des R8Cs aktivieren??

beppo
03.05.2008, 20:26
Vielleicht schreibst du zu schnell auf das Display. Ich hatte auch schon mal das Problem, daß das LCD einfach zu langsam war für den Controller.

NetBlade
03.05.2008, 20:47
vielen dank fuer die schnelle antwort!!!!
ich habe eben gerade mal die timings drastisch erhoet das einyige was sich aendert ist, dass er frueher aufgibt. Mir scheint es als ob nach einer bestimmten Zeit irgent wer oder irgent was die Enabel leitung unkontroliert zum schingen bringt ](*,) ](*,) ](*,) ](*,)

NetBlade
04.05.2008, 16:24
Hm also ich bin jetzt so weit, das ich heraus gefunden habe, dass wenn ich das display immer neu initialisiere, nachdem ich es voll geschreiben habe (2x16 Zeichen), dann kann ich meist so viel aus geben wie ich will.

Es scheint als ob das Display waerend es befehle bekommt "abstuertzt".
Wenn Text einmal ausgeben ist, dann ist alles ok und der Verschwindet auch nicht wider oder so.

Wie gesagt ich kann das Display durch erneute initialisierung wider zurueck holen. Das klappt aber auch nur in 4 von 5 faellen (circa).

Da das Display nicht einfach so ausgeht, muss es irgent wie an der kommunikation liegen. Da es keinen uebertragungsfehler gibt (alle Zeichen die ausgeben werde sind richtig) und wenn es einmal initalisiert is auch nicht zwischen drinn abbricht, gehe ich davon aus, dass mein Programm irgend was falsch macht... aber was??





/************************************************** *********************/
/* */
/* FILE :FirstTest.c */
/* DESCRIPTION :Main Program */
/* CPU TYPE :Other */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.0). */
/* */
/************************************************** *********************/

#include "sfr_r813.h"


/************************************************** ***********************************/
/* Output/Input definitions */
/************************************************** ***********************************/
/* p1_0 = DB0
p1_1 = DB1
p1_2 = DB2
p1_3 = DB3
p1_4 = DB4
p1_5 = DB5
p1_6 = DB6
p1_7 = DB7
*/

#define LCDPORT p1
#define Enable p3_1
#define R_W p0_1
#define RS p3_7



/**************** delay ************/
void delay(long zeit) /* 2000 ist ca. 5 msec */
{ /* 50 ist ca. 150 usec */
/* 50000 ist ca. 120 msec */
long t = 0;
for (t=0; t<zeit; t++)
{}
}

/************************************************** ***********************************/
/* Funktion Wait_ms */
/************************************************** ***********************************/

Wait_ms(long y)

{
long z;
y = y * 520; /* Wert für ms Zählschleife bei 20MHz */
for(z=0;z<y;z++)
{
asm("nop");
}
}
/************************************************** ***********************************/
/* Funktion Wait_us */
/************************************************** ***********************************/

Wait_us(long y)

{
long z;
y = y * 2; /* Wert für us Zählschleife bei 20MHz */
for(z=0;z<y;z++)
{
asm("nop");
}
}


/**************** Instruction ************/

void inst(int anw)
{
RS = 0;
LCDPORT=anw;
Enable = 1;
Wait_us(30);
Enable = 0;
Wait_us(30);
}

/**************** Data ************/

void data(int wert)
{
RS = 1;
LCDPORT=wert;
Enable = 1;
Wait_us(30);
Enable = 0;
Wait_us(30);
RS = 0;
}


/********** Display einstellen ************/

void init(void)
{


Enable = 0;
R_W = 0;
RS = 0;

LCDPORT = 0x0; /*Port1 = low*/
Wait_ms(60); /*Wait 60 ms*/

inst(0x39); // Funktionset 8-bit, 2 lines, Instruction Table 1
inst(0x39); //secondtime
inst(0x39);
inst(0x39);

inst(0x1c); //Bias 1/4, 2-zeilen LCD

inst(0x52); //Booster aus, Kontras C5 und C4

inst(0x69); //Spannungsfolger und Verstärkung setzten

Wait_ms(300);

inst(0x74); //Kontras C3,C2,C1

inst(0x38); //back to instruction table 0

inst(0x0f); //Display ein, Cursor ein, Cursor blinken

inst(0x01); //Display löschen, Cursor Home

inst(0x06); //Cursor Auto-Increment

LCDPORT = 0x0; /*Port1 = low*/
//Wait_ms(2000); /*Wait 60 ms*/
}

/********** Daten ausgeben ************/

void ausgabe( char ausgabewert[16])
{
int i = 0;

//data(sizeof(ausgabewert));

for (i=0;i<16;i++)
{
data(ausgabewert[i]);
}
}

/************************************************** ***********************************/
/* Funktion LCD_Write_Integer */
/************************************************** ***********************************/
void LCD_Write_Integer(unsigned int a)
{

unsigned char idx; /*Schleifenzähler*/
/*unsigned int a = 10234;*/ /*Beispielzahl die dargestellt werden soll*/
unsigned int div = 1000; /*Teilen bei int max 10000*/
unsigned int buff; /*Temp*/
unsigned char flag = 0; /*Flag wird für Nullunterdrückung benötigt*/
unsigned char Aus =0; /*Ausgabe wird an LCD-Display übergeben*/

for(idx=0;idx<4;idx++) /*Schleife 5* für 10000er Stelle*/

{
buff = a;
buff = buff / div;

if(flag == 0)
{
if(buff >0)
{
flag = 1;
}
}
Aus = buff + 48; /*Umrechnung für LCD-Display*/
if(flag == 0)
{
Aus = 254; /*Nullunterdrückung durch Leerzeichen*/
}
if(flag == 0 && idx == 3)
{
Aus = 48; /*bei Zahl null, eine null darstellen*/
}
data(Aus);
a = a - (buff * div);
div = div/10;
}
}

void setOutPuts(void)
{
p0 = 0x00;
p1 = 0x00;
p3_1 = 0x00;
p3_7 = 0x00;
}


void main(void)
{
/*-------------------------------------------------
- Change on-chip oscillator clock to Main clock -
-------------------------------------------------*/
unsigned int g = 0;

Wait_ms(1);

prc0 = 1; /* Protect off */
cm13 = 1; /* Xin Xout */
cm15 = 1; /* XCIN-XCOUT drive capacity select bit : HIGH */
cm05 = 0; /* Xin on */
cm16 = 0; /* Main clock = No division mode */
cm17 = 0;
cm06 = 0; /* CM16 and CM17 enable */
asm("nop"); /* Waiting for stable of oscillation */
asm("nop");
asm("nop");
asm("nop");
ocd2 = 0; /* Main clock change */
prc0 = 0; /* Protect on */

Wait_ms(3000);

prc2 = 1; /* !!! Port 0 protection aufheben !!! */

//adcon1 = 0x00; //Deactivate A/D Resitorladder
pd0 = 0xFF; //set P0 to output mode
p0 = 0x00; //set P0 to low
//drr = 0xff; //P1 LED Drive capabiity
//pur0 = 0x00;
//pur1 = 0x00;
//txmr = 0x00;
//tc = 0x0000;


pd1 = 0xFF; /* Set Port 1.0 - 1.3 be used for output*/
pd3 = 0x0F; /* SET PORT 3.0 - 3.? ALS OUTPUT */
pd3_7 = 0x01; /enable output mode

p0_4 = 1; //LED
p0_5 = 0; //LED
p0_6 = 0; //LED

Wait_ms(300);
init(); /* Display einstellen */
Wait_ms(3000);



ausgabe("Enableling COMs.");
inst(0xC0);
Wait_us(30);
ausgabe("EA DOGM162 2x16c");
Wait_ms(3000);

init();
Wait_ms(300);

inst(0x80);
Wait_us(30);
ausgabe("Setting Online S");
inst(0xC0);
Wait_us(30);
ausgabe("Trace...........");
Wait_ms(3000);

init();
Wait_ms(300);

inst(0x80);
Wait_us(30);
ausgabe("InitialatingSys0");
inst(0xC0);
Wait_us(30);
ausgabe("Loading Nitro...");
Wait_ms(3000);

init();
Wait_ms(300);

inst(0x80);
Wait_us(30);
ausgabe("InitialatingSys1");
inst(0xC0);
Wait_us(30);
ausgabe("LoadingBassboost");
Wait_ms(3000);inst(0x80);

init();
Wait_ms(300);

Wait_us(30);
ausgabe("InitialatingSys2");
inst(0xC0);
Wait_us(30);
ausgabe("Loading Speed...");
Wait_ms(3000);

init();
Wait_ms(300);

inst(0x80);
Wait_us(30);
ausgabe("InitialatingSys3");
inst(0xC0);
Wait_us(30);
ausgabe("Loading Space...");
Wait_ms(3000);

init();
Wait_ms(300);

inst(0x80);
Wait_us(30);
ausgabe("InitialatingSys4");
inst(0xC0);
Wait_us(30);
ausgabe("Loading Fun.....");
Wait_ms(3000);

init();
Wait_ms(300);

inst(0x80);
Wait_us(30);
ausgabe("InitialatingSys5");
inst(0xC0);
Wait_us(30);
ausgabe("LoadingAdrenalin");
Wait_ms(3000);

init();
Wait_ms(300);

inst(0x80);
Wait_us(30);
ausgabe("NFS DRIVER READY");
inst(0xC0);
Wait_us(30);
ausgabe("PRESS SPEED TO S");
Wait_ms(3000);

while(1)
{}


}


wenn ich ohne erneute initialisirung weiteren text aus gebe (natuerlich nach vorherigem CLS (0x01) oder DDRAM Address set (0x80) und einem delay danach, "stuertzt" das Display ab..

NetBlade
04.05.2008, 22:31
so hier noch das daten blatt vom display http://www.reichelt.de/?;ACTION=7;LA=6;OPEN=0;INDEX=0;FILENAME=A500%252Fd og-m.pdf

ich kann das problem nun besser Formulieren. Wenn das Display stuertzt ab (alle bisher geschriebenen zeichen verschwinden), wenn ich nach dem schreiben in der ersten zeile den befehl 0xC0 sende um in die naechste zeile zu kommen. Der steuer befehl 0x01 fuer cls hat diesen efekt nicht. Des weiterem stuertzt das Display bei manchen Zeichen ab. Wenn ich diese Buchstaben durch andere ersetze gehts. Es sind aber nicht bestimmte Zeichen, den das selbe zeichen geht an einer anderen stelle.
Dennoch ist es nicht zufaellig, ich vermute deshalb, das es an bestimmten auf ein ander folgenden kombinationen liegt.

Kann mir bitte bitte bitte jemand helfen? Was kann das sein? Woran kann das liegen?

PS: Die Kontackte sind alle ok ich habe das ganze Teil neu geloetet. Und der Fehler hat sich nicht wirklich veraendert. Kann das an einem zu langem kabel zum Display liegen??