PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : BASCOM, Atmega32 und ein 240*128 EA DIP240-7 Display



RobNet
01.11.2011, 16:02
Hallo Ihr Lieben,

nach langer Zeit ist es mal wieder Zeit ein Projekt zu beginnen. Vor geraumer Zeit hab ich mal mit Unterstützung aus dem iNetz ein Teil meiner Funk-Haus-Steuerung auf FS20 Basis realisiert. Dieses Experiment hat funktioniert, ist aber bis Heute noch nicht im Wohnzimmer verbaut worden.

Nun habe ich vor das ganze mit einem neuen Display zu erproben. Dabei geht es um das im Titel besagt EA DIP240-7 Display (http://www.lcd-module.de/pdf/grafik/dip240-7.pdf) welches eigentlich ein recht chickes Gerät ist. Nun bin ich aber ziemlicher Anfänger in Sachen GLCDs und würde mich freuen, wenn es hier Interessierte gibt, die das Display schonmal mit Bascom angesteuert haben. Dabei geht es mir um Zeichnen von "Tasten" und Text auf dem Display und diese über den vorhandenen Touch auszuwerten.

Als Umgebung liegt gerade vor mir

- Atmega32
- Pollin Evaluation Board
- Das EA DIP240-7
- 'n PC mit Bascom :)

Das Display hat eine Auflösung von 240x128 Pixel und einen T6963C Kontroller. Ich habe hier schon einiges über den Kontroller gelesen, aber ehrlich gesagt sind das sehr, sehr viele Informationen in denen ich mich gerade beim lesen verloren habe.

Der erste Schritt wäre ja nun das Anschließen des Displays an den Atmega, das sollte ich hinbekommen. Leider kann das Display kein I²C oder ähnlich. Dann wird es wohl die 8Bit Variante sein - Viele Leitungen aber auch gut :-)

Im zweiten Schritt möchte ich dann das Display initiieren und mal einen Text ausgeben.
Der dritte Schritt soll dann das zeichnen von "Touchtasten" auf dem Display sein. Wäre natürlich schön wenn das mit relativ kompaktem Code gehen würde.
Im vierten und letzten Schritt ist das Ziel dann, die Touchwerte auszulesen und so zu verarbeiten, dass ich die Tasten auch Sinnvoll in Bascom verwenden kann.

Das war jetzt viel Text und ich würde mich sehr über ein wenig Hilfe oder guten Tipps freuen!

Viele Grüße
Thomas

Rone
01.11.2011, 18:02
Hallo!

Im Samplverzeichnis das LCGRAPH Verzeichnis öffnen und glücklich werden.


MfG
Rone

RobNet
01.11.2011, 19:31
Hallo Rone,

ich steh gerade ein wenig auf der Leitung... Wo finde ich das Sampleverzeichnis?

Grüße
Thomas

dussel07
01.11.2011, 20:07
Am wichtigsten ist für Dich erst mal die Pinbelegung und deren Benennung in Bascom!
Vorteil bei dem von Dir gewähltem Display ist: Die Bezeichnung der Pins ist genau gleich der Bezeichnung in Bascom! Das ist nicht immer so!!
Zum Ansteuern brauchst Du mehr oder weniger zwei komplette Ports - den DatenPort und den SteuerPort.
So fängt das Config dann auch an -

