C-Library für Displaymodule XV-GDM128X64 und XV-GDM128X64-RGB (Atmel Studio 6)

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
C-Library für Displaymodule XV-GDM128X64 und XV-GDM128X64-RGB (Atmel Studio 6)



Achtung:
Diesen Beitrag werde ich durch weitere Erklärungen, Bilder und Video erweitern !



Für die Displaymodule XV-GDM128X64 und XV-GDM128X64-RGB (mit RGB LED-Backlight)
habe ich eine C-Library für Atmel Studio 6 geschrieben.

Diese möchte ich euch nun zur Verfügung stellen.


Beide Displays habe ich euch bereits im Forum Mikrocontroller-Praxis.de Onlineshop vorgestellt.

Links zu den Themen:
XV-GDM128X64
XV-GDM128X64-RGB







Weitere Erklärungen folgen noch in diesem Beitrag!


Features der Library:


  • einfach in Atmel Studio Projekt einbinden
  • für AVR und AVR Xmega Mikrocontroller (einfach in Config.h die Architektur auswählen)
  • unterstützt SoftwareSPI und HardwareSPI
  • Display-Modi:
    • Landscape (Breite 128px, Höhe 64px) und
    • Portrait (Breite 64px, Höhe 128px)
  • Signale der Schnittstelle (A0, RESET\, CS\, MOSI und SCK):
    • bei SoftwareSPI beliebigen IO-Pins zuzuordnen,
    • bei HarwareSPI steht MOSI und SCK fest
  • sind mehrere SPI-Module vorhanden (Xmega), kann ein beliebiges SPI-Modul ausgewählt werden (HardwareSPI)
  • aktuell sind zwei Fonts (FONT_1 und FONT_2) integriert. Der größere FONT_2 kann "abgeschaltet" werden, so dass man Flash-Momory einspart
  • des Display-Memory befindet sich im Applikations-Mikrocontroller. Die Funktionen der Lib haben somit schnellen Zugriff auf den Speicher (belegt wird 1.024Byte SRAM), dadurch...
  • jeder Pixel kann adressiert werden (Adressierungsmodi sind: Pixel setzen, Pixel löschen, Pixel mit EXOR-Funktion)
  • grafische Grundfunktionen sind implementiert: Draw_Pixel, Draw_Line, Draw_Rect, Draw_Circle.
  • Textausgabe: Display_Text und Display_Text_F (Text im Flash Memory)
  • Zahlen: 8bit und 16bit dezimal ausgeben (weiteres werde ich vielleicht noch einbauen oder kann auch von der eigenen Software über die Display_Text Funktionen ausgegeben werden).
  • Text-Modi: normal/invers, Hintergrund vorhanden oder "durchsichtig"
  • Funtion zur Kontrasteinstellung: SetContrast
  • Grafiken ausgeben, die sich im Flash Memory befinden (Display_Image)
  • RGB-LED-Backlight kann von der Library gesteuert werden. Signale können invertiert werden (alles einstellbar in Config.h, PWM habe ich nicht realisiert)


Interface der Displaymodule (SPI):

Insgesamt werden 5 Signale benötigt. Ist SoftwareSPI gewählt, können diese an beliebige freie IO-Pins gelegt werden. Ist HardwareSPI gewählt, liegt MOSI und SCK an den IO-Pins des SPI-Moduls, die anderen bleiben frei.


  • MOSI (DATA)
  • SCK
  • CS\
  • A0
  • RESET\

Durch die Routine Display_Update() wird der gesamte Grafikspeicher des Displaymoduls aktualisiert. Die Framerate ist natürlich direkt von der SPI-Übertragungsrate abhängig.

SPI
System
Frame rate
SoftwareSPIATmega32A @ 16MHz110Hz
(9ms Aktualisierungszeit)
HardwareSPIATmega32A @ 16MHz
fsck = 8MHz* (Prescaler 2)
258Hz
(3,5ms Aktualisierungszeit)

* testweise habe ich hier die Übertragungsrate sehr hoch gewählt. Die Übertragungsrate sollte 5MHz nicht überschreiten, also bei HardwareSPI den Prescaler entsprechend auswählen (siehe Config.h).


