mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ReadModifyWrite beim SED1520


Autor: Marcel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:

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

.
.
.

  Befehl;                      // Es folgt eine Befehlssequenz
  PORTD  = PAGE+0;                // Page wählen
  Takt;
  PORTD  = COLUMN + 0;              // Zeile schreiben
  Takt;
  
  RMW;
  Takt;

for(int i = 0; i<4; i++)
{
  Lesen;
  DDRD  = 0x00;                  // Eingänge
  PORTD  = 0;
  Takt; 
  Takt;
  char _0 = PIND;

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

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?

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
// ***********************************************************************
// Zeichnen eines Punktes positioniert
// Übergabe: lcd_x: X-Koordinate 0...121
//           lcd_y: Y-Koordinate 0..31
//           mode:  0=Pixel löschen 1=Pixel setzen
// ***********************************************************************
void draw_clear_pixel(byte lcd_x, byte lcd_y, bit mode) {
byte code mask_bit_tab[] = {
   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; 
byte idata mask_bit;
bit display_seite;  // 0=linke 1=rechte Displayhälfte je 0...60
  if (lcd_x < 61) {
    display_seite = 0;
    write_lcd_command(lcd_x,0);             // Colum links
    write_lcd_command(0xB8 + lcd_y/8,0);    // Zeile/Page 0...3 linke Hälfte    
  } else {
    display_seite = 1;
    write_lcd_command(lcd_x - 61,1);        // Colum rechts
    write_lcd_command(0xB8 + lcd_y/8,1);    // Zeile/Page 0...3 linke Hälfte    
  }
  mask_bit = mask_bit_tab[lcd_y];
  write_lcd_command(0xE0,display_seite);    // Read Modify ON
  read_lcd_data(display_seite); // Dumy-Read laut Datenblatt SED1520
  if (mode) {
    // Pixel setzen
    write_lcd_data(read_lcd_data(display_seite) | mask_bit,display_seite);
  } else {
    // Pixel löschen
    write_lcd_data(read_lcd_data(display_seite) & ~mask_bit,display_seite);
  }
  write_lcd_command(0xEE,display_seite);    // Read Modify END
} 

Autor: Marcel (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.