Forum: Mikrocontroller und Digitale Elektronik ReadModifyWrite beim SED1520


von Marcel (Gast)


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?

von Max (Gast)


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
}

von Marcel (Gast)


Lesenswert?

Ah, hab meinen Fehler gefunden. Hatte A0 und WR Falsch beschaltet, warum 
auch immer. Jetzt klappt es!
Danke dir trotzdem.

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.