Dateien

  • GraphicDisplayModule128X64.c
  • Config.h
  • Display.c
  • Display.h
  • Display_Interface_AVR8.h
  • Display_Interface_XMEGA.h
  • Font.h
  • Image.h



Prototypen der Funktionen

Code:
[B]System[/B]

void Display_Init(void);
void Display_Update(void);

void Display_SetContrast(uint8_t i);
Parameter: i = 0..40, center is 20


[B]Display graphic[/B]

void Display_Clear(void);
void Display_Fill(void);        
void Display_DrawPixel(int16_t x, int16_t y);
void Display_DrawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1);
void Display_DrawRect(int16_t x, int16_t y, int16_t w, int16_t h);
void Display_DrawRect_Fill(int16_t x, int16_t y, int16_t w, int16_t h);
void Display_DrawCircle(int16_t x0, int16_t y0, int16_t radius);
        
SetPenMode(mode)
Parameter: mode = pmSET, pmCLEAR, pmEXOR
pmSet     : set pixel
pmCLEAR    : clear pixel
pmEXOR    : exor pixel

void Display_DrawImage(int16_t x1, int16_t y1, const uint8_t *image)

[B]Display text[/B]
        
void Display_Text(uint8_t x, uint8_t y, char *string);
void Display_Text_F(uint8_t x, uint8_t y, const char *string);
        
SetFont(index)
Parameter: index = FONT_1 or FONT_2
Font 1: width: 6px, height: 8px
Font 2: width:10px, height 16px, memory usage about 5326 Byte
(Font 2 available if EMBED_FONT2 = true, see Config.h)
        
SetTextMode(mode)
Parameter: mode = (tmNormal or tmInverse) and (tmBrushSolid or tmBrushClear)
tmNormal    : display text normal
tmInverse    : display text inverse
tmBrushSolid: backround of text is solid (inversed to pen color)
tmBrushClear: background of text is not visible
tmInit        : normal and solid brush


[B]Decimal numbers[/B]
        
void Display_Decimal8(int16_t x, int16_t y, uint8_t d);
void Display_Decimal16(int16_t x, int16_t y, uint16_t d);


[B]Backlight[/B]
        
void Display_SetBacklight_By_Color(uint8_t color);
Parameter color: blOFF, blRED, blGREEN, blYELLOW, blBLUE, blPURPLE, blCYAN, blWHITE
        
Available if backlight controlled by lib (DISPLAY_BACKLIGHT_CONTROL = true), see Config.h.



Datenblatt:
XV-GDM128X64 Datasheet.pdf
XV-GDM128X64-RGB Datasheet.pdf

Links in den Onlineshop:
XV-GDM128X64
XV-GDM128X64-RGB



Mein Bilderalbum im Forum
Die Bilder im Album zeigen das Displaymodul am Nano Board mit ATmega32A (16MHz, VCC5V).
(Leider stimmt die Reihenfolge der Bilder nicht mit der Abfolge des Demoprogramms überein.)


Eine Lösung für Arduino (C++) und auch für BascomAVR (Basic) werde ich noch erstellen, naja zumindest habe ich es geplant ;)




Library_XV-GDM128x64_AtmelStudio.zip

Atmel Studio C Library for the display modules XV-GDM128X64 and XV-GDM128X64-RGB (www.xv-display.de).

Author: Dirk
BSD License

Revision 1


Das folgende Video zeigt den Ablauf des Demoprogramms

[video=youtube;Dm7iPxb4uJA]http://www.youtube.com/watch?v=Dm7iPxb4uJA[/video]
 

CDS

Neues Mitglied
4 Jan 2015
6
0
1
37
Oberboihingen
Sprachen
ANSI C, Assembler
Bitmap-Darstellung

Hallo, habe mit kürzlich das besagte Display zugelegt und funktioniert auch prächtig.

Allerdings möchte ich auch Bitmaps ( auch eigene Darstellen).
Nach etlichen Versuchen mit diversen Tools ( LCD-Vision, Bmp2 code ect) schlugen leider fehl.

Die Größeneinteilen gemäß dem Beispiel "Image.h" habe ich soweit eingehalten,
sprich wenn das Bild 64px x 64 px hat steht bei mir dementsprechend:

Code:
const uint8_t Bild1[] PROGMEM = {
8, // width (bytes) ( 64px/8=8)
64, // height (pixels)
.....
Es liegt wohl generell an der Generierung des Codes für die Bilddatei...
Hat da jemand schon Erfahrung gesammelt, bzw. einen Tipp für mich?

MFG
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Hallo und Willkommen im AVR-Praxis-Forum :)


Ich hatte mir irgendwann einmal ein Windowsprogramm geschrieben, welches Bitmap-Bilder in das in der Lib benutzte Format konvertiert.

Ich schau da später mal nach, und lade es dann im Forum hoch.

Dirk :ciao:
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Ich habe das Programm leider nicht auf meinem Rechner zu Hause, da schaue ich die Woche nochmal nach.

Falls es hilft, der Aufbau des Bildes sieht folgerndermaßen aus:
Das Bild ist Zeilenweise aufgebaut (es sind n Bytes in einer Zeile enthalten. Das höherwertige Bit eines Bytes ist links)
Das erste byte im Array ist die Breite in Byte, das zweite byte ist die Höhe in Zeilen (Bits).

Man kann auch den Programmteil in der lib an eine andere Struktur anpassen:
(Wenn ich den Aufbau des Bildes im Array kenne, könnte ich dies sicherlich machen)

Dirk :ciao:

Dies wäre die zu ändernde Funktion, welche sich in Display.c befindet:
[CCODE]void Display_DrawImage(int16_t x1, int16_t y1, const uint8_t *image)
{

uint16_t index, w, h;
uint8_t width, height, i, data;
index = 0;

width = pgm_read_byte(&image[index++]); // in bytes
height = pgm_read_byte(&image[index++]); // in pixels (rows)

for (h=0; h<height; h++)
{

for (w=0; w<(width<<3); w+=8)
{
data = pgm_read_byte(&image[index++]);

for (i=0; i<8; i++)
{
if (data & (0x80>>i))
{
_Display_ImagePixel(w+i+x1, h+y1, 1);
} else {
_Display_ImagePixel(w+i+x1, h+y1, 0);
}
}

}

}

}[/CCODE]
 

IngoP

Mitglied
4 Jan 2012
72
2
8
45
Sprachen
BascomAVR, Pascal
Hallo, ich muss das Thema noch einmal hervorholen.
Nachdem ich mich von meiner Ursprünglichen ATMEGA Lösung zu einem PI meiner Heizungssteuerung umentschieden habe, möchte ich jetzt dieses Display auch an den GPIOs des Pi betreiben. (SPI) Hat jemand eine Idee, was ich dafür machen muss um das Display auf einem PI ans laufen zu bekommen? Die Zeichenausgabe aus FHEM heraus ist dann noch einmal eine andere Hausnummer ...
 

Dirk

Administrator
Teammitglied
28 Jan 2007
4.282
141
63
Mittelhessen, Giessen
Sprachen
ANSI C, C++, C#, Java, Kotlin, Pascal, Assembler, PHP
Hallo Ingo,

schau vielleicht mal nach einer Raspi-Lösung für ein DOGM128, vielleicht findest du etwas.

Es wird der selbe LCD Controller (ST7565R) verwendet. Unterschiede gibt es nur bei der Initialisierung.

Vielleicht hilft dir dies ja schon einmal weiter.

(aus einem Bascom Source ...)
Code:
DOGM128
&HE2, &H40, &HA1, &HC0, &HA6, &HA2, &H2F, &HF8, &H00, &H27, &H81, &H16, &HAC, &H00, &HAF

Initialisierung für das XV-GDM128X64-RGB und XV-GDM128X64:
&HE2, &H40, &HA0, &HC8, &HA6, &HA2, &H2F, &HF8, &H00, &H24, &H81, &H1F, &HAC, &H00, &HAF
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)