Config Graphlcd = 240 * 128 - hier wird die Auflösung des Displays angegeben (mögliche Auflösungen stehen in der Hilfe)
Dataport = Porta , Controlport = Portc - hier werden die Ports bestimmt (Beispiel Daten PortA / Steuerung PortC)
Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 ,Reset= 4 , Fs = 5 - hier werden den nötigen Steuerpins die einzelnen Portpins zugewiesen (Ce = PC2 / Cd = PC3 / Wr = PC0 usw.)
Mode= 8 - hier ist Mode = 6 oder Mode = 8 möglich (Die Zahl bestimmt die Breite der Zeichen / Beispiel: 240 / 8 = 30 Zeichen /// 240 / 6 = 40 Zeichen

Und noch mal komplett:
Config Graphlcd = 240 * 128 , Dataport = Porta , Controlport = Portc , Ce = 2 , Cd = 3 , Wr = 0 , Rd = 1 ,Reset= 4 , Fs = 5 ,Mode= 8

Nun zur Textausgabe:
Als erstes sagst Du dem Display wo es anfangen soll zu schreiben

Locate 1 , 1 ---- bedeutet nichts anderes als: Beginne in Zeile1 beim ersten Zeichen

und dann die eigentliche Texteingabe

Lcd"Hallo RobNet" - Wichtig ist das der gewählten Text in Anführungszeichen zu setzen ist!
usw.

Locate 2 , 10 :Lcd"ist Alles gar nicht so schwer!"

Locate 5 , 1 :Lcd"oder?"

willst Du den Text wieder löschen geht das wie folgt:

CLS TEXT

Andere Schriftgrößen sind möglich - dazu muß eine Schrift mit dem Fond Editor (Bascom / Tools / Plugins / Fondeditor) erstellt werden.
Die neu erstellte Schrift wird dann über den Befehl "setfond 8x8" und "$include "font8x8.fond" in das Programm eingebunden.

Und weiter gehts mit Linien - - - -

hierzu mal zum Verständniss das Koordinatensystem des LCD

Koordinatenangaben: x,y

yyyyyyyyyyyyx
bb0,0 - ------------------------239,0
bbb!bbbbbbbbbbbbbbbbbbbbbb !
bbb!bbbbbbbbbbbbbbbbbbbbbb !
..y !bbbbbbbbbbbbbbbbbbbbb.b !
bbb!bbbbbbbbbbbbbbbbbbbbbb !
bb0,127 -----------------------239,127

LINE(X0,Y0) - (X10,Y10), on/off
Line (ich möchte eine Linie zeichnen) (X0,Y0) bezeichenet den Startpunkt der Linie - (X10,Y10) den Endpunkt - - - 255 ist on / 0 ist off

Hier ein Beispiel zum besseren Verständniss:
Line(0 , 0)-(100, 0), 255 /// zeichnet eine horizontale Linie von X0,Y0 bis X100,Y0

und ein Quadrat mit 100 Pixel Kantenlänge:
Line(0 , 0) -(100 , 0) , 255
Line(100 , 0) -(100 , 100) , 255
Line(100 , 100) -(0 , 100) , 255
Line(0 , 100) -(0 , 0) , 255
jetzt möchte ich die obere horizontale Linie wieder löschen
Line(0 , 0) -(100 , 0) , 0
und den ganzen Rest (ohne eventuellen Text) auch
CLS GRAPH

und noch ein Kreis:

Circle(30 , 30), 40 , 255 cccccc -cc(30 , 30) gibt den Mittelpunkt des Kreises an 40 den Durchmesser 255 gleich on
wieder wech
Circle(30 , 30), 40 , 0


- Als letztes für Heute noch ein Link (https://www.roboternetz.de/community/threads/29656-240x128-T6963-LCD-mit-Touch-an-ATMega128) zu einem ähnlichem Thema hier im RN -

RobNet
01.11.2011, 21:11
Hi, Dussel07!

Das ist ja schonmal ein super Start! Werde das geschriebene schnellstmöglich in die Tat umsetzen!
Dann wären ja Schritt 1 und Schritt 2 schon erledigt. Ich bin mal gespannt wie es aussehen wird.

Vielen Dank und ich meld mich sobald es Neues gibt.

Grüße
und 'noch einen schönen Abend Allen!

Thomas

PS: Um schonmal in den Gedanken das Ganze weiter zu spinnen....
Bietet Bascom bzw. der Display-Controller denn schon 'fertige' Buttons oder müssen die manuell erstellt werden?
Mir ist klar, erst Schritt für Schritt zum Ergebnis, aber ich finde es jedesmal wieder spannend auch ohne PC und µC das ganze
schonmal in Gedanken ans Ziel zu bringen :-)

dussel07
01.11.2011, 21:54
Ich denke das es keine fertigen Buttons gibt - aber hier können sicher Andere präziser Antworten!
Würde mir ein Button erstellen und den dann mehrfach an verschiedener Position ins Programm einfügen -
(zB. in der Mitte des Buttons ein Zeichen das beim drücken dann die Größe ändert)

Ps . Bin gespannt auf Weiteres da ich auch Ähnliches vorhabe.


Nachtrag:
Hab was schönes im Bascom-Forum gefunden: (http://bascom-forum.de/showthread.php?1808-m%F6chte-mal-was-mit-Touchscreen-machen&highlight=buttons+Touchscreen)
Siehe dort die Beiträge von Six1.
Dort kam der Vorschlag die Buttons als Grafik einzubinden (Beispiel ist auch vorhanden)

Einbinden von Grafikdateien:

Showpic 10 , 0 , Einschalten nnnnnnnnn - X , Y Position Unterprogramm
Showpic 40 , 0 , Ausschalten

Einschalten:
$bgf"Ein.bgf"

Ausschalten:
$bgf"Aus.bgf"

Ein Konverter scheint Bascom auch mitzubringen ( Bascom / Tools / Graphic Converter )

und noch ein Link zu MCS (http://www.mcselec.com/index.php?option=com_content&task=view&id=189&Itemid=57)

RobNet
02.11.2011, 16:43
Na das klingt doch super, es scheinen ja alle Möglichkeiten vorhanden zu sein.

Was genau hast Du vor? Ebenfalls eine Haussteuerung auf Funkbasis? Wenn ja kann ich mal auf die FS20 Elemente von ELV verweisen. Dazu habe ich hier einen Atemga32 Controller, welcher inzwischen FS20 spricht. Das ganze ist zwar eine recht schaurige Angelegenheit, funktioniert aber!

Viele Grüße
Thomas

RobNet
02.11.2011, 17:36
Sehr cool, wie das mit dem TExten und Kreisen funktioniert, 1A - bis auf das, dass die Kreise eher Eier sind :) Aber das bekommen wir auch noch hin.

Juhuuu, das macht Spaß, die Kreise, Rechtecke etc mal aus der Bascom Hilfe auf den Bildschirm zu zaubern!!!

RobNet
02.11.2011, 19:44
So, nun ein aktueller Status zu den ToDo Punkten.
Diese haben sich durch die aktuellen Funktionen erweitert und auch teils geändert.

Aktuell funktioniert das Display wunderbar um Text, Kreise und Linien auszugeben über die in Bascom inplementierten Funktionen. Leider klappt es noch nicht die "Bild"-Funktion zu verwenden. Ich habe das Bascom-Test-Bild konvertiert und mit

Showpic 40 , 0 , Testbild

Testbild:
$bgf"test.bgf"

versucht anzuzeigen. Dabei ist das Bild jedoch zemlich verzerrt und nicht wirklich erkennbar gewesen und so wie ich das interpretiere, hat sich der Atmega dabei auch aufgehängt, bzw. das Bild ist immer wieder erschienen und dann wieder verschwunden. Das wäre zu klären, wobei das bestimmt ein kleineres Problem ist.

Da das Zeichnen von Linen und Kreisen relativ aufwendig ist (bzw. das Positionieren derer), werd ich wohl mal ein kleines C# Windows Programm für das Display erstellen, in welches man mit der Maus Zeichnen kann und welches dann den Bascom-Code zur gemachten Zeichnung ausgibt. Dann sollte es schneller gehen Linien o.ä. zu zeichnen. Das ganze aber wenn mal Zeit dafür vorhanden ist.

Die Sache mit der 'anderen Schrift' muss ich mal noch austesten. Das Standart Font, ist sehr 'leicht' und dezent. eine etwas dickere und kräftigere Schrift wäre eigentlich erforderlich.

Den Touch hab ich noch nicht angeschlossen, der kommt dran, wenn die Grafikdarstellung perfekt funktioniert.

Prinzipiell soll das Ganze dann einmal so aussehen:

- Das Display wird unten eine Status und Steuerleiste haben. Diese erlaub zwischen verschiedenen Bildschirmseiten hin und her zu schalten. Ebenso gibt es dort eine Anzeige zum aktuellen Status.

- Auf dem Display selbst werden z.B. im Jalousie-Menü die Jalousiene in Textform angezeigt und dahinter dann z.B. Auf, Ab, Halb etc...

- Dann gibt es einen weiteres Bildschirmmenü mit Beleuchtungssteuerung, wo man dann wählen kann z.B. Wohnzimmer-> Deckenleuchte Heller, Dunkler, Ein, Aus etc....

- Ein weiteres Menü wird dann Optionen und Einstellungen biteten, wie Uhr einstellen, Helligkeitssensor kalibrieren usw.

Bis dahin ist es noch ein ganzes Stück Arbeit. Das erste ist es die Menüs einmal so darzustellen, wie es nachher aussehen soll. Dann werden die Menüs mit den nötigen Funktionen belegt. Das wichtigste ist es als zuerst ordentlich Buttons zu erstellen und diese per Tocu auszuwerten.

Und los gehts :-=}

Viele Grüße
Thomas

dussel07
02.11.2011, 20:34
Zu den Bildern die eingefügt werden sollen:
Öffne Paint -
Stelle die Bildgröße entsprechend der Zielgröße ein - (zB. 48x48Pixel (es sind nicht alle Größen mit Bascom konvertierbar?))
Erstelle deine Grafik -
Unter Eigenschaften die Farbe auf Schwarz/Weiß einstellen -
Als BMP speichern -
Mit dem in Bascom integriertem Konvertierer konvertieren - (ich glaub ich stottere)
Nun sollte das Seitenverhältniss passen ?????

20450

Leider läßt sich hier keine .bgf Datei hochladen? Zip oder RAR geht auch nicht - - -

Zu dem was Du vorhast - ob dafür der Speicher des Atmega32 ausreicht??
Ansonsten - hört sich cool an!

RobNet
02.11.2011, 21:28
Hi dussel07,

werd ich austesten. Der Speicher sollte ja kein Problem darstellen. Eventuell kann man da ja etwas mit EEprom auf I²C Basis lösen. Das größere Problem sind die Timer, da ich schon 2 Timer für die FS20 Funksteuerung benötige. Es bleibt aber offen einen Atmega64 zu verwenden, soweit ich das gerade in Erinnerung habe, hat der einen Timer mehr.

100%ig hab ich das ganze noch nicht im Griff, aber das Ziel ist es für imch erst mal die Oberfläche zu realisieren, die Details dahinter funktinieren immer :) Es gibt ja viele, viele Möglichkeiten und im Prinzip bin ich da von Bascom überzeugt. Bestimmt nicht immer der idealste Code, aber für ehemalige Basic und indischem C# Programmieren doch recht vorteilhaft :-)


