Forum: Mikrocontroller und Digitale Elektronik Pollin 16080 Touch mit ATMEGA32 und BASCOM


von Thomas H. (microtom)


Lesenswert?

Fortsetzung zu
Beitrag "Re: Display mit Touchscreen bei Pollin?"
mit reinem BASCOM und ATMEGA32

Danke für Hilfe und Ideenaustausch!

von Thomas H. (microtom)


Lesenswert?

Zitat:
-------
#Autor: allu (Gast)
Datum: 13.11.2009 19:15

Bleib erstmal bei 8 Mhz, dafür sind die Zeiten der Displayansteuerung
ausgelegt. Langsamer gehts immer, schneller muß man probieren. Demnächst
möchte ich auch einen Mega32 mit 16 Mhz verwenden und dabei die
Ansteuerzeiten anpassen.

Ein Quarz ist für die Displayansteuerung nicht notwendig, aber sehr
empfehlenswert, Stichwort: serielle Schnittstelle.

Bei 8 Mhz-Quarzen verwende ich 27pf.
------------------------------------------------------------------------ 
-----

OK, dann reicht zum ansteuern aber jetzt erst mal 'ohne' Quarz. Soblad 
es geht und der Quarz da ist wird er eingebaut.

Wie hast Du Dein Display mit dem Atmega32 zusammengeklebt? Schon
mit dem gleichen Schaltplan, oder? Hast Du eine Schaltung mit passendem,
funktionierendem Code?

(Sorry für das teils- Doppelposting, aber sonst weiß ja keiner in diesem 
Thread -- <was bisher geschah>

Gruß
Thomas

von Thomas H. (microtom)


Lesenswert?

Den Touch habe ich aktuell noch gar nicht angeschlossen, meine 
Widerständchen hängen noch auf der Platine im freien rum, ich wollte 
eigentlich einfach einmal einen Text ausgeben.

Ich kann mir nicht vorstellen dass beide meiner Displays defekt sind, 
dennoch zeigen beide etwas anderes an. Das Eine Zeigt Streifen, das 
Andere zeigt bei Kontrasterhöhung so 8 kleine Kästchen mit 
"grauverlauf"...?!

Wahnsinn? Nein gerade nur Verzweiflung und leider keine Funktion.

Für Heute ist Ende mit experimenten. Aber Morgen gehts weiter!

Gruß
Thomas

von allu (Gast)


Lesenswert?

Hallo Thomas,

ich verwende bisher die Testschaltung von Benedikt mit dem Mega8.
Den Mega32 habe ich leider noch nicht in Betrieb, da bin ich noch ganz 
am Anfang.

Hast Du nur ein Display? Und wie war es verpackt? Erfahrung: Große 
hellrosa Noppen-Tüte = schlecht, kleine schwarze Tüte = gut.

Gruß  allu

von Sven B. (svenba)


Lesenswert?

Im Unterschied zu deinem Schaltplan hab ich einen 20k Poti zwischen Pin 
2 (+5V) und 17 (VEE) gehängt, der mit dem Schleifer an Pin 3(V0) 
hängt.So stehts auch im Datasheet des 16080.

(Mir ist aufgefallen, dass ein kleinerer Wert als 20k einen schlechteren 
Kontrast gibt.)
Danach hab ich erstmal im Hauptprogramm alle Subprogramme ausser 
Initialisierung auskommentiert, um zu sehen, ob der Reset wenigstens 
läuft.
Danach hab ich nur Highs auf dem Display ausgegeben, dann Lows, dann 
Hex55 (Strichel) usw... Immer mal wieder am Kontrast drehen, sonst 
entgeht einem schnell was!!

ich hoffe, das hilft dir...

von Thomas H. (microtom)


Lesenswert?

Habe leider erst Morgen die Hardware wieder in Griffweite, dann wird 
getestet. Danke schonmal - und ich melde mich!

Gruß
Thomas

von allu (Gast)


Lesenswert?

Hallo Thomas,

bin auch gerade dabei das Programm auf den Mega32 umzustellen und habe 
dabei ähnliche Effekte erhalten. Da ich die serielle Schnittstelle noch 
brauche, ist das Display bei mir anders angeschlossen: PD6 = RS, PD5 = 
RW, PD7 = E, PC0 bis PC7 = D0 bis D7, PD4 = CS und PD3 = R.

Ein Test aller Ports ergab, dass PD0(RxD), PD1(TxD) und PC2, PC3, PC4, 
PC5 keine Ausgangssignale lieferten.

Warum PC2 bis PC4 nicht funktionierten, lag an der Einstellung im 
Brenn-Prog. (AVR ISP MK2). Das JTAG-Interface war eingeschaltet. Nachdem 
unter Fuses hinter dem Eintrag JTAGEN das Haken weg war, erschien auf 
dem Display das erste Kalibrierkreuz.

Noch eine Anmerkung, wenn beim Compilieren Fehler gemeldet werden, 
könnte das an der neuen Bezeichnung ADCSRA liegen:

'      sbi  ADCSRA, ADSC       ' neuer Name nach Atmel
       sbi  ADCSR, ADSC        ' Bezeichnung in Bascom

Also das letzte A wegmachen. Oder im „m32def.DAT  den Namen in ADCSRA 
ändern.

Gruß Alex

von Thomas H. (microtom)


Angehängte Dateien:

Lesenswert?

Hi Allu,

ich denke inzwischen es muss sich bei mir um ein Hardwareproblem 
handeln.
Meine Testplatine habe ich durchgeprüft und sollte funktionieren, aber 
Ihr kennt das ja... Es schleichen sich gelegentlich die 
"interessantesten" Fehler ein.

In meinem Fall warte ich jetzt auf die neue Pollin Lieferung und dann 
gehts weiter. Denke dass das Display einen Defekt hat (nicht sicher aber 
könnte sein)

Ich melde mich sobald es Neues gibt.

PS: Das Display wäre der Hammer, hab gerade 100te von Ideen was man 
damit so alles anstellen könnte - es fehlt jetzt nur noch der erste 
Schritt (ein erstes Lebenszeichen)

Gruß und guten Start in die Woche!
Thomas

ANHANG:
Testaufbeu und die interessante Anzeige des Displays.
[schön mit vielen, vielen Brücken und Streifenrasterplatine]

von Thomas H. (microtom)


Angehängte Dateien:

Lesenswert?

...und die Rückseite

hab schon lange keine Lochrasterprojekte mehr durchgeführt und muss 
sagen, es gibt doch nichts spannenderes als ein trockenen Rotwein, 
gediegene Musik und ein schönes Elektronikprojekt.

@Allu: schwarze, kleine EMV-Tüte und Display wie auf Photo.

@Sven & Allu :-)
Könnt Ihr mal Euren "minimal-aber-funktionierenden", ersten Code posten?

von Thomas H. (microtom)


Angehängte Dateien:

Lesenswert?

So, die neuen Displays sind noch nicht da.

Ich habe jetzt ein verwirrendes Ergebniss. Eventuell könnt Ihr damit 
etwas anfangen weil es bei Euch auch mal so war?!

Das Display Streift jetzt unschön von oben nach unten, innerhalb von 
ca.0,5sekunden endlos durch.

|--------|
|░░░░░░░░| <- Streifen (unkontrolliert und ungewollt)
|        | saust immer von oben
|        | nach unten
|        | durch das Display etc.etc.
|--------|

mehr tut sich nicht.

Den aktuellen Source habe ich mal angehängt.
Die Ports passen mit meiner Verdrahtung überein:

Daten = D0-D7
Controll ist Port C

Rs Alias 5
Rw Alias 4
E Alias 3
Cs Alias 1
R Alias 0

- JTAG ist disabled (im BASCOM Progrämmle unter manueller 
Programmierung)
- ADCSRA habe ich abgeändert zu ADCSR
- Hab aktuell noch ein 10k Kontrastpoti drin, so wie es aber aktuell tut 
ist das nicht das Problem.

Ohje,ohje
Gruß
Thomas

von Sven B. (svenba)


Lesenswert?

auf welcher Frequenz bist du denn mit dem Atmega?
Versuch mal weniger, das geht immer; sieht wie´n Timing Problema aus...
Werd mal mein Display rauskramen und versuchen, das Richtige falsch zu 
machen :-)

von Sven B. (svenba)


Lesenswert?

Bezug;
Init_gc_mode:

Data &H00 , &H07                                  'Die nächsten 7
Data &H00 , &H12                                  'Befehle an GC senden
Data &H01 , &H76
Data &H02 , &H17
Data &H03 , &H4F
Data &H08 , &H00
Data &H09 , &H00
Data &H00 , &H32

Hab mal bißchen gefummelt!
Stell mal deinen Character-Pitch (ßH01) auf H77 anstatt 76, dann hast du
->8dots pro 1byte<- gesendete Daten.Ist auch schöner beim Programmieren.

Daraus ergibt sich ein "Number of Characters"(ßH02)von 19dez.,also H13!
((Hn = 2 bis 256) - 1)
Versuch mal.
Wenn ich bei mir die NumofChar zu hoch einstelle, erscheint irgendwann 
auch nur ein Balken, weil er die Daten nicht über die gesamte Höhe 
zieht...        Rest sieht soweit gut aus...

von Thomas H. (microtom)


Lesenswert?

Guten Abend Sven,

leider ergab der Tipp keine Änderung am Ergebniss.
Ich muss wohl auf ein neues Display warten.

Hast Du genau das Display mit dem ATMEGA32 am laufen?

Da ich Anfänger im ATMEGAen bin, jetzt mal eine sehr doofe Frage:
Zum testen der Lauffähigkeit meines Controlers wollte ich gerade am 
freien PORTC.7 eine LED drankleben und diese mit BASCOM ein oder auch 
mal ausschalten. PORTC.7 = 0 -> Theoretisch ja logisch AAABER: Tut 
nicht, PORTC.7 wird nicht 0. ???

Gruß
Thomas

von allu (Gast)


Lesenswert?

Hallo Thomas,

lösche mal die Zeile "$baud = 19200" aus dem Programm. Dadurch werden 
von Bascom die beiden Ports PD0 und PD1 für die serielle Schnittstelle 
reserviert und sind dann nicht mehr verfügbar.

Gruß  Allu

von allu (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

mein Mega32 läuft jetzt. Es lag nur an der JTAG-Freigabe. Da ich die 
serielle Schnittstelle brauche, ist meine Schaltung anders verdrahtet. 
Übrigens funktioniert das Display auch noch mit 16 Mhz-Taktfrequenz.

Gruß  allu

von Sven B. (svenba)


Lesenswert?

@allu:
Jo, meins läuft auch (bis jetzt) auf 16MHz kommt halt nur auf Timing und 
die Busy-wait Routine an...
Hatte am Anfang nur zum Probieren auf 1MHz geschaltet..

@Thomas:
Hast du nach dem Umschalten von PC7 mal ne Endlosschleife gesetzt??

von Thomas H. (microtom)


Lesenswert?

Hi und erstmal vielen Dank für die Unterstüzung!

Also ich hab meinen ATMeg32 auf 8MHz internen Takt,  damit am XTAL1 und 
XTAL2 nichts dran (auch desshalb weil mein Quarz noch mit den neuen 
Displays in Lieferung ist).

Das mit dem Baud-Tipp klingt logisch, wurde entfernet - aber immer noch 
kein Lebenszeichen.

Ich sehe Du, Allu hast einen 100k Kontrastpoti drinne. Ich einen 10k. 
Wenn ich bei mir den Kontrast aber stelle, kann ich von 'ganz blass' bis 
'ganz dunkel" einstellen. Sollte das nicht reichen? Oder ist das bei mir 
eine nur scheinbar korrekte Funktion?

Aktuell habe ich etwas den überblick verloren. Ich werde mir Morgen die 
komplatte Schaltung noch einmal zu Gemüte führen (jedes Raster, jeder 
Pin und jeder Luftspalt) danach kommt der Code nochmals dran.

Sollte dies nicht zum Erfolg führen, werde ich bis die neuen Displays 
kommen, schonmal die Schaltung nach genau dem 'jetzt neuen 
Allu'-Schaltplan anfertigen, damit ich mit Sicherheit ein Lebenszeichen 
erwarten kann. Das wäre jetzt wirklich gut um sicher zu gehen ob das 
Display OK ist.

Das mit der Test-LED an PORTC war mein Fehler, das klappt schon, danke 
für den Tipp Sven!

von Sven B. (svenba)


Lesenswert?

Diese Kontrast-Einstellung ist teilweise ne feinfühlige Sache, ab und zu 
triffst du den "richtigen Punkt" nicht. Wie ich oben schon schrieb; 
besser nen Poti mit min. 20k nehmen!!

von Thomas H. (microtom)


Lesenswert?

Wusste nicht dass das so empfindlich ist, ich kenne noch die "alten 4x20 
Zeichen Displays" da war das kein Problem ;)

Wird Erldigt > 20k rein ;)

von allu (Gast)


Lesenswert?

@Thomas

Flachbandkabel sprechen über wie Hund. Zu deinem Display-Kabel habe ich 
mal eine Frage. Es sieht so aus, als ob doppelt so viel Adern als nötig 
vorhanden sind - was sehr gut wäre.

Ist jede nicht benötige 2. Ader mit GND verbunden?

von allu (Gast)


Lesenswert?

Hm, irgendwas klemmt bei Hochladen   ... Test  .. Test

von allu (Gast)


Lesenswert?

Hallo zusammen,

anbei eine Programmversion mit angepassten Steuerzeiten für die 
schnelleren 16 Mhz. Waren teilweise um ca. 100 nsec zu kurz.

Die Bit-Ports für den Controlbus sind jetzt frei wählbar. Zum 
kreuzungsfreien Anschluss werde ich Reset und CS des Displays noch nach 
PA6 und PA7 umverdrahten.

@Thomas
Lustige Muster habe ich bei falscher Controller-Konfiguration und bei 
Verdrahtungsfehlern erlebt. Ich kann Dir nur raten, ändere nix im 
Programm was den Display-Controller betrifft, bevor nicht was 
vernüftiges angezeigt wurde.

Gruß allu

von Thomas H. (microtom)


Angehängte Dateien:

Lesenswert?

Die jeweils 'zweiten' auf dem Flachband hängen bei mir in der Luft. 
Jetzt wo Du das schreibst, macht es wirklich Sinn die auf Masse zu 
hängen. Danke für den Tipp, wird bald möglichst versucht.

Ich hab hier mal noch ein Datenblatt vom 16080er Display,
eventuell habt Ihr das in der Form ja noch nicht. Ich zumindest hatte 
bisher ein 'noch schlechter' ausgeführtes.

Gruß
Thomas

von allu (Gast)


Lesenswert?

Das mit dem Anhang hat leider nicht geklappt  ....

von allu (Gast)


Lesenswert?

Hallo Thomas,

mit einem ausführlicherem Datenblatt habe ich tagelang gegen den 
Controller gekämpft. Gehe mal davon aus, dass mit dem Programm ein 
kleines Kreuzchen oben links erscheinen muss. Und mit der Version _7 
wenn, ich es nur endlich hochladen könnte  ...

von allu (Gast)


Lesenswert?

Geht leider nicht ....  Warum auch immer ...

von Thomas H. (microtom)


Lesenswert?

Hi Allu,

kannst Dich ja mal im Forum anmelden, eventuell klappts ja dann.
Ich würd Dir auch gern mal meine ICQ zukommen lassen, über PN, falls Du 
das nutzt.

Gruß
und trotz Uploadproblemen 'nen schönen Abend
Thomas

von Alex D. (allu)


Lesenswert?

Ratlos ......  geht auch angemeldet nicht mehr ...

von Thomas H. (microtom)


Lesenswert?

Seltsam, bei mir gings vorhin ja noch. Kommt eventuell auf die 
Dateierweiterung drauf an?!

Das bekommen wir schon hin ;-)

von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

Habe mal alle Unterlines entfernt ---- großer Woodoo-Zauber --- ich 
glaube selbst nicht dran --- egal --- jetzt werden die Dateien 
angezeigt.

Die Version 7 zeigt auf der Startseite einen Text an, so ist leichter zu 
sehen, ob was geht.

Gruß Alex  (alias allu)

von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

Noch ein Datenblatt, jetzt zum Display-Controller LC7981

von allu (Gast)


Lesenswert?

Hi Thomas,

angemeldet habe ich mich, danke, guter Tipp.

Aber mit "ICQ zukommen lassen, über PN" kann ich leider nichts anfangen. 
Da hat mir das Internet auch nicht so richtig weitergeholfen.

Wahrscheinlich weil ich ein älteres, wenn nicht gar uraltes Model bin. 
Aber in mir ist immer noch zuviel Unsinn drin.

Ebenfalls einen ahngenehmen Abend   Alex

von Thomas H. (microtom)


Lesenswert?

ICQ ist ein "Messenger", also ein Programm um sich von 'Mensch vor PC' 
zu 'Mensch vor PC' direkt "Echtzeit" per Tastatur zu unterhalten. Wenn 
man sich bei ICQ anmeldet bekommt man eine ICQ Nummer, die dann 
sozusagen die Zugangsnummer ist um im ICQ-Netzwerk erreichbar zu sein. 
Im ICQ Programm kann man dann seine Bekannten oder Freunde hinzufügen 
und kann dann wenn diese online sind kontaktieren. Ist relativ bekannt, 
aber keine Schande wenn man es nicht kennt :-)

