Forum: Projekte & Code DG-12232 Ansteuerung von 2xSED1520 Controller


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Christian L. (logos23)


Angehängte Dateien:

Lesenswert?

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

von Fnord (Gast)


Angehängte Dateien:

Lesenswert?

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

von avryeti (Gast)


Lesenswert?

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

von avryeti (Gast)


Lesenswert?

ist gelöst.

es müssen 4 extra zeilen erstellt werden mit je 8x122 und vertical 
ceiling exportiert.

viel spaß

von Marvin (Gast)


Lesenswert?

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

von Marvin (Gast)


Lesenswert?

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

von Posmanet (Gast)


Lesenswert?

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.

von Christoph F. (saij)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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

von Etumic E. (etumic)


Angehängte Dateien:

Lesenswert?

Da ich keinen IC 7660 zur Hand hatte, habe ich mit Hilfe des 
mitgelieferten IC NE555 die negative Spannung erzeugt.
Es funktioniert wunderbar.

etumic

von Eingehirner (Gast)


Lesenswert?

@ 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?

von Eingehirner (Gast)


Lesenswert?

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 :(

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hi,

ich habe es auch geschafft die Ameisenstraße zu bekommen.
Hat einer von euch nen Tip woran es liegen könnte?

Gruß
Tom

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

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

von Sam .. (sam1994)


Lesenswert?

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?

von Marco O. (xray272)


Lesenswert?

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

von AlShikan (Gast)


Lesenswert?

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

von AlShikan (Gast)


Lesenswert?

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

von Alex R. (itaxel)


Angehängte Dateien:

Lesenswert?

@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
von Alex R. (itaxel)


Angehängte Dateien:

Lesenswert?

Hier noch mein Schaltplan.

Gruß Alex

von Alex R. (itaxel)


Lesenswert?

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
Noch kein Account? Hier anmelden.