Schönen Abend

Grüße
Thomas

RobNet
05.11.2011, 16:19
Hi,

habe jetzt einige Versuche hinter mir...

Was mich gerade noch stört ist, dass ich einen gewünschten Text nicht sauber in die Mitte einer Bascom-LCD-Box bekomme. Das ist ja auch klar, die Schriften haben ja immer einen gewissen Abstand zur nächsten Zeile. Aber irgendwie muss das Problem ja lösbar sein. Ich möchte am unteren Rand des Displays eine Navigationsleiste, welche aus Linien besteht und da dann passend Text schreiben... Das scheint gar nicht so einfach zu sein.

z.B.

--------------------------------------------
|
|
|
|
|-----------------------------------------
|Hauptmenü | Einstellungen | | > |
|-----------------------------------------


Das ganze möchte ich eigentlich nur, weil ich mit den Bascom-Convertierten Buttons nicht so ganz zufrieden bin. Die Grafiken lassen sich jetzt zwar anzeigen. aber die Konvertierung ist nicht so wirklich chick.

Welche Möglichkeiten für 'schöne' Menü-Buttons gibt es denn noch?

Viele Grüße
Thomas

EDIT:
Da der Kontroller T6963 nur begrenzte Fonts hat, muss wohl jedes Pixel einzeln gesetzt werden um ein neues Font zu erstellen, dann sollte es aber auch möglich sein den Text Pixelgenau zu setzen. Leider ist das ganze ein wenig zu viel Arbeit für den Moment und der Atmega wirds dann mit dem geplanten Gesamtcode auch nicht ganz schaffen....

