Guten Abend, habe nun im Anhang endlich eine (voll-)funktionsfähige Library für die Ansteuerung des DG-12232 Adapterboard von Pollin. Die Ansteuerung bezieht sich dabei auf 2 SED1520daa Controller. Habe noch nie so etwas online gestellt, die Optik entspricht wohl Kraut und Rüben. Ich kenne die Normen nicht und habe mich allein mit dem Funktionieren zu lange befasst, also wer da mehr Erfahrung hat, sei herzlich eingeladen mir zu erzählen, was man ändern kann. Besser wäre wohl, selbst ein bisschen mit rumzuspielen. Für all diejenigen, die in dem Gebiet auch Einsteiger sind, habe ich ein Doc-File mit reingestellt, was ich für mich zusammengefasst habe. Auch hier seien Fehler bitte offen zu legen. Als dann nur noch zu wünschen bleibt, das ihr schneller wesentlichere Dinge mit dem Display anstellen könnt. liebe grüße logos
Sehr schön, genau das habe ich gesucht! Das basiert auf http://en.radzio.dxp.pl/sed1520/ . Was hast du genau angepasst, damit es mit den DG-12232 Adapterboards von Pollin funktioniert? Ich hatte zuerst auch die Probleme die schon in dem Thread angesprochen wurden: Beitrag "pollin dot matrix lcd 122x32 dots dg 12232" Ich habe noch in der Datei "SED1520-AVR.c" in Zeile 99 ein delay auskommentiert, welches das Zeichnen von Linien sehr langsam machte. Getestet habe ich es mit einem ATMega32 mit 16 Mhz. Alles funktioniert, Text, Linie, Rechteck, Kreis. Schön! Im Anhang gibts meine Modifikation mit Testprogramm. Die Pinbelegung wird auch in der Datei "SED1520-AVR.c" definiert, die muss man anpassen. Viel Spaß damt ;)
Super Beitrag, Habs sofort nachgebaut, mit "Spannungspumpe" für Negative Rev und der Lib. Zeigt jetzt wunderbar das Testlogo, Kreise usw.. Ich hab jetzt nur noch ein Problem: Konnte mir leider kein Funktionierendes Logo selbst schnitzen. Ich verwende das Programm von mugui (Version 0.1.0.0) und die xsl Datei für avr. Leider kommt dabei nur eine "Ameisenstraße" raus. Welche xsl hast du verwendet ? Nur zur Info: ich hatte beim kompilieren das Problem, dass in der GLCD_WriteData Funktion (Datei SED1520-AVR.c) zu viele Parameter angemozt. Habs mir entsprechend angepasst... vielen dank avryeti
ist gelöst. es müssen 4 extra zeilen erstellt werden mit je 8x122 und vertical ceiling exportiert. viel spaß
Moin moin, wenn ich versuche die Librarys zu verwenden, egal welche der beiden, bekomme ich immer diesen Fehler:
1 | -------- begin -------- |
2 | avr-gcc (WinAVR 20100110) 4.3.3 |
3 | Copyright (C) 2008 Free Software Foundation, Inc. |
4 | This is free software; see the source for copying conditions. There is NO |
5 | warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
6 | |
7 | |
8 | Compiling C: main.c |
9 | avr-gcc -c -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -fu |
10 | nsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adh |
11 | lns=./main.lst -std=gnu99 -MMD -MP -MF .dep/main.o.d main.c -o main.o |
12 | main.c:2:1: warning: "F_CPU" redefined |
13 | <command-line>: warning: this is the location of the previous definition |
14 | main.c: In function 'main': |
15 | main.c:49: warning: unused variable 'test1' |
16 | |
17 | Linking: main.elf |
18 | avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os -funsigned-char -funsi |
19 | gned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -Wa,-adhlns |
20 | =main.o -std=gnu99 -MMD -MP -MF .dep/main.elf.d main.o --output main.elf -Wl,-M |
21 | ap=main.map,--cref -lm |
22 | main.o: In function `main': |
23 | B:\MC\lcd/main.c:52: undefined reference to `GLCD_Init' |
24 | B:\MC\lcd/main.c:53: undefined reference to `GLCD_ClearScreen' |
25 | B:\MC\lcd/main.c:60: undefined reference to `GLCD_Bitmap' |
26 | B:\MC\lcd/main.c:65: undefined reference to `GLCD_ClearScreen' |
27 | B:\MC\lcd/main.c:66: undefined reference to `GLCD_WriteString' |
28 | B:\MC\lcd/main.c:67: undefined reference to `GLCD_GoTo' |
29 | B:\MC\lcd/main.c:68: undefined reference to `GLCD_WriteString' |
30 | B:\MC\lcd/main.c:69: undefined reference to `GLCD_GoTo' |
31 | B:\MC\lcd/main.c:70: undefined reference to `GLCD_WriteString' |
32 | B:\MC\lcd/main.c:71: undefined reference to `GLCD_GoTo' |
33 | B:\MC\lcd/main.c:72: undefined reference to `GLCD_WriteString' |
34 | B:\MC\lcd/main.c:79: undefined reference to `GLCD_ClearScreen' |
35 | B:\MC\lcd/main.c:81: undefined reference to `GLCD_Line' |
36 | B:\MC\lcd/main.c:83: undefined reference to `GLCD_Rectangle' |
37 | B:\MC\lcd/main.c:85: undefined reference to `GLCD_Circle' |
38 | B:\MC\lcd/main.c:87: undefined reference to `GLCD_Circle' |
39 | B:\MC\lcd/main.c:88: undefined reference to `GLCD_Line' |
40 | make: *** [main.elf] Error 1 |
Ich hab mit mfile ne Makefile erstellt, ging bisher imme wunderbar, hab an den Dateien nix geändert, und selbst die Beispieldatei main.c geht nicht zu kompilieren... Ich verstehs einfach nicht... Weiss vlt einer von euch, worans liegen kann? Danke schonmal, Marvin
Hat sich erledigt... Mit etwas mehr nachdenken hab ich die ersten Zeilen in der main.c durch das ersetzt: #define F_CPU 16000000L // 16 Mhz #include <avr/io.h> #include "SED1520.c" #include "graphic.h" #include "graphic.c" #include "SED1520-AVR.c" #include <avr/pgmspace.h> #include <util/delay.h> Hatte dann das gleiche Prob, wie mein Vorredner mit den Parametern, hab den 2. rausgenommen und von weiter unten if (lcd_x < 61) GLCD_WaitForStatus(0x80, 0); else GLCD_WaitForStatus(0x80, 1); genommen. Jetzt hab ich ne 1a Ameisenstrasse, aber das Display macht immerhin etwas :D
Dank Euch funktioniert meins! :) ATmega8@8MHz, PortD als Data, PortC als Control. Die Korrekturen von Marvin sind gut. Ich habe keine Ameisenstraße, sondern Buchstaben, Pixel- und Vektorgrafik - und das recht flott. Die Pixelgrafik kann man sich notfalls auch im Hexacode im main.c zurechtbasteln, wenn man hart genug ist. ;) Die 4 Datenblöcke entsprechen den 4 Textzeilen. Ein Bytepaar entspricht einer Pixelspalte innerhalb der Textzeile (8 Pixel Höhe) - das erste Byte sind jeweils die oberen vier, das zweite die unteren vier Pixel.
Haben gestern im Shack e.V. mal versucht das Display mit einem Arduino Duemilanove anzusteuern. Ausser ein paar blinkenden Linien ist dabei nichts herraus gekommen. Kann mir vlt. jemand helfen und sagen wie genau ich das Display an ein Arduino anschliessen muss damit es richtig funktioniert? Haben es bis jetzt so gemacht, dass D0-D7 auf PortD (Digital Pin 0-7 am Arduino), RW an PortB4 (Digital Pin 12), E an PortB1 (Digital Pin 9), CS1 an PortB2 (Digital Pin 10), CS2 an PortB3 (Digital Pin 11), A0 an PortB5 (Digital Pin 13) und Reset an PortB0 (Digital Pin 8) angeschlossen. VDD ging direkt auf +5V und Gnd auf Ground (wer hätte es gedacht ^^). VEE haben wir auch direkt auf GND gesetzt. Gegen 5 Uhr sind wir dann verzweifelt und stellen euch dadurch hier die Frage: Wie schließt man dieses Display an einen Arduino Duemilanove an? Gruß Saij
Hallo Forum, Ich greife diesen Beitrag mal auf, da ich auch Probleme habe dieses "Pollin" Display anzusteuern, Ich habe schon alle Beiträge zu diesem Thema gelesen, aber ich werde daraus nicht schlau. Ich möchte dieses Display mit einem alten Laptop, (486/25) mit QBasic über den LPT-Port steuern. Ich weiss das ein Contoller die bessere Lösung ist, ich möchte nur etwas "rumspielen" um dabei zu lernen. Aufgebaut ist das alles auf einem Steckbrett. Der LPT-Port liegt bei mir auf 378 h, (dez. 888) das ist der Datenport, der Steuerport ist liegt auf 37A h (dez. 890), die Bit's 0,1 und 3 werden da invertiert ausgegeben !! Das Kabel zum Laptop ist ein voll belegtes Druckerkabel, ich habe den Stecker für den Drucker abgeschnitten und die Adern mit dem Durchgangsprüfer durchgeklingelt, die benötigten Adern habe ich an eine Stiftleiste gelötet und in das Steckbrett eingesteckt. Wenn in in QBasic im 'Direkt Modus' mit OUT die Port's anspreche, sind alle Pegel sauber da. Die Anschlüsse des Displays sind folgendermaßen belegt: VDD - über Netzteil an 5V VSS - an Minus /RD - dauerhaft auf H-Pegel RES - über Kondensator/Widerstand, wird beim Einschalten kurz 'L', dann dauerhaft 'H' VEE - wird über einen ICL7660 mit einer einstellbaren, negativen Spannung versorgt. DB0 - DB7 - am Datenport D0 - D7 A0 - Steuerport, Bit 0 mit Pullup 4,7k an 5V CS1 - Steuerport, Bit 1 mit Pullup 4,7k an 5V CS2 - Steuerport, Bit 2 mit Pullup 4,7k an 5V R/W - Steuerport, Bit 3 mit Pullup 4,7k an 5V Für die EL-Folie habe ich mir diesen "quick and dirty" Inverter aus MOS-FET und Trafo gebastelt, den ich hier im Forum in einem Beitrag gefunden hatte, der mit dem CL getaktet wird, er funktioniert tatsächlich, die Folie leuchtet ! Um die Port's anzusprechen gibt es in QBasic den Befehl 'OUT'. Mit OUT 890, 11 (binär 1011) schalte ich A0 auf 'L', CS1 auf 'L', CS2 auf 'L' und R/W auf 'L' Das Display müsste jetzt für Befehle empfänglich sein. Die sende ich mit OUT 888, xxx über den Datenport. Mein Basic Programm sendet nacheinander die Daten für die Initialisierung, so wie sie auf dem 'Beipackzettel' vom Display stehen. Das Display geht auch an und zeigt ein wildes Pixelmuster, jetzt muss das Display gelöscht werden. Jetzt kommen die Probleme..... Ich wähle Page 0 und COL 0, wenn ich jetzt eine '0' über den Datenport sende, (vorher umschalten auf Daten, mit OUT 890,10 (binär 1010)) müsste die PAGE 0 , langsam 'leer' werden, aber es werden nur vereinzelte Pixel gelöscht nicht die ganze PAGE. Wenn ich abwechselnd '255' und '0' sende musste sich ein senkrechtes 'Streifenmuster' ergeben, (da die Pixel senkrecht angeordnet sind D0 oben, D7 unten), aber da werden auch nur vereinzelte Pixel gesetzt. Wo liegt der Fehler oder ist das im Ansatz schon falsch ? Bitte klärt mich auf !!! Danke Gruß Tom
Da ich keinen IC 7660 zur Hand hatte, habe ich mit Hilfe des mitgelieferten IC NE555 die negative Spannung erzeugt. Es funktioniert wunderbar. etumic
@ Tom: Wenn du die Schaltung auf dem Steckbrett aufgebaut hast, kann das Probleme geben. Ich habs in den letzten Tagen auch mal versucht -- den µC auf einer eigenen kleinen Platine mit Spannungskonstanter 7805, Programmierstecker und Quarz, alles andere (Inverter mit NE555, Display etc) auf dem Steckbrett. Das Ergebnis war ein chaotisches Gehüpfe von mehr oder weniger vollständigen Linien... Der Grund: Vermutlich mehrere "höherfrequente" Wackelkontakte durchs Steckbrett. Nach dem Auflöten (und der Verwendung eines ICL7660) ging es jedenfalls deutlich besser... Steckbrett ist wohl nix für Frequenzen um 8 MHz ;) Die Löschprobleme hab ich allerdings auch und mir ist in dem Zusammenhang die Frage gekommen, wie das Timing des SED1520 funktioniert. Kann man den einfach mit einem 4MHz-Takt vom µC versorgen und dann schnellstmöglich mit Daten zuballern, ohne nops oder sonstige Warteschleifen? Werden die Daten im Fall der 80er-MPU-Family bei fallender FLANKE an CS1/2, bei LOW an CS1/2 oder beim Setzen der Datenbits, während CS1/2 LOW sind, übernommen? Kann es also sein, daß ich einfach nur /WR auf LOW setze ("schreiben"), dann z.B. CS1 auf LOW setze und der Controller sich mit jedem neuen Takt wieder dieses Byte holt und schreibt? Ich hab nämlich grade das Problem, daß ich "vorsichtshalber" nach jedem Schreibzugriff (Kommandos und Daten) eine 1sec-Pause eingebaut hab. Die Folge: Trotz "Clear_Display"-Funktion wird das Display am Anfang schwarz, weil es noch die Daten vom letztenmal hat (?), und ändert sich danach nicht mehr. Ich vermute eben, daß der zeitliche Ablauf dabei der Haken ist. Irgendwie ist die Dokumentenlage für das Display und den Controller abartig schlecht, wenn man die ATMEL-Datenblätter gewohnt ist :( Ich hab bisher fast nichts zu den Timings gesehen. Kann es auch sein, daß man im 68er-Modus OHNE Wissen zum Timing besser arbeiten kann, weil dort mit fallender Flanke an E gearbeitet wird? Oder werf ich da was durcheinander?
Oooh, wie peinlich, hab grade in einem anderen Thread die komplette Beschreibung zum SED1520 gefunden, die ich seit Ewigkeiten suche... ich nehme meine Frage(n) vorerst zurück :(
Hi, ich habe es auch geschafft die Ameisenstraße zu bekommen. Hat einer von euch nen Tip woran es liegen könnte? Gruß Tom
hat sich erledigt... hab etwas debug code von mir entfernt. Die Ameisenstraße kam wenn man nur die Init Funktion ausführt und dann return; macht ;)
Ich verstehe den Code irgendwie nicht. Warum schluckt der Compiler diese Lib überhaupt: In SED1520.c
1 | extern void GLCD_WriteDatta(unsigned char); |
WriteDatta taucht im restlichen Code nicht auf. Dazu kommt, dass WriteData mit nur einem Argument aufgerufen wird, aber nur mit einem definiert wird: Definition (SED1520-AVR.c):
1 | void GLCD_WriteData(unsigned char dataToWrite, unsigned char ctrl) |
2 | {
|
3 | GLCD_WaitForStatus(0x80, ctrl); |
4 | SED1520_DATA_DDR = 0xFF; |
5 | A0_h; |
6 | RW_l; |
7 | |
8 | if(lcd_x < 61) {CS1_l;} |
9 | else { CS2_l; } |
10 | |
11 | _delay_us(1); |
12 | Enable_h; |
13 | _delay_us(1); |
14 | SED1520_DATA_PORT = dataToWrite; |
15 | _delay_us(1); |
16 | Enable_l; |
17 | CS1_h; CS2_h; |
18 | lcd_x++; |
19 | |
20 | if(lcd_x >= SCREEN_WIDTH)lcd_x = 0; |
21 | }
|
Aufruf (SED1520.c):
1 | void GLCD_ClearScreen(void) |
2 | {
|
3 | char j, i; |
4 | for(j = 0; j < 4; j++) |
5 | {
|
6 | GLCD_GoTo(0, j); |
7 | for(i = 0; i < SCREEN_WIDTH; i++) |
8 | {
|
9 | GLCD_WriteData(0); |
10 | }
|
11 | }
|
12 | GLCD_GoTo(0, 0); |
13 | }
|
Fehlen mir hier C Kenntnisse? Ist das etwa erlaubt?
Mahlzeit ! Das Display lag bei sehr lange ungenutzt rum ich habs jetzt mal ausprobiert. Ich hab die Quellen aus dem ersten Link benutzt. zum testen hab ich n atmega32 genommen mit 1MHz. die NegativSpannung hab ich mir von einem zweiten Netzteil geholt und so um die -1V eingestllt (es sollte erstmal laufen). Ich hab z.B. folgendes Problem: Bei angelegter VEE hab ich im rechten Bild nur ameisen ! Demo ist also nur im halben Bild zu sehen. Vertausche ich CS1 und CS2 wandert der Fehler mit ! Also links kein bild. Wenn ich VEE später anlege nachdem die daten übertragen sind funzt es einwandfrei. In einem Beitrag stand bei zu hoher VEE gäbs Übertragungsprobleme, aber ich bin schon bei unter -0,7V und es klappt wirklich nur wenn ich den VEE Anschluss offen lasse. Hat das schonmal jemand beobachtet oder kennt abhilfe ? nicht das ich jetzt VEE immer ausschalten muß beim übertragen. mfg marco
Hi, ist zwar schon etwas älter hier, aber vielleicht kann mir ja trotzdem jemand helfen. Ich möchte das o.g. LCD an mein Arduino Uno anschließen und konnte 1. bisher noch nirgens in der library eine möglichkeit finden die Pinbelegung zu ändern. 2. die library nicht benutzen, da mir angezeigt wird: ------------------------------- In file included from C:\...\SED1520-AVRc2/SED1520.h:1, from sketch_may25a.ino:3: C:\...\SED1520-AVRc2/font.h:6: error: redefinition of 'char font5x7 []' C:\...\SED1520-AVRc2/font.h:6: error: 'char font5x7 [480]' previously defined here ------------------------------- Ich habe in mein Programm font.h, graphic.h und SED1520.h eingebunden. fehlt etwas, ist etwas zu viel? MfG Luca
Okay ich habe jetzt verschiedene Einbindungsvarianten ausprobiert und wenn ich graphic.c, SED1520-AVR.c und SED1520.h einbinde scheint es zu finktionieren, zumindest wirft das Programm keine Fehler aus und erkennt die Befehle. Ich vermute auch den Teil gefeunden zu haben in dem ich die Pinbelegung verändern kann, nur bräuchte ich dafür ein wenig Hilfe: Das arduino hat seine Pins leider nicht wie viel AVRs in 4 Ports aufgeteilt und ich bin mir nicht sicher wie ich jetzt die Datenübertragung über z.Bsp. Pin 2-9 realisiere im Quelltext. Mein problem ist, dass ich nicht weiß welche Ports vom Arduino dem des AVRs darauf entsprechen (das ist es doch was ich einstellen muss oder?). Bitte helfen :) Hier der Teil der (vermutlich) verändert werden muss ------------------------------------------------------------ #define SED1520_DATA_PORT PORTD #define SED1520_DATA_DDR DDRD #define SED1520_DATA_PIN PIND #define SED1520_CONTROL_PORT PORTC #define SED1520_CONTROL_DDR DDRC #define SED1520_RW (1 << 0) #define SED1520_Enable (1 << 1) #define SED1520_CS1 (1 << 2) #define SED1520_CS2 (1 << 3) #define SED1520_A0 (1 << 4) #define SED1520_RES (1 << 5) ------------------------------------------------------------- MfG Luca
@AlShikan Ich sitze momentan auch an diesem Display. Ich benutze das arduino duemilanove Board. Bei mir sieht die Pin-Belegung folgend aus: Display Arduino Pin D0-D7 0-7 (PORTD) Code: #define SED1520_DATA_PORT PORTD #define SED1520_DATA_DDR DDRD #define SED1520_DATA_PIN PIND #define SED1520_CONTROL_PORT PORTC #define SED1520_CONTROL_DDR DDRC #define SED1520_A0 (1 << 0) // A0 #define SED1520_CS1 (1 << 1) // A1 #define SED1520_CS2 (1 << 2) // A2 #define SED1520_RW (1 << 3) // A3 #define SED1520_RES (1 << 4) // A4 #define SED1520_E (1 << 5) // A5 An Vee habe ich die Schaltung von Benedikt K. (Beitrag "pollin dot matrix lcd 122x32 dots dg 12232") angeschlossen. Auch eine Timer-Schaltung habe ich ausprobiert. Laut Datenblatt braucht Vee 6,4Volt aber in anderen Foren haben manche es mit den beiden Schaltungen zum laufen gebracht. Bis hier ist soweit alles OK aber auf dem Display erscheint nichts. Hat jemand das Display mit dem SED1520-Code und Arduino schon zu laufen gebracht? gruß Alex
:
Bearbeitet durch User
Nach nochmaliger gründlicher durchsicht meiner Schaltung stellte ich fest das die Eingangsspannung zur Timer-Schaltung zu gering war. (uuups :)) Dann habe ich den Code noch für das Arduino Studio angepasst. Für das Atmel-Studio muss ich allerdings noch einiges umprogrammieren. Soweit funktionierts :) gruß Alex
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.