Ich wollte dir also meine ICQ Nummer via "privater Bordnachricht (PN)" 
hier im Forum zukommen lassen, fals Du ICQ installiert gehabt hättest. 
Aber ist nicht so wichtig, wir haben ja das Forum.

---
Zum Atmel Projekt
---
Du bist fleißig und dir steht ja eine hervorragende Analysehardware zur 
Verfügung wenn ich das richtig interpretiere! Alle Achtung schwärm! 
Was ist das für ein schickes Gerät?

Ich bin mir inzwischen sicher dass das Display defekt ist (100%ig). 
Leider dauern die Pollin-Bestellungen immer ne ganze Weile und ich muss 
noch warten.

Aber dann geht’s wieder rund. Den Erfolg möchte ich sehen, denn ich hab 
hier eine kleine FHZ FS-20 (siehe ELV) Funk-Haussteuerung und möchte 
anstelle des PCs die Beleuchtung und die Heizung mittels dieses 
Projektes vom Wohnzimmer aus gemütlich am Tochdisplay verwalten. Und ein 
weiteres Projekt würde auch schon warten.

Frage: Wenn ich bei Deinem ursprünglichen Schaltplan (den vor dem 
aktuellen) den Quarz mit den Kondensatoren einfach weglasse, hat das 
doch keine Folgen, oder?

von allu (Gast)


Lesenswert?

Egal welcher Plan, wenn Du den internen RC-Oszillator benutzt, sind 
Quarz und Kondenstoren nicht erfoderlich.

von Thomas H. (microtom)


Lesenswert?

Darf man fragen, welche Art von Projekt Du vor hast?

von Alex D. (allu)


Lesenswert?

Guten Tag

@Thomas, das ist ein "Intronix Logicport 34 Channel Logic Analyzer", ein 
schönes Teil. Unter www.pctestinstruments.com gibts die Software. Ohne 
Logicport läuft diese im Demo-Mode.

Ab und zu bastele ich an einem Hausmeldesystemsystem mit 8 Slaves und 
einem Master herum. Die Heizung wollte ich auch überwachen. Das 
Touchdisplay soll am Master Anzeige und Bedienung übernehmen.

Die Slaves gibt es schon. Sie verfügen über 5 Meldeeingänge, einen 
1-Wire-Bus, einen Temperatursensor und zwei Schaltausgänge. Das ganze 
läuft per Aufruf vom Master über einen RS485-Bus. Der wohnt aber zur 
Zeit noch als Mega8 auf einem Steckbrett.

@Sven
>Hab mal bißchen gefummelt!
>Stell mal deinen Character-Pitch (ßH01) auf H77 anstatt 76, dann hast du
>->8dots pro 1byte<- gesendete Daten.Ist auch schöner beim Programmieren.

Mein Grund für 23*8 ist die Lesbarkeit. Es bleiben dann 2 „Leerpunkte“ 
zwischen den Zeichen und 3 "Leerzeilen" zwischen den Zeilen. Aber das 
ist Geschmackssache.

Allerdings ist die Auswertung des Touchs auf 23*8 ausgelegt. Die 
Messergebnisse des A/D-Wandlers sind weiter verwertbar. Die Auswertung 
aber wird falsche Zeichenpostionen und damit verbunden falsche 
Rückgabewerte liefern.

Gruß  Alex

von Thomas H. (microtom)


Lesenswert?

Hi Alex,

morgen sind die Displays da. freu
Mal schauen ob ich am Wochenende dazukomme Sie zu testen.

Ich melde mich!

Gruß
Thomas

von Thomas H. (microtom)


Lesenswert?

Hallo Alex,

das Display ist angekommen UND es funktioniert! freude

Das 'alte' ist tatsächlich defekt.

Viele Dank erstmal für Deine Unterstützung, jetzt macht es wieder 
richtig freude zu experimentieren. Als nächsten Schritt, werde ich mich 
mit der Software detailierter auseinandersetzen damit ich auch verstehe 
was gemacht wird.

Dein Logic-Analyser ist wirklich chick, für soetwas wie die 
Displayansteuerung auch perfekt!

Wünsche Du kommst mit Deinem Projekt voran!
[Wenn ich darf, komme ich bestimmt nochmal mit Fragen ;-)]

Beste Grüße zum Wochenende
Thomas

von Alex D. (allu)


Lesenswert?

Hallo Thomas,

klasse, dass es mit dem neuen Display funktioniert (mitfreu)!

Um die Programmierung übersichtlicher zu gestalten, bin ich gerade dabei 
das Programm in verschiedene Dateien aufzuteilen. Bis jetzt habe ich die 
Initialisierung, Touch, LCD und Charakter-Tabelle ausgelagert. Nicht 
elegant, sondern nur mit $include als Textdatei.

Fragen, wenn ich helfen kann, gerne. Ich habe auch schon öfters Rat in 
diesem Forum gefunden.

Eine Frage hätte ich doch noch:
Funktioniert der Touch auch, oder verwendest Du nur das Display?

Angenehmes Wochenende, Gruß
Alex

von Thomas H. (microtom)


Lesenswert?

Hallo,

es funktioniert der Touch und das Display bestens!
Der Touch liefert nach der Kalibrierung genau die richtigen Werte 
zurück!

Hast Du es schon geschafft Darstellungen außerhalb von ASCII 
einzubinden, also z.b. kleine Buttons?

Grüßle
Thomas

von Thomas H. (microtom)


Lesenswert?

Nachtrag: Kann ich die Schriftgröße innerhalb einer 'Seite' ändern?

Später soll das mal so aussehen:

-----------------------------
| Licht Wohnzimmer   <    > |   'die Pfeile sollten kleine Button sein
| Licht Büro         <    > |
|                           |
| Garage: offen             |   'Statusabfragen
| Temperatur Bad: 23°C      |   'Die 23°C sollten schön groß sein!
|                           |
|                           |
|---------------------------|
| Hauptmenü    |   Weiter   |
-----------------------------

so wie ich das interpretiere, kann ich mit dem aktuellen Programm immer 
eine Zeile zusammenbauen und dann am Ende komplett ausgeben. Kann ich 
auch wie oben ein Muster im Quellcode generieren und diesen dann 
anzeigen?
Also dass ich immer einen Bildschirm wie oben gestalte (egal ob ASCII 
oder Bild)?

Nach dem Motto
Zeile 1 = ---------------------
Zeile 2 = blblblblblblbblblblblb
Zeile 3 = blubblubblub
Zeile 4 = usw...

lcd_schreibe_jetzt_alle_zeilen()

Gruß
Thomas

von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

Hi Thomas,

meine Sonderzeichen habe ich  in der Tabelle Tabchr (jetzt in 
RomTabs.txt) mit untergebracht, wie z. B. Ohm, Grad Celsius, ein Häkchen 
und einen Radiobutton (oder wie das Ding auch immer heißt). Etwas Platz 
ist noch vorhanden.

Nein, bisher gibt es nur eine Schriftgröße.  Kleine Pfeile könnte man 
noch in die Tabchr packen (Zeichenraster ist 7-breit und 8-hoch, nicht 
gerade viel).

Warum überhaupt ein Raster und eine Form-Tabelle?.
Der Display-Controller ist unflexibel, ohne Raster müsste man jedes 
Pixel einzeln in den Controller schreiben.
Für eine einfache Anbindung des Touchs ans Basic. Weil ich Ketten von 
größer-kleiner Abfragen vermeiden wollte. Die Auswertung (das getroffene 
Rasterkästchen wird berechnet)  dauert etwa 50 Mikrosekunden, dann 
stehen dem Basic Postion-Fein, Position gerastert und der Rückgabewert 
zur Verfügung.

Man kann auch nur ein Zeichen an eine beliebigen Postion ins Display 
schreiben  (Nach unten von 0 bis 79, zur Seite von 0 bis 22, wobei über 
71 nicht sinnvoll ist). Ganze Zeilen sind nicht notwendig

Das Motto „von oben nach unten“ und „lcd_schreibe_jetzt alle_Zeilen()“ 
ist eine gute Idee, aber nicht im Programm enthalten. Ursprünglich 
wollte ich die Bildschirmmasken ins Rom packen und von da aus laden. 
Aber das war mir für meine ersten Versuche zu unübersichtlich.

Naja, mit Software kann man immer fast alles machen, fragt sich nur, 
wie groß ist der Aufwand. Und jeder hat so seine Ideen. Die wirft man am 
besten alle in einen Topf, rührt um und realisiert die sinnvollsten 
davon.

Im Moment bin ich gerade am überlegen, wie man einen Linie- oder 
Box-Befehl basteln könnte.

Die aufgeteilte Version ist angehängt. Alle Dateien müssen sich zum 
Compilieren im gleichen Ordner befinden.

Gruß
Alex

von Thomas H. (microtom)


Angehängte Dateien:

Lesenswert?

Hi Alex,

ich hab mal die Dateien mit Trennlinien ein bischen getunt
(Das ist zwar nichts Besonders aber erhöht die Lesbarkeit beim 
programmieren)

Eventuell kannst Du damit was anfangen.

Ich denke es reicht auch vollkommen wenn mit ASCIIs gezeichnet wird. 
Persönlich muss ich keine "grafischen" Buttons haben, eine Linie wäre 
natürlich perfekt zum Buttons malen.

Die Raster und Form-Tabelle ist perfekt so, finde ich gut zu handeln.

Das Display macht einen rießen Spaß!

Gruß
Thomas

von Thomas H. (microtom)


Lesenswert?

Hi Alex,

ich hätte da mal noch ein Frage. Bin gerade dabei mit dem COde zu 
spielen und klappt auch ganz gut soweit. Gelegentlich bin ich etwas am 
raten, aber man kommt durch Versuche meist drauf. Aktuell habe ich mir 
mal eine Testseite auf dem Display gemacht um einzelne Ports ein und 
auszuschaleten - rein aus Testzwecken.

Eine Frage zum Touch-Rückgabewerte-Raster:
1
Dim Lcd_format(192) As Byte
2
Dim Lcd_form_0 As String * 23 At Lcd_format(1) Overlay
3
Dim Lcd_form_1 As String * 23 At Lcd_format(25) Overlay
4
Dim Lcd_form_2 As String * 23 At Lcd_format(49) Overlay
5
Dim Lcd_form_3 As String * 23 At Lcd_format(73) Overlay
6
Dim Lcd_form_4 As String * 23 At Lcd_format(97) Overlay
7
Dim Lcd_form_5 As String * 23 At Lcd_format(121) Overlay
8
Dim Lcd_form_6 As String * 23 At Lcd_format(145) Overlay
9
Dim Lcd_form_7 As String * 23 At Lcd_format(169) Overlay

Wie darf ich mir das Raster genau vorstellen, von welcher bis zu welcher 
Zeile geht die LCD_FORM_0 und die LCD_FORM_7? Das wäre super zu wissen.

Als nächstes bin ich gerade dabei (experimentell) mit den Modulen
http://www.ehomeportal.de/Funk-System-FS20/Bausaetze/FS20-868-MHz-HF-Sendemodul-TX868-75.htm?shop=shop&SessionId=&a=article&ProdNr=68-620-11&t=1597&c=1932&p=1932
und
http://www.ehomeportal.de/FS20-868-MHz-Empfangsmodul-RX868-3V.htm?shop=shop&SessionId=&a=article&ProdNr=68-641-28

meine Wohnlichter zu schalten. Dafür hab ich eine gute Hilfe gefunden 
und bin gespannt bis mir 'die erste Leuchte angeht'

Viele Grüße
Thomas

PS: Würde Dir auch gerne bei was helfen, leider weiss ich als noch 
Beginner nicht bei was :-) g

von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

Hallo Thomas,

ja, es ist schöner aufgeteilt und besser lesbar, danke.

Habe mal zum "Buttons malen" ein paar einfache Zeichen und Pfeile in die 
RomTabs eingegeben (ist angehängt, aber noch ungeprüft). Mit 
„Zeichensatz anzeigen“ kann man die Symbole sehen.

Dim Lcd_format(192) As Byte
Dim Lcd_form_0 As String * 23 At Lcd_format(1) Overlay  usw., usw

192 Byte Gesamtgröße =
(23 Zeichen je Zeichenzeile für den String + 1 für das interne 
Endezeichen 00h von Bascom.)

multipliziert mit

8 Zeichenzeilen zu je 10 Zeilen( Zeile = 1 Bildpunkt hoch).

Das ist halt eine Variante von vielen die das Display bietet. Ich habe 
23 Zeichen je Zeile, mit einer Höhe von 10 Zeilen gewählt. 80 Zeilen 
ergeben  deshalb 8 Zeichenzeilen – Schreiben kann man aber ab jeder 
Zeile (z.B locate Zeile 32, 33, 34 , ...usw.), passt halt nicht mehr ins 
gewählte Touch-Raster. Übrigens werden nur die nächsten 8 Zeilen 
überschrieben. 10 Zeichenzeilen gehen also auch.

Bildlich gesehen liegt unter jedem Rasterfeld ein Speicherplatz in der 
LCD_Form-Tabelle. Wird der Touch berührt, wird X/Y des Rasterfelds 
berechnet und der zugehörige Speicherplatz in LCD_form gelesen.

LCD_form_0 liegt unter der obersten Zeichenzeile 0, Position symmetrisch 
locate_Zeile = 01
LCD_form_7 liegt unter der untersten Zeichenzeile 7, Position 
symmetrisch locate_Zeile = 71

Zu beachten ist noch, dass das Leerzeichen für den Rückgabewert 0h 
steht. Möchte man ein Leerzeichen über den Touch eingeben, muss in die 
Formtabelle ein „_“ eingetragen werden. Für eine Funktionstaste wird nur 
128 addiert.

Beispiel: (1) erzeugt = (128+“1“),(128+“1“),(128+“1“) → 3 Raster breit
    1 liefert eine „1“ zurück

Mehr steckt nicht dahinter. Dinge wie () zum Erzeugen der 
Funktionstasten sind nicht wirklich notwendig. Habe ich mir nur aus 
Tipp-Faulheit und zur besseren Übersichtlichkeit eingebaut.

Gruß
Alex

von Thomas H. (microtom)


Lesenswert?

Danke für Deine Antwort!

Die Pfeilchen sind praktisch, damit kann man richtig schöne Navigationen 
darstellen und der Radiobutton ist auch prima für zum Beispiel "Aktor 
ist EIN oder AUS".

Kommst Du voran mit Deiner Haussteuerung?

Grüßle
Thomas

von Thomas H. (microtom)


Lesenswert?

Hallo Alex,

ich hab gerade ein Problem eventuell hast Du eine Idee:

Ich habe nun meine Sendemodule angekoppelt und kann auch schon 
funkschalten.
Das Problem ist, dass ich zur korrekten "Sendegeschwindigkeit" den 
ATMEGA auf 7372800Hz Takten muss (8MHz gingen zum Test auch aber nicht 
optimal)

damit ist aber der Touch und der Bildaufbau viel zu langsam.

Gibts da eine Möglichkeit, das zu umgehen?
Kann ich wärend des Betriebs des ATMEGA den Takt ändern (nur zum 
Zeitpunkt des Signalaussendens) und danach wieder zurück auf 16MHz?

Gruß
Thomas

von Alex D. (allu)


Lesenswert?

Hallo Thomas,

mit meiner Haussteuerung, im Moment garnicht, bin zeitlich im Moment 
etwas knapp.

Habe es gerade mal mit 8 Mhz probiert, der Bildaufbau ist nicht 
sichtbar, dass geht wie immer schlagartig. Bei 16 Mhz werden 4 
Wartezyklen eingeschoben, bei 8 Mhz werden es wohl nur 2 sein. Also ist 
kein grober Geschwindigkeitsverlust zu erwarten - siehe oben Bild 
Ansteuerung 16080.jpg.

Beim Touch sieht das anders aus, der ist jetzt auf 16 Mhz mit 30 
Abfragen/sec ausgelegt. Werfe den Vorteiler halt wieder raus. Der Touch 
verbraucht dann bei 8 Mhz je Sekunde < 30 msec Rechenzeit, da muss man 
nicht wirklich was zurückändern.

Natürlich kann man mit etwas zusätzlicher Hardware die 
Taktgeschwindigkeit umschalten. Die Frage ist, brauchst die 
Rechenleistung von 16 Mhz? Oder soll der Stromverbrauch minimal werden? 
Und für was brauchst Du genau 7372800Hz?

Wie ist das Modul angekoppelt? Zum Beispiel könnte eine IRQ-Routine mit 
ungünstigen (hemmungslosen) Aufrufen den Mega lahmlegen.

Also an den 8 oder 7 Mhz liegt es sicher nicht.

Gruß
Alex


Tim0_isr:
'------------------------------------------------------------------
     Set Portb.0                  ' für Zeitmessung

' Incr Irq_teiler
' If Irq_teiler = 2 Then          ' Vorteiler durch 2 für 16 Mhz
                                  ' ergibt Touchabfrage alle 33 msec
'     Irq_teiler = 0
    Gosub Touch_auswerten

   Incr Ticker
   If Ticker = 3 Then
      Ticker = 0
      If Timer_a > 0 Then Decr Timer_a
      If Timer_b > 0 Then Decr Timer_b
   End If