Ziel ist es also nun:

- Chicke Buttons, welche etweder einen "Live-Varibalen" Text haben, oder notfalls auch statische Bilder sind.
- Text an jede beliebige Stelle des Displays setzen, ohne auf Zeilen/Spalten achten zu müssen.... (ist das möglich?)
- Invertieren von Text.

peterfido
06.11.2011, 08:24
Das ist alles machbar. Wenn Du Sorgen wegen dem Platz für den Gesamtcode hast, gehe ich davon aus, dass die Fonts evtl. nicht optimal hinterleft werden. Dafür würde ich bei Platzproblemen eine eigene Routine nehmen. Viel Platz sparst Du, wenn Du Dir "Read" und Data sowie "Lookup" näher anschaust. Damit lassen sich Fonts recht platzsparend einbinden. Und hinterlege nur die Zeichen, welche Du auch wirklich benötigst.
Die neueren Bascom Versionen compilieren auch schlankeren Code als die älteren Versionen.

RobNet
06.11.2011, 09:16
Hi,

bei der Einbindung von Fonts stehe ich jedoch gerade noch auf der Steuerleitung :)

Theoretisch sollte das ja so gehen


'clear the screen

Cls

Wait 2

'specify the font we want to use

Setfont Font8x8


...


'we need to include the font files

