Forum: Mikrocontroller und Digitale Elektronik Problem mit T6963c bei Umstellung auf I2C


von Verzweifelter (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe ein 240x128 Display mit T6963C Controller. Um Pins zu sparen, 
versuche ich das Display über zwei PCF8574A Portexpander anzusteuern. µC 
ist ein ATMega644 mit 16 Mhz. Pullups am I2C sind vorhanden.

Ein PCF8574A versorgt die Datenleitungen D0-D7, der andere die übrigen 
Steuerleitungen.

Das Display erscheint im schönsten Blau mit etwas mehr Kontrast im 
beschreibbaren Bereich.

Der Code funktioniert nicht, er bleibt bei der while Schleife in der 
Funktion T6963cPutData stehen, in der auf das Display gewartet wird. Ich 
bekommen einen Statuswert von 34 (später 162) angezeigt, was STA1 und 
STA5 (STA1, STA5, STA7) entspricht. Geprüft wird STA0 und STA1, daher 
geht der Code hier in eine Endlosschleife.

Hier die Debug-Ausgabe:
1
+++ Programm Start +++
2
UART Init ok.
3
I2C Init ok.
4
In Display Init.
5
1.
6
2.
7
in T6963cPutData 1
8
Status:  34 
9
Status:  34 
10
Status:  34 
11
Status:  162 
12
Status:  162 
13
Status:  162 
14
Status:  162 
15
Status:  162 
16
Status:  162 
17
Status:  162 
18
Status:  162 
19
Status:  162 
20
Status:  162 
21
Status:  162

Hat jemand eine Idee, warum es nicht funktioniert ? Source-Code anbei.

von Verzweifelter (Gast)


Lesenswert?

(hochschieb)

von Das delay (Gast)


Lesenswert?

Poste den Code als C File im Anhang und nicht als ZIP.
Dann kann man weitersehen.

von Verzweifelter (Gast)


Angehängte Dateien:

Lesenswert?

OK, hier das C-File und die relevanten Header-Infos anbei:
1
#define PCF8574A_CMD_Address      0x72  // 0_1_1_1_A2_A1_1_RW
2
#define PCF8574A_DATA_Address      0x76  // 0_1_1_1_A2_1_1_RW
3
4
//Controlbits an PCF8574A_CMD
5
#define T6963C_WR          0    
6
#define T6963C_RD          1
7
#define T6963C_CE          2
8
#define T6963C_CD          3
9
#define T6963C_RST          4
10
11
//Physical Description
12
#define T6963C_ADDR_CGRAML        0x1800  //Lower half of CG (Chars 00-7F)
13
#define T6963C_ADDR_CGRAMH        T6963C_ADDR_CGRAML + 0x80*8  //Higher half of CG (Chars 80-FF)
14
#define T6963C_ADDR_GRAPHIC        0x0400
15
#define T6963C_ADDR_TEXT        0x0000
16
#define T6963C_TEXT_COLS        30    //40 bytes for 6x8 Font, 30 for 8x8 Font
17
#define T6963C_TEXT_ROWS        16
18
#define T6963C_GRPH_COLS        T6963C_TEXT_COLS
19
#define T6963C_GRPH_ROWS        128
20
#define T6963C_FONTWIDTH        8

von Das delay (Gast)


Lesenswert?

Eventuell ist der Zugriff auf das Display zu schnell.
Ich habe bei 8MHz einige NOPs einfügen müssen damit das klappt.

void StatusCheck_1(void)
{
  u8 Status;
  daten_bus_in(); // Bus auf eingang schalten
  steuer_bus = (1<<WR)+(1<<CD);

  NOP();
  NOP();
  NOP();

  Status = PINA;

  NOP();

  steuer_bus |= (1<<CE);  // CE wieder aus

  NOP();

  daten_bus_out();

  NOP();
  NOP();

  daten_bus = Status;
}

Wenn ich jetzt nur ein NOP weglasse, wird STA0 & STA1 nicht mehr
richtig gelesen.

1 NOP == 125ns

Dies ist nur eine Testfunktion.
Gruß

von holger (Gast)


Lesenswert?

Ich würde vor dem Lesen von Status ein 0xFF auf den
PCF mit den Datenleitungen schreiben. Jede 0 ist ein
niederohmiger Ausgang gegen den der T6963 evtl. nicht ankommt.

von Verzweifelter (Gast)


Lesenswert?

DANKE !!!

Es funktioniert :-)

Ich habe in der GetStatus Routine als erstes ein 0xFF auf den Datenbus 
geschrieben und noch zwei nops eingefügt.

Vielen Dank, wieder etwas dazugelernt!

von holger (Gast)


Lesenswert?

>Ich habe in der GetStatus Routine als erstes ein 0xFF auf den Datenbus
>geschrieben und noch zwei nops eingefügt.

Du kannst sämtliche nops weglassen. I2C ist langsam genug ;)

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.