Forum: Mikrocontroller und Digitale Elektronik PCF8576, schaltet nicht alle Segmente im Multiplex Betrieb an, aber im Static Modus


von André L. (do7ale)


Lesenswert?

Hallo,

ich möchte einen PCF8576 LCD Treiber/Controller verwenden um ein LCD 
Display mit 3 Backplanes und 33 Segmenten zu betreiben. Als µC nutze ich 
einen Atmega128, programmiert wird in C und es wird die i2c Lib von 
Peter Fleury zur Vereinfachung genutzt. Der PCF8576 wurde auch schon 
einmal ausgetauscht, das selbe Problem...

Wenn ich das Display im Static Modus betreibe, dann werden alle 
Segmente, je nach Datenbytes an bzw. ausgeschaltet. Bei einem gesetzten 
Bit sind 3 Segmente an -> ok.

Wenn ich den Controller nun in den richtigen Modus setze, also 3 
Backplanes, sind bei 4 x 5 Bytes mit dem Wert 0 alle Segmente aus -> ok. 
Das gleiche Spiel mit 4 x 5 Bytes mit dem Wert 255, jetzt fehlen mir ca. 
10 Segmente. Das ist nicht das erhoffte Ergebnis. :-( (Ich habe auch 
schon versucht mit mehr Bytes nachzuhelfen, das ändert nichts...)

Bei einem gesetzten Bit leuchtet auch wie erwartet 1 Segment. :-|

Sieht jemand meinen Fehler oder hat eine Idee?

Mein Quellcode:
1
/*
2
avrdude -p atmega128 -P /dev/ttyACM0 -c stk500v2 -v -Uefuse:w:0xFF:m -U hfuse:w:0xC9:m -U lfuse:w:0xDF:m
3
*/
4
5
#define F_CPU 18432000UL
6
7
#include <avr/io.h>
8
#include <util/delay.h>
9
#include <avr/interrupt.h>
10
#include <i2cmaster.h>
11
12
int main(void)
13
{
14
  i2c_init();
15
  _delay_ms(10);            // aufwaermen, laut Datenblatt soll min. 1 ms gewartet werden, ansonsten wird der Reset nicht richtig durchgefuehrt
16
  i2c_start_wait(112);      // Adresse, alle Adressleitungen sind auf 0 UND das R/W Bit!
17
  i2c_write(224);           // Device Select 0
18
  /*
19
  Aufbau MODE Befehl:
20
  0. Bit        : 1 noch mehr Befehle  
21
                  0 Ende der Befehle
22
  1. - 2. Bit   : 10 (Erkennung für Mode)
23
  3. Bit        : Power Saving
24
                  0 Normal
25
                  1 Power Save
26
  4. Bit        : Display Status
27
                  0 Disabled
28
                  1 Enabled
29
  5. Bit        : BIAS
30
                  0 1/3 Bias
31
                  1 1/2 Bias
32
  6. - 7. Bit   : 0 1 Static 
33
                  1 0 1:2 2 Backplanes
34
                  1 1 1:3 3 Backplanes
35
                  0 0 1:4 4 Backplanes
36
  */
37
 
38
  i2c_write(207);         // 1100 1111 (1/2 Bias, 1:3 Betrieb)
39
  i2c_write(240);         // kein Blinken
40
  i2c_write(0);           // Adresszeiger auf Pos.0 schieben
41
42
  i2c_write(255);
43
  i2c_write(255);
44
  i2c_write(255);
45
  i2c_write(255);
46
  i2c_write(255);
47
48
  i2c_write(255);
49
  i2c_write(255);
50
  i2c_write(255);
51
  i2c_write(255);
52
  i2c_write(255);
53
54
  i2c_write(255);
55
  i2c_write(255);
56
  i2c_write(255);
57
  i2c_write(255);
58
  i2c_write(255);
59
60
  i2c_write(255);
61
  i2c_write(255);
62
  i2c_write(255);
63
  i2c_write(255);
64
  i2c_write(255);
65
66
  i2c_stop();
67
  while(1)
68
  {
69
  }
70
  return 0;
71
}

von Klaus (Gast)


Lesenswert?

Hast Du --testweise-- mal die Variante mit 4 Backplanes probiert?

Klaus

von André L. (do7ale)


Lesenswert?

Ja,

habe ich.

Dann ist das Verhalten richtig, wenn alle 4 x 5 Bytes auf 0 sind 
leuchtet nichts, bei 255 leuchten alle. Kontrast ist natürlich komisch.

Irritierend ist, das erst beim 2. Bit (Dezimal 2) ein Segment angeht, 
beim 1. Bit geht keins an. Und es ist keins der 3 Segmente die beim 1. 
Bit im statischen Modus angehen.

Hmmm...

von André L. (do7ale)


Lesenswert?

So,

ein 1. Lichtblick.

Habe meinen Logikanalysator angeklemmt und sehe das die i2c 
Schnittstelle vom Atmega nur Quatsch überträgt. Als ob er immer 
dauerhaft versucht etwas zu senden...

Ich nehme nun einmal in Ruhe den Code auseinander.

Ich melde mich wieder wenn das auf dem Analyzer schön aussieht. :-)

von André L. (do7ale)


Lesenswert?

So,

ich denke ich habe die Ursache gefunden.

Im Datenblatt vom PCF8576C auf Seite 22 steht es.

Ein Byte im Speicher:

1. Bit: 1 Segment, 1 BP
2. Bit: 1 Segment, 2 BP
3. Bit: 1 Segment, 3 BP

4. Bit: 2 Segment, 1 BP
5. Bit: 2 Segment, 2 BP
6. Bit: 2 Segment, 3 BP

7. Bit: 3 Segment, 1 BP
8. Bit: 3 Segment, 2 BP
(3 Segment, 3 BP ist unbeschrieben!!)

Beim 2. Byte geht es dann mit dem 4. Segment weiter...

Ich muss also, um die fehlenden Segmente zu erreichen den Datenpointer 
richtig hinschieben...

So, frohe Ostern!

Grüße & Danke von André

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.