Forum: Projekte & Code SED1520 - Pollinkompatibel und flink


von Daniel B. (bradan)


Angehängte Dateien:

Lesenswert?

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

von Augenarzt (Gast)


Lesenswert?

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.

von Daniel B. (bradan)


Lesenswert?

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?

von me (Gast)


Lesenswert?


von Daniel B. (bradan)


Lesenswert?


von Bert 0. (maschinist)


Lesenswert?

Tolle Lib. Und so reichhaltig kommentiert.
:-(


Ciao...Bert

von Daniel B. (bradan)


Lesenswert?

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:
1
sed1520DrawImage(uint8_t* imgData, uint8_t mode,
2
   int16_t originX, int16_t originY,
3
   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:
1
void sed1520DrawText(char* text, uint8_t* font, uint8_t mode,
2
   int16_t originX, int16_t originY,
3
   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"):
1
void sed1520DrawBox(uint8_t x, uint8_t y,
2
   uint8_t width, uint8_t height,
3
   uint8_t filled, uint8_t pixelValue);

Zeichnen einer Linie von x1, y1 nach x2, y2, weiß oder schwarz 
("pixelvalue"):
1
void sed1520DrawLine(uint8_t x1, uint8_t y1,
2
   uint8_t x2, uint8_t y2,
3
   uint8_t pixelValue);





Für fortgeschrittene User gibts dann noch das womit viele der obigen 
Befehle arbeiten:
1
void sed1520ShaderExecute(SED1520SHADERCALLBACK shaderCallback,
2
   uint8_t originX, uint8_t originY,
3
   uint8_t width, uint8_t height,
4
   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
1
uint8_t ownFunction(uint8_t x, uint8_t y, uint8_t pixelValue, void* additionalData) {
2
  // do something with pixelValue and return the new pixelValue
3
  // for example xor with additionalData
4
  return pixelValue ^ *((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:
1
uint8_t test = 1;
2
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.

von Artur R. (artur2000)


Lesenswert?

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)

von Daniel B. (bradan)


Lesenswert?

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 ;-) .

von Paul W. (Gast)


Lesenswert?

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

von Daniel B. (bradan)


Angehängte Dateien:

Lesenswert?

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.

von Crabtack (Gast)


Lesenswert?

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:
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 << 2)
11
#define SED1520_E      (1 << 5)
12
#define SED1520_A0      (1 << 6)
13
#define SED1520_CS1      (1 << 3)
14
#define SED1520_CS2      (1 << 4)

Und mein Hauptcode sieht so aus:
1
#define F_CPU 16000000
2
3
#include <stdint.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include <avr/interrupt.h>
7
#include <avr/pgmspace.h>
8
#include "sed1520.h"
9
10
11
12
int main(void) {
13
  
14
  sed1520Init();
15
  sed1520SetDisplayOnOff(1);
16
   
17
18
  sed1520ClearScreen();
19
  
20
    sed1520DrawBox(1, 1, 5, 5, 1, 1);
21
  sed1520DrawBox(10, 0, 100, 32, 0, 1);
22
  sed1520DrawLine(110, 32, 10, 2, 1);
23
  sed1520DrawLine(60, 0, 60, 20, 1);
24
  sed1520DrawLine(10, 10, 120, 10, 1);
25
  while (1) {}
26
  
27
  return 0;
28
}

Gruß
Olaf

von Daniel B. (bradan)


Lesenswert?

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.

von Crabtack (Gast)


Lesenswert?

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

von Daniel B. (bradan)


Lesenswert?

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);

von Crabtack (Gast)


Lesenswert?

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

von Daniel B. (bradan)


Lesenswert?

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.

von Simon K. (simon) Benutzerseite


Lesenswert?

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.
---

von Daniel B. (bradan)


Lesenswert?

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. ;-)

von Crabtack (Gast)


Lesenswert?

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

von Amrius (Gast)


Lesenswert?

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

von Daniel B. (bradan)


Lesenswert?

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

von Mario O. (bender4000)


Lesenswert?

kleiner Nachtrag:

Bei dem Pollin-Display muss der Res-Pin auf high gezogen werden, 
ansonsten bringt das Display nur Pixelmüll.

von internoide (Gast)


Lesenswert?

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!

von spess53 (Gast)


Lesenswert?

Hi

>Datenleitungen in gleicher Reihenfolge wie die Pins an Port C

>Als Prozessor dient ein Atmega32!

JTAG ausgeschaltet?

MfG Spess

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.