$include"font8x8.font"



Ein Font hab ich auch, jedoch kommt die Fehlermeldung:
Invalid datatyp... in der SetFont Zeile.

was vermutlich daran liegt, dass ich für den T9693 Kontroller keine passende LIB habe welche den Befehl Setfont unterstützt.
Gibt es so eine Lib?

peterfido
06.11.2011, 10:48
Nein, unterstützt der T6963 so nicht. Entweder eine eigene Routine erstellen, oder den Font als einzelne bgf Dateien (je Zeichen eine) einbinden und nach Bedarf an der jeweiligen Position mittels Showpic anzeigen.

RobNet
06.11.2011, 12:06
Hallo Peterfido,

ist das nicht ein unglaublich großer Aufwand? Ich meine es kommt relativ viel Text auf das Display und wenn ich dabei jeden Pixel oder jeden Buchstaben aus einer .bgf holen muss, ist das Projekt Ende 2012 nicht fertig :-)

Bin inzwischen soweit, dass ich auf 'schöne' Buttons ja verzichten würde und auch bei der Standart Schrift bleibe. Ich würde jetzt Buttons einfach mit "Box (x,y)-(x,y)" zeichnen. Jedoch besteht dann immer noch das Problem, dass ich den Text ja nicht pixelgenau in die Box schreiben kann.

Hat Du schonmal ein solches Problem mit einem T6963 gelöst und mir eventuell eine Starthilfe?

EDIT: Einbinden von Bilder klappt ganz gut und ist auch eine nette Spielerei im Moment, aber für Buttons und den Text zur Laufzeit... da happerts....

Hier mal ein Start-Splash-Screen :-) PS: Ich bin schonmal auf einen Atmega644 umgestiegen, da ich für die Funksteuerung mit FS20 später noch mehr Timer benötige.

20482

Grüße
Thomas

RobNet
06.11.2011, 13:21
Hier mal ganz kurz eine Zeichnung wie ich mir das Jalousiemenü vorstellen könnte.
Die Uhr rechts oben müsste dann in der Praxis natürlich dynamisch sein, aktuell ist das gesamte nur ein bgf-Bild in welches die Texte geschrieben wurden.

Im weiteren Verlauf des Projekts müssen auch viele Statustexte wie z.B. "Garage abgeschlossen", "Besucher klingelt" etc... angezeigt werden und die müssen dynamisch generiert werden können. Der Aufbau des Bildes ist aktuell auch nicht besonderst schnell, aber das liegt vermutlich im Moment noch bei meinen 1MHz internen Takt. Sollte jedoch später mal mit Fingerdruck eine Taste angewählt werden, wäre es prima wenn diese sich invertiert und das muss natürlich so schnell gehen wie der Finger auf dem Display tippt...

Ohje, aktuell sehe ich mich als beginner von Displays recht überfordert...

20483

So soll das Menü ungefähr aussehen für die Jalousien, es gibt dann für jeden Bereich ein separaten Menübildschirm

20484

