Forum: Mikrocontroller und Digitale Elektronik T6963 --> Data Read - Aber wie?


von mainster (Gast)


Lesenswert?

Hallo,

Bin seit einigen Wochen dran mir ein Menü auf nem 240 * 128 pixel GLCD 
mit T6963 zu basteln. Läuft schon ganz gut außer die Sache mit dem Data 
Read..... Wenn ich einen Data Read ausführe und das gelesene Byte wieder 
zurückschreibe kommt nur Müll raus!

Hat jemand ein code schnipsel parat oder nen Link?

MFG, MainSter

von Klaus (Gast)


Lesenswert?

... hast du überhaupt den /RD Pin beschaltet, um was rücklesen zu können 
?

von mainster (Gast)


Lesenswert?

Hallo!

Ja hab ich. Es gibt ein oder zwei Beiträge wo komplette Libs vorgestellt 
werden.... In denen finde ich aber nur eine Leseroutine für die 
Statusbits!

Eine routine von jemandem der sagen kann dass sie sicher funktioniert 
wäre super!

Ich betreibe den Controller an einem Mega128 (kein Memory Mapped Mode).
Ich hab jede Andere Routine mit hilfe der Flowcharts aus dem Datenblatt 
zusammengebastelt und die funktionieren. Nur die Read und die Autoread 
routine laufen nicht.....

Danke, MainSter

von Thomas K. (thkais)


Lesenswert?

Wie sieht denn Deine derzeitige Subroutine zum Auslesen aus?

von mainster (Gast)


Lesenswert?

void lcd_read_data(void)
{
   LCD_CE_H();
   lcd_status_check1();
   LCD_CD_L();
   LCD_RD_L();
   LCD_WR_H();
   nops();
   LCD_CE_L();
   nops();
   DATA_DIR_IN();
   LCD_DATA_READ = LCD_READ;
   LCD_CE_H();
}


Habs schon paar mal geändert.....
Der Statuscheck funktioniert und nops() ist ein Delay über ca. 200ns 
(Mega128 @ 16MHz)

Danke, MainSter

von pumpkin (Gast)


Lesenswert?

ich habs so gemacht (im automode).

unsigned char lcd_get_data_auto(void)
{
   lcd_status_read_loop(0x04);
   unsigned char temp_var = 0x00;
   DDRB = 0x00;
   DATA_PORT = 0x00;
   COMMAND_PORT |=  (1 << WRITE_PIN);
   COMMAND_PORT &= ~(1 << COMMAND_DATA_PIN);
   COMMAND_PORT &= ~(1 << READ_PIN);
   COMMAND_PORT &= ~(1 << ENABLE_PIN);
   asm volatile ("nop"::);
   temp_var = PINB;
   COMMAND_PORT |=  (1 << ENABLE_PIN);
   COMMAND_PORT |=  (1 << READ_PIN);
   asm volatile ("nop"::);
   COMMAND_PORT |=  (1 << COMMAND_DATA_PIN);
   return temp_var;
}

(alles gibts hier: 
http://www.total-war.org/sound_inside_STUFF/downloads/sharp_lm24014.rar)

ich hoffe es hilft weiter.

pumpkin

von mainster (Gast)


Lesenswert?

Vielen Dank! Werds heute abend gleich ausprobieren. Wie schnell taktest 
du den AVR?

MFG MainSter

von pumpkin (Gast)


Lesenswert?

dat warn nega16 bei ~4MHz. lief aber imho auch auf nen mega128 bei 
16MHz.

pumpkin

von mainster (Gast)


Lesenswert?

OK!
Ich hab Deine Autoread - funktion übernommen sowie deinen Status loop.
Wenn ich jetzt einen Statuscheck 1 ausführe funktioniert noch alles wie 
vorher aber wenn ich einen Statuscheck 2 (STA2 --> mask 0x04) ausführe 
bleibt er in dem loop hängen.... Den Auto - read - command habe ich ein 
paar zeilen drüber eingeschalten und trotzdem scheint der zustand STA2 = 
1 niemals aufzutreten....

MFG MainSter

von pumpkin (Gast)


Lesenswert?

häng mal bitte deine source an.

pumpkin

von mainster (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Ich hab mir die Source von dem Link mal genauer angeschaut. Zum daten 
lesen gibt es unter DECLARATIONS nur die Funktion
unsigned char lcd_get_data_auto   (void);
In der Beschreibung von dieser funktion steht
...it's the only difference to the "unsigned char lcd_get_data(void)"
Ist diese funktion mit absicht nicht im Code enthalten?
Hab nämlich schon versucht eine Single read routine zu schreiben.
Im Datenblatt ist auch für alles ein Flowchart hinterlegt außer für 
einen Singleread.... Zugegeben dass es sich eigentlich fast von selber 
erklärt (auch wieder Status check, befehl zum lesen eines Datenbytes und 
dann die umgeschriebene SR aufrufen mit mask 0x03) trotzdem wills nicht 
laufen.

Danke, MainSter

von pumpkin (Gast)


Lesenswert?

moin,

öhm, hab gerade mal deine source beäugt und das datenblatt gewälzt. eine 
frage: warum benutzt du die stat-mask 0x03 (0b00000011) wenn du den 
automode reseten willst? siehe datasheet S.21 - du musst nur STA2 
checken (0x04 wenn man davon ausgeht dass unsere pinnings gleich sind).
leider kann man aber aus deiner source nicht ersehen wo du überall 
status_read_loops machst - die sind extrem wichtig. z.b. solltest du VOR 
einem befehl an den controller auf sein ready 'warten' (natürlich mit 
der richtigen stat-mask).

pumpkin

von pumpkin (Gast)


Lesenswert?

achso, und die nicht-auto-read-routine wegen zeit- und motivationsmangel 
noch nicht drin.  ; )


pumpkin

von mainster (Gast)


Lesenswert?

Jaaaaa!!!

Ich habs! hab deine tips übernommen und es wurde nach wie vor nur ein 
0x00 ausgegeben! Dann bin ich mal auf die idee gekommen in deiner 
lcd_get_data_auto funktion die Wartezeit auf den gültigen BUS zustand zu 
verlängern.... Und dass ist alles.... manchmal funktioniert es auch mit 
zwei nops aber zur sicherheit lieber 4x!!!


unsigned char lcd_get_data_auto(void)
{
  lcd_status_read_loop(0x04);
  unsigned char temp_var = 0x00;
  DATA_DIR_IN();
  LCD_DATA = 0x00;
  LCD_WR_H();
  LCD_CD_L();
  LCD_RD_L();
  LCD_CE_L();

  asm volatile ("nop"::);
  asm volatile ("nop"::);
  asm volatile ("nop"::);
  asm volatile ("nop"::);

  temp_var = LCD_READ;

         LCD_CE_H();
  LCD_RD_H();
  asm volatile ("nop"::);
  LCD_CD_H();
  return temp_var;
}

Vielen dank für eine Unterstützung pumpkin..... So machts Spaß auch mal 
nicht weiterzukommen :-)

Ich hoffe bald kann ich mein projekt hier vorstellen........

MFG MainSter

von pumpkin (Gast)


Lesenswert?

nice! frohes fest....  : )

pumpkin

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.