mikrocontroller.net

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


Autor: Thomas H. (microtom)
Datum:

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

Danke für Hilfe und Ideenaustausch!

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven B. (svenba)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas H. (microtom)
Datum:

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

Gruß
Thomas

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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]

Autor: Thomas H. (microtom)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas H. (microtom)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sven B. (svenba)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Sven B. (svenba)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: allu (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sven B. (svenba)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Sven B. (svenba)
Datum:

Bewertung
0 lesenswert
nicht 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!!

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm, irgendwas klemmt bei Hochladen   ... Test  .. Test

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem Anhang hat leider nicht geklappt  ....

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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  ...

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht leider nicht ....  Warum auch immer ...

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ratlos ......  geht auch angemeldet nicht mehr ...

Autor: Thomas H. (microtom)
Datum:

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

Das bekommen wir schon hin ;-)

Autor: Alex D. (allu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)

Autor: Alex D. (allu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Noch ein Datenblatt, jetzt zum Display-Controller LC7981

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: allu (Gast)
Datum:

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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Darf man fragen, welche Art von Projekt Du vor hast?

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Alex,

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

Ich melde mich!

Gruß
Thomas

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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:
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
Dim Lcd_form_2 As String * 23 At Lcd_format(49) Overlay
Dim Lcd_form_3 As String * 23 At Lcd_format(73) Overlay
Dim Lcd_form_4 As String * 23 At Lcd_format(97) Overlay
Dim Lcd_form_5 As String * 23 At Lcd_format(121) Overlay
Dim Lcd_form_6 As String * 23 At Lcd_format(145) Overlay
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/Bausaet...
und
http://www.ehomeportal.de/FS20-868-MHz-Empfangsmod...

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

Autor: Alex D. (allu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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
abändere, funktioniert meine korrekte Protokollsendung nicht mehr in der richtigen Zeit.

Bei der Senderoutine wird das verwendet:
[c]
 Config Timer2 = Timer , Prescale = 64     'Timer for transmiter
   On Timer2 Isr_timer2

       Enable Timer2
       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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Helmut (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: allu (Gast)
Datum:

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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oder probiere mal:
"Disable Timer0" -> Steuerimpulse senden -> "Enable Timer0"  ....

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Hannes,

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

Gruß
Alex

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt kommt nochmal eine Frage:

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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klappt! :-)

Es wird so langsam ein Schuh draus.

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
.             Normal:
-BBBB---  < 1.Pixelzeile
-B---B--
-B---B--
-BBBB---
-B---B--     bis
-B---B--
-BBBB---
--------  < 8.Pixelzeile
^      ^      Gedreht:
1. bis 8.
Pixelzeile

Autor: kolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
Write_2_byte:
      push Temp_1

      cbi  Control_Bus, CS                                  'Chip select aktivieren
      rjmp Write_2_Byte_20

Write_2_byte_10:
      cbi  Control_Bus, E                                   'Enable-Puls beenden
      nop                                                   'warten
      nop                                                   'warten
      nop
      nop                                                   'warten

Write_2_byte_20:
      sbi  Control_Bus, E                                   'Enable-Puls beginnt
      nop                                                   'warten
      nop                                                   'warten
      nop                                                   'warten
         'warten
      sbic Daten_Bus_in, Bussy                              'Fertisch ?
      rjmp Write_2_Byte_10
      nop

      cbi  Control_Bus, E                                   'Enable-Puls beenden
      cbi  Control_Bus, RW                                  'Write Signal aktivieren
      nop

  'Register im Grafikcontroller auswählen
      ldi  Temp_1,auf_Output_stellen                        'Datenbus auf Ausgabe stellen
      !out  Daten_ddr, Temp_1                               '..und umschalten
      nop
      !out  Daten_Bus_out, Befehl                           'Befehl-Register auswählen
      sbi  Control_Bus, E                                   'ins Befehl-Register schreiben
      nop                                                   'warten
      nop
      nop
      nop
      nop
      nop                                                   'warten
      cbi  Control_Bus, E                                   'Enable-Puls beenden

      nop
  'Mode-Temp_1 in Grafikcontroller schreiben
      cbi  Control_Bus,RS
      !out  Daten_Bus_out, Daten                            'Mode-Temp_1 aufv Bus legen
      sbi  Control_Bus, E                                   'ins Mode-Register schreiben
      nop                                                   'warten
      nop
      nop
      nop
      nop                                                   'warten
      nop                                                   '... und warten
      cbi  Control_Bus, E                                   'Enable-Puls beenden
      nop

  'Ruhepegel wieder herstellen
      sbi  Control_Bus, CS                                  'Chip select deaktivieren
      ldi  Temp_1,auf_Input_stellen                         'Datenbus auf Input stellen
      !Out Daten_ddr , Temp_1                               '..und umschalten
      sbi  Control_Bus, RW                                  'Read Signal deaktivieren
      sbi  Control_Bus, RS

Write_2_byte_99:
      pop  Temp_1

      ret

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

Liebe Grüsse

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: kolli (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.
Zusammenfassung des Befehlssatzes des LCD-Treibers LC7981
des Pollin-GLCDs DG-16080-11 von Datavision:

00h: Einstellung der Betriebsart
01h: Zeilenhöhe und Zeichenbreite im Textmodus
02h: Anzahl Zeichen bzw. Bytes pro Zeile
03h: Teilerwert für Display-Multiplexing
04h: Cursorposition im Textmodus

08h: Startadresse für Anzeige Low (Scrolling)
09h: Startadresse für Anzeige High (Scrolling)
0ah: RAM-Zeiger Low
0bh: RAM-Zeiger High
0ch: RAM schreiben
0dh: RAM lesen
0eh: Pixel löschen
0fh: Pixel setzen

>
> Danke
>
> Grüsse Kevin

...

Autor: Kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
'TEST PIXEL
Gosub Lcd_clear

'1. Pixel
Command = &H0A                                              'Befehl: RAM-Zeiger Low
Datenwert = &H00                                            'Spalte 1 (a 8 Pixel 0-22)
Gosub Zum_glcd                                              'In Display-RAM schreiben
Command = &H0B                                              'Befehl: RAM-Zeiger High
Datenwert = &H00
Gosub Zum_glcd                                              'In Display-RAM schreiben
Command = &H0F                                              'Befehl: Pixel setzen
Datenwert = &H01                                            'Pixel 1 (1-8)
Gosub Zum_glcd                                              'In Display-RAM schreiben

'2. Pixel
Command = &H0A                                              'Befehl: RAM-Zeiger Low
Datenwert = &H01                                            'Spalte 2 (a 8 Pixel 0-22)
Gosub Zum_glcd                                              'In Display-RAM schreiben
Command = &H0B                                              'Befehl: RAM-Zeiger High
Datenwert = &H00
Gosub Zum_glcd                                              'In Display-RAM schreiben
Command = &H0F                                              'Befehl: Pixel setzen
Datenwert = &H01                                            'Pixel 1 (1-8)
Gosub Zum_glcd 

und hier der Assembler-Code:
Zum_glcd:
      Loadadr Command , X
      LD  Befehl, X
      Loadadr Datenwert , X
      LD  Daten, X

Write_pixel:
      push Temp_1

      cbi  Control_Bus, CS                                  'Chip select aktivieren
      rjmp Write_pixel_20

Write_pixel_10:
      cbi  Control_Bus, E                                   'Enable-Puls beenden
      nop                                                   'warten
      nop                                                   'warten
      nop
      nop                                                   'warten

Write_pixel_20:
      sbi  Control_Bus, E                                   'Enable-Puls beginnt
      nop                                                   'warten
      nop                                                   'warten
      nop                                                   'warten
         'warten
      sbic Daten_Bus_in, Bussy                              'Fertisch ?
      rjmp Write_pixel_10
      nop

      cbi  Control_Bus, E                                   'Enable-Puls beenden
      cbi  Control_Bus, RW                                  'Write Signal aktivieren
      nop

  'Register im Grafikcontroller auswählen
      ldi  Temp_1,auf_Output_stellen                        'Datenbus auf Ausgabe stellen
      !out  Daten_ddr, Temp_1                               '..und umschalten
      nop
      !out  Daten_Bus_out, Befehl                           'Befehl-Register auswählen
      sbi  Control_Bus, E                                   'ins Befehl-Register schreiben
      nop                                                   'warten
      nop
      nop
      nop
      nop
      nop                                                   'warten
      cbi  Control_Bus, E                                   'Enable-Puls beenden

      nop
  'Mode-Temp_1 in Grafikcontroller schreiben
      cbi  Control_Bus,RS
      !out  Daten_Bus_out, Daten                            'Mode-Temp_1 aufv Bus legen
      sbi  Control_Bus, E                                   'ins Mode-Register schreiben
      nop                                                   'warten
      nop
      nop
      nop
      nop                                                   'warten
      nop                                                   '... und warten
      cbi  Control_Bus, E                                   'Enable-Puls beenden
      nop

  'Ruhepegel wieder herstellen
      sbi  Control_Bus, CS                                  'Chip select deaktivieren
      ldi  Temp_1,auf_Input_stellen                         'Datenbus auf Input stellen
      !Out Daten_ddr , Temp_1                               '..und umschalten
      sbi  Control_Bus, RW                                  'Read Signal deaktivieren
      sbi  Control_Bus, RS

Write_pixel_99:
      pop  Temp_1

      ret

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Kevin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Hannes Lux (hannes)
Datum:

Bewertung
0 lesenswert
nicht 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.

...

Autor: Chriz X. (tc-maxx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Chriz X. (tc-maxx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
Dim V As Byte
Dim W As Byte
Dim X As Byte

Dim W_to As Byte
W_to = 255

For V = 0 To 7
If V = 7 Then W_to = 126
   For W = 0 To 255                                         'W_to (23 out) '1.Zeile==> 23*7 (0..22=23)=190px
   Waitms 1
      For X = 0 To 6
         Command = &H0A                                     ' Befehl: RAM-Zeiger Low
         Datenwert = W                                      ' Zeichen 0..22
         Gosub Zum_glcd                                     ' In Display-RAM schreiben

         Command = &H0B                                     ' Befehl: RAM-Zeiger High
         Datenwert = V                                      ' Segment 0..7 + w_to = 126 !
         Gosub Zum_glcd                                     ' In Display-RAM schreiben

         Command = &H0F                                     ' Befehl: Pixel setzen
         Datenwert = X                                      ' Pixel 0-6 ! (7)
         Gosub Zum_glcd
      Next X
   Next W
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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chriz X. (tc-maxx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas H. (microtom)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chriz X. (tc-maxx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)
'===================================================================================================
'---[P_Set - Funktion für Pollin 16080 ]------------------------------------------------------------
'===================================================================================================
Sub P_set(ByVal X1 As Byte, ByVal Y1 As Byte)
    
    Select Case Y1
    '---[Sonder 1]---------------------------------------------------------------
        Case 11: 'W = =KÜRZEN(R47/7)+((T47-43)*24)+240 'X=R47+(((T47-43)*24 + 240)*7)-(R48*7)-0
                If X1 < 112 Then
                   S1 = 240
                   S2 = 0
                   S3 = 240
                   V = 0
                Else 'W=KÜRZEN(R52/7)+((T52-43)*24)-16 'X=R52+(((T52-43)*24 + 000)*7)-(R53*7)-112
                   S1 = 0
                   S2 = 112
                   S3 = -16
                   V = 1
                End If
                GoSub SonderFall
        '---[Sonder 2]---------------------------------------------------------------
        Case 22:   'W =KÜRZEN(R25/7)+((T25-S1)*24)+S3 'X=R25+(((T25-S1)*24+S1)*7)-(R26*7)-S2
                If X1 < 56 Then
                   S1 = 248 '
                   S2 = 0 '
                   S3 = 248 '
                   V = 1
                Else 'W =KÜRZEN(R30/7)+((T30-S1)*24)-S3 'X=R30+(((T30-S1)*24+S1)*7)-(R31*7)-S2
                   S1 = 0 '
                   S2 = 56 '
                   S3 = -8 '
                   V = 2
                End If
                GoSub SonderFall
        '---[Sonder 3]---------------------------------------------------------------
        Case 43: 'W = =KÜRZEN(R47/7)+((T47-43)*24)+240 'X=R47+(((T47-43)*24 + 240)*7)-(R48*7)-0
                If X1 < 112 Then
                   S1 = 240
                   S2 = 0
                   S3 = 240
                   V = 3
                Else 'W=KÜRZEN(R52/7)+((T52-43)*24)-16 'X=R52+(((T52-43)*24 + 000)*7)-(R53*7)-112
                   S1 = 0
                   S2 = 112
                   S3 = -16
                   V = 4
                End If
                GoSub SonderFall
        '---[Sonder 4]---------------------------------------------------------------
        Case 54:
                If X1 < 56 Then
                   S1 = 248
                   S2 = 0
                   S3 = 248
                   V = 4
                Else
                   S1 = 0
                   S2 = 56
                   S3 = -8
                   V = 5
                End If
                GoSub SonderFall
        '---[Sonder 5]---------------------------------------------------------------
        Case 75: 'W = =KÜRZEN(R47/7)+((T47-43)*24)+240 'X=R47+(((T47-43)*24 + 240)*7)-(R48*7)-0
                If X1 < 112 Then
                   S1 = 240
                   S2 = 0
                   S3 = 240
                   V = 6
                Else 'W=KÜRZEN(R52/7)+((T52-43)*24)-16 'X=R52+(((T52-43)*24 + 000)*7)-(R53*7)-112
                   S1 = 0
                   S2 = 112
                   S3 = -16
                   V = 7
                End If
                GoSub SonderFall
    End Select

'----[01...10]---------------------------------------------------------------------
    If Y1 >= 1 Then
        If Y1 <= 10 Then
            S1 = 1
            S2 = 0
            S3 = 0
            GoSub NormalFall
        End If
    End If
    
'----[12...21]---------------------------------------------------------------------
    If Y1 >= 12 Then
        If Y1 <= 21 Then
            S1 = 12
            S2 = 8
            S3 = 0
            GoSub NormalFall
        End If
    End If
    
'----[23...32]---------------------------------------------------------------------
    If Y1 >= 23 Then
        If Y1 <= 32 Then
            S1 = 23
            S2 = 16
            S3 = 1
            GoSub NormalFall
        End If
    End If
'----[33...42]---------------------------------------------------------------------
    If Y1 >= 33 Then
        If Y1 <= 42 Then
            S1 = 33
            S2 = 0
            S3 = 1
            GoSub NormalFall
        End If
    End If
'----[44...53]---------------------------------------------------------------------
    If Y1 >= 44 Then
        If Y1 <= 53 Then
            S1 = 44
            S2 = 8
            S3 = 1
            GoSub NormalFall
        End If
    End If
'----[55...64]---------------------------------------------------------------------
    If Y1 >= 55 Then
        If Y1 <= 64 Then
            S1 = 55
            S2 = 16
            S3 = 3
            GoSub NormalFall
        End If
    End If
'----[66...74]---------------------------------------------------------------------
    If Y1 >= 66 Then
        If Y1 <= 74 Then
            S1 = 66
            S2 = 0
            S3 = 3
            GoSub NormalFall
        End If
    End If
'----[76...80]---------------------------------------------------------------------
    If Y1 >= 76 Then
        If Y1 <= 80 Then
            S1 = 76
            S2 = 8
            S3 = 3
            GoSub NormalFall
        End If
    End If
Exit Sub
'--[Normalfälle]-----------------------------------------------------------
NormalFall:
    '---[W]----------------------------------------------------------------
    Tmp1 = X1 / 7
    Tmp2 = Y1 - S1
    Tmp2 = Tmp2 * 24
    Tmp2 = Tmp2 + S2
    w = WorksheetFunction.RoundDown(Tmp1 + Tmp2, 0)          'w = Tmp1 + Tmp2
    '---[X]----------------------------------------------------------------
    Tmp1 = Y1 - S1
    Tmp1 = Tmp1 * 24
    Tmp1 = Tmp1 + S2
    Tmp1 = Tmp1 * 7
    Tmp2 = w * 7
    x = Tmp1 - Tmp2
    x = x + X1
    '---[V]----------------------------------------------------------------
    Tmp1 = Y1 + S3
    Tmp1 = Tmp1 * 160
    Tmp1 = Tmp1 / 7
    V = WorksheetFunction.RoundDown(Tmp1 / 256, 0)
Exit Sub
'--[Sonderfälle]-----------------------------------------------------------
SonderFall:
    '---[W]----------------------------------------------------------------
    Tmp1 = X1 / 7
    w = WorksheetFunction.RoundDown(Tmp1, 0)
    w = w + S3
    '---[X]----------------------------------------------------------------
    Tmp1 = w * 7
    Tmp2 = S1 * 7
    Tmp2 = X1 + Tmp2
    x = Tmp2 - Tmp1
    x = x - S2
Return
End Sub

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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. ;)

Autor: Chriz X. (tc-maxx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Chriz X. (tc-maxx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: allu (Gast)
Datum:

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

Autor: John Small (linux_80)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chriz X. (tc-maxx)
Datum:

Bewertung
0 lesenswert
nicht 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:
 
'(initialisierung wie allu)
'==============================================================================
'---[P_Set - Funktion für Pollin 16080 ]----------------------------------------
'===============================================================================
Sub P_set(byval X1 As Byte , Byval Y1 As Byte , Byval P_set_del As Byte)

   If P_set_del = 1 Then P_set_del = &HFH Else P_set_del = &HEH       ' Befehl: Pixel setzen/löschen

   Dim Tmp As Integer
   Dim Ganz As Integer
   Dim Addr As Integer
   Dim Rest As Integer                                      'Addr_High
   Dim Addr_lo As Integer

   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

   Tmp = Y1 * 160
   Tmp = Tmp / 7
   Tmp = Tmp / 256
   Command = &H0B                                           ' Befehl: RAM-Zeiger High
   Datenwert = Tmp                                          ' Segment 0..7 ??
   Gosub Zum_glcd                                           ' In Display-RAM schreiben

   Command = P_set_del                                      ' Befehl: Pixel setzen
   Datenwert = Rest                                         ' Pixel 0-6
   Gosub Zum_glcd                                           ' In Display-RAM schreiben
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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Chriz X. schrieb:
> Addr_lo = Low(addr)

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

Gruß   allu

Autor: Chriz X. (tc-maxx)
Datum:

Bewertung
0 lesenswert
nicht 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?
'----------------------------------------------------------------------------
Lcd_initialisieren:
'----------------------------------------------------------------------------
      ldi  ZL, low(Init_gc_mode *2)
      ldi  ZH, high(Init_gc_mode *2)

      lpm  Temp_1, Z+                                       ' Schleifenzähler
      lpm  Temp_1, Z+                                       ' Schleifenzähler
'----------------------------------------------------------------------------
Lcd_initialisieren_10:
'----------------------------------------------------------------------------
      lpm  Befehl,Z+
      lpm  Daten,Z+
      rcall Write_2_Byte

      dec  Temp_1
      brne LCD_Initialisieren_10

'----------------------------------------------------------------------------
Lcd_initialisieren_99:
'----------------------------------------------------------------------------
      ret

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: allu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chriz X. (tc-maxx)
Datum:

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

Super, so funktioniert's!
Danke!
'===============================================================================
'---[P_Set - Funktion für Pollin 16080 ]----------------------------------------
'===============================================================================
Sub P_set(byval X1 As Byte , Byval Y1 As Byte , Byval P_set_del As Byte)

   If P_set_del = 1 Then P_set_del = &HFH Else P_set_del = &HEH       ' Befehl: Pixel setzen/löschen

   Dim Ganz As Integer
   Dim Addr As Integer

   Addr = Y1 * 24
   Ganz = X1 / 7
   Addr = Addr + Ganz                                    

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

Autor: John Small (linux_80)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Chriz X. (tc-maxx)
Datum:

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

Super Arbeit ! DANKE !

Gruß MaXX

Autor: Chriz X. (tc-maxx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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 ;)

Autor: John Small (linux_80)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Chriz X. (tc-maxx)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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 
;-)

Autor: Chriz X. (tc-maxx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mein Username ist Linux_80 nicht _90 !
;)

Autor: Matze G. (maroni666)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Chriz X. (tc-maxx)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andy (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Tiny 80,

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

Andy

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe ich auskommentiert, aber immernoch gleiches ergebnis

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
$baud..... habe ich auch schon auskommentiert

Autor: Andy (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner E. (sammelstoerung)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Migelito (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex D. (allu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Migelito,

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

Migelito schrieb im Beitrag #1674395:
> 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

Autor: Stephan B. (s_bronco)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan B. (s_bronco)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stephan B. (s_bronco)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Stephan B. (s_bronco)
Datum:

Bewertung
0 lesenswert
nicht 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:
Font5x5C:
$asm
.db 1,5,5,0
.db 0,0,0,0,0 ;

Autor: John Small (linux_80)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan B. (s_bronco)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stephan B. (s_bronco)
Datum:

Bewertung
0 lesenswert
nicht 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:
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

Autor: Stephan B. (s_bronco)
Datum:

Bewertung
0 lesenswert
nicht 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:
' ********  Compiler Kommandos

$regfile = "M324Pdef.dat"
$crystal = 16000000
$hwstack = 160
$swstack = 30
$framesize = 20
$lib "glcdLC7981.lib"
$include "8x8B.font"
$include "5x5.font"


'  ##############################################
'  ################    INIT      ################

' ********  Globale Variablen
   Dim A As Byte , Flag As byte , TargetCounter as word
   Dim PollCounter as word , LCDCounter as word , TouchCounter as word , IntervallCounter(3) as word

' ********  TouchPad Variablen
   Dim Tpx As Word , Tpy As Word
   Dim Tpxold As Word , Tpyold As Word
   dim Anzeigepos(3) as byte



   anzeigepos(1) = 14
   anzeigepos(2) = 37
   anzeigepos(3) = 60


'  ******** Interruptcounter
   set PortB.3
   set PortB.4
   Config Timer0 = Timer , Prescale = 1024                     ' 10ms bei 16MHz

   On Timer0 Timerinterrupt
   Enable Interrupts
   Timer0 = 100                                             ' 16MHz
   'Timer1 = 61                                           ' 20MHz
  Enable Timer0

   Config Watchdog = 2048                                   '  ####### WatchDog

   Config 1wire = Portd.1
   Config 1wire = Portd.2
   Config 1wire = PortD.3

'  Prozeduren

   Declare Sub LCDAnzeigen





   waitms 500                                               'glcd wartezeit
' ********  GLCD
' Mode: 6 -> Text, 8 -> Graphic                                                                 CS         RS        R/w
   Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Ce = 7 , Cd = 6 , Rd = 5 , Enable = 4 , Mode = 8 , Reset = 5
   Cls
   Setfont Font8x8
   Boxfill(47 , 30) -(110 , 44) , 255
   LCDat 35 , 8 , "TEST" , 255
waitms 250
cls


'     ########    MAIN     ##############################
Do
LCDat 73 , 1 , "MAIN"




   If LCDCounter >= 250 then call LCDAnzeigen               '  LCD update alle 1/4s

   Reset Watchdog
Loop
END


Sub LCDAnzeigen
    Line(0 , 22) -(159 , 22) , 255

   Line(0 , 45) -(159 , 45) , 255

   Line(0 , 68) -(159 , 68) , 255
   
   LCDat 1 ,1 , LCDCounter ; "   "


End Sub



END
'##################################################
' ********  10ms INTERRUPT
Timerinterrupt:
   Disable Timer0
      'IntervallCounter(1) = IntervallCounter(1) + 10
      'IntervallCounter(2) = IntervallCounter(2) + 10
      'IntervallCounter(3) = IntervallCounter(3) + 10
      'PollCounter = PollCounter + 10
      LCDCounter = LCDCounter + 10
      'TouchCounter = TouchCounter + 10
      Timer0 = 100
   Enable Timer0
Return

Autor: Stephan B. (s_bronco)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Stephan B. (s_bronco)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
push

Autor: Tester (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...!

Autor: Kluchscheißernder Nixwisser (kluchscheisser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Sutter (suttermichi)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: da_miez3 (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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_conten...

orientiert. Hoffe mir kann jemand helfen.

Danke schonmal :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.