Forum: Mikrocontroller und Digitale Elektronik SED1520 Read: Problem mit statischen Pixeln?


von ●● pit ●. (Gast)


Angehängte Dateien:

Lesenswert?

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
}

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.