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 | }
|