' End If

   Reset Portb.0                   ' für Zeitmessung
Return

von Thomas H. (microtom)


Lesenswert?

Hallo Alex,

du hast vollkommen Recht, ich brauche die 16MHz eigentlich nicht 
unbedingt und 'könnte' den Vorteiler raus machen, damit die Abfrage bei 
8MHz schnell genug ist.

Das habe ich auch gerade versucht, faszinierender Weise ändert sich 
dabei aber auch etwas bei meiner Sendesequenz?!

Wenn ich den Prescale vom Timer0
[/c]Config Timer0 = Timer , Prescale = 1024
1
abändere, funktioniert meine korrekte Protokollsendung nicht mehr in der richtigen Zeit.
2
3
Bei der Senderoutine wird das verwendet:
4
[c]
5
 Config Timer2 = Timer , Prescale = 64     'Timer for transmiter
6
   On Timer2 Isr_timer2
7
8
       Enable Timer2
9
       Goto Fs20tx_end
Theoretisch dürften die beiden doch keine Gemeinsamkeiten haben?

Wenn ich darf, sende ich Dir meinen Code mal per Mail,
eventuell kannst Du einen groben Fehler erkennen. Ist nicht all zu viel 
zum durchlesen.

Meine Sendemodule müssen das Protokoll eben in einer bestimmten 
Zeitspanne senden. Die funktionieren ähnlich wie der RC5-IR Code.

Gruß
Thomas

von Alex D. (allu)


Lesenswert?

Hallo Thomas,  hallo benim,

Mail ist für mich nicht ok. Nichts für ungut, aber mit meiner 
Mailadresse bin ich sehr vorsichtig.

Dafür sind Foren wie dieses hier, transistorNET und ähnliche doch da.

Gruß
Alex

von Alex D. (allu)


Lesenswert?

Hallo Thomas,

hmm, schwierig. Dass mit den Timern und Prescalern weiss ich leider auch 
nicht. Der Touch läuft per Interupt, zeitlich gesteuert über den 
Prescaler (Teiler 1024) mit nachgeschaltetem Timer_0 (Teiler 256) → 
28,125 Touchaufrufe/Sekunde bei 7372800 Mhz.

Der IRQ_Teiler ist Software  und verändert außer der Anzahl der 
Touchaufrufe nichts.

Um zeitlich kurze Impulsketten mit einem Mikroprozessor exakt zu 
erzeugen, wird der IRQ für den Touch wohl gesperrt werden müssen. Oder 
den IRQ rausnehmen und den Touch im Abstand von etwa 30 bis 60 msec 
selbst aufrufen, dann bleiben die zeitkritischen Programmteile 
ungestört.

Gruß
Alex

von Helmut (Gast)


Lesenswert?

Das einfachste ist die Touchroutine nicht im Interupt zu betreiben.

Einfach im Programm erkennen ob gedrückt worden ist.

