www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RAM-buffer auf Display (EA-DOGM128) ausgeben


Autor: Tobias John (tobiasjohn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich möchte bei einem EA-DOGM128 die Pixel "pixelweise" setzen können. Da 
man den Display-RAM nicht auslesen kann habe ich einen "Buffer" dafür im 
PIC-RAM definiert.

Leider habe ich diverse Probleme mit der Ausgabe des Buffers. Es werden 
zwar auch die richtigen Pixel gesetzt - jedoch wiederholt sich die 
Ausgabe entweder in x- oder y-Richtung (je nachdem was ich für routinen 
benutze).

Es ist bestimmt nur ein Denkfehler meinerseits.

Hier die Routine zum setzen der Pixel im PIC-RAM:
void display_setpixel(unsigned char x, unsigned char y, unsigned char color) {
  if (x < 128 && y < 64)
    if (color != 0)
      disp_ram[(y >> 3) + (x << 3)] |=  (1 << (y & 0x07));
    else
      disp_ram[(y >> 3) + (x << 3)] &= ~(1 << (y & 0x07));
  
}

und hier die Routine zum Ausgeben:
void display_flush()
{
  unsigned char page, column;
  for (page = 0; page < 8; page++)
  {
    display_write(0xB0 + page, CMD); //Set page address to <page>
    display_write(0x10, CMD);
    display_write(0x00, CMD);

    for (column = 0; column < 128; column++) {
      display_write(disp_ram[((page) + (column << 3))],DATA);
    }
  }
}

definiert ist "disp_ram" wie folgt:
char disp_ram[1024];

Bin für jeden Hinweis dankbar. Ich habe nun so ziemlich alle Variationen 
zur Errechnung der Adresse und zur Ausgabe ausprobiert ;-)

Gruß,
 Tobias

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias John schrieb:

>       disp_ram[(y >> 3) + (x << 3)] |=  (1 << (y & 0x07));

Also, das passt mir nicht. Du hast ja immer 8 Pixel uebereinander in 
einem Byte. 128 Byte pro Page und 8 Pages.

Ich wuerde arbeiten mit

uint8_t Column = x;
uint16_t Page = y >> 3;
uint8_t Pixel = y & 0x07;
uint16_t Address = ( Page * 128) + Column;

disp_ram[ Address] |= Pixel;

Bei der ausgabe dann genauso:

uint16_t Address = ( Page * 128) + Column;

write( disp_ram[ Address]);

Alternativ koennte man disp_ram auch gleich zweidimensional 
deklarieren...

Autor: Tobias John (tobiasjohn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter Stegemann schrieb:
> Ich wuerde arbeiten mit
>
> uint8_t Column = x;
> uint16_t Page = y >> 3;
> uint8_t Pixel = y & 0x07;
> uint16_t Address = ( Page * 128) + Column;
>
> disp_ram[ Address] |= Pixel;
>
> Bei der ausgabe dann genauso:
>
> uint16_t Address = ( Page * 128) + Column;
>
> write( disp_ram[ Address]);

Ich habe es jetzt so gemacht:
void display_setpixel(unsigned char x, unsigned char y, unsigned char color) {
  if (x < 128 && y < 64)
    if (color != 0)
      disp_ram[( (y >> 3) * 128) + x] |=  (1 << (y & 0x07));
    else
      disp_ram[( (y >> 3) * 128) + x] &= ~(1 << (y & 0x07));
  
}

void display_flush()
{
  unsigned char page, column;
  for (page = 0; page < 8; page++)
  {
    display_goto(0,page);
    for (column = 0; column < 128; column++) {
      display_write(disp_ram[( page * 128) + column],DATA);
    }
  }
}

Jetzt wird das ganze 4x in y-Richtung wiederholt.

Irgendwie klappt auch das nicht.

Ne Idee wo der Fehler liegt?

Autor: Michael P. (protactinium)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tobias,

hier
http://msp430.ms.funpic.de/doku.php?id=projekte:gr...
gibts routinen die funktionieren. kannst sie dir ja mal anschauen.

Michael

Autor: Tobias John (tobiasjohn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manchmal kann die Lösung so einfach sein.

Ich habe jetzt mal den Vorschlag von Peter verfolgt und ein 
zwei-dimensionales array als buffer genommen.

Ist übersichtlicher und einfacher anzusprechen - und schon geht es... 
und zwar so:
void display_setpixel(unsigned char x, unsigned char y, unsigned char color) {
  disp_ram[y/8][x] |= (1 << (y & 0x07));
}

void display_flush() {
  unsigned char page, x;
  for(page=0;page<8;page++) {
    display_goto(0,page);
    for(x=0;x<128;x++) {
      display_write(disp_ram[page][x],DATA);
    }
  }
}

Dank euch für die Hilfe!

Gruß,
 Tobias

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.