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:
http://www.youtube.com/watch?v=E6Xhk8M6Qok
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
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.
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?
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":
1
// port settings
2
#define SED1520_DATAPORT PORTC
3
#define SED1520_DATAPIN PINC
4
#define SED1520_DATADDR DDRC
5
6
#define SED1520_CTRLPORT PORTD
7
#define SED1520_CTRLDDR DDRD
8
9
#define SED1520_RES 0
10
#define SED1520_RW (1 << 0)
11
#define SED1520_E (1 << 3)
12
#define SED1520_A0 (1 << 6)
13
#define SED1520_CS1 (1 << 1)
14
#define SED1520_CS2 (1 << 5)
Danach ruft man am Anfang des Programms folgendes auf:
1
sed1520Init();// Initialisiert alles
2
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:
1
SED1520_IMGMODE_NORMAL// D.h. das bild wird ohne Transparenz gemalt
2
SED1520_IMGMODE_INVERTEDCOLORS// Schwarz und Weiß wird vertauscht
3
SED1520_IMGMODE_TRANSPARENTBLACK// Schwarz wird nicht gezeichnet
4
SED1520_IMGMODE_TRANSPARENTWHITE// Weiß wird nicht gezeichnet
Leeren der Anzeige:
1
sed1520ClearScreen();
Zeichnen eines Bildes (von der Speicherposition imgData) an der
Bildschirmposition originX, originY mit dem definierten Ausschnitt
(clipX, clipY, clipWidth, clipHeight) vom Bild:
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:
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"):
1
voidsed1520DrawBox(uint8_tx,uint8_ty,
2
uint8_twidth,uint8_theight,
3
uint8_tfilled,uint8_tpixelValue);
Zeichnen einer Linie von x1, y1 nach x2, y2, weiß oder schwarz
("pixelvalue"):
1
voidsed1520DrawLine(uint8_tx1,uint8_ty1,
2
uint8_tx2,uint8_ty2,
3
uint8_tpixelValue);
Für fortgeschrittene User gibts dann noch das womit viele der obigen
Befehle arbeiten:
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
// do something with pixelValue and return the new pixelValue
3
// for example xor with additionalData
4
returnpixelValue^*((uint8_t*)additionalData);
5
}
(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:
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.
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)
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 ;-) .
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
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:
1
#define SED1520_DATAPORT PORTC
2
#define SED1520_DATAPIN PINC
3
#define SED1520_DATADDR DDRC
4
5
#define SED1520_CTRLPORT PORTD
6
#define SED1520_CTRLDDR DDRD
7
8
#define SED1520_RES 0
9
#define SED1520_RW (1 << 0)
10
#define SED1520_E (1 << 3)
11
#define SED1520_A0 (1 << 6)
12
#define SED1520_CS1 (1 << 1)
13
#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.
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.pnghttp://www.abload.de/thumb/schaltplan4zixro.png
Dann ahbe ich die Header so verändert:
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.
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
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);
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
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.
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__util__delay.html
---
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.
---
Simon K. schrieb:> Keine Halbwahrheiten erzählen!>> http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html> ---> 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. ;-)
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
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
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
Hallo,
ich möchte gerne deine Lib benutzen für mein LCD 12232-4. Nun habe ich
deine files in mein AVR- Studio Projekt kopiert. Außerdem habe ich
folgende Main Routine geschrieben:
#include <stdint.h>
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include "sed1520.h"
#define F_CPU 1000000
int main(void) {
sed1520Init();
sed1520SetDisplayOnOff(1);
while(1)
{
}
return 0;
}
um mal die allgemeine Funktion des LCD zu überprüfen. Leider Ohne
Erfolg. Software dürfte auch tun. LCD Spannungsversorgung scheint
korrekt(Display zeigt alle pixel dunkel an).
Akt Pin Belegung wie original in sed1520.h
Datenleitungen in gleicher Reihenfolge wie die Pins an Port C
Die Steuerleitungen an PortD:
A0=6
cs2=5
e=3
cs1=1
rw=0
Außerdem habe ich Res auf +5V gelegt
Als Prozessor dient ein Atmega32!
Ich hoffe jemand kann mir sagen was ich Falsch mache!