Problem mit T6963c bei Umstellung auf I2C

Gast #1017310
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.
Angehängte Dateien:
Gast #1017558
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
Angehängte Dateien:
Gast #1017617
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ß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren