Datum:
Angehängte Dateien:Hallo, Da mir die im Web vorhandenen SED1520-Bibliotheken alle nicht so recht zusagten und kaum eine davon Pollinkompatibel war (CS1, CS2 und nur ein E statt E1, E2 und nur ein CS) hab ich mir eine eigene Bibliothek geschrieben die auch schneller ist als die anderen Bibliotheken, da sie eine Art Pixelshader verwendet, mit der nicht jeder Pixel einzeln sondern gleich bis zu 8 übertragen werden. Hier noch eine kleine Demonstration: Youtube-Video "DG12232 display with SED1520 controller with fast pixelcallback shaders" Außerdem kann der sed1520DrawText Befehl den Text auch ohne fixed-width zeichnen. Die Breite der Zeichen wird dann dynamisch bestimmt. Zusätzlich zu der Bibliothek hab ich noch 2 Programme geschrieben: - Font-Bild-Generator (Zeichensätze werden als Bilder gehandhabt die geclippt werden) - Bild zu C-Code mit Skalierung Probierts einfach aus :-) . Mit einer kleinen Modifikation könnte man Bilder sogar skaliert anzeigen. Viel Vergnügen, Daniel
Datum:
Wenn Sie auf dem Video nichts erkennen können, liegt es nicht an Ihren Augen. danke für Ihre Aufmerksamkeit! PS: Na dann reih es mal in die Artikelsammlung zu LCD-Libs und Font-Gens ein.
Datum:
Augenarzt schrieb: > Wenn Sie auf dem Video nichts erkennen können, liegt es nicht an Ihren > Augen. danke für Ihre Aufmerksamkeit! > > PS: > Na dann reih es mal in die Artikelsammlung zu LCD-Libs und Font-Gens > ein. Ja, leider hab ich keine Kamera die das einigermaßen gut aufnimmt. Ich musste sogar eine Lupe davorstellen. Aber so kann man wenigstens einigermaßen erkennen worum es geht. Zu dem PS: Ich nehme an damit ist eine bestimmte Sektion auf dieser Webseite gemeint. Wo genau ist diese denn?
Datum:
Datum:
Tolle Lib. Und so reichhaltig kommentiert. :-( Ciao...Bert
Datum:
Bert Braun schrieb: > Tolle Lib. Und so reichhaltig kommentiert. > :-( > > > Ciao...Bert Naja, also eigentlich dachte ich dass man bei grafischen Befehlen nicht viel wissen muss ;-) und dass der Code ziemlich klein ist, aber wenn es so ist: Zuerst sollte man die Porteinstellungen anpassen. Das geschieht in "sed1520.h" unter dem Kommentar "// port settings":
// port settings #define SED1520_DATAPORT PORTC #define SED1520_DATAPIN PINC #define SED1520_DATADDR DDRC #define SED1520_CTRLPORT PORTD #define SED1520_CTRLDDR DDRD #define SED1520_RES 0 #define SED1520_RW (1 << 0) #define SED1520_E (1 << 3) #define SED1520_A0 (1 << 6) #define SED1520_CS1 (1 << 1) #define SED1520_CS2 (1 << 5) |
Danach ruft man am Anfang des Programms folgendes auf:
sed1520Init(); // Initialisiert alles sed1520SetDisplayOnOff(1); // Schaltet das Display an |
Jetzt ist alles soweit, dass man darauf zeichnen kann. Hier eine Beschreibung der üblichen Befehle/Konstanten: Bei allen Befehlen die uint8_t mode erwarten sind das hier mögliche Konstanten:
SED1520_IMGMODE_NORMAL // D.h. das bild wird ohne Transparenz gemalt SED1520_IMGMODE_INVERTEDCOLORS // Schwarz und Weiß wird vertauscht SED1520_IMGMODE_TRANSPARENTBLACK // Schwarz wird nicht gezeichnet SED1520_IMGMODE_TRANSPARENTWHITE // Weiß wird nicht gezeichnet |
Leeren der Anzeige:
sed1520ClearScreen(); |
Zeichnen eines Bildes (von der Speicherposition imgData) an der Bildschirmposition originX, originY mit dem definierten Ausschnitt (clipX, clipY, clipWidth, clipHeight) vom Bild:
sed1520DrawImage(uint8_t* imgData, uint8_t mode, int16_t originX, int16_t originY, uint8_t clipX, uint8_t clipY, uint8_t clipWidth, uint8_t clipHeight); |
Zeichnen eines Textes (von der Speicherposition text) mit der Schriftart von der Speicherposition font mit der Bildschirmposition originX, originY mit oder ohne fester Breite (Ohne fester Breite wirkt es natürlicher und man hat mehr Platz) und einer relativen Zeichenverschiebung um deltaCharDist Pixel:
void sed1520DrawText(char* text, uint8_t* font, uint8_t mode, int16_t originX, int16_t originY, uint8_t fixedWidth, int8_t deltaCharDist); |
Zeichnen einer Box an der Bildschirmposition x, y, mit der Breite
"width" und Höhe "height", ausgefüllt oder nicht ausgefüllt (filled),
weiß oder schwarz ("pixelValue"):void sed1520DrawBox(uint8_t x, uint8_t y,
uint8_t width, uint8_t height,
uint8_t filled, uint8_t pixelValue); |
Zeichnen einer Linie von x1, y1 nach x2, y2, weiß oder schwarz
("pixelvalue"):void sed1520DrawLine(uint8_t x1, uint8_t y1,
uint8_t x2, uint8_t y2,
uint8_t pixelValue); |
Für fortgeschrittene User gibts dann noch das womit viele der obigen Befehle arbeiten:
void sed1520ShaderExecute(SED1520SHADERCALLBACK shaderCallback, uint8_t originX, uint8_t originY, uint8_t width, uint8_t height, void* additionalData); |
Dieser Befehl beschleunigt einen großflächigen Pixelzugriff indem immer 8 Bits gelesen, verarbeitet und zurückgeschrieben werden statt jedes Bit einzeln wie bei anderen Bibliotheken. Hierzu erstellt man eine Funktion die einen Funktionsrumpf nach SED1520SHADERCALLBACK vorweisen kann, also
uint8_t ownFunction(uint8_t x, uint8_t y, uint8_t pixelValue, void* additionalData) { // do something with pixelValue and return the new pixelValue // for example xor with additionalData return pixelValue ^ *((uint8_t*) additionalData); } |
(x, y sind die Koordinaten des Pixels, pixelValue ist der Wert des Pixels, additionalData ist das was man bei sed1520ShaderExecute im gleichnamigen Parameter angegeben hat) Wenn man nun die Funktion sed1520ShaderExecute nach diesem Muster aufruft:
uint8_t test = 1;
sed1520ShaderExecute((SED1520SHADERCALLBACK) ownFunction, x, y, width, height, &test); |
Dann wird die Funktion ownFunction für jeden Pixel in dem Bereich x, y, width, height einmal aufgerufen mit der jeweiligen Pixelposition, aktuellem Pixelwert und dem additionalData Parameter aufgerufen. Ich glaube das sollte für den Anfang reichen.
Datum:
Sehr gute lib für das Display, große Fonts funktionieren jedoch nicht richtig Tipp, gute Schriftarten für das Display: Consolas, Small Fonts (lesbare Schriftgröße von 4pt)
Datum:
Artur R. schrieb: > Sehr gute lib für das Display, Vielen Dank. > große Fonts funktionieren jedoch nicht richtig Was für ein Problem gibt es bei großen Fonts? Werden die Fonts nicht korrekt im Display angezeigt oder ist es nur ein Problem des Font-Generators? Falls ich nach dem Bachelorprojekt Zeit finde versuche ich eine Lösung für das Problem zu finden. > Tipp, gute Schriftarten für das Display: > Consolas, > Small Fonts (lesbare Schriftgröße von 4pt) Terminal ist mein persönlicher Favorit, denn damit kann man recht viel Text anzeigen auf dem kleinen Display. Andere Fonts wie z.B. Courier waren mir zu breit, aber wenn ich dazu komme werde ich auch mal diese Fonts testen ;-) .
Datum:
Hey, der Beitrag ist zwar schon etwas älter, aber ich versuchs trotzdem mal. Ich hab hier ein Display WD-G1203T mit anscheinend diesem Controller drin. Nun hab ich die Dateien von dir, allerdings kommt nichts auf dem Display. Wie hast du es den angeschlossen? Ich hab jetzt folgendes: 1 - GND 2 - VCC 3 - GND 4 - A0 5-9 frei 10 - 17 -> PD0 - PD7 19 -> LED - VCC 20 - GND Was hab ich den Falsch gemacht? Bin leider noch nicht solange dabei :( Danke, LG
Datum:
Angehängte Dateien:Hallo, Paul W. schrieb: > der Beitrag ist zwar schon etwas älter, aber ich versuchs trotzdem mal. Ich hab den Thread abonniert, also keine Angst - ich krieg jedes mal eine Mail ;-) . > Ich hab hier ein Display WD-G1203T mit anscheinend diesem Controller > drin. Da musst du ein wenig was anpassen, denn mein Code ist für das Pollin Board und das hat (sofern ich mich noch richtig erinnere) ein getrenntes CS1, CS2 und ein gemeinsames E Signal statt einem getrennten E1 und E2 Signal. Da muss man dann das Signal minimal anpassen, aber ich habe leider vergessen wie genau. Dazu müsstest du allerdings auch was im Forum finden. > Nun hab ich die Dateien von dir, allerdings kommt nichts auf dem > Display. Ja, bei mir hat das auch lange gedauert, bis es funktioniert hat. Ich habe hier noch ein Foto rumliegen, vielleicht hilft es dir etwas weiter (Ich gebe zu, die Qualität ist nicht gut, aber die blauen Brücken kann man noch einigermaßen zurückverfolgen). > Wie hast du es den angeschlossen? > > Ich hab jetzt folgendes: > 1 - GND > 2 - VCC > 3 - GND > 4 - A0 > 5-9 frei > 10 - 17 -> PD0 - PD7 > 19 -> LED - VCC > 20 - GND > > Was hab ich den Falsch gemacht? Bin leider noch nicht solange dabei :( In der Header Datei steht:
#define SED1520_DATAPORT PORTC #define SED1520_DATAPIN PINC #define SED1520_DATADDR DDRC #define SED1520_CTRLPORT PORTD #define SED1520_CTRLDDR DDRD #define SED1520_RES 0 #define SED1520_RW (1 << 0) #define SED1520_E (1 << 3) #define SED1520_A0 (1 << 6) #define SED1520_CS1 (1 << 1) #define SED1520_CS2 (1 << 5) |
D.h. RES ist nicht angeschlossen RW ist an PortD Pin Nr. 0 A0 ist an PortD Pin Nr. 6 E ist an PortD Pin Nr. 3 CS1 ist an PortD Pin Nr. 1 CS2 ist an PortD Pin Nr. 5 PortC ist an den Daten-Pins in selber Reihenfolge angeschlossen. [EDIT] Hast du auch das ganze Zeug mit den Kondensatoren gemacht, damit du ein geeignetes 2kHz Signal bekommst? Bin kein Elektroniker, eher Softwareentwickler.
Datum:
Hallo Daniel! Erstmal möchte ich dir für deine LIB danken. Ich habe da allerdings ein Problem und hoffe, dass du mir helfen kannst. Also, ich habe das ganze mit dem Pollin Teil aufgebaut. Also mit der Platine, die die 2 KHz erzeugt (Das Oszi sagt 3.3 KHz) Jedenfalls funktioniert das ganze nur sehr seltsam. Meistens Zeigt das Display garnichts an. Aber so nach jedem 5. Neustart zeigt es ein Gebilde an, dass aus einer Fläche und mehreren Strichen besteht. Manchmal allerdings nur eine Seite des Displays. Hast du eine Idee, woran das liegen könnte? Ich ahbe das ganze so angeschlossen: http://www.abload.de/image.php?img=schaltplan4zixro.png http://www.abload.de/thumb/schaltplan4zixro.png Dann ahbe ich die Header so verändert:
// port settings #define SED1520_DATAPORT PORTC #define SED1520_DATAPIN PINC #define SED1520_DATADDR DDRC #define SED1520_CTRLPORT PORTD #define SED1520_CTRLDDR DDRD #define SED1520_RES 0 #define SED1520_RW (1 << 2) #define SED1520_E (1 << 5) #define SED1520_A0 (1 << 6) #define SED1520_CS1 (1 << 3) #define SED1520_CS2 (1 << 4) |
Und mein Hauptcode sieht so aus:
#define F_CPU 16000000
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "sed1520.h"
int main(void) {
sed1520Init();
sed1520SetDisplayOnOff(1);
sed1520ClearScreen();
sed1520DrawBox(1, 1, 5, 5, 1, 1);
sed1520DrawBox(10, 0, 100, 32, 0, 1);
sed1520DrawLine(110, 32, 10, 2, 1);
sed1520DrawLine(60, 0, 60, 20, 1);
sed1520DrawLine(10, 10, 120, 10, 1);
while (1) {}
return 0;
}
|
Gruß Olaf
Datum:
Hallo, Crabtack schrieb: > Also mit der Platine, die die 2 KHz erzeugt (Das Oszi sagt 3.3 KHz) Daran könnte es schon liegen. Ich habe von Elektronik weniger Ahnung als von Softwareentwicklung, aber ich habe diese externe Ladungspumpe zusätzlich angeschlossen: Beitrag "Re: pollin dot matrix lcd 122x32 dots dg 12232" Du bist jedenfalls auf dem richtigen Weg, bei mir hat es erstmal eine ganze Weile gedauert, bis überhaupt irgendwas angezeigt wurde. Ah und wieso ist bei dir kein E angeschlossen? Du musst RD (oder auch E genannt) an PD5 legen.
Datum:
Hallo Daniel, danke für die schnelle Antwort. E (RD) ist an PD5. Im Schaltplan liegt das auf Reset, ichd ahcte so könnte ich einen Pin sparen. Hat dann aber nicht so gut geklappt. Jetzt liegt E an PD5 :) Ok, hast du eine Idee, wie ich das Problem mit der Software beheben kann? An den 3.3 KHZ kann ich eigentlich nichts mehr ändern. Gruß Olaf
Datum:
Hallo Olaf, Crabtack schrieb: > Hallo Daniel, danke für die schnelle Antwort. > > E (RD) ist an PD5. > Im Schaltplan liegt das auf Reset, ichd ahcte so könnte ich einen Pin > sparen. > Hat dann aber nicht so gut geklappt. > Jetzt liegt E an PD5 :) > > Ok, hast du eine Idee, wie ich das Problem mit der Software beheben > kann? > An den 3.3 KHZ kann ich eigentlich nichts mehr ändern. > > Gruß > Olaf Kannst du mal nur zu Testzwecken mal probieren ob es mit F_CPU 1000000, 2000000, 4000000, 8000000 besser geht? Eventuell stimmt dann etwas mit den Timern nicht oder es kommt mit viel Glück zu einem Ausgleich der 3.3kHz und man erkennt vllt. etwas. Oder hast du zufällig eine funktionierende Kommunikationsleitung zum PC und kannst mal schauen, ob er überhaupt zur while Schleife kommt oder im Code hängen bleibt? Ah, hast du den pixelValue Parameter bei deinen Funktionsaufrufen mal umgedreht? Ich kann mich nicht mehr daran erinnern ob 1 = weiß oder 1 = schwarz ist. Also sed1520DrawLine(10, 10, 120, 10, 0); statt sed1520DrawLine(10, 10, 120, 10, 1);
Datum:
Hallo Daniel. Also bei 8.000.000 klappt es besser zwar immer noch nciht 100% aber erstmal OK. Seltsam ist aber: Wenn ich keine Befehle zum Zeichnen mache sondern erstmal clearscreen () und dann noch in die endlosschleife Clearscreen(), dann bleibt das selstsame Bild noch immer auf dem Display. Selbst wenn ich CS1 und CS2 tausche, das Bild bleibt gleisch. Gruß Olaf
Datum:
Hallo Olaf, Gestern Abend kam mir noch folgender Gedanke: hast du Optimierungen an? Soweit ich weiß sind die delay_us/delay_ms Funktionen bei einer bestimmten Optimierungsstufe unzuverlässig.
Datum:
Daniel B. schrieb: > Hallo Olaf, > > Gestern Abend kam mir noch folgender Gedanke: hast du Optimierungen an? > Soweit ich weiß sind die delay_us/delay_ms Funktionen bei einer > bestimmten Optimierungsstufe unzuverlässig. Keine Halbwahrheiten erzählen! http://www.nongnu.org/avr-libc/user-manual/group__... --- In order for these functions to work as intended, compiler optimizations must be enabled, and the delay time must be an expression that is a known constant at compile-time. If these requirements are not met, the resulting delay will be much longer (and basically unpredictable), and applications that otherwise do not use floating-point calculations will experience severe code bloat by the floating-point library routines linked into the application. ---
Datum:
Simon K. schrieb: > Keine Halbwahrheiten erzählen! > > http://www.nongnu.org/avr-libc/user-manual/group__... > --- > In order for these functions to work as intended, compiler optimizations > must be enabled, and the delay time must be an expression that is a > known constant at compile-time. If these requirements are not met, the > resulting delay will be much longer (and basically unpredictable), and > applications that otherwise do not use floating-point calculations will > experience severe code bloat by the floating-point library routines > linked into the application. > --- Ich hab doch nichts falsches erzählt?! Dein Zitat bestätigt mich ja noch: "If these requirements are not met, the resulting delay will be much longer (and basically unpredictable)" Also wenn die Optimierung nicht an ist (Optimierungsstufe aus) wird der Delay unvorhersehbar. Btw.: Vielleicht willst du Olaf ja helfen, ich habe momentan nicht viel Zeit (Endphase des Studiums) und anscheinend kannst du es ja besser Simon K. ;-)
Datum:
Hallo Daniel,danke für die Antwort! Also Optimierungen habe ich keine an. Momentan arbeitet mein Atmega32 mit 1MHz. Für welchen Takt ist die LIB eigentlich gedacht? Oder passt sie sich an? Ich habe dem ding jetzt mal die Kommunikation mit dem PC ermöglicht um leichter zu debuggen. Gruß Olaf
Datum:
Hey vielen Dank für die Lib! Leider hab ich momentan noch massive Probleme das 12232 zum rennen zu kriegen. Daher wollte ich deinen Code gerne mal testen... Du hast leider noch nicht gesagt wofür du den Timer0 und seine ISR verwendest... (200kHz an PortA ?) Würde das gerne ersetzen um meine 2kHz Ladungspumpenfrequenz zu erzeugen. Davon mal ab das ich den PortA sowieso brauche. Kann der Timer ohne weiteres raus ? Grüße
Datum:
Amrius schrieb: > Hey vielen Dank für die Lib! > Leider hab ich momentan noch massive Probleme das 12232 zum rennen zu > kriegen. Daher wollte ich deinen Code gerne mal testen... > > Du hast leider noch nicht gesagt wofür du den Timer0 und seine ISR > verwendest... (200kHz an PortA ?) Würde das gerne ersetzen um meine 2kHz > Ladungspumpenfrequenz zu erzeugen. Davon mal ab das ich den PortA > sowieso brauche. > Kann der Timer ohne weiteres raus ? > > Grüße Hallo, Also 200kHz sind das nicht (5µs mal 10000 mal 10 = 0,5s), ich glaube ich hab da eine LED dran gehabt, damit ich wusste dass er arbeitet (ab und zu waren die Steckverbinder nicht richtig kontaktiert und ich wunderte mich dann dass er nichts tut). Mit freundlichen Grüßen, Daniel
Datum:
kleiner Nachtrag: Bei dem Pollin-Display muss der Res-Pin auf high gezogen werden, ansonsten bringt das Display nur Pixelmüll.