Das kann man über die ADC`s gut erkennen.

Dann kann das Ganze auch mit kleinerer Taktrate betrieben werden.

Und man hat einen Timer frei und kann ihn verkaufen oder in Zahlung 
geben ;-)

Oder Impulse ausgeben oder messen oder....oder

von Thomas H. (microtom)


Lesenswert?

Danke für den Tipp,
aktuell klappt es zwar ganz gut, aber bei Gelegenheit kommt der 
Interrupt raus.

Ich hatte völlig übersehen, dass der Timer2 einen Prescaler von 128 
unterstützt. Timer0 und Timer1 machen das nicht. Aktuell funktioniert 
das senden perfekt.

Gruß
Thomas

von allu (Gast)


Lesenswert?

@Thomas,
über Deine Absenderadresse, und rate mal wie der Admin dort heißt ...

von Thomas H. (microtom)


Lesenswert?

@Allu,
Zufälle gibt es manchmal, faszinierend!

Ist ein Projekt welches mir sehr wichtig ist, auch wenn zur Zeit nicht 
so viel Zeit dafür ist. Würde mich freuen wenn es Dir gefällt und Dir 
dort auch mal geholfen wird!

Gruß
Thomas
www.TransistorNET.de :-)

von Thomas H. (microtom)


Lesenswert?

@Alex,

was meinst Du zum rauswerfen der Interruptfunktion für den Touch, würde 
eventuell einiges an Programmaufwand ersparen.

Wärst Du dafür? (Können wir ja zusammen machen)

Gruß
Thomas

von Alex D. (allu)


Lesenswert?

Hallo Thomas,

nein, die Touchroutine rauswerfen habe ich nicht gemeint, sondern "Gosub 
Touch_auswerten" nicht mehr per IRQ, sondern regelmäßig selbst aufrufen. 
Wie es jetzt ist, läuft der Touch ohne weiteres zutun, der 
Programmieraufwand würde m.E. eher größer werden.

Die IRQ-Routine möchte ich bei mir nicht rausnehmen, da mir sonst die 
Software-Timer A, B, und noch viele mehr wenn nötig) nicht mehr zur 
Verfügung stehen würden. Außerdem läuft darüber inzwischen die 
Zeitsteuerung zum Datenaustausch mit den Slaves.

Vielleicht wäre das auch eine einfache Lösung für Dein Problem, einfach 
im Interrupt bei Bedarf die Impulserzeugung aufrufen. Wenn es nicht 
länger als  25msec dauert, sollte es ohne Störungen ablaufen 
(vorausgesetzt die 28,125 Touchaufrufe/Sekunde sind noch eingestellt).

Gruß
Alex

von Alex D. (allu)


Lesenswert?

... oder probiere mal:
"Disable Timer0" -> Steuerimpulse senden -> "Enable Timer0"  ....

von Thomas H. (microtom)


Lesenswert?

Hallo Alex, das senden klappt bei mir inzwischen hervoragend. Mit dem 
Empfangen happert es aber noch. Unabhängig davon muss ich mir etwas 
einfallen lassen um noch einen Timer zu haben, da ich später auch zu 
einer bestimmten Uhrzeit etwas senden lassen möchte.

Leider reichen meine aktuellen BASCOM Kentnisse noch nicht ganz aus um 
das Programm so umzubauen dass ich einen Timer übrig habe.

Zum Thema Emfpangen von Funksignalen, habe ich Heute eventuell den 
Zugriff auf ein Oszi, dann sieht die Welt eventuell schon wieder ganz 
anders aus


Wünsche Euch ein schönes Wochenende!

Gruß
Thomas

von Hannes L. (hannes)


Lesenswert?

Entschuldigt, dass ich mich (nochmal) einmische.

> Unabhängig davon muss ich mir etwas
> einfallen lassen um noch einen Timer zu haben, da ich später auch zu
> einer bestimmten Uhrzeit etwas senden lassen möchte.

Nur als Tip, ohne Euer Programm zu kennen:

Wie wäre es, einen Timer mehrere Dinge timen zu lassen?

Beispiel:

Ein Timer erzeugt im Zeitabstand von 10 ms Interrupts.

In diesem Interrupt wird:

- der Merker "ms10" gesetzt
- die Variable "hundsek" hochgezählt
- bei Erreichen von 100 husek auf 0 gesetzt und der Merker "neusek"
  gesetzt

Die Mainloop läuft nun im Kreis und fragt die Merker ab. Ist ein Merker 
gesetzt, wird zur entsprechenden Job-Routine verzweigt. Diese löscht 
(resetet) den Merker und erledigt den Job.

Der ms10-Job (alle 10 Millisekunden) kann den Touchscreen abfragen (oder 
Tasten abfragen und entprellen), TimeOut-Zähler für irgendwelche Dinge, 
die sonst per Warteschleife (Wait, Waitms) das Programm anhalten würden, 
herunterzählen, und weitere Dinge überprüfen, für die ein Abstand von 10 
ms akzeptabel ist. Durch das Führen weiterer Zählvariablen lassen sich 
weitere "Zeitscheiben" für zyklische Jobs einrichten.

Der Neusek-Job (alle Sekunde) zählt dann die Uhr einschließlich Kalender 
hoch, wobei sich für Schaltaufgaben die "fortlaufende Zahl" besser 
eignet, für die Anzeige allerdings getrennte Variablen für Sekunde, 
Minute, Stunde, Tag, Wochentag (Mo, Di...), Monat, Jahr, Jahrhundert. 
Bei Bedarf kann der Neusek-Job auch noch auch noch lange TimeOuts 
(Sekundenauflösung) verwalten.

Was meine ich mit "TimeOut"?

Eine Zählvariable (TimeOut-Zähler) wird vom zyklischen Job auf 0 
getestet. Ist sie 0, wird nichts gemacht. Ist sie nicht 0, dann wird sie 
vermindert. Wird sie dabei 0, so wird der entsprechende Job aufgerufen 
oder ein entsprechender Merker verändert. Um einen Timeout zu starten, 
muss die Routine, die ihn braucht, nur die TimeOut-Variable auf den Wert 
der gewünschten Wartezeit setzen. Dann geht's zur Mainloop, den Rest 
übernimmt der TimeOut.

Dies alles bitte nur als Hinweis auf alternative Programmstrukturen 
sehen, wie sie auch in Bascom möglich sind, wenn das Programm 
entsprechend konzipiert.

...

von Alex D. (allu)


Lesenswert?

Hallo Hannes,

hmmm, alternative Programmstruktur? Ich sehe einen sauberen 
Programmaufbau im wesentlichen auch so, wie er von Dir oben beschrieben 
wird.

Gruß
Alex

von Thomas H. (microtom)


Lesenswert?

@Allu,

ich lass es mal auf mich zukommen, aber die Displayansteuerung wie Sie 
aktuell (von Dir) ist ist super und klappt wirklich gut.

Ob ich die Timer noch brauche kommt demnächst auf.

Senden wie gesagt funktioniert, empfangen leider noch nicht ;)

Gruß
Thomas

von Alex D. (allu)


Lesenswert?

@Thomas,

freud mich, wenn Du was verwenden konntest. Du brauchst einen Timer für 
eine Aktion pro Tag und ich die Uhrzeit, eine Schaltuhr wäre also nicht 
schlecht. Bin gerade am überlegen, wie man  Prozessorquarz, 
IRQ-Frequenz, Touchabfrage, Uhr und meinen seriellen Datenaustausch 
(vielleicht auch Dein Sendetelegramm, wenn Du mir verrätst wieviel Zeit 
es braucht) am geschicktesten zeitlich kombiniert. Habe ich dass richtig 
in Erinnerung, Du verwendest 7,372800 Mhz ?

Mir ist schon nicht klar, wie Du ohne Oszi den Sender zum funktionieren 
gebracht hast, aber auch noch einen Empfänger, der scheinbar strohdumm 
ist und nur Impulse liefert, zusätzlich mit dem Mega32 decodieren 
willst, das wird richtig eng. Da hilft höchstens noch das Zauberwort 
externer Interrupt.

Ich habe mal einen Funksteckdosenempfänger (läuft übrigens einwandfrei 
mit 5V) mit einem Mega8 kombiniert, weil ich was mit der Fernbedienung 
schalten wollte. Zugegeben, das Programm war primitiv und hat nur die 
Codes auf einem LCD angezeigt, aber der Mega8 war immer mit dem Ohr in 
der Luft. Vielleicht wäre ein Empfängerbedienungsmega8 auch eine Lösung. 
Ankopplung z.B. über die serielle Schnittstelle.

Gruß
Allu

von Alex D. (allu)


Lesenswert?

Hallo Micha,

probier mal:

####### weiter im Menü ############

Locate_zeile = 61   ' Zur Zeile 6 gehört LCD_form_6
Locate_spalte = 0
'Muster = "01234567890123456789012"
Lcd_string = "  test"
Lcd_form_6 = "  (6 )"   ' LCD_form_6 gehört zur 6.Zeile,
                       'sonst stimmt Text und Schaltfläche nicht überein
Gosub Lcd_write_string

' Muss zum Schluss einmal aufgerufen werden.
' Gosub Lcd_form_aufbau            ' Funktionstasten erzeugen

'########### und zum sprung ###########

Test:

Gosub Lcd_clear                         ' Display löschen
Gosub Lcd_form_clear                    'alte Rückgabewerte löschen

Locate_zeile = 41       ' Zur Zeile 4 gehört LCD_form_4
Locate_spalte = 0
Lcd_string = "  TEST  "  ' Text für Display
Lcd_form_4 = "(6     )"  ' Funktionstaste "5" mit Klammerbreite 
vorbereiten
                           ' Die 5 muss direkt hinter "Klammer auf" 
stehen
Gosub Lcd_write_string                       'Text auf Display schreiben

Locate_zeile = 01
Locate_spalte = 0                     ' Zur Zeile 0 gehört LCD_form_0
Lcd_string = "Zurueck"                ' Text für Display
Lcd_form_0 = "(5    )"          ' Funktionstaste 5 mit der Klammerbreite 
vorbereiten
Gosub Lcd_write_string           'Text auf Display schreiben

Gosub Lcd_form_aufbau            ' Funktionstasten erzeugen

Temp_a = 0                        ' nur für Test

Do

If Touch_meldet = Ja Then

   ' Was getan werden soll, Beispiel:

   Incr Temp_a                        ' Test, um 1 erhöhen und anzeigen
   Locate_zeile = 45
   Locate_spalte = 18
   Lcd_string = Str(temp_a) + "  "
   Gosub Lcd_write_string

   Touch_meldet = Erledigt

   End If

Loop Until F_taste = _menue                 ' Rückkehr ausgewählt
Gosub Auswahl                               ' Auswahl aufbauen
Return                                      '.. und zurück

Gruß
Allu

von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

anbei eine erweiterte Version für Bascom und und den ATMega8. Das 
Programm läuft auf der Schaltung von Benedikt. Umlaute und einige 
Sonderzeichen sind jetzt direkt erreichbar. Dünne() und dicke[] Rahmen 
für Tasten lassen sich automatisch erzeugen (allerdings zeigt mein 
Display unschöne Streifen bei zu vielen Balken).

Alles in den gleichen Ordner packen, dann sollte Bascom den .bas 
fehlerfrei übersetzen.

Das Programm lässt sich zum Testen des Displays und des Touchs verwenden 
und bietet Routinen um in Bascom Display und Touch einzubinden.

Gruß
Allu

von Thomas H. (microtom)


Lesenswert?

Hallo und ein erfolgreiches, glückliches neues Jahr Zusammen!

Deinen Code werde ich gleich mal ausprobieren, Alex. Apropos: Das senden 
und Empfangen klappt nun hervorragend. Keine Probleme mehr. Jetzt geht 
es nur noch um ein chickes Displaydesign :-)

Viele Grüße und bis bald
Thomas

von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

Diesen guten Wünschen kann ich mich nur anschließen und wünsche 
ebenfalls allen ein frohes neues Jahr, Glück und Gesundheit.

Thomas, schön das Deine Funkübertragung so gut funktioniert. Ich bin 
immer noch am Display basteln. Inzwischen gibt es paar neue Funktionen 
(Bilder oben) und einen Autorepeat für die Touchtasten. Die Uhr ist noch 
in Arbeit.

Leider zeigt das Display bei hellem Hintergrund dunkle Streifen.

Gruß
Alex

von Thomas H. (microtom)


Lesenswert?

Wow, das sieht ja prima aus.
Ist das der Code von oben?

Werde ich heute mal noch anschauen.
Wie erstellst Du die Buttons? Bisher habe ich die immer von ASCII-Hand 
gemacht.

Gruß
Thomas

Edit: Ahhh, ich verstehe, die Klammern werden automatisch in einen 
chicken Rahmen übersetzt. Das ist ja super!

Jetzt hätte ich eine wichtige Frage:
Da ich bereits schon viel "Menügefusel" gemacht habe und nicht nochmal 
alles ändern möchte am bestehenden Projekte. Könntest Du mir sagen, 
welche Parts ich updaten muss, damit ich auf Deiner aktuellen Version 
bin?

Gruß
Thomas

von Thomas H. (microtom)


Lesenswert?

Hallo Alex,

ich habe mir den Code mal genauer angeschaut und habe die Änderungen 
gefunden :-)

Die Sache bei mir ist, dass ich den Touch ganz ohne Timer abfrage. Ich 
packe bei einem Menü in jede Do-Schleife ein "Gosub Touch_auswerten" und 
greife so mit voller Brutalität ohne Timer auf eine Tastenaktion zu.

Das aber auch nur damit mir meine Timings vom Sende und 
Empfangsprotokoll passen. Das FS20 Protokoll ist da sehr empfindlich und 
ich benötige den Timer1 für das Empfangen (Captureport) und den Timer2 
für das Senden. Leider funktioniert somit die Sache mit den aufgeteilten 
Interrupts bei mir nicht, da das ja nur der Timer 1 kann.

Sehe ich das richtig?

Den Timer 0 habe ich bei mir komplett frei. Eventuelöl kann ich damit 
dann meine Uhr und ähnliches realisieren.

Gruß
Thomas

PS: Was meinst Du?

von Thomas H. (microtom)


Lesenswert?

Jetzt kommt nochmal eine Frage:

Das "Hauptmenü" bzw. 'Auswahl:' besitzt wie ich das sehe Maximal 8 
Auswahlpunkte, die mit:
1
_kalibrieren Alias 1 + 48 + 128                             'Auswahlpunkt 1
2
_setup Alias 2 + 48 + 128                                   'Auswahlpunkt 2
3
_delete Alias 3 + 48 + 128                                  'Auswahlpunkt 3
4
_touch_werte_anzeigen Alias 4 + 48 + 128                    'Auswahlpunkt 4
5
_menue Alias 5 + 48 + 128                                   'Auswahlpunkt 5
6
_auswahl_6 Alias 6 + 48 + 128                               'Auswahlpunkt 6
7
_zeichensatz_anzeigen Alias 7 + 48 + 128                    'Auswahlpunkt 7
8
_fs20_senden Alias 8 + 48 + 128                             'Auswahlpunkt 8

ausgewertet werden.

Wie stelle ich es nun auf eine einfache Art an, meinen Untermenüs 
ebenfalls solche Auswahlpunkte zur Verfügung zu stellen? Bisher habe ich 
in meinen Untermenüs immer mit den X und Y Koordinaten gearbeitet um zu 
Erreichen, dass bei Betätigung eines Buttons das Ziel aufgerufen wird. 
Das ist aber recht aufwendig zu schreiben und ergibt einen riesen 
Quelltext.

Wie kann demnach eine einfache, ordentliche Abfrage weiterer Button aus 
einem Untermenü gemacht werden? Ist die 'Select Case' Anweisung mit 
vorigem Buchstabenvergeben im LCD_Form_x das wie Du es machst?

Viele Grüße
Thomas

von Hannes L. (hannes)


Lesenswert?

Warum arbeitest Du nicht mit laufenden Menüpunktnummern? Diese kannst Du 
als Index auf die Texte nutzen und auch zum Verzweigen auf die Handler.

...

von Thomas H. (microtom)


Lesenswert?

Klappt! :-)

Es wird so langsam ein Schuh draus.

von Alex D. (allu)


Lesenswert?

Hallo Thomas,

zuerst zur letzten Frage nach den Menüpunkten.

> Das "Hauptmenü" bzw. 'Auswahl:' besitzt wie ich das sehe Maximal 8
> Auswahlpunkte, die mit:

> _kalibrieren Alias 1 + 48 + 128                    'Auswahlpunkt 1
  ... usw ...
>_fs20_senden Alias 8 + 48 + 128                     'Auswahlpunkt 8
> ausgewertet werden.

Nein, es sind viel mehr möglich, nämlich maximal 184. Genau so viel wie 
es kleine Touchtasten gibt (23 Spalten * 8 Zeichenzeilen). Im 
Testprogramm kann man das schön mit Touchtest und Texteingabe mal 
probieren.

Nur um die Möglichkeit zur freien Texteingabe zu behalten, gibt es die 
"Funktionstasten", o.k., ungünstige Wortwahl. Da passiert aber weiter 
nichts, als das von Lcd_form_aufbau das erste Zeichen nach der Klammer 
inklusive der Klammern mit dem (Zeichenwert + 128 = Rückgabewert) 
überschrieben wird.

Die Rückgabewerte werden in einem Array gespeichert, man kann genauso 
gut die Werte direkt zuweisen, z.B. : Lcd_format(29)= 1. Um die Eingabe 
und das Positionieren zu vereinfachen, können die einzelnen Werte auch 
in Form einer Textzeile direkt zugewiesen werden. Bascom verwendet wie C 
eine 0 als Textendezeichen, deshalb hat das Array 24 * 8 
Speicherstellen.

Dim Lcd_format(192) As Byte
Dim Lcd_form_0 As String * 23 At Lcd_format(1) Overlay
Dim Lcd_form_1 As String * 23 At Lcd_format(25) Overlay usw.

Die kleinen Folientasten liegen, flächenmässig betrachtet, dann genau 
über den Textzeichen, wenn die Pixelzeilen
Locate_zeile          01,11,21,31,41,51,61,71 Verwendung finden.
Passend dazu Lcd_form_0 ,1 ,2 ,3 ,4, 5 ,6 ,7 für die Rückgabewerte.

> Wie stelle ich es nun auf eine einfache Art an, meinen Untermenüs
> ebenfalls solche Auswahlpunkte zur Verfügung zu stellen? Bisher habe ich
> in meinen Untermenüs immer mit den X und Y Koordinaten gearbeitet um zu
> Erreichen, dass bei Betätigung eines Buttons das Ziel aufgerufen wird.
> Das ist aber recht aufwendig zu schreiben und ergibt einen riesen Quelltext.

Eben um die Programmierung nicht in endlose X/Y-Abfragen ausarten zu 
lassen, gibt es ja die Aufteilung in 23*8 kleine Tasten und die Tabelle 
mit den Rückgabewerten. Es funktioniert in allen Menüebenen mit 
vollkommen unterschiedlichen Rückgabewerten (sprich Tastenbelegungen). 
Vielleicht schaust Du Dir nochmal meinen Bascom-Quelltext an, da gibt es 
nirgendwo eine Koordinatenabfrage, nur die Auswertung von 
Rückgabewerten. Und ein Beispiel für eine Möglichkeit die Menüs zu 
wechseln, ist auch enthalten

In der Variablen F_Taste (Folien-Taste) wird der Rückgabewert 
zurückgegeben, der zu der Fläche auf dem Display passt. Mit dem 
dargestellen Zeichen selbst hat das überhaupt nichts zu tun. Kommt eine 
0 zurück, ist für diese Taste kein Rückgabewert eingetragen worden. Bei 
einem Menüwechsel muss man natürlich zuerst alle Rückgabewerte löschen 
und die neuen Rückgabewerte eintragen. In jedem Menü können die gleichen 
Rückgabewerte oder auch ganz andere Rückgabewerte verwendet werden - 
solange der Vorrat reicht.

Als Rückgabewerte empfehle ich die Ascii-Zeichen 0 bis 9, A bis Z
und a bis z zu verwenden. Sind eben einfach einzugeben.

Für die Auswertung des Rückgabewerts gibt es viele Möglichkeiten, ob 
„Select Case F_taste“, If F_taste = xyz then .., oder eine andere 
Abfragemöglichkeit, dass ist eben Geschmackssache.

Ich hoffe, es hilft weiter.
Gruß
Alex

von Ingo (Gast)


Lesenswert?

Hallo zusammen,

hat es einer hier schon geschafft das Touch-Feld genau auszulesen?
Meine versuche sehen leider nicht viel-versprechend aus. Eventuell hat 
ja einer eine Schaltplan und ein Beispielprogramm für C?

Ich Versuche das ganze auf einem ATMega8 anzusprechen.

Danke & Gruß

Ingo

von kolli (Gast)


Lesenswert?

Hallo

gibts denn eine Möglichkeit den gesamten Displayinhalt um 90° zu drehen?

Klar das dann alle Werte neu berechnet werden müssen aber würde es rein 
theoretisch gehen das Display für hochkant zu nutzen?

Danke

von Alex D. (allu)


Lesenswert?

Im Grafikmode - ja. Eine Möglichkeit, grob:

8x8 einstellen, Fonttabelle "um 90 Grad drehen". Die Adressberechnung 
muss dann angepasst werden, sodass die Chr-Bytes von links nach rechts 
ins Display geschrieben werden.

Gruß  allu

von kolli (Gast)


Lesenswert?

Hm, ich bin noch nicht so Fit in der Materie.

Im Grafikmodus? Ich möchte aber Text schreiben!
Fonttabelle drehen?

Kannst du mal bitte ein kleines Beispiel schreiben? Evtl versteh ich es 
dann besser.

Danke

von Alex D. (allu)


Lesenswert?

.             Normal:
-BBBB---  < 1.Pixelzeile
-B---B--
-B---B--
-BBBB---
-B---B--     bis
-B---B--
-BBBB---
--------  < 8.Pixelzeile
^      ^      Gedreht:
1. bis 8.
Pixelzeile

von kolli (Gast)


Lesenswert?

Jo also einfach den "Buchstaben" drehen, soweit klar.

mit $include bekomm ich dann die font8x8 rein

Ja aber wie ruf ich dann aus der font8x8 auf? Weil er greift ja auf die 
tabchr Daten zu.

Das steht im asm Teil und den versteh ich nicht, in dem asm Teil muss 
ich ja dann sicher auch die Cr Bytes ändern??

Ich nutze die "nur_text.bas" von dir!

Danke

von Kevin (Gast)


Lesenswert?

Hallo alle miteinander,

ich spiel auch gerade mit dem Display und Bascom rum. Text ausgabe 
funktioniert mit dem Code von Allu schon wunderbar. Aller Dings würde 
ich gern einzelne Pixel an oder aus schalten. Ich denke das wird am 
besten gehen wenn man Write_2_Byte ein bisschen umbaut, oder täusche ich 
mich da?

Hier mal der Code:
1
Write_2_byte:
2
      push Temp_1
3
4
      cbi  Control_Bus, CS                                  'Chip select aktivieren
5
      rjmp Write_2_Byte_20
6
7
Write_2_byte_10:
8
      cbi  Control_Bus, E                                   'Enable-Puls beenden
9
      nop                                                   'warten
10
      nop                                                   'warten
11
      nop
12
      nop                                                   'warten
13
14
Write_2_byte_20:
15
      sbi  Control_Bus, E                                   'Enable-Puls beginnt
16
      nop                                                   'warten
17
      nop                                                   'warten
18
      nop                                                   'warten
19
         'warten
20
      sbic Daten_Bus_in, Bussy                              'Fertisch ?
21
      rjmp Write_2_Byte_10
22
      nop
23
24
      cbi  Control_Bus, E                                   'Enable-Puls beenden
25
      cbi  Control_Bus, RW                                  'Write Signal aktivieren
26
      nop
27
28
  'Register im Grafikcontroller auswählen
29
      ldi  Temp_1,auf_Output_stellen                        'Datenbus auf Ausgabe stellen
30
      !out  Daten_ddr, Temp_1                               '..und umschalten
31
      nop
32
      !out  Daten_Bus_out, Befehl                           'Befehl-Register auswählen
33
      sbi  Control_Bus, E                                   'ins Befehl-Register schreiben
34
      nop                                                   'warten
35
      nop
36
      nop
37
      nop
38
      nop
39
      nop                                                   'warten
40
      cbi  Control_Bus, E                                   'Enable-Puls beenden
41
42
      nop
43
  'Mode-Temp_1 in Grafikcontroller schreiben
44
      cbi  Control_Bus,RS
45
      !out  Daten_Bus_out, Daten                            'Mode-Temp_1 aufv Bus legen
46
      sbi  Control_Bus, E                                   'ins Mode-Register schreiben
47
      nop                                                   'warten
48
      nop
49
      nop
50
      nop
51
      nop                                                   'warten
52
      nop                                                   '... und warten
53
      cbi  Control_Bus, E                                   'Enable-Puls beenden
54
      nop
55
56
  'Ruhepegel wieder herstellen
57
      sbi  Control_Bus, CS                                  'Chip select deaktivieren
58
      ldi  Temp_1,auf_Input_stellen                         'Datenbus auf Input stellen
59
      !Out Daten_ddr , Temp_1                               '..und umschalten
60
      sbi  Control_Bus, RW                                  'Read Signal deaktivieren
61
      sbi  Control_Bus, RS
62
63
Write_2_byte_99:
64
      pop  Temp_1
65
66
      ret

Währe sehr nett wenn mir jemand ein bisschen Hilfe geben könnte.

Liebe Grüsse

von Alex D. (allu)


Lesenswert?

kolli schrieb:
> Jo also einfach den "Buchstaben" drehen, soweit klar.

Von "einfach" habe ich nichts gesagt. Du schreibst doch selbst:

> Klar das dann alle Werte neu berechnet werden müssen ....

Das beschreibt den Arbeitsaufwand recht gut. Durch das Drehen des 
Displays verschiebten sich die Adressen für die Zeichenzeilen, die 
Initialisierung des GLCD-Controllers und die Fonttabelle muß angepasst 
werden. Oder willst Du die Drehung per Programm im ATMega jedesmal neu 
berechen?

Das Programm Nur_text.bas ist für 23 Zeichen je Zeile ausgelegt. 
Schreiben kann man damit bis zu 10 Zeichenzeilen. Mit Touchprogramm sind 
es 8 Zeichenzeilen, damit die Folientasten dazu passen.

> mit $include bekomm ich dann die font8x8 rein
> Ja aber wie ruf ich dann aus der font8x8 auf? Weil er greift ja auf die
> tabchr Daten zu.

Über die Tabelle-font8x8 "tabchr:" schreiben und das alte tabchr: 
auskommentieren.

Ein Beispielprogramm habe ich leider nicht.

Gruß  allu

von Alex D. (allu)


Lesenswert?

Kevin schrieb:
>  .... würde
> ich gern einzelne Pixel an oder aus schalten. Ich denke das wird am
> besten gehen wenn man Write_2_Byte ein bisschen umbaut, oder täusche ich
> mich da?

"Write_2_Byte" bedient das GLCD direkt. Soweit ich das Datenblatt des 
LC7981 verstanden habe wird immer zuerst das Instruction-Register 
(Befehl) ausgewählt und dann der entsprechende Datenwert (Daten) 
geschrieben. Die Routine schreibt also zuerst den Inhalt von "Befehl" 
und dann Inhalt von "Daten" in den GLCD-Controller.

Da gibt es also nichts zu ändern, vielmehr kannst Du die Routine für 
Deine Zwecke verwenden. Befehl und Datenwert eintragen und Write_2_Byte 
aufrufen. Von Bascom aus würde ich das so probieren,

im Bascomteil am Programmanfang:
Dim Command as Byte
Dim Datenwert as Byte

Im Assemblerprogramm direkt vor "Write_2_Byte:"
Zum_glcd:
      Loadadr Command, X
      LD  Befehl, X
      Loadadr Datenwert, X
      LD  Daten, X

Write_2_Byte:
      usw ....

Werte bestimmen und in "Command" und "Datenwert" eintragen und
mit "Gosub Zum_glcd" ausgeben.

Gruß allu

von kolli (Gast)


Lesenswert?

Ok, da ich das auf dieser Basis allein nich hin bekomme, stell ich die 
Frage einfach mal anders.

Ist es mit einem anderen Display z.B. mit KS0108 einfacher?
Oder ist der Aufwand bei "allen" gleich?

Danke

von Alex D. (allu)


Lesenswert?

Hallo Kolli,

zum KS0108 kann ich nichts sagen. Muss es den unbedingt gedreht sein? 
Wäre es auch eine Möglikeit 2 Bereiche nebeneinander anzuzeigen? Zum 
Beispiel 10 Zeichen 3 Abstand und dann wieder 10 Zeichen. Quasi 2 
Tabellen nebeneinander.
Oder 3 Tabellen: 7 Zeichen, 1 Abstand, 7 Zeichen, 1 Abstand, 7 Zeichen
Das könntest Du mit dem Programm machen, so wie es ist.

Gruß  allu

von kolli (Gast)


Lesenswert?

Nein es muss "hochkant" stehen, da das Gehäuse und alles rings um so 
vorgefertigt da steht.

Ich hab mir damals darüber keinerlei Gedanken gemacht als ich das 
vorbereitet habe, weil ich dachte das es mit einem Grafik LCD kein 
Problem wäre.
Ja und jetzt hab ich Zeit weiter an der Sache zu basteln und nun steh 
ich da.

Ich brauch auch keinen Touch etc. ich will einfach nur Zahlen und 
Buchstaben anzeigen und irgendwie auch größer als es jetzt in dem 
Beispielcode ist.

Tja da war ich wohl sehr "Blauäugig" mit meiner Planung.

Ich dacht eben das Ausgeben von Zahlen und Text ginge so easy wie mit 
nem 20x4 LCD, und denn gibts nen "Rotate" Befehl, tja eben weit vorbei 
gedacht.

Danke

von Sascha W. (sascha-w)


Lesenswert?

Hallo,

also beim KS0108 liegen die Datenbyte's 90° "gedreht" im Speicher - 
bezogen auf das Display also senkrecht.
Mit etwas Anpassung sollte es also möglich sein mit den Fonts und 
Displayroutinen ein LC7981 im hochformat zu betreiben.

Sascha

von Kevin (Gast)


Lesenswert?

Hallo,

danke schonmal für die Hilfe, aber irgendwie versteh ich bei dem 
Datenblatt nur kauderwelsch. Kann mir vielleicht jemand ein wenig hilfe 
geben?
Ich werde nicht schlau daraus welchen Befehl ich schreiben soll, wie ich 
die Position setze und wie ich den Pixel an/aus schalte.

Ist für mich alles noch neuland.

Danke

Grüsse Kevin

von Hannes L. (hannes)


Lesenswert?

Kevin schrieb:
> Hallo,
>
> danke schonmal für die Hilfe, aber irgendwie versteh ich bei dem
> Datenblatt nur kauderwelsch. Kann mir vielleicht jemand ein wenig hilfe
> geben?
> Ich werde nicht schlau daraus welchen Befehl ich schreiben soll, wie ich
> die Position setze und wie ich den Pixel an/aus schalte.

Befehle 0eh und 0fh...

>
> Ist für mich alles noch neuland.

Alle verfügbaren Befehle in Kurzform auflisten, um etwas mehr Übersicht 
zu erhalten und alle Befehle auf einen Blick zu sehen. Dann die Details 
der Befehle nachlesen. Notfalls auch mal etwas ausprobieren, wenn sich 
der Sinn beim Lesen nicht erschließt.
1
Zusammenfassung des Befehlssatzes des LCD-Treibers LC7981
2
des Pollin-GLCDs DG-16080-11 von Datavision:
3
4
00h: Einstellung der Betriebsart
5
01h: Zeilenhöhe und Zeichenbreite im Textmodus
6
02h: Anzahl Zeichen bzw. Bytes pro Zeile
7
03h: Teilerwert für Display-Multiplexing
8
04h: Cursorposition im Textmodus
9
10
08h: Startadresse für Anzeige Low (Scrolling)
11
09h: Startadresse für Anzeige High (Scrolling)
12
0ah: RAM-Zeiger Low
13
0bh: RAM-Zeiger High
14
0ch: RAM schreiben
15
0dh: RAM lesen
16
0eh: Pixel löschen
17
0fh: Pixel setzen

>
> Danke
>
> Grüsse Kevin

...

von Kevin (Gast)


Lesenswert?

Super :)

jetzt sehe ich das Datenblatt etwas anders. Bin auch schon fleissig am 
probieren. In der ersten Zeile kann ich Pixel an/aus schalten und eine 
Linie Zeichnen. Allerdings habe ich noch ein Problem, dass mich seit 
Stunden beschäftigt.
Ich bekomme es einfach nicht hin eine Zeile tiefer zu gehen und dort 
Pixel zu setzen. In der Ersten Zeile funktioniert es wunderbar. Ich geb 
beim RAM-Zeiger-low meine Spalte an.
Gebe ich einen anderen Wert as H00 im RAM-Zeiger-high an verschwindet 
der Pixel oder liegt irgendwo auf dem Display, aber nicht da wo er sein 
soll.
Kennt jemand die Berechnungsroutine für das lower und upper Byte, oder 
kann mir jemand helfen?
Mit dem Text funktioniert es, aber irgendwie bekomm ich es nicht 
gebacken die Zeile zu ändern. Am ende soll es dann so funktionieren, 
dass ich mit locate_x und locate_y meinen Pixel auswähle und setzen 
kann.

Vielen Dank

Hier mein Code (Bascom):
1
'TEST PIXEL
2
Gosub Lcd_clear
3
4
'1. Pixel
5
Command = &H0A                                              'Befehl: RAM-Zeiger Low
6
Datenwert = &H00                                            'Spalte 1 (a 8 Pixel 0-22)
7
Gosub Zum_glcd                                              'In Display-RAM schreiben
8
Command = &H0B                                              'Befehl: RAM-Zeiger High
9
Datenwert = &H00
10
Gosub Zum_glcd                                              'In Display-RAM schreiben
11
Command = &H0F                                              'Befehl: Pixel setzen
12
Datenwert = &H01                                            'Pixel 1 (1-8)
13
Gosub Zum_glcd                                              'In Display-RAM schreiben
14
15
'2. Pixel
16
Command = &H0A                                              'Befehl: RAM-Zeiger Low
17
Datenwert = &H01                                            'Spalte 2 (a 8 Pixel 0-22)
18
Gosub Zum_glcd                                              'In Display-RAM schreiben
19
Command = &H0B                                              'Befehl: RAM-Zeiger High
20
Datenwert = &H00
21
Gosub Zum_glcd                                              'In Display-RAM schreiben
22
Command = &H0F                                              'Befehl: Pixel setzen
23
Datenwert = &H01                                            'Pixel 1 (1-8)
24
Gosub Zum_glcd

und hier der Assembler-Code:
1
Zum_glcd:
2
      Loadadr Command , X
3
      LD  Befehl, X
4
      Loadadr Datenwert , X
5
      LD  Daten, X
6
7
Write_pixel:
8
      push Temp_1
9
10
      cbi  Control_Bus, CS                                  'Chip select aktivieren
11
      rjmp Write_pixel_20
12
13
Write_pixel_10:
14
      cbi  Control_Bus, E                                   'Enable-Puls beenden
15
      nop                                                   'warten
16
      nop                                                   'warten
17
      nop
18
      nop                                                   'warten
19
20
Write_pixel_20:
21
      sbi  Control_Bus, E                                   'Enable-Puls beginnt
22
      nop                                                   'warten
23
      nop                                                   'warten
24
      nop                                                   'warten
25
         'warten
26
      sbic Daten_Bus_in, Bussy                              'Fertisch ?
27
      rjmp Write_pixel_10
28
      nop
29
30
      cbi  Control_Bus, E                                   'Enable-Puls beenden
31
      cbi  Control_Bus, RW                                  'Write Signal aktivieren
32
      nop
33
34
  'Register im Grafikcontroller auswählen
35
      ldi  Temp_1,auf_Output_stellen                        'Datenbus auf Ausgabe stellen
36
      !out  Daten_ddr, Temp_1                               '..und umschalten
37
      nop
38
      !out  Daten_Bus_out, Befehl                           'Befehl-Register auswählen
39
      sbi  Control_Bus, E                                   'ins Befehl-Register schreiben
40
      nop                                                   'warten
41
      nop
42
      nop
43
      nop
44
      nop
45
      nop                                                   'warten
46
      cbi  Control_Bus, E                                   'Enable-Puls beenden
47
48
      nop
49
  'Mode-Temp_1 in Grafikcontroller schreiben
50
      cbi  Control_Bus,RS
51
      !out  Daten_Bus_out, Daten                            'Mode-Temp_1 aufv Bus legen
52
      sbi  Control_Bus, E                                   'ins Mode-Register schreiben
53
      nop                                                   'warten
54
      nop
55
      nop
56
      nop
57
      nop                                                   'warten
58
      nop                                                   '... und warten
59
      cbi  Control_Bus, E                                   'Enable-Puls beenden
60
      nop
61
62
  'Ruhepegel wieder herstellen
63
      sbi  Control_Bus, CS                                  'Chip select deaktivieren
64
      ldi  Temp_1,auf_Input_stellen                         'Datenbus auf Input stellen
65
      !Out Daten_ddr , Temp_1                               '..und umschalten
66
      sbi  Control_Bus, RW                                  'Read Signal deaktivieren
67
      sbi  Control_Bus, RS
68
69
Write_pixel_99:
70
      pop  Temp_1
71
72
      ret

von Hannes L. (hannes)


Lesenswert?

> Kennt jemand die Berechnungsroutine für das lower und upper Byte, oder
> kann mir jemand helfen?

Wie wäre es, sich Seite 15 des Datenblattes mal genauer anzusehen? Dabei 
den Druckfehler ignorieren, der sich da eingeschlichen hat, vertausche 
"Display Pattern" und "Character-Code" und die Tabelle ergibt Sinn.

Und dabei nicht vergessen, dass eine RAM-Zelle nicht einen Pixel 
enthält, sondern eine Gruppe aus 8 Pixeln. Dann sollte es Dir möglich 
sein, jede Pixelgruppe des Displays exakt zu adressieren. Die 
Adressierung des Pixels innerhalb der Gruppe ist ja Bestandteil des 
Befehls.

...

von Kevin (Gast)


Lesenswert?

Guten Morgen und Danke für den Tip.

Leider verstehe ich das nicht. Wie kann ich daraus schliessen in welche 
Zeile ich schreiben will? Da steht doch nur welche pixel ich bei der 
Curser-Position setze, oder nicht?
Ich steh total auf dem Schlauch.

Grüsse

von Hannes L. (hannes)


Lesenswert?

> Leider verstehe ich das nicht.

Überleg' mal...

Ein Byte sind 8 Pixel (oder Dots), diese liegen waagerecht 
nebeneinander.

Eine Pixelzeile hat 160 Pixel. Nun rate mal, wieviele Bytes man braucht, 
um eine Pixelzeile mit Pixeln zu füllen.

Und genau so viele Adressen weiter beginnt die nächste Pixelzeile.

Du bestimmst also die Adresse, indem Du erstmal die Nummer der Zeile mit 
der Anzahl der Bytes je Zeile multiplizierst und dann die waagerechte 
Position (in Achter-Blöcken betrachtet) dazu addierst. Nun hast Du die 
Adresse für das RAM, also für die Achtergruppe von Pixeln. Den 
eigentlichen Pixel in dieser Gruppe selektierst Du anschließend mit dem 
Parameter im Befehl 14 oder 15.

Um das zu verstehen, reicht eigentlich das Mathematikverständnis der 
Grundschule. Da ist keine höhere Mathematik dabei...

Wenn Du immernoch Probleme hast, dann nimm ein Blatt Millimeterpapier, 
zeichne die Displaygröße (160x80) sowie die Pixelgruppen (Bytes) ein und 
nummeriere sie durch (Adressen). Vielleicht fällt es Dir dann leichter, 
die (eigentlich recht einfachen) Zusammenhänge zu verstehen.

...

von Chriz X. (tc-maxx)


Angehängte Dateien:

Lesenswert?

Hallo,
ich experimentiere momentan auch mit dem Display von Pollin.
Der Textmodus klappt super, auch Rahmen werden um die Buttons 
gezeichnet.

Hast du es jetzt hinbekommen ein Pixel zu setzen wo du es möchtest?
Ich komme gerade nicht weiter :(

Ich habe mal den Code angehangen mit dem ich teste.

Gruß MaXX

von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

Hallo MaXX,

packe mal die LCD16080_2.txt und die LCD1600_1.bas in deinen Ordner und 
probiere mal damit. Testweise wird der 1., 2. und 8.-Pixel gesetzt.

Wofür ein neues Assemblerprogramm Write_pixel? Meiner Meinung nach liegt 
dort der Fehler.

Gruß  allu

von Chriz X. (tc-maxx)


Angehängte Dateien:

Lesenswert?

Hallo Alex, DANKE !! :)

Das Pixel setzen funktioniert bestens! Kann man den ASM-Code irgendwie 
einkürzen??

Ich wollte mir die Funktion Pset(x,y) und Line(x1,y1,x2,y2) basteln.
Ich habe etwas getestet und bin auf die Werte in der Excel-Tabelle 
gekommen.

Hier der Code dazu:
1
Dim V As Byte
2
Dim W As Byte
3
Dim X As Byte
4
5
Dim W_to As Byte
6
W_to = 255
7
8
For V = 0 To 7
9
If V = 7 Then W_to = 126
10
   For W = 0 To 255                                         'W_to (23 out) '1.Zeile==> 23*7 (0..22=23)=190px
11
   Waitms 1
12
      For X = 0 To 6
13
         Command = &H0A                                     ' Befehl: RAM-Zeiger Low
14
         Datenwert = W                                      ' Zeichen 0..22
15
         Gosub Zum_glcd                                     ' In Display-RAM schreiben
16
17
         Command = &H0B                                     ' Befehl: RAM-Zeiger High
18
         Datenwert = V                                      ' Segment 0..7 + w_to = 126 !
19
         Gosub Zum_glcd                                     ' In Display-RAM schreiben
20
21
         Command = &H0F                                     ' Befehl: Pixel setzen
22
         Datenwert = X                                      ' Pixel 0-6 ! (7)
23
         Gosub Zum_glcd
24
      Next X
25
   Next W
26
Next V

Dieser Code füllt das LCD komplett mit Pixel.

Jetzt frag ich mich wie ich aus der Tabelle eine Formel hinbiege in der 
ich auf die x und y Koordinaten schließen kann?! *überleg..*

Gruß
MaXX

von Alex D. (allu)


Lesenswert?

Hallo Chrix,

freud mich, dass dein "Pixeln" klappt. Die NOPs in der GLcd-Ansteuerung 
sind für einen Prozessortakt bis etwa 20Mhz ausgelegt. Die 
Geschwindigkeit jedoch bestimmt im wesentlichen das GLcd.

Zu deiner Frage:
> Kann man den ASM-Code irgendwie einkürzen??

Antwort: Sehr wahrscheinlich. Aber, Gegenfrage:  Wozu ?

Gruß Alex

von Chriz X. (tc-maxx)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe jetzt die Formeln zusammengebastelt, die man benötigt um 
einzelne Pixel mit Koordinaten (x,y) zu setzen. …allerdings nur in 
Excel!

(Falls jemand Interesse daran hat bzw. damit weiter kommt => siehe 
Anhang)

Man kann nicht alles in eine Formel packen. k.A. wie es 
geschwindigkeitstechnisch aussieht. Höchstwahrscheinlich wäre es besser 
die Formeln in ASM umzusetzen?!

Hat jemand Ideen?

Gruß
MaXX

von Thomas H. (microtom)


Lesenswert?

Ich muss das jetzt (offtópic) einfach mal los werden, Ihr seid echt 
spitze. Es macht richtig Freude, zusammen auf einem Forum Ideen 
auszuarbeiten. Sorry, dass ich länger nicht aktiv war in dieses Thread, 
aber mir fliegen die Termine um die Ohren :-)

Viele Grüße
Thomas

von Chriz X. (tc-maxx)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe die Bestimmung der Koordinaten fertig, vorerst in VBA.

Nur zur Pixelbestimmung, ist dieser Code doch schon sehr umfangreich!
Sieht jemand eine Möglichkeit hier etwas zu optimieren?
bzw. eine ganz andere Herangehensweise?

Gruß
MaXX

(EXCEL mit VBA-Programm zum testen im Anhang)
1
'===================================================================================================
2
'---[P_Set - Funktion für Pollin 16080 ]------------------------------------------------------------
3
'===================================================================================================
4
Sub P_set(ByVal X1 As Byte, ByVal Y1 As Byte)
5
    
6
    Select Case Y1
7
    '---[Sonder 1]---------------------------------------------------------------
8
        Case 11: 'W = =KÜRZEN(R47/7)+((T47-43)*24)+240 'X=R47+(((T47-43)*24 + 240)*7)-(R48*7)-0
9
                If X1 < 112 Then
10
                   S1 = 240
11
                   S2 = 0
12
                   S3 = 240
13
                   V = 0
14
                Else 'W=KÜRZEN(R52/7)+((T52-43)*24)-16 'X=R52+(((T52-43)*24 + 000)*7)-(R53*7)-112
15
                   S1 = 0
16
                   S2 = 112
17
                   S3 = -16
18
                   V = 1
19
                End If
20
                GoSub SonderFall
21
        '---[Sonder 2]---------------------------------------------------------------
22
        Case 22:   'W =KÜRZEN(R25/7)+((T25-S1)*24)+S3 'X=R25+(((T25-S1)*24+S1)*7)-(R26*7)-S2
23
                If X1 < 56 Then
24
                   S1 = 248 '
25
                   S2 = 0 '
26
                   S3 = 248 '
27
                   V = 1
28
                Else 'W =KÜRZEN(R30/7)+((T30-S1)*24)-S3 'X=R30+(((T30-S1)*24+S1)*7)-(R31*7)-S2
29
                   S1 = 0 '
30
                   S2 = 56 '
31
                   S3 = -8 '
32
                   V = 2
33
                End If
34
                GoSub SonderFall
35
        '---[Sonder 3]---------------------------------------------------------------
36
        Case 43: 'W = =KÜRZEN(R47/7)+((T47-43)*24)+240 'X=R47+(((T47-43)*24 + 240)*7)-(R48*7)-0
37
                If X1 < 112 Then
38
                   S1 = 240
39
                   S2 = 0
40
                   S3 = 240
41
                   V = 3
42
                Else 'W=KÜRZEN(R52/7)+((T52-43)*24)-16 'X=R52+(((T52-43)*24 + 000)*7)-(R53*7)-112
43
                   S1 = 0
44
                   S2 = 112
45
                   S3 = -16
46
                   V = 4
47
                End If
48
                GoSub SonderFall
49
        '---[Sonder 4]---------------------------------------------------------------
50
        Case 54:
51
                If X1 < 56 Then
52
                   S1 = 248
53
                   S2 = 0
54
                   S3 = 248
55
                   V = 4
56
                Else
57
                   S1 = 0
58
                   S2 = 56
59
                   S3 = -8
60
                   V = 5
61
                End If
62
                GoSub SonderFall
63
        '---[Sonder 5]---------------------------------------------------------------
64
        Case 75: 'W = =KÜRZEN(R47/7)+((T47-43)*24)+240 'X=R47+(((T47-43)*24 + 240)*7)-(R48*7)-0
65
                If X1 < 112 Then
66
                   S1 = 240
67
                   S2 = 0
68
                   S3 = 240
69
                   V = 6
70
                Else 'W=KÜRZEN(R52/7)+((T52-43)*24)-16 'X=R52+(((T52-43)*24 + 000)*7)-(R53*7)-112
71
                   S1 = 0
72
                   S2 = 112
73
                   S3 = -16
74
                   V = 7
75
                End If
76
                GoSub SonderFall
77
    End Select
78
79
'----[01...10]---------------------------------------------------------------------
80
    If Y1 >= 1 Then
81
        If Y1 <= 10 Then
82
            S1 = 1
83
            S2 = 0
84
            S3 = 0
85
            GoSub NormalFall
86
        End If
87
    End If
88
    
89
'----[12...21]---------------------------------------------------------------------
90
    If Y1 >= 12 Then
91
        If Y1 <= 21 Then
92
            S1 = 12
93
            S2 = 8
94
            S3 = 0
95
            GoSub NormalFall
96
        End If
97
    End If
98
    
99
'----[23...32]---------------------------------------------------------------------
100
    If Y1 >= 23 Then
101
        If Y1 <= 32 Then
102
            S1 = 23
103
            S2 = 16
104
            S3 = 1
105
            GoSub NormalFall
106
        End If
107
    End If
108
'----[33...42]---------------------------------------------------------------------
109
    If Y1 >= 33 Then
110
        If Y1 <= 42 Then
111
            S1 = 33
112
            S2 = 0
113
            S3 = 1
114
            GoSub NormalFall
115
        End If
116
    End If
117
'----[44...53]---------------------------------------------------------------------
118
    If Y1 >= 44 Then
119
        If Y1 <= 53 Then
120
            S1 = 44
121
            S2 = 8
122
            S3 = 1
123
            GoSub NormalFall
124
        End If
125
    End If
126
'----[55...64]---------------------------------------------------------------------
127
    If Y1 >= 55 Then
128
        If Y1 <= 64 Then
129
            S1 = 55
130
            S2 = 16
131
            S3 = 3
132
            GoSub NormalFall
133
        End If
134
    End If
135
'----[66...74]---------------------------------------------------------------------
136
    If Y1 >= 66 Then
137
        If Y1 <= 74 Then
138
            S1 = 66
139
            S2 = 0
140
            S3 = 3
141
            GoSub NormalFall
142
        End If
143
    End If
144
'----[76...80]---------------------------------------------------------------------
145
    If Y1 >= 76 Then
146
        If Y1 <= 80 Then
147
            S1 = 76
148
            S2 = 8
149
            S3 = 3
150
            GoSub NormalFall
151
        End If
152
    End If
153
Exit Sub
154
'--[Normalfälle]-----------------------------------------------------------
155
NormalFall:
156
    '---[W]----------------------------------------------------------------
157
    Tmp1 = X1 / 7
158
    Tmp2 = Y1 - S1
159
    Tmp2 = Tmp2 * 24
160
    Tmp2 = Tmp2 + S2
161
    w = WorksheetFunction.RoundDown(Tmp1 + Tmp2, 0)          'w = Tmp1 + Tmp2
162
    '---[X]----------------------------------------------------------------
163
    Tmp1 = Y1 - S1
164
    Tmp1 = Tmp1 * 24
165
    Tmp1 = Tmp1 + S2
166
    Tmp1 = Tmp1 * 7
167
    Tmp2 = w * 7
168
    x = Tmp1 - Tmp2
169
    x = x + X1
170
    '---[V]----------------------------------------------------------------
171
    Tmp1 = Y1 + S3
172
    Tmp1 = Tmp1 * 160
173
    Tmp1 = Tmp1 / 7
174
    V = WorksheetFunction.RoundDown(Tmp1 / 256, 0)
175
Exit Sub
176
'--[Sonderfälle]-----------------------------------------------------------
177
SonderFall:
178
    '---[W]----------------------------------------------------------------
179
    Tmp1 = X1 / 7
180
    w = WorksheetFunction.RoundDown(Tmp1, 0)
181
    w = w + S3
182
    '---[X]----------------------------------------------------------------
183
    Tmp1 = w * 7
184
    Tmp2 = S1 * 7
185
    Tmp2 = X1 + Tmp2
186
    x = Tmp2 - Tmp1
187
    x = x - S2
188
Return
189
End Sub

von John S. (linux_80)


Lesenswert?

@tc-maxx
Was hast Du eingentlich genau vor mit diesen Berechnungen ?
Was bedeuten die ganzen Variablen ?
Gehts darum, irgend ein Pixel im Grafikmodus zu setzen/löschen ?
Dann schauts mir etwas zu kompliziert aus. ;)

von Chriz X. (tc-maxx)


Lesenswert?

Hi,
ja mit dieser Funktion sollen mal Pixel gesetzt werden.
Die Variabeln sind die Anpassungen für die beiden Subs Normalfall & 
Sonderfall.

k.A. wie man sonst an so etwas herangeht, ich habe noch keine 
Erfahrungen in diesem Bereich.

Ich benötige aber die Pixel-Setz-Funktion dringend für mein aktuelles 
Projekt mit diesem Display.

Gruß
MaXX

von John S. (linux_80)


Lesenswert?

@tc-maxx
also wenn man eine Pixelposition berechenen will, braucht man ja das 
entspr. Byte davon, in dem das Pixel liegt.

Wenn man davon ausgeht, das oben Links 0,0 liegt, sind bei diesem LCD in 
X-Richtung die Pixel innerhalb eines Bytes.
Also nur die X-Achse durch 8 Teilen, und man hat das Byte, dann noch die 
Anzahl Zeilen dazu.

BytePos = Y * 28 + X / 8

Die Pixelposition innerhalb des Bytes bekommt man, wenn man den Rest von 
X / 8 ausrechnet. Und noch umrechnet auf die andere aufsteigende 
Richtung da das 7. Bit ganz links ist.

von Chriz X. (tc-maxx)


Angehängte Dateien:

Lesenswert?

Hi,
schau dir mal meine Exceltabelle an, wenn es so einfach wäre hätte ich 
nicht so eine große Funktion schrieben müssen.

MaXX

(im Anhang die *.bas mit funktionierender P_Set-Funktion)

von John S. (linux_80)


Lesenswert?

@tc-maxx
da versteh ich aber trotzdem nicht so ganz was Du da so rumrechnest.

Willst Du gleich die XY-Werte vom Touch der Pixelsetz-Sub übergeben ?

Ich dachte es geht einfach darum, im Bereich von den 160x80 irgendwo ein 
Pixel zu treffen !

Klär mal auf.


Um ein Pixel zu setzen/löschen, muss man ja erst mal die Cursorposition 
(=RAM-Adresse) setzen, dann entsprechend setzen/löschen mit Befehl 12/13 
(&He, &Hf) die Pixelposition übergeben, das wars dann schon.

Wenn man das Pixel x 70,y 30 treffen will ergibt das RAM-Position:848, 
Bit 6.

Es muss nur noch abgestimmt werden, ob oben Links 0,0 oder 1,1 ist. Bei 
1,1 muss man vor dem Berechnen 1 abziehen :)

von Sascha W. (sascha-w)


Lesenswert?

kann es sein das du dein Display falsch initialisiert hast?
Betreibst du es wirklich im Grafikmodus??

Ich benutze das Display ebenfalls, und Berechnung ist so wie 'Tiny 80' 
schrieb!

Sascha

von allu (Gast)


Lesenswert?

Hallo  Chriz,

wenn die Initialisierung noch so ist, wie ich sie eingetragen hatte, 
dann läuft das Display im Grafikmodus. Aufgeteilt in 23 Zeichen pro 
Zeile mit 7 verwendeten Bit pro Byte. Genauer, es sind 22 Zeichen mit 7 
Bit-Breite und und das letzte mit 6 Bit-Breite (7*22 + 6 = 160 Pixel) je 
Zeile.

Der Controller rechnet aber nur mit geraden Adressen, also ist der 
Anfang der nächsten Pixel-Zeile 24 Byte weiter zu finden.

Die beiden Zahlen für das Display  sind damit 7 und 24.

Tiny 80 schrieb:
> BytePos = Y * 28 + X / 8

Das sehe ich genauso, wäre also mit unserer Initialisierung:
BytePos = Y * 24 + ABS(X / 7)
Der Rest von X/7 ist dann die Bitposition.

Beispiel:  links oben ist 0/0,  x = 8 , Y = 0, (das 9.te Pixel 
anknipsen)
BytePos = Y * 24 + ABS(X / 7 ) = 0 * 24 + ABS(8/7) = 1 / 8/7 = 1 Rest 1
Also Byteadresse  = 1,    Pixelposition = 1

Beispiel:   x = 9 , Y = 2
BytePos = Y * 24 + ABS(X / 7)  = 2 * 24 + ABS(9/7) = 49 / 9/7 = 1 Rest 2
Also Byteadresse  = 49,    Pixelposition = 2

Die 16-Bit-Byteadresse in Low und High aufteilen und die Pixelposition 
ungeändert zum_Glcd schicken (ich hoffe, ich habe nichts falsches 
erzählt).

Gruß  Alex

von allu (Gast)


Lesenswert?

Ups .. Fehler .. nicht ABS  sondern INT war gemeint  Gruß  Alex

von John S. (linux_80)


Angehängte Dateien:

Lesenswert?

Moin,
Jetzt hab ich versucht die Bascom-Lib weiter zu bauen, aber es hängt 
irgendwo :)
Komisch ist aber, wenn statt dem LCD an PortB der ISP hängt, läuft 
zumindest mal das Programm durch :-/

Heut seh ich nix mehr ;)
Deshalb hab ich die Lib und ein Beispiel für Text und eins für Grafik 
angehängt.

Das Problem in der Grafikversion ist, dass bei der ersten For-Schleife 
(Y=20), nur bis 31 gezählt wird, egal wo man anfängt zu zählen, die 
Linie wird auch gezeichnnet, kann man schön erkennen, wenn man ein Wait 
einbaut.

Bei der 2. For-Schleife kommen die Pixel irgendwo am LCD an, aber nur 
die ersten 6, aber die Anzahl stimmt :)

PS:
Das Programm bleibt an diesen Stellen komplett hängen.

von Sascha W. (sascha-w)


Lesenswert?

allu schrieb:
> Hallo  Chriz,
>
> wenn die Initialisierung noch so ist, wie ich sie eingetragen hatte,
> dann läuft das Display im Grafikmodus. Aufgeteilt in 23 Zeichen pro
> Zeile mit 7 verwendeten Bit pro Byte. Genauer, es sind 22 Zeichen mit 7
> Bit-Breite und und das letzte mit 6 Bit-Breite (7*22 + 6 = 160 Pixel) je
> Zeile.

was soll denn der Mist - im Grafikmodus nicht die volle Bytebreite zu 
verwenden. Und im Grafikmodus gibts auch keine Zeichen pro Zeile.

nutze als:
'Character pitch'       7 => 8 Pixel
'number of Characters' 19 => 20 Byte pro Zeile

dann ergibt sich die Pixelnummer mit einer einfachen UND-Verküpfung mit 
7 aus der X-Koordinate. Die Cursoadresse zu X/8 + Y*20

Sascha

von Chriz X. (tc-maxx)


Lesenswert?

Hallo,
danke für eure Ausführungen, so wie es aussieht habe ich die Kirche 
komplett ums Dorf getragen.. ;)


So sieht’s momentan bei mir aus:
1
 
2
'(initialisierung wie allu)
3
'==============================================================================
4
'---[P_Set - Funktion für Pollin 16080 ]----------------------------------------
5
'===============================================================================
6
Sub P_set(byval X1 As Byte , Byval Y1 As Byte , Byval P_set_del As Byte)
7
8
   If P_set_del = 1 Then P_set_del = &HFH Else P_set_del = &HEH       ' Befehl: Pixel setzen/löschen
9
10
   Dim Tmp As Integer
11
   Dim Ganz As Integer
12
   Dim Addr As Integer
13
   Dim Rest As Integer                                      'Addr_High
14
   Dim Addr_lo As Integer
15
16
   Addr = Y1 * 24
17
   Ganz = X1 / 7
18
   Addr = Addr + Ganz                                       'Addr = Y1 * 24 + INT( X1 / 7 )
19
   Rest = X1 Mod 7                                          'Rest = X1 Mod 7 =
20
   Addr_lo = Low(addr)
21
22
   Command = &H0A                                           ' Befehl: RAM-Zeiger Low
23
   Datenwert = Addr_lo
24
   Gosub Zum_glcd                                           ' In Display-RAM schreiben
25
26
   Tmp = Y1 * 160
27
   Tmp = Tmp / 7
28
   Tmp = Tmp / 256
29
   Command = &H0B                                           ' Befehl: RAM-Zeiger High
30
   Datenwert = Tmp                                          ' Segment 0..7 ??
31
   Gosub Zum_glcd                                           ' In Display-RAM schreiben
32
33
   Command = P_set_del                                      ' Befehl: Pixel setzen
34
   Datenwert = Rest                                         ' Pixel 0-6
35
   Gosub Zum_glcd                                           ' In Display-RAM schreiben
36
End Sub

Der Datenwert für High kann 0, 1, 2, 3, 4, 5, 6, 7 sein.
Meine Rechnung dafür: Tmp =  Y * 160/7/256

So kommt es aber bei den Sonderfällen in den Zeilen 11, 22 , 43, 54 und 
75 zu Fehldarstellungen.

Wie kann ich das anders berechnen?

@Tiny 80: schön, dass du an der Lib weiterarbeitest ;)
MaXX

von Sascha W. (sascha-w)


Lesenswert?

@ Chriz X.

wenn du das Display wie oben beschieben für den Grafikmodus 
initialisieren würdest, währe es so einfach ...

   Addr = Y1 * 20 + X1 / 8

   Command = &H0A
   Datenwert = low(Addr)
   Gosub Zum_glcd

   Command = &H0B
   Datenwert = high(Addr)
   Gosub Zum_glcd

   Command = P_set_del
   Datenwert = X1 Mod 7
   Gosub Zum_glcd

Sascha

von allu (Gast)


Lesenswert?

Chriz X. schrieb:
> Addr_lo = Low(addr)

dann müßte auch funktionieren:
Addr_hi = High(addr)

Gruß   allu

von Chriz X. (tc-maxx)


Lesenswert?

Wenn ich es mit "Character pitch=8 Pixel" und "number of Characters = 20 
Byte pro Zeile" initialisiere, dann funktioniert der Rest von allu's 
Programm nicht mehr richtig oder?

@allu
ist folgender Abschitt alles was zum initialisieren des LCD gebraucht 
wird?
Wie müßte dies angepasst werden?
1
'----------------------------------------------------------------------------
2
Lcd_initialisieren:
3
'----------------------------------------------------------------------------
4
      ldi  ZL, low(Init_gc_mode *2)
5
      ldi  ZH, high(Init_gc_mode *2)
6
7
      lpm  Temp_1, Z+                                       ' Schleifenzähler
8
      lpm  Temp_1, Z+                                       ' Schleifenzähler
9
'----------------------------------------------------------------------------
10
Lcd_initialisieren_10:
11
'----------------------------------------------------------------------------
12
      lpm  Befehl,Z+
13
      lpm  Daten,Z+
14
      rcall Write_2_Byte
15
16
      dec  Temp_1
17
      brne LCD_Initialisieren_10
18
19
'----------------------------------------------------------------------------
20
Lcd_initialisieren_99:
21
'----------------------------------------------------------------------------
22
      ret

von Sascha W. (sascha-w)


Lesenswert?

ich sehe zwar nicht was dort zum Display gesendet wird weil das in 
"Init_gc_mode" steht, und Temp_1 nicht initialsiert wird, aber das wirds 
schon sein.

>Wenn ich es mit "Character pitch=8 Pixel" und "number of Characters = 20
>Byte pro Zeile" initialisiere, dann funktioniert der Rest von allu's
>Programm nicht mehr richtig oder?
Ich weis ja nicht welche Grafikfunktionen du aus allu's lib noch 
verwendest, denn seine Initialisierung deutet ja eher auf den Textmodus 
hin.

Sascha

von John S. (linux_80)


Lesenswert?

Hat eigentlich schon jemand einen Bascom-Zeichensatz erstellt, den man 
mit include einbindet, der für dieses LCD zu brauchen ist ?
Also alles um 90° gedreht.

von allu (Gast)


Lesenswert?

@Chrix, hast Du es mit der High-Adresse auch mal so probiert?

Chriz X. schrieb:
> Addr = Y1 * 24
>    Ganz = X1 / 7
>    Addr = Addr + Ganz                'Addr = Y1 * 24 + INT( X1 / 7 )
>    Rest = X1 Mod 7                   'Rest = X1 Mod 7 =
>    Addr_lo = Low(addr)
>
>    Command = &H0A                    ' Befehl: RAM-Zeiger Low
>    Datenwert = Addr_lo
>    Gosub Zum_glcd                    ' In Display-RAM schreiben

   ' Zeilen mit   Tmp   löschen

>    Command = &H0B                    ' Befehl: RAM-Zeiger High

     Datenwert = high(addr)

>    Gosub Zum_glcd                    ' In Display-RAM schreiben



Chriz X. schrieb:
> @allu
> ist folgender Abschitt alles was zum initialisieren des LCD gebraucht
> wird?
> Wie müßte dies angepasst werden?

Nichts, nur die Tabelle die die Initialisierungsdaten enthält.

Chriz X. schrieb:
> '---------------------------------------------------------------------
> Lcd_initialisieren:
> '---------------------------------------------------------------------
>       ldi  ZL, low(Init_gc_mode *2)
>       ldi  ZH, high(Init_gc_mode *2)

Die Initialisierungsdaten stehen in der Tabelle "Init_gc_mode". Da 
brauchst Du nur eintragen, wieviel und welche Befehle zum GLcd geschickt 
werden sollen.

Gruß  allu

von Chriz X. (tc-maxx)


Lesenswert?

allu schrieb:
> @Chrix, hast Du es mit der High-Adresse auch mal so probiert?

Super, so funktioniert's!
Danke!
1
'===============================================================================
2
'---[P_Set - Funktion für Pollin 16080 ]----------------------------------------
3
'===============================================================================
4
Sub P_set(byval X1 As Byte , Byval Y1 As Byte , Byval P_set_del As Byte)
5
6
   If P_set_del = 1 Then P_set_del = &HFH Else P_set_del = &HEH       ' Befehl: Pixel setzen/löschen
7
8
   Dim Ganz As Integer
9
   Dim Addr As Integer
10
11
   Addr = Y1 * 24
12
   Ganz = X1 / 7
13
   Addr = Addr + Ganz                                    
14
15
   Command = &H0A                                     
16
   Datenwert = Low(addr)                               
17
   Gosub Zum_glcd                                         
18
19
   Command = &H0B                                      
20
   Datenwert = High(addr)                               
21
   Gosub Zum_glcd                                         
22
23
   Command = P_set_del                                 
24
   Datenwert = X1 Mod 7                                
25
   Gosub Zum_glcd                                         
26
End Sub

Jetzt noch eine Line-Funktion, habt ihr da auch gleich noch was 
Passendes?
Nicht, dass ich wieder die komplette Kirche ansacke ;)

Gruß MaXX

von John S. (linux_80)


Angehängte Dateien:

Lesenswert?

Hallo,

also im Prinzip hätte alles soweit gepasst mit meiner Lib von gestern 
Nacht, 1. Fehler war, das ich die Zeilenanzahl mit 19 statt mit 20 
berechnet habe.
Warum sich das Programm gehängt hatte, war einfach nur wegen der 
Verkabelung, bzw, hab ich mit den Pullups rumprobiert, und schon gings 
:-D
Das Handy war glaub ich auch ein wenig schuld, das hier gleich daneben 
lag :-/

Angehängt die letzte Lib, und mein BastelTestProgramm.

Um den Touch hab ich mich noch nicht recht gekümmert, deshalb passen die 
Pixel nicht so ganz zusammen.

von Chriz X. (tc-maxx)


Lesenswert?

Tiny 80 schrieb:
> Angehängt die letzte Lib, und mein BastelTestProgramm.

Super Arbeit ! DANKE !

Gruß MaXX

von Chriz X. (tc-maxx)


Angehängte Dateien:

Lesenswert?

Tiny 80 schrieb:
> Hat eigentlich schon jemand einen Bascom-Zeichensatz erstellt, den man
> mit include einbindet, der für dieses LCD zu brauchen ist ?
> Also alles um 90° gedreht.

Ich habe mal einen 8x8-Zeichensatz konvertiert. (90°)
Leider ziegt mir es nur in der 1. Zeile etwas an.

MaXX

von John S. (linux_80)


Lesenswert?

Da wird diese Zeichen-Schreib-Funktion auch eine kleine Optimierung 
benötigen, um mit dem Byte-Layout zurecht zu kommen.
Muss ich mal angucken wie das Original das macht ;)

von John S. (linux_80)


Angehängte Dateien:

Lesenswert?

So, dann schaumamal :)

Mit dem Font von oben, und dieser Lib, und meinem BastelProg, kommt das 
im Bild raus ;)

Bei Lcdat kommt erst die Zeile, dann die Spalte (siehe Bascomhilfe) !
Anders als bei zB. KS0108 geht die Zeile von 1-80 (Pixel), die Spalte 
von 1-20 (Zeichen).

Ich hab aber nicht alle eventualitäten ausprobiert, auch weiss ich nicht 
was passiert, wenn man einen anderen Font als 8x8 verwendet !

mfG

von Chriz X. (tc-maxx)


Lesenswert?

Hi Tiny_80,
danke für deine Arbeit!
Jetzt steht meinem Projekt nichts mehr im Weg :)

Ich konvertiere dann noch ein paar Fonts (90°)

Gruß
MaXX

von John S. (linux_80)


Lesenswert?

Hallo,

ich weiss, das showpic noch auf der OP-Liste steht,
aber die nächste Zeit wird das nix.

Fasching ist ja auch vorbei, und ich muss wieder was Ernsthaftes machen 
;-)

von Chriz X. (tc-maxx)


Angehängte Dateien:

Lesenswert?

Hallo,
ich habe die Kalibrierung des Touchscreens lt. Application Note: AVR341 
in Bascom umgesetzt. (falls jemand Interesse daran hat..)

Das Entprellen des Touchscreens funktioniert noch nicht optimal
und es wird noch nicht erkannt wenn eine fehlerhafte Kalibrierung 
durchgeführt wurde. (Ideen?)

Vielleicht kann man den Code ja noch optimieren ???

Gruß
MaXX

von John S. (linux_80)


Lesenswert?

mein Username ist Linux_80 nicht _90 !
;)

von Matze G. (maroni666)


Lesenswert?

Hallo zusammen,

erst mal vielen Dank für eure zur Verfügung gestellten Sourcen, die 
haben mir schon sehr sehr viel geholfen. Gerade da ich noch am Anfang 
meine Mikrocontroller Laufbahn bin.

Könnt Ihr mir vielleicht einen Tipp geben, wie ich es hinbekommen kann 
das ich mit Hilfe von selbst definierten Buttons auch Befehle an den 
Controller weitergeben kann. So das sich dadurch meinet wegen eine LED 
an einem freien Port An/Aus schalten lässt. So etwas, was in diese 
Richtung geht habe ich in den ganzen Pollin DG 16080 Beiträgen hier im 
Forum noch nicht gefunden (zumindest meine ich es nicht gesehen zu 
haben).

z.Z. benutzte Version:
Autor:  Chriz X. (tc-maxx)
Datum: 07.02.2010 15:39

Gruß
Matze

von Chriz X. (tc-maxx)


Angehängte Dateien:

Lesenswert?

Tiny 80 schrieb:
> mein Username ist Linux_80 nicht _90 ! ;)

Sorry :)


Ich habe etwas weitergebastelt, Touchwerte werden jetzt in den Eprom 
gespeichert und es wird eine Prüfung gemacht ob richtig Kalibriert 
wurde.

An der Entprellung habe ich noch gearbeitet aber irgendwie gelingt es 
mir nicht den ADC-Wert zu nehmen wenn man das Touch los lässt. :(

Gruß MaXX

von Sascha W. (sascha-w)


Lesenswert?

Chriz X. schrieb:

> An der Entprellung habe ich noch gearbeitet aber irgendwie gelingt es
> mir nicht den ADC-Wert zu nehmen wenn man das Touch los lässt. :(

also zum Entprellen:
nach dem Erkennen des Touch's messe ich X und Y Wert und prüfe danach 
noch mal ob der Touch noch gedrückt ist, das ganze mache ich 4x und 
berechne aus den Messwerten den Durchschnitt. Ist der Touch nach einer 
Messung nicht mehr gedrückt so werden die Messwerte verworfen.

PS: was soll das doppelte Auslesen des ADC ??? Den Dummy-Read braucht's 
nur nach einem Wechsel der Referenzspannungsquelle bzw. evl. nach dem 
Einschalten des ADC.

Sascha

von Andy (Gast)


Angehängte Dateien:

Lesenswert?

Hallo!

Da ich noch nicht sehr bewandelt in der Controllerwelt bin, habe ich 
eine Frage zu der Sache mit dem Display.
Ich habe den Display wie folgt angeschlossen:
(DisplayPin - Name - Pin µC)

1 - GND - GND
2 - +5V - +5V (und an Poti)
3 - Vo  - Schleifer Poti
4 - RS  - PC5
5 - R/W - PC4
6 - E   - PC3
7 - DB0 - PD7
8 - DB1 - PD
usw, bis:
14 - DB7 - PD0
15 - CS  - PC1
16 - Res - PC0
17 - Ree - Poti

Als code habe ich den code von Tiny 80 wie im Anhang abgewandelt.

JTAG ist ausgeschaltet.
Allerdings wird nicht eine schrift dargestellt, sondern es läuft nur ein 
kleiner Balken über das Display von unten nach oben.

Wäre jemand so nett und kann mir etwas helfen?

Viele Grüße
Andy

von John S. (linux_80)


Lesenswert?

Andy schrieb:

> 1 - GND - GND
> 2 - +5V - +5V (und an Poti)
> 3 - Vo  - Schleifer Poti
> 4 - RS  - PC5
> 5 - R/W - PC4
> 6 - E   - PC3
> 7 - DB0 - PD7
> 8 - DB1 - PD
> usw, bis:
> 14 - DB7 - PD0
> 15 - CS  - PC1
> 16 - Res - PC0
> 17 - Ree - Poti


ich würde sagen, Du hast die Reihenfolge der Datenpins verdreht,
DB0 muss an PD0 usw.

Denn wenn dieser Balken durchläuft ist das LCD nicht initialisiert.

von Andy (Gast)


Lesenswert?

Hallo Tiny 80,

hab das direkt nach meiner Frage auch gemerkt und gedreht, die Situation 
bleibt aber unverändert.

Andy

von John S. (linux_80)


Lesenswert?

Probier mal das $include font...
wieder ans Ende des Progs zu setzen, denn das sind nur Daten und kein 
Programm.

Ausserdem steht Mode = 6 was Textmodus bedeuted,
bei graphischer Ausgabe sollte es Mode = 8 heissen.

von Andy (Gast)


Lesenswert?

Habe ich gemacht, aber mehr oder minder ohne Erfolg.

Nach dem ersten mal programmieren waren nur quadrate mit verschiedenem 
kontrast zu sehen und nach dem zweiten mal erschien wieder der wandernde 
balken.

von John S. (linux_80)


Lesenswert?

Ausserdem sind die Print-Befehle noch drinnen, wenn man den ganzen PortD 
verwenden will, müssen die alle raus, sonst ist PD0 und PD1 blockiert.

von Andy (Gast)


Lesenswert?

Habe ich auskommentiert, aber immernoch gleiches ergebnis

von Alex D. (allu)


Lesenswert?

Zum UART und PD0. PD1:
Falls die Baudrate für die serielle Schnittstelle initialisiert wurde, 
sind PD0 und PD1 nicht mehr verfügbar. Also, falls Du es noch nicht 
getan hast, auch die Zeile "$baud = xxxx" auskommentieren.

Gruß   allu

von Andy (Gast)


Lesenswert?

$baud..... habe ich auch schon auskommentiert

von Andy (Gast)


Lesenswert?

Hallo Liebe Forumuser,

wie so oft lag das Problem da, wo man es am wenigsten erwartet. Ein 
Flachbandkabel hatte keinen richtigen Kontakt zum Stekcer.

Der Display läuft nun einwandfrei.

Danke für eure Hilfe.
Eine Frage habe ich noch:
hat mittlerweile jemand eine Bibliothek für Bascom erstellt, mit der man 
auch Bilder anzeigen kann?

Grüße
Andy

von sven (Gast)


Lesenswert?

hallo

hab mal zum testen die bas und lib von Tiny 80 (linux_80) versucht
allerdings nörgelt bascom external rutine not found _box und _boxfill
sowie label not found _box _boxfill....

seine lib datei findet er allerdings und ich kann weder in der bas noch 
inn der lib irgendwo was mit _box finden?

was is da falsch gelaufen?
mfg

von John S. (linux_80)


Lesenswert?

Hallo,
in der selber gebauten Lib müssen ja nur die Teile vorhanden sein, die 
zum Pixel setzen usw. angepasst wurden, der Rest kommt von Bascom 
selber.
Wenn meine Lib im Bascom-Lib-Verzeichnis ist, sollte alles klappen.

von sven (Gast)


Lesenswert?

also ich habe deine glcdlc7981.lib ins lib verzeichnis von bascom 
kopiert die font datei und die bas datei in c:\lcd\

aber wie beschrieben taucht der fehler auf ... muss ich an bascom 
irgendetwas einstellen?

p.s. habe version 1.11.9.0 ist die schonwieder veraltet oder ungeeignet?

von sven (Gast)


Lesenswert?

ähm 1.11.9.0 ich glaub ich lebe mal wieder hinterm mond werd das gleich 
mal in ordnung bringen vllt klappts ja dann

von Werner E. (sammelstoerung)


Angehängte Dateien:

Lesenswert?

Hallo Leute,
Mein glcd geht nach langen Suchen.
Tip:Bei billig Disp. ist der Druchkontakt meist nicht oki
deshalb auch mal auf deranderen Seite Löten.

Frage wer ist so lieb mir die Lib von Holger für den Pic
mit c18 comeiler (bitmap.c) umzuschreiben. Ich raf das nicht!
Gruß sammelstoerung

von Migelito (Gast)


Lesenswert?

Hallo Leute,
ich habe leichte Probleme irgend wie die zeit oder Temperatur beim 
Pollin Display an zeigen zu lassen, ich habe schon einiges probiert im 
Programm von Allu, aber es funktioniert nicht, kann mir jemand Bitte 
zeigen wie die Zeit oder Temperatur beim Programm eingebunden wird. ??

Danke
Migelito

von Alex D. (allu)


Lesenswert?

Hallo Migelito,

ich war eine Woche unterwegs, deshalb die verspätete Antwort.

Migelito schrieb:
> Hallo Allu,
> irgendwie will es nicht, ich denke aber doch das ich es soweit richtig
> umgesetzt habe, oder ?
> habe mal die wichtigen Zeilen mit rein genommen wie ich es im Programm
> habe.
> er compiliert zwar aber er zeigt nur "Grad" an, kann aber auch nicht das
> Programm für ein ds1820 mit ins Hauptmenü rein nehmen dann spinnt das
> komplette Programm.


Auf Basis Deiner Programmzeilen habe ich mal folgendes probiert, zeigt 
auf dem Display:
Temperatur = 12.3 Grad
Temperatur = 12.3 °C

Gruß  allu


Dim Temp1 As Byte
Dim Temperatur As String * 3
Temp1 = 123                  ' nur für Test vorbesetzen

Locate_zeile = 21
Locate_spalte = 0
'Muster    = "01234567890123456789012"
Lcd_string = "Temperatur =      Grad"
Gosub Lcd_write_string

Locate_zeile = 71
Locate_spalte = 0
'Muster    = "01234567890123456789012"
Lcd_string = "Temperatur =      " + Chr(4)       ' Grad-Symbol
Gosub Lcd_write_string


Do
      '   Simulator für Temperaturwert
      Incr Temp1              ' Temperatursimulator und Anzeigezeit
      Wait 1                  ' ...NUR für Simulation !!!


      '  Temperaturstring aufbereiten
      Temperatur = Str(temp1)
      Lcd_string = Format(temperatur , "00.0")


      '   und anzeigen zwischen Temperatur und Grad
      Locate_zeile = 21
      Locate_spalte = 13
      Gosub Lcd_write_string


      '   und anzeigen zwischen Temperatur und Grad-Symbol
      Locate_zeile = 71
      Locate_spalte = 13
      Gosub Lcd_write_string

Loop   ' Endlosschleife NUR für den Test

von Stephan B. (s_bronco)


Lesenswert?

Letzter Post schon nen Monat her, hmm...

Hallo Jungs ich hab da mal ne Frage/ Problem:

Wie bekomm ich es hin, da bei mir Control und Datenports ganz anders 
aufgeteilt sind,daß das Program trotzdem weis was zu tun ist?

bei mir:
 LCD      Mega32
 4 RS   -   PC1
 5 fest an GND, oder sollte ich Daten lesen können? Wenn ja, warum?
 6 E    -  PC2
 7 DB0  -  PC3
 8 DB1  -  PC4
 9 DB2  -  PC5
10 DB3  -  PC6
11 DB4  -  PC7
12 DB5  -  PA5
13 DB6  -  PA6
14 DB7  -  PA7
15 CS   -  PA4


bei "normalen" TextLCDs hätte ich zB.;
Config Lcdpin = Pin , Rs = Porta.5 , E = Porta.4 , Db4 = Porta.0 , Db5 = 
Porta.1 , Db6 = Porta.2 , Db7 = Porta.3
geschrieben, geht das hier auch?? (anstatt RS natürlich Cd, E = Wr etc.)

ich steh voll auf dem Schlauch und blicks gar ned!
Hilfe

von John S. (linux_80)


Lesenswert?

@s_bronco
bei dieser Aufteilung müsste man sich einen extra Treiber schreiben, um 
mit den Bascom-Befehlen etwas hin zubekommen.
Auf jeden Fall wird es damit eine ziemlich langwierige Geschichte bis 
die 8Bit draussen sind, und das bei jedem Befehl mehrfach.

Beim Config Graphlcd werden die einzelnen Port-Definitionen, glaub 
ich, nicht akzeptiert, auch wenn man den Treiber selber schreibt.

Lesen sollte man vom LCD schon können, sonst kann man keine einzelnen 
Pixel setzen, da man ja nicht weiss welche Pixel vorher 0 oder 1 sind. 
Auch wenn der LC7981 nen Pixelsetz/lösch Befehl hat, ist es damit nicht 
von Vorteil damit das ganzen Display vollzumalen, das dauert ewig.
Und i.d.R. fragt man das Busy-Flag ab, ob das LCD schon fertig ist für 
den nächsten Befehl.

von Stephan B. (s_bronco)


Lesenswert?

@John Small: Danke für die ausführliche Erklärung.

Werd das dann mal so stecken und im Schaltplan ändern; naja, erst mal 
schaun wie ichs überhaupt verdrahten kann....

Danke nochmal

von Stephan B. (s_bronco)


Lesenswert?

kann immer noch nicht editieren, grumelgrumel

ein dickes Danke und Lob an alle die das hier geschaffen haben, 
besonders an
linux_80, dank deiner LIB geht das jetzt endlich!

von Stephan B. (s_bronco)


Lesenswert?

Hallo,
das LCD arbeitet bei mir ziemlich gut, habe aber trotzdem noch was 
gefunden:
Ich habe mir einen 5x5font erstellt, nur mal die Zahlen und 
Großbuchstaben.
Anzeigen geht auch wunderbar, allerdings sind die Zeichen im 8 
Pixelraster, im Header steht aber das der Font 5 breit und 5 hoch ist, 
warum ist der Abstand dennoch zu groß?

Fontheader:
1
Font5x5C:
2
$asm
3
.db 1,5,5,0
4
.db 0,0,0,0,0 ;

von John S. (linux_80)


Lesenswert?

Hi,
ein Byte hat ja bekanntlich 8bit, und deswegen werden alle Zeichen in 
Y-Richtung in diesem Abstand platziert.
Es hat sich bis jetz noch keiner die Arbeit gemacht einen anderen 
Abstand vorzusehen.

von Stephan B. (s_bronco)


Lesenswert?

Ja dachte mir schon sowas..
Hatte aber gedacht in der LIB was über den Abstand gelesen zu haben, war 
dann wohl doch was anderes, C source vermutlich.

Wenn sich allerdings jemand darum kümmert, würde ich das gern annehmen.

von Stephan B. (s_bronco)


Lesenswert?

Ich schon wieder..

Das Display geht in unregelmässigen Abständen einfach Aus, uC läuft aber 
weiter, nach reset ist Display wieder eine Weile an (irgendwas von 5min 
bis 10h)
absolut nicht nicht vorhersehbar.
Änderung meinerseits war, den LCD- reset fest über 10k auf 5V zu legen 
und Initanpassung:
1
Config Graphlcd = 128 * 64sed , Dataport = PortC , Controlport = PortA , Ce = 7 , Cd = 4 , Rd = 5 , Enable = 6 , Mode = 8 , Reset = 6
also Enable und Reset teilen sich im Prog den PortA.6

liegt das daran?

kann ich Reset im Init vielleicht einfach weglassen?

ich habe keine Pins mehr übrig, alles belegt.

Hilfe

von Stephan B. (s_bronco)


Lesenswert?

Hallo,
ich schon wieder, kann halt nix alleine machen...

Habe jetzt eine Platine geätzt auf die das LCD aufgesteckt wird, darauf 
arbeitet ein M324.
LCD läuft perfekt, ich kann alles anzeigen was ich will, M324 arbeitet 
perfekt, ISP etc. alles funktioniert.

ABER!

ich erzeuge im M324 eine Basiszeit von 10ms mittels des Timer0 und 
Interrupt bei Überlauf, sobald ich den Timer0 laufen laß, habe ich 
ständig wechselnde Streifen auf dem LCD, Text und Grafik werden noch 
angezeigt, halt überlagert von diesen Streifen.
Die meisten Streifen laufen von links oben nach rechts unten.

Timer langsamer oder schneller timen > Streifen ändern sich langsamer 
oder schneller, Timer aus > Streifen weg.

Hilfe!

Ist mein Boardlayout Schei*** oder kann ich da am AVR Softwareseitig was 
machen?

Am Steckbrett + Pollinboard hats funktioniert.

Hier mal der Testcode:
1
' ********  Compiler Kommandos
2
3
$regfile = "M324Pdef.dat"
4
$crystal = 16000000
5
$hwstack = 160
6
$swstack = 30
7
$framesize = 20
8
$lib "glcdLC7981.lib"
9
$include "8x8B.font"
10
$include "5x5.font"
11
12
13
'  ##############################################
14
'  ################    INIT      ################
15
16
' ********  Globale Variablen
17
   Dim A As Byte , Flag As byte , TargetCounter as word
18
   Dim PollCounter as word , LCDCounter as word , TouchCounter as word , IntervallCounter(3) as word
19
20
' ********  TouchPad Variablen
21
   Dim Tpx As Word , Tpy As Word
22
   Dim Tpxold As Word , Tpyold As Word
23
   dim Anzeigepos(3) as byte
24
25
26
27
   anzeigepos(1) = 14
28
   anzeigepos(2) = 37
29
   anzeigepos(3) = 60
30
31
32
'  ******** Interruptcounter
33
   set PortB.3
34
   set PortB.4
35
   Config Timer0 = Timer , Prescale = 1024                     ' 10ms bei 16MHz
36
37
   On Timer0 Timerinterrupt
38
   Enable Interrupts
39
   Timer0 = 100                                             ' 16MHz
40
   'Timer1 = 61                                           ' 20MHz
41
  Enable Timer0
42
43
   Config Watchdog = 2048                                   '  ####### WatchDog
44
45
   Config 1wire = Portd.1
46
   Config 1wire = Portd.2
47
   Config 1wire = PortD.3
48
49
'  Prozeduren
50
51
   Declare Sub LCDAnzeigen
52
53
54
55
56
57
   waitms 500                                               'glcd wartezeit
58
' ********  GLCD
59
' Mode: 6 -> Text, 8 -> Graphic                                                                 CS         RS        R/w
60
   Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 7 , Cd = 6 , Rd = 5 , Enable = 4 , Mode = 8 , Reset = 5
61
   Cls
62
   Setfont Font8x8
63
   Boxfill(47 , 30) -(110 , 44) , 255
64
   LCDat 35 , 8 , "TEST" , 255
65
waitms 250
66
cls
67
68
69
'     ########    MAIN     ##############################
70
Do
71
LCDat 73 , 1 , "MAIN"
72
73
74
75
76
   If LCDCounter >= 250 then call LCDAnzeigen               '  LCD update alle 1/4s
77
78
   Reset Watchdog
79
Loop
80
END
81
82
83
Sub LCDAnzeigen
84
    Line(0 , 22) -(159 , 22) , 255
85
86
   Line(0 , 45) -(159 , 45) , 255
87
88
   Line(0 , 68) -(159 , 68) , 255
89
   
90
   LCDat 1 ,1 , LCDCounter ; "   "
91
92
93
End Sub
94
95
96
97
END
98
'##################################################
99
' ********  10ms INTERRUPT
100
Timerinterrupt:
101
   Disable Timer0
102
      'IntervallCounter(1) = IntervallCounter(1) + 10
103
      'IntervallCounter(2) = IntervallCounter(2) + 10
104
      'IntervallCounter(3) = IntervallCounter(3) + 10
105
      'PollCounter = PollCounter + 10
106
      LCDCounter = LCDCounter + 10
107
      'TouchCounter = TouchCounter + 10
108
      Timer0 = 100
109
   Enable Timer0
110
Return

von Stephan B. (s_bronco)


Lesenswert?

UPDATE:

mit einem Standard Mega32 gibts keine Störungen.

M324 und M32 sind doch aber Pinkompatibel????
der einzig große Unterschied ist die 2. Compare Einheit vom Counter2, 
OCR2A und OCR2B anstatt nur OCR2???

von Stephan B. (s_bronco)


Lesenswert?

push

von Tester (Gast)


Lesenswert?

ich habe mal eine Frage:

Wenn ich die -10V direkt an den Kontrastpin halte, sollte das Display 
dann nicht schwarz werden?! Bei mir ist es nicht der Fall... "Display 
Off" usw. sind natürlich so eingestellt, dass das GLCD funktionieren 
sollte. Ist mein LCD kaputt? Im Datenblatt steht sogar, dass der 
Kontrast bis zu 20V aushält. Vielleicht ist dort versehentlich mal 5V 
drangekommen, aber mehr nicht.

Ich hoffe ihr wisst weiter...!

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Tester schrieb:
> ...

> Im Datenblatt steht sogar, dass der Kontrast bis zu 20V aushält.

Ja, schon, aber auf VCC bezogen. Die (negative) Kontrastspannung bezieht 
sich immer auf VCC. Das steht aber auch im Datenblatt.

MfG

von Michael S. (suttermichi)


Lesenswert?

Hallo!

Ich habe mir auch 3 dieser Grafik LCDs besorgt. Und ich möchte mich
Schritt für Schritt an das Display herantasten. Zuerst mal nur im
Textmodus.
Wie muss ich denn das in Bascom programmieren? Brauche ich für die
Zeichen auch so einen Font? (ist das nur im Grafikmodus nötig oder
nicht?) Oder gibt es da auch so eine Bilbliothek dafür. Denn dann könnte
man das LCD ja nur initialisieren und dann einfach einen Text anzeigen
lassen, wie bei einem Normalen LCD?

Bin halt noch ein Bascom anfänger!
Hoffe es kann mir jemand antworten.

LG Michi

von da_miez3 (Gast)


Lesenswert?

hallo,

hat jemand eine idee, wie ich mit obiger lib eine *.bgf einfügen kann?
text usw läuft alles, nur ein bild wird mit mit folgendem code nicht 
angezeigt:

 (...)

Showpic 0 , 0 , Test

Wait 5

Lcdat 3 , 1 , "ABCDEFGHIJKLMNOPQR"
Lcdat 13 , 1 , "STUVWXYZ0123456789"

(...)
Return
(...)

Test:
$bgf "test.bgf"
$include "font8x8.font"


Hab mich an der AppNote

http://www.mcselec.com/index.php?option=com_content&task=view&id=189&Itemid=57

orientiert. Hoffe mir kann jemand helfen.

Danke schonmal :)

von Sonic Blast (Gast)


Lesenswert?

Hello.

I apologize for my English (using Google translator)

guys I can’t connect the screen (DG-16080) to Atmega168 (micro 
controllers 100% of the workers tried on two pieces)

the screen works on Atmega16. (special thanks to those who participated 
in this forum, since I have not found experiments with such a screen 
anywhere else)

And also about the touchscreen there is a question, when connected, as 
it is drawn on the diagrams above, part of the touchscreen does not 
work.

Thank you in advance for your help.

von John S. (linux_80)


Lesenswert?

Hi,

haven't had a look into this since my last post 10 years ago.

Do you even have enough pins available on an M168 as it's quite 
different to an M16 ?

An m168 is about a 28 pin package while an m16 has 40Pins.

What language are you using, is Bascom still available ?

Kids tend to use Arduino these days to code atmegas ;)

kbye

von Sonic Blast (Gast)


Lesenswert?

Thank you very much for your answer, I honestly did not hope since 10 
years have passed)

I figured it out with Atmega168 (connected to port B) but it doesn’t 
work with the touchscreen (or rather it works but doesn’t work 
correctly) I soldered a board for Atmega 16 on the breadboard (there are 
more ports in it) I write on BASKOM using your library and examples of 
working with it. According to the touchscreen connection schemes that 
described above did not work, maybe I'm doing something wrong?

I attach a photo of my board and screen (but it seems to be 100% like 
yours)

https://ibb.co/ng4NmKL
https://ibb.co/TtFgq8p

von John S. (linux_80)


Lesenswert?

so I donno what we did back then.
did you check the resistance of the touch thing using a multimeter if 
its working at all ?
the ones we got back then where some kind of refurbished ones, I guess, 
and were sold w/o mentioning that there is a touch screen.
I had to fix them with a soldering iron, that's what i found in my past 
posts :D

von Sonic Blast (Gast)


Lesenswert?

checked (I removed these screens from the cash register terminal 
Hypercom ICE5500, I left another one specifically for verification, and 
so the touchscreen works in it) measure the resistance (should it be 
there any specific?) ;-)

von John S. (linux_80)


Lesenswert?

No, I don't have any specific values,
but there is a post around somewhere in this or the other thread.
It's just so you see if its connected an you're using the matching 
connections for X and Y axis (don't touch it when doing this).

von Sonic Blast (Gast)


Lesenswert?

In the photo, the DG-16080 screen with a touchscreen (you can note where 
there are contacts X +, X-, Y +, Y-)

FOTO:
https://ibb.co/jWM550g
https://ibb.co/j3QWZRt
https://ibb.co/2hRPg1y

when measuring with a multimeter (if you count the 1st night in the left 
to the right), then 1 and 2 legs are measured (I defined them as X + and 
X-) and 3 and 4 (defined as Y + and Y-), naturally tried playing with 
contacts but no result.

https://ibb.co/QHkwkbN

von Sonic Blast (Gast)


Lesenswert?

On the touchscreen there are such inscriptions (Google does not know 
anything about them): G.T/GUNZE USP.4484038 DVO-02

On the soft cable (4 contact so that comes from the touchscreen) it is 
written : 24060T

I figured out the screen itself but anyway, here are the inscriptions 
from it:(the inscription on the chip that is on the chip) 
DG16080-11C-WFBLY-H REV B 3325310252 02.29/033149 , (the inscription on 
the sticker that on the second chip) 040238-001 , (inscription on the 
board)DATA VISION P206-1D DG-16080-11

von Sonic Blast (Gast)


Lesenswert?

numbered on the photo contacts on a soft loop

https://ibb.co/SygrTW8

By the way, on the circuits in this topic (and circuits from other 
sources) the touchscreen is shown as four resistors with a common 
center, and on my touchscreen 1 and 2 legs are not connected to 3 and 4 
(for example, if you measure 1 and 3 or 4 legs with a tester, then there 
is no resistance, the same with 2 and 4)

https://ibb.co/47pbZdW

von QQ (Gast)


Lesenswert?

Sonic Blast schrieb:
> https://ibb.co/SygrTW8
> https://ibb.co/47pbZdW

Please Please add your images as an attachment to your post. It is 
easier to view and people trying to help you do not have to follow a 
link to some dubious third partiy image hoster. In addition it will be 
preserved not only for a few months, so if someone will come up with the 
same problem you have in the future, it is easier for everybody to have 
pics of what is found to be a solution and what is not.


A post/solution referring to a schematic, etc. that is no longer 
available because of some external filehoster, is useless.

von Sonic Blast (Gast)


Lesenswert?

I apologize from the beginning I did not understand how to insert a 
photo here, right now I'll redo everything!

von Sonic Blast (Gast)


Angehängte Dateien:

Lesenswert?

In the photo, the DG-16080 screen with a touchscreen (you can note where
there are contacts X +, X-, Y +, Y-)

von Sonic Blast (Gast)


Angehängte Dateien:

Lesenswert?

when measuring with a multimeter (if you count the 1st night in the left
to the right), then 1 and 2 legs are measured (I defined them as X + and
X-) and 3 and 4 (defined as Y + and Y-), naturally tried playing with
contacts but no result.

von (unknown) (Gast)


Angehängte Dateien:

Lesenswert?

Here's how the touchscreen looks on your circuits.

von (unknown) (Gast)


Angehängte Dateien:

Lesenswert?

And it looks like mine according to the measurements of the multimeter.

von Sven B. (svenba)


Angehängte Dateien:

Lesenswert?

Hi.
Its funny to see that someone is still interested in this post after so 
many years.
I managed to use this display with the touch in the past but i used 
assembler for my project.
I think, the attached pic could be helpful for you.
The two pairs of connectors should always have a low resistance between 
them but not to the other two.

To measure the right coordinates on the touch, you need to create a 
point, where both layers (X and Y) are connected. So it has to be 
"touched". Then i connected one layer (e.g. Y) on + and on the other 
layer ( X), i measured on one side, while the other side was connected 
to ground.

This was for X - coordinate. For Y coordinate vise versa.

Have fun !
Sven

von (unknown) (Gast)


Lesenswert?

before trying to connect the screen and then the touchscreen from the 
beginning I read this topic and it seems people wrote here that 
everything works for them, laid out code examples ... Well, yes, BASCOM 
is far from assembler but we write on what we can do)

And I already read the article (with which you have a photo of the 
principle of action of a transreflective touchscreen), everything is 
said the same there, as well as here to connect it to the 
microcontroller ...

Well, okay, I’ll try, if I manage to connect, I’ll write in a friend and 
then it’s still useful)

Guys to all who answered Thank you very much)

von (unknown) (Gast)


Lesenswert?

Can I install four 100 Ohm Resistors from the microcontroller to the 
touchscreen (I didn’t try the 100om but on the 75om and 150om)?

von (unknown) (Gast)


Angehängte Dateien:

Lesenswert?

By the way, here is a photo of my craft)

von (unknown) (Gast)


Angehängte Dateien:

Lesenswert?

Front Side.

von Sven B. (svenba)


Lesenswert?

If I remember well, i didnt use any resistors between the touch and the 
uC.
... No, I´m sure, that i didnt use resistors, the layers are the 
resistors themself !

: Bearbeitet durch User
von Thomas F. (igel)


Lesenswert?

Alexander B. schrieb:
> Can I install four 100 Ohm Resistors from the microcontroller to the
> touchscreen

There is no need for resistors. It works fine without them.

von (unknown) (Gast)


Angehängte Dateien:

Lesenswert?

Okay Thomas, here is the code of the program that I use (the code that 
was laid out here as examples), take a look, maybe I missed something, I 
definitely didn’t change anything critical?

Thank you in advance for your help.

von (unknown) (Gast)


Lesenswert?

To : Sven B. (svenba)

And what compiler do you use assembler for, I installed myself by 
Bascom, Winavr and Atmel Studios.

von Sonic Blast (Gast)


Lesenswert?

Guys, thank you all for at least answering after 10 years -))) It turned 
out to set up the Touchscreen (I just had a slightly different display), 
Special thanks to everyone who had a hand in creating the Library to 
Bascom, you are just Gods.

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.