peterfido
07.11.2011, 16:13
Ich habe grad keine Programmierumgebung dabei. Jedoch sehe ich da keinen allzu großen Aufwand. Wenn Du Dich an den gegebenen Textpositionen orientierst, kannst Du den im T6963 intergrierten Font nehmen. Eine Linie "drumherum" zeichnen hast Du ja schon herausgefunden. Ansonsten einfach die Buttons als bgf abspeichern und im Programm mit Showpic darstellen lassen. Flexibler wird es, wenn Du eine Sub erstellst, welche den Button dynamisch (z.B. anhand der Textbreite) berechnet. Da lassen sich dann auch recht einfach "runde Ecken" realisieren.

Soll es pixelgenau platziert werden, dann halt wie gesagt einen eigenen Font integrieren. Da sollte doch ein Grafikfont bei den Samples bei sein.

RobNet
09.11.2011, 16:49
Hallo Peterfido,

ich werd am Wochenende schauen, was ich realisieren kann und melde mich dann wieder. Parallel zum Display bin ich gerade noch an einem Versuch der Porterweiterung des Atmega644ers mit einem Atmega8 als Slave am I²C.

RobNet
20.11.2011, 15:23
Hi,

um also einen Atemga8 zum Portexpander als TWI Slave zu machen, könnte ich doch die Beispielrotine aus der Bascom Hilfe nutzen:




$regfile="meinemega8konfiguration"' specify the used micro
$crystal= 8000000 ' used crystal frequency
$baud= 19200 ' use baud rate
$hwstack= 32 ' default use 32 for the hardware stack
$swstack= 10 ' default use 10 for the SW stack
$framesize= 40 ' default use 40 for the frame space


' Not all AVR chips have TWI (hardware I2C)
' IMPORTANT : this example ONLY works when you have the TWI slave library
' which is a commercial add on library, not part of BASCOM

Print"MCS Electronics TWI-slave demo"

Config Twislave =&H70 , Btr = 1 , Bitrate = 100000


'as you might need other interrupts as well, you need to enable them manual

EnableInterrupts

'this is just an empty loop but you could perform other tasks there
Do
nop
Loop
End

'A master can send or receive bytes.
'A master protocol can also send some bytes, then receive some bytes
'The master and slave must match.

'the following labels are called from the library
Twi_stop_rstart_received:
Print"Master sent stop or repeated start"
Return


Twi_addressed_goread:
Print"We were addressed and master will send data"
Return


Twi_addressed_gowrite:
Print"We were addressed and master will read data"
Return


'this label is called when the master sends data and the slave has received the byte
'the variable TWI holds the received value
Twi_gotdata:
Print"received : "; Twi
Return

'this label is called when the master receives data and needs a byte
'the variable twi_btr is a byte variable that holds the index of the needed byte
'so when sending multiple bytes from an array, twi_btr can be used for the index
Twi_master_needs_byte:
Print"Master needs byte : "; Twi_btr
Twi = 65 ' twi must be filled with a value
Return


'when the mast has all bytes received this label will be called
Twi_master_need_nomore_byte:
Print"Master does not need anymore bytes"
Return

Damit wäre dann mein Mega8 als Slave konfiguriert wenn ich das richtgi verstehe. Und in der Variable TWI ist mein Empfengener Wert.

Die Bascom-Hilfe schreibt:

' IMPORTANT : this example ONLY works when you have the TWI slave library
' which is a commercial add on library, not part of BASCOM
Weiß jemand was es damit auf sich hat?

Meinem Mega32 als Sender und Master würde dann so folgenden COde bekommen (ebenfalls aus der Hilfe):


Config Sda = Portb.5
Config Scl = Portb.7
Dim X As Byte , A As Byte , Bytes As Byte
X = 5 'assign variable to 5
Dim Ax(10)as Byte
Const Slave = &H40 'slave address of a PCF 8574 I/O IC
I2csend Slave , X 'send the value or


For A = 1 To 10
Ax(a) = A 'Fill dataspace
Next
Bytes = 10

I2csend Slave , Ax(1) , Bytes
End



Habe ich das richtig verstanden, dass das schon meine Antwort auf die Portexpanderung wäre? Meinem Salve würde ich natürlich dann noch in ner Schleife sagen was er mit den empfangenen Daten machen soll also z.B.


if twi = 000001 then
porta.1 = 1

oder ähnlich...

was mein Ihr?

Viele Grüße
Thomas