Hallo,
ich hoffe jemand kann mir helfen:
Ich bastle gerade an einer SED1520 Library. Die klappt bereits, sofern
ich alles Write-Only benutze.
Nun möchte ich Draw Modes (SET/CLR/XOR) einbauen. Das Problem ist,
obwohl es funktioniert den Status zu lesen, kann ich offenbar nicht
normal Daten lesen -> es sind immer die 3 MSBs gesetzt (siehe
Screenshot).
Nachstehend mein aktueller Testcode, der Write-Only klappt, aber mit dem
Read (egal ob mit ReadModifyWrite oder ohne) immer die 3 höchsten Bits
gesetzt hat.
Ich habe mit den Delays in Read...() natürlich rumgespielt, ebenso den
Code mehrfach refactored, auch alle in anderen Libraries gefundenen
Varianten ausprobiert, keine klappt.
Auch habe ich mehrere verschiedene SED1520 Displays, alle haben den
gleiche Effekt.
Wäre für einen Tipp dankbar!
- pit
1 | uint8_t ReadDataDirect(uint8_t ctrl)
|
2 | {
|
3 | uint8_t data = 0x00;
|
4 |
|
5 | if (ctrl & GLCD_CTRL_A) {
|
6 | GLCD_WaitForStatus(0x80, GLCD_CTRL_A);
|
7 | }
|
8 |
|
9 | if (ctrl & GLCD_CTRL_B) {
|
10 | GLCD_WaitForStatus(0x80, GLCD_CTRL_B);
|
11 | }
|
12 |
|
13 | _delay_ms(1);
|
14 |
|
15 | SED1520_DATA_DDR = 0x00;
|
16 | SED1520_DATA_PORT = 0xFF;
|
17 |
|
18 | SED1520_CONTROL_PORT |= SED1520_A0;
|
19 | SED1520_CONTROL_PORT |= SED1520_RW;
|
20 |
|
21 | #define CONTROLER_CS ((ctrl == GLCD_CTRL_A) ? SED1520_E1 : SED1520_E2)
|
22 |
|
23 | // not really necessary
|
24 | SED1520_CONTROL_PORT |= CONTROLER_CS;
|
25 | asm("nop"); asm("nop");
|
26 | SED1520_CONTROL_PORT &= ~CONTROLER_CS;
|
27 | asm("nop"); asm("nop");
|
28 |
|
29 | _delay_us(5);
|
30 |
|
31 | SED1520_CONTROL_PORT |= CONTROLER_CS;
|
32 | //asm("nop"); asm("nop");
|
33 | _delay_us(5);
|
34 |
|
35 | data = SED1520_DATA_PIN;
|
36 | _delay_us(5);
|
37 |
|
38 | SED1520_CONTROL_PORT &= ~CONTROLER_CS;
|
39 |
|
40 | SED1520_DATA_PORT = 0x00;
|
41 | SED1520_DATA_DDR = 0xFF;
|
42 |
|
43 | return data; // hat immer die 3 msb gesetzt - warum?
|
44 | }
|
45 |
|
46 |
|
47 | void GLCD_DrawPixel(uint8_t x, uint8_t y)
|
48 | {
|
49 | uint8_t d = 0x00;
|
50 | uint8_t page = y / 8;
|
51 | uint8_t bit = (1 << (y % 8));
|
52 |
|
53 | GLCD_SetPage(page);
|
54 | GLCD_SetColumn((x > (SCREEN_WIDTH / 2)) ? x - (SCREEN_WIDTH / 2) - 1 : x);
|
55 |
|
56 | GLCD_WriteCommand(READ_MODIFY_WRITE, GLCD_CTRL_ALL);
|
57 |
|
58 | if (x <= (SCREEN_WIDTH / 2)) {
|
59 | GLCD_ReadDataDirect(GLCD_CTRL_A); // dummy as per datasheet
|
60 | d = GLCD_ReadDataDirect(GLCD_CTRL_A);
|
61 | GLCD_WriteDataDirect(d | bit, GLCD_CTRL_A);
|
62 | }
|
63 | else {
|
64 | GLCD_ReadDataDirect(GLCD_CTRL_B); // dummy as per datasheet
|
65 | d = GLCD_ReadDataDirect(GLCD_CTRL_B);
|
66 | GLCD_WriteDataDirect(d | bit, GLCD_CTRL_B);
|
67 | }
|
68 |
|
69 | GLCD_WriteCommand(END_READ_MODIFY, GLCD_CTRL_ALL);
|
70 | }
|