ReadModifyWrite beim SED1520

Gast #1170576
Lesenswert?

Hi, versuche gerade den ReadModifyWrite beim SED1520 Controller zu 
benutzen.

Laut Datenblatt soll ich:

-> Seite und Reihe einstellen
-> ReadModifyWrite Befehl übertragen

-> DummyRead
-> Daten lesen
-> Daten schreiben

--> das ganze so oft, wie ich diesen Modus benutzen will

--> Irgendwann mit End den RMW-Modus wider ausschalten.

Soweit sogut, klappt jedoch nicht so ganz.

Mein Code:

1
#define Takt  PORTB  |= (1<<Enable); _delay_us(100); PORTB  &= ~(1<<Enable)
2
#define  Befehl  PORTB  &= ~( (1<<A0) | (1<<RW) )
3
#define  Daten  PORTB  &= ~( (1<<RW) ); PORTB  |= (1<<A0)
4
#define  Lesen  PORTB  |= (1<<A0) | (1<<RW);
5
#define  RMW    PORTB  &= ~(1<<A0);   PORTB  |= (1<<RW); PORTD = 0b11100000;
6

7
.
8
.
9
.
10

11
  Befehl;                      // Es folgt eine Befehlssequenz
12
  PORTD  = PAGE+0;                // Page wählen
13
  Takt;
14
  PORTD  = COLUMN + 0;              // Zeile schreiben
15
  Takt;
16
  
17
  RMW;
18
  Takt;
19

20
for(int i = 0; i<4; i++)
21
{
22
  Lesen;
23
  DDRD  = 0x00;                  // Eingänge
24
  PORTD  = 0;
25
  Takt; 
26
  Takt;
27
  char _0 = PIND;
28

29
  DDRD  = 0xFF;                  // Ausgänge
30
  Daten;
31
  PORTD = (1<<8) | _0;
32
  Takt;
33
}

So werden Daten gelesen und diese zwei Reihen später wider ausgegeben. 
Richtig ist das definitiv nicht. Was mich auch auch stark wundert, ist 
das ich jedesmal Lesen; und Daten; "aufrufen" muss, ansonsten passiert 
nix. Ich dachte eigentlich, das mir der ReadModifyWrite-Modus sowas 
abnehmen würde, da laut Datenblatt diese Befehle eh keine Funktion haben 
sollten.
Ergo gehe werde ich den RMW-Modus nicht richtig initialisiert haben 
und/oder ein TimingProblem besteht, wo genau nun das Problem besteht.

Hat da wer Erfahrungen mit gesammelt und kann mit weiterhelfen?
Gast #1174845
Lesenswert?

Hier ein funktionierendes Bsp. zum Umgang mit ReadModify beim SED1520 
(DIP122 122x32px mit 2x SED1520):

Elementare I/O-Funktionen setze ich bei Dir als funktionierend voraus:
1
// ***********************************************************************
2
// Zeichnen eines Punktes positioniert
3
// Übergabe: lcd_x: X-Koordinate 0...121
4
//           lcd_y: Y-Koordinate 0..31
5
//           mode:  0=Pixel löschen 1=Pixel setzen
6
// ***********************************************************************
7
void draw_clear_pixel(byte lcd_x, byte lcd_y, bit mode) {
8
byte code mask_bit_tab[] = {
9
   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
10
   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
11
   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
12
   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; 
13
byte idata mask_bit;
14
bit display_seite;  // 0=linke 1=rechte Displayhälfte je 0...60
15
  if (lcd_x < 61) {
16
    display_seite = 0;
17
    write_lcd_command(lcd_x,0);             // Colum links
18
    write_lcd_command(0xB8 + lcd_y/8,0);    // Zeile/Page 0...3 linke Hälfte    
19
  } else {
20
    display_seite = 1;
21
    write_lcd_command(lcd_x - 61,1);        // Colum rechts
22
    write_lcd_command(0xB8 + lcd_y/8,1);    // Zeile/Page 0...3 linke Hälfte    
23
  }
24
  mask_bit = mask_bit_tab[lcd_y];
25
  write_lcd_command(0xE0,display_seite);    // Read Modify ON
26
  read_lcd_data(display_seite); // Dumy-Read laut Datenblatt SED1520
27
  if (mode) {
28
    // Pixel setzen
29
    write_lcd_data(read_lcd_data(display_seite) | mask_bit,display_seite);
30
  } else {
31
    // Pixel löschen
32
    write_lcd_data(read_lcd_data(display_seite) & ~mask_bit,display_seite);
33
  }
34
  write_lcd_command(0xEE,display_seite);    // Read Modify END
35
}

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