Hi!
Danke für die Antwort!
Hatte hier schon oft gelesen, dass viele über den ext.Int. gehen und hab
mich deshalb dafür entschieden.
Dein Konzept sieht aber wirklich plausibel aus, werde versuchen, das so
um zu setzen, nach zwei Wochen ohne vernünftiges Resultat ist mir ein
neuer Ansatz ganz Recht!
Welchen Wert (ms) würdest du als Prellschwelle verwenden?
Sven
Sven B. schrieb:
> Hi!> Danke für die Antwort!> Hatte hier schon oft gelesen, dass viele über den ext.Int. gehen und hab> mich deshalb dafür entschieden.
Das würde ich nicht überbewerten. Es gibt auch immer wieder Leute, die
meinen, ihre Tasten per ext.-Interrupt einlesen zu müssen.
> Dein Konzept sieht aber wirklich plausibel aus, werde versuchen, das so> um zu setzen, nach zwei Wochen ohne vernünftiges Resultat ist mir ein> neuer Ansatz ganz Recht!
Wie gesagt, ich habe es noch nicht realisiert, es existiert also noch
keinerlei Erfahrung damit.
> Welchen Wert (ms) würdest du als Prellschwelle verwenden?
Da muss ein Kompromiss gefunden werden. Zu schnell könnte zu Störungen
führen, zu langsam beeinträchtigt die Grafikeingabe (malen, schreiben).
Finde es raus. Man kann den Statuszähler ja rückwärts laufen lassen,
dann kann man die Prellanzahl durch Variation des Startwertes
einstellen, ohne den eigentlichen Code (welcher Statuszählerwert welchen
Job erledigt) dabei nicht zu ändern.
Auch die 1 ms ISR-Rate ist erstmal aus der Luft gegriffen und kann
variiert werden. Die Grenze nach unten ist das ADC-Tempo, der ADC sollte
in diesem Intervall mindestens zwei Wandlungen geschafft haben, so dass
die erste (ungenaue) Wandlung überschrieben ist und nicht erst per
Programm ausgefiltert (unterdrückt, weggeworfen) werden muss. Die Grenze
nach oben ist die gewünschte Geschwindigkeit der Toucheingabe. Da aber
(fast) jedem Programm einen Zeittakt braucht, lohnt es sich, einen
glatten Wert zu nehmen, aus dem man nebenher noch die Systemzeit
ableiten kann.
>> Sven
...
Yippie!
Du bist mein Held der Woche!!
Die erste Routine zur Timer gesteuerten Abfrage läuft!
Endlich!
Nur leider misst er nur vernünftige Werte bei niederigem Takt, meine
Schaltung soll aber auf 20MHz laufen.Da kommt immer nur der "Min.Wert".
Hat jemand ne Idee?
ADC Prescaler ist schon so hoch wie möglich und meine sonstigen
Messwertaufnahmen gehen damitz einwandfrei...
Touch-debouncing?? Aber wie?
Hi!
Danke, habs schon mit Dummy-Messungen bis hoch auf 10 versucht.
Ausserdem hab ich an allen möglichen Stellen delays eingefügt usw, er
misst immer nur max Werte... Hab mein Display/Touch ber Flachband (ca.
5cm) an die uC-Platine angeschlossen, hab das Gefühl, dass die
verschiedenen Signal sich da stören.?.
Ach ja, hier mal meine erst (leicht veränderte) Variante der
Timer-Touch- ISR: (noch mit Ausgabebefehlen zum überprüfen)
1
touch_timer:
2
push temp1
3
in temp1, sreg
4
push temp1
5
push adhigh
6
push temp4
7
push zl
8
push zh
9
10
clr temp2
11
z_laden Touchstatus
12
ld adhigh, z ; Statuszähler
13
14
; Ist X- wirklich Low?
15
in temp1, pina
16
ldi temp2, 1<<x_minus
17
andi temp1, 0b00010000
18
cpi temp1, 0b00010000
19
breq Touch_reset
20
;-----------------------------------------------
21
; 20 mal während Timer gedrückt?
22
23
cpi adhigh, 20
24
breq Schwelle_eins
25
26
cpi adhigh, 25
27
breq Schwelle_zwei
28
29
cpi adhigh, 30
30
breq Schwelle_drei
31
32
; Schwelle erreicht:
33
Schwelle:
34
inc adhigh
35
st z, adhigh
36
rjmp Timer_ende
37
38
Schwelle_eins: ; X- speichern
39
rcall touch_speichern_x ; XWert in ZL(Touchwerte)
40
z_laden Touchwerte
41
ldi disdata1, 0x0c
42
ldi disdata2, 0x53
43
rcall sende_daten
44
ldi disdata2, 0x31
45
rcall sende_daten
46
47
ld disdata2, z
48
rcall sende_daten
49
;;;;;;;;
50
z_laden Touchstatus
51
inc adhigh
52
st z, adhigh
53
rjmp Timer_ende
54
Schwelle_zwei: ; Y-speichern
55
rcall touch_speichern_y ; Y-Wert in ZL+1(Touchwerte)
Wie ich die Berührungs- und Positionerkennung für meinen Touch gelöst
habe, hatte ich oben schon mal kurz beschrieben:
Beitrag "Re: Display mit Touchscreen bei Pollin?".
Zur Zeit babe ich den IRQ auf 20msec Zeitabstand eingestellt. Nach
meinen Versuchen reicht eine Dummy-Messung. Dann sollten sich auch 5cm
Flachbandleitung beruhigt haben. Während den beiden Messungen dürfen
aber die Portleitungen zum Touch nicht verändert werden.
Gruß allu
Hi Leute!
Natürlich fliegen die Displayausgaben raus, hatte ich doch oben auch
geschrieben. Nach zwei Wochen vergeblicher Liebesmühe wird man mir wohl
ein bißchen sichtbare Erfolgskontrolle durchgehen lassen.
Ausserdem ging es mir hier erstmal darum, etwas reagierendes hin zu
kriegen, deswegen hab ich den Vorschlag von Hannes nicht 100% umgesetzt,
sondern arbeite mich Stück für Stück heran!
Hier mal noch ein bißchen Code;
1
Touch_ruhe:
2
sbi Touch_DDR, Y_minus ; alles auf Ausgang
3
sbi Touch_DDR, Y_plus
4
cbi Touch_DDR, X_plus
5
cbi Touch_DDR, X_minus ; Interruptauslöser !!
6
7
cbi Touch_Control, Y_minus ; Y Auf 0V
8
cbi Touch_Control, Y_plus
9
sbi Touch_control ,X_minus; pullup an
10
11
ret
Die Init für meinen ADC habe ich so aus meinem funktionierenden Programm
übernommen, genau wie die Messabläufe.
Aber hier mal die X-Messumschaltung;
1
Touch_speichern_X:
2
;hier X-Messung
3
push temp1
4
push temp2
5
push zl
6
push zh
7
8
z_laden Touchwerte
9
10
cbi Touch_DDR, Y_plus ;Y auf Input stellen
11
cbi Touch_DDR, Y_minus
12
sbi Touch_DDR, x_minus
13
sbi Touch_DDR, x_plus
14
15
sbi touch_control, x_plus
16
cbi Touch_Control, X_minus ;X bestromen
17
18
ldi Temp1, (0<<ADEN)
19
sts Adcsra , Temp1
20
21
ldi Temp1, 0b01100010 ;auf Eingang Y- stellen
22
sts Admux , Temp1
23
24
ldi Temp1, (1<<ADEN)
25
sts Adcsra , Temp1
26
27
rcall Touch_messen
28
29
st z, adlow ; X-Wert in ZL(Touchwerte) gespeichert
30
31
pop zh
32
pop zl
33
pop temp2
34
pop temp1
35
ret
Touch_speichern_Y sieht genau so aus, nur wird der Wert in Z+1
gespeichert und natürlich vorher die Pins umgeschaltet.
Lies Dir noch mal mein Konzept durch.
Ich schlug vor, eine ADC-Messung nur vorzubereiten (Portpins setzen,
Messquelle auswählen) und dann die ISR zu verlassen. Die Messung (egal
ob ADC oder nur Berührung) erfolgt dann im nächsten Interrupt, danach
wird die nächste Messung vorbereitet. Zwischen Vorbereitung und Messung
vergeht also immer die Zeit eines Timer-ISR-Intervalls, in der aber die
CPU nicht wartet, sondern Jobs der Mainloop abarbeiten kann. Der ADC
klappert derweil im Hintergrund (per Hardware) einige Wandlungen durch,
wobei es auch darauf ankommt, dass er mindestens zwei Wandlungen
schafft, damit das erste fehlerhafte Ergebnis überschrieben (entsorgt)
wird und ein sinnvolles Ergebnis erscheint.
Und was machst Du?
Du rufst in der ISR Unterprogramme auf, die erst jetzt die Ports
konfigurieren, die ADC-Quelle auswählen und auch noch sofort das
Ergebnis liefern sollen... Das kann doch gar nicht funktionieren, der
ADC braucht doch auch seine Zeit zum arbeiten. Du erzeugst doch damit in
der ISR elend lange Busywaits. Und dabei ist es doch so einfach, etwas
vorausschauend zu planen...
Vom LCD-Zugriff möchte ich nicht reden, mit meinem LCD-Treiber ist das
kein Problem, der führt einen Bildschirmspeicher im SRAM, was die
Zugriffe extrem beschleunigt. An das LCD übertragen wird der Inhalt dann
byteweise in einem per Timer synchronisierten Job der Mainloop. Damit
darf ich dann auch in der ISR ganze Texte ausgeben, ohne dass ein
Timing-Problem entsteht. Aber das ist nun wieder eine andere Baustelle.
...
Danke für die kritische Antwort.
Ich beschäftige mich erst seit letztem August mit uC,daher sind mir
einige Dinge einfach noch nicht so klar.
Ich habe jetzt also die Befehle, die ich erst per rcall aufgerufen hatte
direkt in die "Schleifen" geschrieben und halte mich an die von dir
vorgeschlagene Reihenfolge.
Den ADC lasse ich dann also im Free Run laufen und kümmere mich nicht
mehr unbedingt um das Busy-Flag, richtig?
Mein Hauptprogramm ist ein Oszilloskop auf einem zweiten, grösseren
GLCD, wobei ich erst 255 Werte mit ADC speichere und danach auf dem GLCD
ausgeben lasse, usw, das funktioniert bis jetzt alles super.
Was würde jetzt passieren, wenn der "TouchADC" im Free Run anläuft, die
ISR
zurück springt und dann der Punkt kommt, wo ich die 255 Werte des
anderen Portpins über ADC hole und während dieser Zeit die Interrupts
sperre?
Kann ich dem ADC nach Start einer Wandlung eines Eingangs umschalten auf
Wandlung von zwei Eingängen?
Evtl über "laden ADC-Register -- setzen High für neuen Eingang ---
speichern in Register" ?
Schönes Wochenende wünsch ich euch!
Sven B. schrieb:
> Danke für die kritische Antwort.
Sorry, manchmal bin ich da recht direkt...
> Ich beschäftige mich erst seit letztem August mit uC,daher sind mir> einige Dinge einfach noch nicht so klar.
Das ist normal.
>> Ich habe jetzt also die Befehle, die ich erst per rcall aufgerufen hatte> direkt in die "Schleifen" geschrieben und halte mich an die von dir> vorgeschlagene Reihenfolge.
Das allein ist es nicht, das würde weiterhin Busywaits bewirken.
>> Den ADC lasse ich dann also im Free Run laufen und kümmere mich nicht> mehr unbedingt um das Busy-Flag, richtig?
Das wäre richtig, wenn der ADC sich nur um den Touch kümmern bräuchte.
Einfach das Abfrage-Intervall so hoch legen, dass darin mindestens zwei
Wandlungen erfolgen.
>> Mein Hauptprogramm ist ein Oszilloskop auf einem zweiten, grösseren> GLCD, wobei ich erst 255 Werte mit ADC speichere und danach auf dem GLCD> ausgeben lasse, usw, das funktioniert bis jetzt alles super.
Aha, dann ist ja der ADC bereits voll ausgebucht. Dann sollte man
unbedingt den ADC-Complete-Interrupt nutzen, um die maximale Samplerate
nutzen zu können und nebenher noch etwas Rechenzeit für andere Aufgaben
zu haben.
>> Was würde jetzt passieren, wenn der "TouchADC" im Free Run anläuft, die> ISR> zurück springt und dann der Punkt kommt, wo ich die 255 Werte des> anderen Portpins über ADC hole und während dieser Zeit die Interrupts> sperre?
Dies ist kein gutes Konzept. Wenn der ADC eine Quelle (also ohne
Quellen-Umschaltung) mit maximaler Samplerate abtasten soll, dann nutzt
man den ADC-Complete-Interrupt und liest die Messwerte in ein Array ein.
Die ISR wird dabei so kurz, dass die Mainloop nebenher noch andere
Arbeiten erledigen kann.
Übrigens halte ich den ADC des AVRs für etwas zu langsam für ein Gerät,
dass Oszilloskop genannt werden darf. Für einen Kanal kommt man nicht
viel höher als 15 kHz Samplerate (wenn man sich an das Datenblatt hält,
also den ADC-Takt nicht über 200 kHz wählt), bei zwei Kanälen ist es
dann nur noch 1/4 davon je Kanal, da ja die jeweils erste Messung nicht
so gut ist.
>> Kann ich dem ADC nach Start einer Wandlung eines Eingangs umschalten auf> Wandlung von zwei Eingängen?
Du solltest Dir im Datenblatt nochmal den Aufbau, die Arbeitsweise und
die Timingdiagramme des ADCs genauer ansehen.
> Evtl über "laden ADC-Register -- setzen High für neuen Eingang ---> speichern in Register" ?
Das verstehe ich jetzt nicht, ADC-Register ist doch readonly.
Falls Du Admux meinst, sicher kann man das ändern, aber bitte nicht
irgendwann während der Messung, sondern erst nach der Messung. Z.B. in
der ADC-ISR: Messwert holen und sichern, ADMUX auf nächste ADC-Quelle
einstellen, ADC wieder starten, im Hauptprogramm weiter arbeiten.
>> Schönes Wochenende wünsch ich euch!
Danke, Dir auch, die Sonne scheint ja bereits...
...
Hannes Lux schrieb:
> Übrigens halte ich den ADC des AVRs für etwas zu langsam für ein Gerät,> dass Oszilloskop genannt werden darf. Für einen Kanal kommt man nicht> viel höher als 15 kHz Samplerate (wenn man sich an das Datenblatt hält,> also den ADC-Takt nicht über 200 kHz wählt), bei zwei Kanälen ist es> dann nur noch 1/4 davon je Kanal, da ja die jeweils erste Messung nicht> so gut ist.
Off-Topic:
Ja, das war mir von Anfang an auch klar, deswegen bin ich gerade dabei,
eine kleine abgeschirmte Platine zu entwickeln, welche zwischen meine
Eingangsverstärkerschaltung und den uC gesteckt werden kann.
Hab dafür schon nen schnellen ADC von Maxim und schnelle RAMs liegen.
Ich versuche nur, mein Projekt Stück für Stück weiter zu entwickeln und
lerne dabei immer mehr dazu.
(Am Anfang blinkte nur eine Led, dann Text auf einem 2 Zeilen
Textdisplay, dann Punkte auf dem GLCD von Pollin, dann ADC einlesen mit
Poti, ausgeben Byteweise mit Umrechnung, ausgeben bitweise mit
Umrechnung auf 240x128, entwickeln und aufbauen einer Eingangsschaltung
mit Multiplexer zum V/Div einstellen und hoher Eigangsimpedanz,Messung
mit (für mich) maximal erreichbarer Samplerate, TOUCHBENUTZUNG,
schnelleres Messen,......)
Die Frequenz, welche bis jetzt mit einer kompletten Periode angezeigt
wird, liegt bei 2,5 kHz, das reicht fürs erste...
Sorry fürs Abschweifen... :-)
Ich stelle mir jetzt vor, dass ich den ADC für die Touchabfrage im Free
Run starte und sollte mein Oszi-ADC dazwischen kommen, wird in dessen
Unterprogramm der Touch-Schwellenzähler zurückgesetzt und meine 255
Werte werden geholt.
Dann würde die Berührung nur in diesem Fall verworfen und wenn sie NACH
dem OsziMessen kommt normal ausgewertet. Ist zwar nicht so elegant, aber
könnte evtl funktionieren, oder?
Später soll der interne ADC eh nicht mehr fürs Oszi genutzt werden und
es wird nichts mehr verworfen.
Was hältst du davon?
Mit dem ADC-Int hab ich noch nicht gearbeitet, werd mich da jetzt aber
mal ran machen, dann könnte ich das oben geschilderte evtl sein lassen.
In etwa würde das ganze dann so aussehen, oder?
Start
Intvektor ADC wählen
Intvektor Timer wählen
Hauptprogramm:
mach blabla
rjmp starte OsziADC
mach blabla
rjmp Hauptprogramm
starte OsziADC:
setze bit1 in Register XY ; Oszi ist am messen
st Z(ADCwahl), xy
admux xy
adsc
ADIF
ret
Timer-ISR:
Abfrage Z(ADCwahl) ; misst Oszi?
wenn ja, Abbruch
setze bit2 in Register XY ; Touch misst
st Z(ADCwahl), xy
Schwellenaktionen wie bekannt
adsc
adif
Abbruch:
reti
ADC-ISR:
ld XY, z(ADCwahl)
auswerten bit1 oder 2 set?
bit1: ; Oszi
Messwertzähler = 255 ?
wenn ja, Abbruch
st Z(OsziADC), ADCH
inc Messwertzähler, speichern
xxx
Abbruch:
reti
bit2: ; Touch
st Z(TouchADC), ADCH
xxx
reti
Allu schrieb:
> Nach dem Einschalten wird zur Kalibrierung ein Kreuz angezeigt, das in> der zu berühren ist. Danach folgen die 3 weiteren Ecken. Erfolgt eine> Fehlermeldung, ist der Touch sehr abweichend von meinen Exemplaren, es> werden dann Defaultwerte geladen und nach 5 Sekunden geht's weiter. Eine> erfolgreiche Kalibrierung wird im EEProm abgelegt.
Hi Allu,
ich versuche gerade die Z-Werte vom ADC in eine korrekte X/Y Positionen
für das Display umzurechnen.
Du hast ja in deinem Code den Touch kalibriert, ich habe versuch ASM zu
verstehen aber das gelingt mir nicht! :(
Kannst du mir bitte beschrieben wie die Kalibrierung funktioniert und
wie du die Umrechnung realisiert hast?
Vielen Dank!
Gruß MaXX
Hi MaXX,
mein Display habe ich in ein Raster mit 23 Zeichen mit 7 Pixel Breite
(x, 10 Pixel-Zeichen-Zeilenhöhe) und in 8 Zeichenzeilen (y) unterteilt.
Das ergibt 23 x 8 = 184 kleine Folientasten. Dafür ist die Berechnung
der Kalibrierung ausgelegt. Diese erfolgt in Bascom und wird im EEprom
abgelegt.
Was Du in ASM siehst, ist die Berechnung der Rasterkoordinaten und des
Rückgabewerts, wenn der Touch berührt wurde.
Der Touch läuft per Interrupt im Hintergrund. Mit dem habe ich nichts
mehr zu tun, außer in Bascom zu fragen, wurde eine Folientaste gedrückt
und welchen Rückgabewert hatte diese. Bei einer Zehnertastatur
bespielsweise ordne ich einfach den Tasten die Rückgabewerte "0" bis "9"
zu. Und dann kommt in Bascom die Frage, wurde eine Taste gedrückt und
wenn ja, welchen Rückgabewert hatte diese. Die x/y-Koordinaten brauche
ich also im meinem Auswerteprogramm überhaupt nicht.
Die Striche der Kreuze liegen auf der erster Pixelzeile des zweiten und
des letzten Zeichens, in X- und Y-Richtung. Kalibriert wird hier auf ein
Raster, da ich nicht auf dem Display malen will, sondern auf einfache
Art Tasten erzeugen möchte. Beispielweise generiert der Text (Return)
eine dünn umrandete Taste und [DEL] ein dick umrandete Taste.
Aber da hat ja jeder andere Ziele.
Gruß allu
Sven B. schrieb u. A.:
>> Ich stelle mir jetzt vor, dass ich den ADC für die Touchabfrage im Free> Run starte und sollte mein Oszi-ADC dazwischen kommen, wird in dessen> Unterprogramm der Touch-Schwellenzähler zurückgesetzt und meine 255> Werte werden geholt.
Dann würde ich die ADC-Zugriffe generell in einen Interrupt auslagern.
Um im Oszi-Betrieb mit unterschiedlichen Zeitachsen arbeiten zu können,
würde ich dann wieder den Timer-Int (Compare) benutzen. Da ja der Oszi
nicht kontinuierlich läuft, sondern einen "Schnappschuss" macht und
dabei den zur Verfügung stehenden RAM füllt, muss ja während des Scanns
der Touch nicht abgefragt werden. So kann per Merker entschieden werden,
ob die ISR den Messwert ins Oszi-Array schaufelt, oder den Touch
abfragt. Die Touchabfrage ist dann eben während des Scanns blockiert.
> Dann würde die Berührung nur in diesem Fall verworfen und wenn sie NACH> dem OsziMessen kommt normal ausgewertet. Ist zwar nicht so elegant, aber> könnte evtl funktionieren, oder?
Die Berührung würde ich während des Oszi-Scanns überhaupt nicht testen,
es gibt keinen Grund, den Scann abzubrechen. Für den Scann würde ich
auch den gesamten freien RAM nutzen (außer Variablen und Stack
natürlich), so dass man bei der Darstellung darin scrollen bzw. zoomen
kann.
> Später soll der interne ADC eh nicht mehr fürs Oszi genutzt werden und> es wird nichts mehr verworfen.> Was hältst du davon?
Ich halte nichts davon, mit einem AVR zwei verschiedene GLCDs mit
unterschiedlichen Controllern ansteuern zu wollen. Ich hatte auch mal
mit einem GLCD 320x128 mit T6963C und einem Mega32 herumgespielt, es
dann aber erstmal beiseite gelegt, weil andere Dinge anstanden.
Realisiert sind erstmal nur Life-Oszi (also kein Speicherbetrieb) mit
AVR-ADC mit nur einem Kanal und 8-Bit-Logic-Logger auf Event-Basis
(Loggen von Veränderung mit Zeitstempel) mit grafischer Darstellung
zoom- und scrollbar. Dazu sollte noch ein Speicher-Oszi und ein LA mit
einstellbarer Abtastrate kommen, mir ist aber auch irgendwie die Lust
vergangen, denn was Vernünftiges wird das sowiso nicht. Wenn Du mir eine
PM schreibst, kann ich Dir gern mal den bisher existierenden Code
schicken. Veröffentlichen möchte ich ihn nicht, dazu ist er zu schlecht,
es gibt in diesem Forum bedeutend bessere Umsetzungen von Oszi und LA.
Das Teil wird mittels zweier Drehgeber und einiger Taster bedient. Die
Touch-LCDs gab es damals noch nicht.
>> Mit dem ADC-Int hab ich noch nicht gearbeitet, werd mich da jetzt aber> mal ran machen, dann könnte ich das oben geschilderte evtl sein lassen.> In etwa würde das ganze dann so aussehen, oder?>>> Start> Intvektor ADC wählen> Intvektor Timer wählen
Naja, ich schreibe da nicht nur die benötigten Vektoren, sondern die
gesamte Sprungtabelle, denn ich mag keine Lücken im Code. Das ist aber
Ansichtsache.
>> Hauptprogramm:> mach blabla> rjmp starte OsziADC> mach blabla> rjmp Hauptprogramm>> starte OsziADC:> setze bit1 in Register XY ; Oszi ist am messen> st Z(ADCwahl), xy> admux xy> adsc> ADIF> ret>> Timer-ISR:> Abfrage Z(ADCwahl) ; misst Oszi?> wenn ja, Abbruch>> setze bit2 in Register XY ; Touch misst> st Z(ADCwahl), xy> Schwellenaktionen wie bekannt> adsc> adif> Abbruch:> reti>> ADC-ISR:> ld XY, z(ADCwahl)> auswerten bit1 oder 2 set?> bit1: ; Oszi> Messwertzähler = 255 ?> wenn ja, Abbruch> st Z(OsziADC), ADCH> inc Messwertzähler, speichern> xxx> Abbruch:> reti>> bit2: ; Touch> st Z(TouchADC), ADCH> xxx> reti
Naja, ich wäre mit diesem Konzept nicht glücklich. Aber ich möchte
diesen Thread nicht auch noch für ein Oszi-Projekt entführen.
...
Hallo MaXX,
genaueres zur Berechnung. Ursprünglich wollte ich noch eine mögliche
Verdrehung der Touchfolie gegen das LCD rausrechnen, hat sich aber bei
meinen Displays als nicht notwendig herausgestellt.
So konnte die Berechnung der Kalibrierwerte recht schlicht ausfallen.
Das Prinzip am Beispiel der X-Achse (im Programm werden jeweils 2 Werte
gemittelt, aber das ist hier erstmal egal).
Prinzip:
|<----------------------ADC-Wert------------------|
|<-ADC-Wert->|
| + + Kal-Kreuze|
| X_links X_rechts|
|<-1 Raster->|<-- -----------21-Raster----------->|<-1 Raster->|
|<------Displaybreite = 23 Zeichen (Raster / Folientasten)---->|
X_links und X_ rechts sind die entsprechenden Messwerte des ADCs.
Der Randabstand zum zweiten Zeichen ist (die Zählung beginnt bei 0):
X_1_pos = X_links ; erster Kalibrierwert
Um das berührte Rasterkästchen im Auswerteprogramm schnell ermitteln zu
können, ist der zweite Kalibrierwert so aufgebaut, dass im wesentlichen
eine Multiplikation und ein Division zur Bestimmung ausreichen. Um die
erforderliche Genauigkeit zu erhalten, wird bei X mit 1024 und bei Y mit
2048 multipliziert).
X_pro_spaltenbreite = 21 * 1024 / (X_rechts - X_links)
Zur Auswertung:
- der ADC liefert einen X-Wert, nennen wir ihn X_aktuell
- von X_aktuell wir der Randabstand abgezogen (X_1_Pos)
- ist das Ergebnis negativ, ist die Position 0 berührt worden
- war es positiv wird der verbleibene Rest mit X_pro_Spaltenbreite
(hardware)multipliziert und dann durch 1024 geteilt, Low-Byte ignorieren
und High-Byte 2 mal rechts schieben und plus 1 rechnen. Die X-Postion
des Rasterkästchens ist jetzt bestimmt.
- da je nach Touch auch mal ein Wert grösser als 22 herauskommen könnte,
wird das Ergebnis noch auf den Max-Wert korrigiert (Wertebereich 0-22 =
23 Zeichen je Zeile).
Mehr steckt nicht dahinter. Die Y-Richtung funktioniert genauso. Die
beiden Werte zeigen jetzt auf das errechnete Rasterkästchen. Damit wird
auf die Tabelle der Rückgabewerte zugegriffen (Form_tab) und der Wert in
F_Taste bereitgestellt. Die Tabelle der Rückgabewerte liegt im RAM, hier
schreibt man rein, was man bei der Berührung des entsprechenden
Rasterkästchen haben möchte. Jetzt wird noch das Flag Touch_meldet
gesetzt und fertig.
Was das LCD an dieser Stelle anzeigt, ist davon völlig unabhängig. Ob
eine Taste oder Text, Hauptsache es stimmt mit dem Raster überein.
Gruß allu
@allu
Danke für deine Erklärung, jetzt ist mir einiges klar!!!
Ich habe mal 4 Punkte auf meinen Touch gesetzt die ich angetippt habe,
dabei sind folgende Werte (siehe Bild) herausgekommen.
Kann das sein, oder mache ich hier evtl. etwas Grundlegendes in der
Ansteuerung falsch ?
MaXX
Chriz X. schrieb:
> ich habe mal 4 Punkte auf meinen Touch gesetzt die ich angetippt habe,> dabei sind folgende Werte (siehe Bild) herausgekommen.
X muss in Richtung von P1 nach P2 ansteigen, ok,
aber die Wertepaare gleichen Abstands von P1/P3 und P2/P4 weichen viel
zu stark voneinander ab.
Y muss in Richtung von P1 nach P3 ansteigen, falsch. Für mich sieht das
so aus, als würde nochmal die X-Richtung mit umgedrehter Polarität
gemessen werden.
Die Messwerte müssen sich anlog zu deiner Liste LCD(X) und LCD(Y)
verhalten.
Übrigens verwende ich nur die oberen 8-Bit des A/D-Wandlers, reicht für
meine Aufgabenstellung. Im Touchprogramm ist eine Entprellfunktion
integriert. Die Touchfolie wird nur für einige 100 usec während der
Messzeit angeschaltet, da diese doch recht niederohmig ist. Ob sich
damit die Werteabweichungen erklären lassen, weiß ich leider auch nicht.
Gruß allu
Alex D. schrieb:
> Chriz X. schrieb:>> ich habe mal 4 Punkte auf meinen Touch gesetzt die ich angetippt habe,>> dabei sind folgende Werte (siehe Bild) herausgekommen.>> X muss in Richtung von P1 nach P2 ansteigen, ok,> aber die Wertepaare gleichen Abstands von P1/P3 und P2/P4 weichen viel> zu stark voneinander ab.>> Y muss in Richtung von P1 nach P3 ansteigen, falsch. Für mich sieht das> so aus, als würde nochmal die X-Richtung mit umgedrehter Polarität> gemessen werden.> Gruß allu
Hm Display unterscheide ? bei mir ist es auch andersherum.
ALSO:
H->L
|
L
K. J. schrieb:
> Hm Display unterscheide ? bei mir ist es auch andersherum.>> ALSO:>> H->L> |> L
Geht auch, die Werte müssen halt per Software umgerechnet werden um
aufsteigende GLCD-RAM-Adressen zu erreichen. Man kann den Touch aber
auch gleich so anschliessen, dass es direkt passt.
Nur X und umgepolt X nochmal messen geht nicht. Da fehlt Y.
Gruß allu
Nun zeigt es mir den Wert für X nur noch in der linke Hälfte des LCD an,
in der rechten Hälfte erhalte ich permanent eine 1.
Und der Wert für Y wird mir nun in der oberen Hälte des LCDs angezeigt,
in der Unteren bekomme ich auch eine 1.
MaXX
Auch wenn ich selbst Bascom benutze, aber beim Touch?
Sag mal, was willst du eigentlich mit dem Touchwert anstellen? Malen,
Tasten basteln, Einzelpixel "antouchen" oder was sonst?
Gruß allu
allu schrieb:
> Sag mal, was willst du eigentlich mit dem Touchwert anstellen? Malen,> Tasten basteln, Einzelpixel "antouchen" oder was sonst?
Als erstes will ich es verstehen, dann malen und Tasten basteln.
Gruß MaXX
Zwei Vorschläge hätte ich noch (am Beispiel von X):
Chriz X. schrieb:
> Waitms 20 ' Wait until the port is stable> X = Getadc(1) ' Read the ad value for the y
ändern in:
X = Getadc(1)
X = Getadc(1)
Das sollte schneller und genauer gehen, da der ADC bei der relevanten
Messung bereits auf dem richtigen Eingang steht.
Chriz X. schrieb:
> X = 1024 - X ' Invert the reading
bedeutet, der Touch wird umgekehrt mit Spannung versorgt, aber wozu soll
das gut sein? Am Rande bemerkt, die größte Zahl des ADC ist 1023 und
nicht 1024.
Chriz X. schrieb:
> Config Pina.3 = Output ' Output> Reset Porta.3 ' Low>> Config Pina.2 = Output ' Output> Set Porta.2 ' High
dafür schreiben:
Config Pina.3 = Output ' Output
Set Porta.3 ' High
Config Pina.2 = Output ' Output
Reset Porta.2 ' Low
Gruß allu
hallo, hab mal eine frage und zwar habe ich das Touch so wie die
Schaltung von benedikt verdrahtet. Ich habe alle auf eine platine
gesetzt mit ISP-Programmer, wenn ich jetzt einen Atmega8 bespielen
möchte ( mit den richtigen Fuses) klappt das auch und das Programm läuft
super.
Jetzt kann ich aber kein 3. mal den Controller bespielen, ich kann nich
mehr auf ihn zugreifen, auch nich auf ner anderen platine. Ich habe so
schon 4 Atmegas geschrottet oder kan nich mehr zugreifen.
Was mache ich verkehrt? Wo liegt mein Fehler ?
Ich sehe grade weiter ob folgenden beitrag:
falls du einen billig-programmer am com-port des pcs benutzt. dann
solltest du mal den transistor fuer die reset-steuerung checken, hier
ist ein exemplar mit recht hoher stromverstaerkung erforderlich.
Welchen transistor sollte ich denn verwenden? ixh habe jetzt BC 547B
drin.
@Klaus
da der AVR auf internem Takt laufen muss kann es nicht sein das CKSEL 3
gesetzt ist, denn dann musst du einen Quarz anschließen, oder zum
wiederbeleben einen externen Takt.
warum verstellst du die FUSE's wenn er läuft wie er soll??
Sascha
ich habe die fuses vorher vestellt und dann lief der und dann wollte ich
noch ne andere software draufbügeln aber danach geht nix merh bei allen
4 atmegas war das so.
Im Anhang noch mal die Fuses also häkchen heisst unprogrammed.
Also es läuft solange, bis ich ein neues Programm aufspiele und danach
geht dann nix mehr.
Und ich habe nur die hier aus dem Forum genommen, die auf laufen.kann es
sein das sich das Display und Isp gleichzeitig nicht verstehen?
Klaus schrieb:
> Also es läuft solange, bis ich ein neues Programm aufspiele und danach> geht dann nix mehr.
lief zuvor schon das Programm fürs Display ?
> kann es> sein das sich das Display und Isp gleichzeitig nicht verstehen?
das kann schon sein - ich hab in der Testschaltung das Display zum
programmieren jedenfalls nicht angeschlossen gehabt da ich dort keinen
ISP-Stecker dran hatte.
Sascha
ja also das Programm lief vorher einwandfrei.
Ich habe jetzt den letzten atmega mal immer auf nem exteren board
programmier und jetzt scheint das zu funktionieren. Dann lag das wohl
doch am ISP und gleichzeitigem Display
totzdem danke für die Antworten
So nun hab ich doch noch mal eine frage und zwar benutze ich den ersten
Code von benedikt, wo es nur um das text Display geht und nun wollte ich
die Schrift kleiner machen, damit ich mehr zeilen bekommen.
Welchen Ansatz muss ich da nachgehen?
Kleiner machen geht nicht wirklich, wenn es gut lesbar bleiben soll. Die
Zeichen sind 7 Pixel hoch. Ein Pixel Zwischenraum = 8. Das Display ist
80 Pixelzeilen hoch, ergibt maximal 10 Zeichenzeilen.
Aber enger schreiben geht, maximal 26 Zeichen je Zeile sind möglich.
Gruß allu
Moin Moin,
ich würde gerne wissen, ob es schon Ideen bzw. Ansätze gibt, wie man es
schaffen kann, damit man mit diesem Touchscreen auch etwas steuern kann.
Wie z.B. ein Relais. Weil wenn ich diesen Thread richtig verfolgt habe
gibt es soetwas leider noch nicht.
Wenn es bis jetzt noch keine Sourcecodes dafür gibt, könnte mir jemand
vielleicht einen Denkanstoß geben in welche Richtung ich mir Gedanken
machen muss. Bin was Controller angeht noch recht neu auf dem Gebiet
also bitte nicht gleich verbal niedermachen.
MfG
Julius
Wieso soll das nicht gehen?
Du malst Dir mit den bisher bekannten Routinen eine Benutzeroberfläche.
Du nutzt den Touch, um Eingaben zu machen.
Die Eingaben werden dem Hauptprogramm gemeldet und haben Koordinaten.
Nun liegt es an Dir, die Koordinaten auszuwerten, also den Buttons der
Oberfläche zuzuordnen und die entsprechenden Schalthandlungen
auszuführen.
Das ist im Prinzip nichts Anderes, als wenn Du Tastendrücke auswertest
und in Abhängigkeit davon Portpins setzt. Oder als wenn Du über eine
Schnittstelle (UART, I²C, SPI, ...) Kommandos empfängst, auswertest und
in Abhängigkeit davon Schalthandlungen auslöst.
Und wenn Du betreffs Controller noch "neu" bist, dann solltest Du
erstmal kleinere Brötchen backen, ehe Du Dich mit einem Grafik-LCD mit
Touchscreen beschäftigst. Das ist jetzt kein "Niedermachen", sondern ein
gut gemeinter Rat. Man schreibt auch keine Romane, ehe man das Alfabet
gelernt hat. Es ist immer vorteilhaft, wenn man versteht, was man tut.
Und dabei ist es hilfreich, etwas kleiner anzufangen und sich das Wissen
Schritt für Schritt anzueignen.
...
Hallo Hannes,
danke für den Tipp.
Das ist schon richtig das man eigentlich am Anfang besser mit den
kleinen Brötchen anfangen sollte, aber ich versuch mich gerne an großen
Sachen um so größer ist hinterher auch die Freude.
Zumindest habe ich es geschafft mittels Touch meine LED auf dem
Testboard An/Aus zu schalten, Dank deines Denkanstoßes. Ob das so wie
ich das gemacht die beste Art und Weise ist das sei mal dahin gestellt,
zumindest freue ich mich über den kleinen Erfolg. Danke für Eure Hilfe
ich hoffe ich kann weiterhin darauf zurück greifen.
Hallo,
im Anhang befindet sich ein Code hier aus dem Forum, den ich umgeändert
habe auf meine Schaltung und wo ich die lcd lib von Benedikt eingefügt
habe.
In Main habe ich einen Buttom programmiert und dann einen Schriftzug
einblenden lasse, wenn das touchg irgendwo berührt wird.
Wie kann ich jetzt nur die koordinaten des Buttoms abfragen, damit nur
etwas passiert, wenn auch der button berührt wird?
Könnt ihr mir helfen ? hier noch mal der Ausschnitt:
hallo habt ihr schon was rausgefunden wegen dem Erkenn, wo genau
gedrückt wurde, um verschiedene Tasten nauswerten zu können ??
Wäre auch an sowas interessiert und probiere schon länger rum aber meine
Kenntnisse sind nich so gut deswegen gabs noch keine fortschritte...
Gruß Thomas
Also warum fragt ihr nicht einfach ab ob ihr an der Stelle seit wo ihr
den Button gesetzt habt ?
Klaus schrieb:
> lcd_gotoxy(28,24);> lcd_writestringP(PSTR("Button"));
Hier habt ihr doch die Stelle wo der button ist!
Also fragt ihr einfach das Touch ab und errechnet dann ob ihr an der
Stelle seit wo der button liegt !!
greetz. Oliver
Also ich löse das ganze anderst, im Moment arbeite ich nämlich an einer
TouchScreenButton Steuerung...
Ich mache folgendes.. ich kreiere Buttons die eine von mir festgelegte
maxhöhe sowie maxbreite haben, dazu kommen noch die Koordinaten.
Wenn ich also jetzt den Button definiert habe, nennen wir ihn Button1
werde ich in der Hauptschleife die Buttons auslesen, das geschieht in
einer Schleife.
Dazu frage ich jeweils das Touchscreen ab, speichere die X,Y Koordinaten
in einem Strukt und vergleiche dann ob die Koordinaten in dem Bereich
des Buttons liegen.
Das dürfte ungefähr so aussehen.
!!!!!!!!!ACHTUNG: KEIN VOLLWERTIGER CODE NUR GEDANKENGÄNGE !!!!!!!!
1
charnum_buttons;//ButtonNummerierung
2
3
// Buttons initialisieren
4
voidbutton_init(void)
5
{
6
num_buttons=0;// Buttons am anfang zurücksetzen oder falsch gewünscht später aus dem EEProm auslesen ?
structPoint*coords;// Koordinaten in ein Strukt schreiben
29
30
for(inti=0;i<num_buttons;i++)
31
{
32
coord=Touchauswertungsprogramm;// Hier muss erst X und danach Y ausgelesen werden da beide werte in das Strukt geschrieben werden !!
33
34
// Koordinaten abfragen.
35
1.if*coordsx>buttonxkoordinate&
36
2.if*coordsx<buttonx2koordinate&
37
3.if*coordsy>buttonykoordinate&
38
4.if*coordsy<buttony2koordinate
39
40
// Dann führe Programm denn Button wurde innerhalb seiner Größe gepushed.
41
button[num_buttons].on_press();
42
return
43
}
Hauptprogrammteil dürfe ungefähr so aussehen:
1
//initteil
2
button_init();
3
4
while(1)
5
{
6
button_poll();
7
add_button(0,0,96,29,hochgrafik,funk_hoch);
8
9
// So könnte eine Funktion aussehen die aufgerufen wird:
10
voidfunk_hoch(void)
11
{
12
// Bewege z.B Servo nach Rechts (hoch) !
13
}
! Wie gesagt sind nur Ideen von mir, welche ich im Moment umsetze, wenn
ich was fertiges habe werde ich es hier natürlich präsentieren !!
Greetz Oliver
OHA, Das sieht doch schon ganz schön komplex aus. Funktioniert das denn
schon bei dir??
Vll wäre es auch gut, wenn man die Buttons schon vordefiniert und sie
nur an bestimmte stellen plazieren kann z.B. nur links oder rechts vom
Touch also an dafür festgelegte Stellen oder so ^^ wäre jetzt mein
erster Gedanke.
Bin auch sehr an sowas interessiert. Kannst dich ja mal melden:
ThomasH89@gmx.de
gruß
Thomas schrieb:
> OHA, Das sieht doch schon ganz schön komplex aus. Funktioniert das denn> schon bei dir??
Also im Moment funktioniert das Button - anlegen, -löschen, -pushen
schon einigermaßen,allerdings habe ich keine passenden grafiken um sie
darzustellen. Deshalb ist es bei mir einfach nur ein TEXT welchen ich
dann verarbeite.
Thomas schrieb:
> Vll wäre es auch gut, wenn man die Buttons schon vordefiniert und sie> nur an bestimmte stellen plazieren kann z.B. nur links oder rechts vom> Touch also an dafür festgelegte Stellen oder so ^^ wäre jetzt mein> erster Gedanke.
Also meine Idee ist, einfach die "buttongrafik" genau an meine Stelle zu
setzen welche ich vorgebe:
Oliver schrieb:
> // Button malen> void button_add(height,width,x,y,bitmap,funktion die aufgerufen wird wenn >gepushed wird(*push))> {>> //Buttongrafik aus dem flash laden und zeichen> button_bitmap(bitmap,x,y,width,height);>> // Button zur Buttonliste hinzufügen> button[num_buttons].on_press = push;> button[num_buttons].x1 = x ;> button[num_buttons].y1 = y;> button[num_buttons].x2 = x + width;> button[num_buttons].y2 = y + height;> num_buttons++;> }
Per -X, -Y Koordinaten übergebe ich den Startpunkt, an dem die Grafik
anfangen soll (Kann diese also beliebig platzieren !!
Vielleicht hat ja jemand lust kleine Grafiken zu zeichnen welche passend
für die Größe des Displays sind, dann kann ich schauen dass ich eine
passende Grafikausgabe programmiere.
Greetz Oliver
Mist Hatte ne falsche Email-Adresse angegeben, meine ist
ThomasH89@gmx.net
sonst schreib mir mal deine dann melde ich mich mal wäre dann
interessiert eventuell ein wenig an deinem Projekt
mitzuwirken............
Hallo,
also die Auswertung von Schaltflächen mache ich auch wie von Oliver
vorgeschlagen - allerdings in ASM.
Im Anhang mal eine Exceldatei die ich mir zum testen gebastelt habe.
Man kann dort mal malen und sich die Grafikdaten ausgeben lassen.
(hier als ASM-Code, ab mit ein bisschen VBA sollte das auch für C
machbar sein)
In meiner Originaldatei hab ich noch ein paar Funkionen eingebaut, die
über die RS232 auch den Transfer der Excelansicht auf das Display
erlaubt - passende Software auf dem Controller vorrausgesetzt.
Sascha
Oliver schrieb:
> Vielleicht hat ja jemand lust kleine Grafiken zu zeichnen welche passend> für die Größe des Displays sind, dann kann ich schauen dass ich eine> passende Grafikausgabe programmiere.
An was hast du da denn gedacht aus deinem Code kann man entnehmen, dass
du das für servos nutzen möchtest. Also eher sonne Cursortasten in alle
Richtungen oder welche Grafiken /Darstellung hast du dir so gedacht??
Gruß
Stefan Feismann schrieb:
>An was hast du da denn gedacht aus deinem Code kann man entnehmen, dass>du das für servos nutzen möchtest. Also eher sonne Cursortasten in alle>Richtungen oder welche Grafiken /Darstellung hast du dir so gedacht??
Also ich würde sagen wir können ja einfach mal ein paar
Cursortasten,Zahlen, vielleicht Statussymbole (Kreis welcher einen
kleinen gefüllten Kreis innerhalb hat für aktiviert und ein einfacher
Kreis für inaktiv) gebrauchen.
Buttons allgemein mit Text kann jeder sich selber anpassen, gibt es hier
nicht iwo im Forum ein Programm welches aus bmp dateien direkt
headerfiles erstellt ?
Ich möchte nicht nur Servos ansteuern, dies war jetzt nur ein Beispiel
welches ich im Quellcode veranschauliche.
Ich möchte eine komplette Steuerung damit erledigen.
Im Moment scheint alles recht zügig zu funktionieren, den Quellcode
werde ich schon bald hier online stellen, wobei hier zu sagen ist dass
alles noch ziemlich BETA Status hat denn ich habe ja noch keine
GrafikPlitt Funktion um Buttons oder ähnliches anzeigen zu können.
Hoffe das wir demnächst hier was ausarbeiten können, vielleicht kann ja
jemand eine GrafikPlott Funktion im Ansatz ausarbeiten, ich verwende ja
die lcd lib von Benedikt! Vielen Dank nochmal dafür !
Greetz Oliver
Ich mach mich morgen mal dran einfache Cursortasten zu erstellen ich
will hoffen das das alle klappt.
ich erstell die in paint und speicher die dann als .bmp und dann kann
man die ja in sonem anderen Programm kleiner machen, etc ich stell
einfach mal was on und guck ob du damit was anfangen kannst.
Also mein ertser gendanke wäre jetzt so ein cursor ^^...............Hab
mal den Cursor Oben mit dem Programm LCD-Assistant verkleinert und so
aber irgendwie kann man das dann nich mehr angucken weiß auch nich weiß
jemand womit oder wie man die passend umwandelt ??
Stefan Feismann schrieb:
> Also mein ertser gendanke wäre jetzt so ein cursor ^^...............Hab> mal den Cursor Oben mit dem Programm LCD-Assistant verkleinert und so> aber irgendwie kann man das dann nich mehr angucken weiß auch nich weiß> jemand womit oder wie man die passend umwandelt ??
Also ich würde das mal mit "Image2Code" probieren, google einfach mal
danach.
Habe im Moment leider nicht die möglichkeit das selber zu testen da ich
nicht zuhause bin und meine Hardware vorliegend habe !
Habe in einem anderen Forum gelesen, dass der dortige User erfolgreich
grafiken damit konvertiert hatte, allerdings beschreibt er dass man die
Einstellung "3" nehmen sollte da es bei den anderen nicht richtig klappt
bzw der dort extrahierte Code anscheinend problematisch zu sein scheint.
Habe mir deine Cursorgrafik angeschaut, sieht wirklich gut aus damit
könnte man wunderbar ein nettes Steuerungsmenü basteln um z.B. eine
Rolladensteuerung zu ermögliche oder ähnliches !!
Greetz Oliver
Ok hab da mal was probiert it dem Programm. Jetzt ist ein Cursor 30 x 30
Pixel groß muss mal jemand ausprobieren, ob das so geht im Anhang das,
was das Programm mir ausgespuckt hat ^^
@ Sascha Weber:
Ich habe mir mal deine MacroExcelDatei angeschaut und bin absolut
begeistert.
Das hast du wirklich genial hinbekommen.
Im großen und ganzen ist es eigentlich kein Unterschied ob dein Programm
die Tabelle für ASM ausgibt oder für C.
Man könnte ganz einfach "Symbole" zeichnen, die .db als Array
umportieren und somit schöne "Grafiken" auf dem Display basteln.
Ich werde mal mit deiner ExcelDatei rumspielen und mal schauen was sich
da so machen lässt, vielleicht ist deine Lösung für einfache Sachen
leichter als ständig das ganze in Paint oder Photoshop in der passenden
Größe zu zeichnen und anschließend mit einem Konvertierungsprogramm in
hexwerte für Mikrocontroller umzuwandeln.
Ich werde hoffentlich im laufe dieser Woche richtig Zeit haben um mich
intensivere mit der Display & Grafikausgabe zu beschäftigen.
Dann kann ich auch mal deine gebastelte Grafik mir anschauen welche du
uns netterweise im Anhang dagelassen hast xD.
Greetz Oliver
@ Oliver
hast du schon was erreicht mit deiner grafikausgabe und hat das mit
meinem erzeugten code geklappt, dann werde ich die anderen teile des
Cursors noch online stellen..........
Schönen Abend noch
Hm
Hi hab hier grade 2 frische von pollin bekommen die mit den weisen
streifen am Touchscreen und invertierender HG-Beleuchtung.
Kann es sein das es da auch nochmal unterscheide gibt, hab hier 3
unterschiedliche die alle mit der gleichen Ansteuerung laufen nur die 2
neuen scheinen eine andere Config zu haben.
ist da was bekannt ?
Sebastian R. schrieb:
> @ Hannes Lux:> Kannst du mal das Layout von deinem Testboard hier einstellen?
Yea, I can...
Nur das Layout??? - Oder auch den Schaltplan? ;-)
Ist natürlich nicht professionell gemacht, war ja nur für einmaligen
Tonertransfer gedacht.
...
Hm, bekomme es nicht hin merkwürdig bei den anderen Displays geht es mit
folgender INIT, bei den 2 neuen nicht glaub auch nicht das die defekt
sind reagieren beide gleich und zeigen auch was an nur halt nicht
richtig.
Un hab die Rückseiten verglichen konnte da keine unterscheide
feststellen scheint aber ne andere Charge zu sein weil die diesmal ohne
Pinheader wahren.
Hannes Lux schrieb:
> Sebastian R. schrieb:>> @ Hannes Lux:>> Kannst du mal das Layout von deinem Testboard hier einstellen?>> Yea, I can...>> Nur das Layout??? - Oder auch den Schaltplan? ;-)>> Ist natürlich nicht professionell gemacht, war ja nur für einmaligen> Tonertransfer gedacht.>> ...
Vielen Dank, dann kann ich das als Grundlage benutzen und ein bischen
erweitern (ISP-stecker usw.)! :-)
Sebastian R. schrieb:
> Vielen Dank, dann kann ich das als Grundlage benutzen und ein bischen> erweitern (ISP-stecker usw.)! :-)
ISP-Stecker brauche ich nicht, den stülpe ich einfach von oben auf den
Controller drauf, die Controllerpins sind dabei der Steckverbinder...
;-)
...
Thomas Forster schrieb:
> @ K. J.>> ich benutze folgende init-Werte:>> Adresse wert>> 0 32> 1 0x77> 2 19> 3 79> 4 7>>> Thomas
Hm, klappt leider auch nicht irgendwie scheint da was komplett anders zu
sein, die anderen Displays laufen auf der Schaltung aber kann ich nicht
verwenden da die diesen komischen Folienleiter haben den man nicht löten
kann.
Hallo,
möchte mal die hintergrundbeleuchtung ausprobieren und hab da auch schon
einen Inverter bei reichelt gefunden mit 12V Eingang und 100V Ausgang
aber dann mit 800Hz ist das schlimm oder funktioniert das auch mit 800Hz
weil im Datenblatt steht ja was von ca 500Hz??
@ Oliver
Wie weit bist du denn mit deiner Grafikausgabe schon gekommen ??
Thomas schrieb:
> @ Oliver> Wie weit bist du denn mit deiner Grafikausgabe schon gekommen ??
Sry Leute dass ich im Moment fast nix von mir gebe, ich habe im Moment
mit nun noch 3 Abi-Vorklausuren zu kämpfen welche vorraussichtlich mitte
nächster Woche vorbei sind, dann schätze ich kann ich mich endlich
wieder ein bischen mehr mit diesem Thema beschäftigen.
Leider kommt noch erschwerend dazu, dass ich nun auf meine neuen
Displays warten muss da mein altes mitsamt dem Atmega kaputt gegangen
ist (Defektes Netzteil,hatte ziemlich Glück dass nur die Teile an der
etwas stark erhöhten Spannung hingen !!!).
Offtopic:
Werde wohl nie wieder ein Voltcraft Labornetzteil gebraucht kaufen,
hatte zwar nun fast 1 Jahr perfekt seinen Dienst vollrichtet, allerdings
jetzt scheint es irgentwie plötzlich die Vollmeise zu bekommen !!!
Zurück zum Text..
Ich habe mir mal gedanken um die Grafikausgabe gemacht, hatte mir da
auch anregung von dem Roboternetz-Code geholt, die dort entwickelte
Grafikausgabe ist ja echt buggy... aber "eigentlich" einfach gelöst..
Wer Lust hat, kann sich diese mal schnappen und mal testen,ich meine
damit schonmal halb erfolgreich (GUTE AUSSAGE xD) einen Button gemalt
(plaziert) bekommen zu haben !!!
Also wenn ich wieder richtig Zeit habe, werde ich hier natürlich wieder
aktiver mitwirken und dann auch mal meinen Code veröffentlichen !!
Bis dahin..
Greetz Oliver
Hallo Leute,
entschuldigt, dass ich euch mit einer neuerlichen Frage zu den
Grafikdisplays stören muss, aber hier liegen drei Stück herum, die ich
beim besten Willen nicht abgesteuert bekomme. Ich habe das Sanyo- und
das Hitachi-Datenblatt durch und brüte nun zwei Tage an der blöden
Initialisierung.
Noch dazu arbeite ich lieber mit assembler und da sind die Codebeispiele
nicht so reichlich zu finden.
Mein aktueller Status:
- Flash-Upload klappt, Fuses sind alle richtig gesetzt, der Prozessor
(ATMega32) läuft mit 16 MHz. Mein Portmapping schaut so aus:
PORTC PC0..PC7 : DB0 .. DB7
PORTA PA0: RS; PA1: R/W; PA2: EN; PA3: !CS; PA4: RST
- Das Display bleibt hängen wie beim power-up, mal mit vertikalen
Streifen, mal komplett leer.
Bin ich jetzt total bescheuert oder total blind? Ich habe auch das
timing so langsam gemacht, damit ich mir um die set-up und hold -Zeiten
keine Sorgen machen muss, aber irgendwie tut sich nichts. Den "Einfach
mal draufbrennen und es tut"-Code scheint ihr hier nur für den ATMega8
ausgeheckt zu haben :(
Danke schonmal für die Hilfe!
hboy
es ist natürlich
.equ LCD16080_CS = 3 ; display Pin15
.equ LCD16080_RST = 4 ; display Pin16
da stimmen die Kommentare nicht.
Ich habe die Pinbelegung schon nachgeprüft (Pins mit pulsfolgen belegt
und am Display nachgemessen)
Thomas Forster schrieb:
> Mein Display sieht genau so aus wie deines, mit den lötbaren> Anschlüssen.> Bei mir funktionierts.> Ist dein enable-Impuls lang genug?>> Thomas
Hi thx für die Antwort hab den Fehler mittlerweile gefunden schuld ist
der ICSP die internen pulups dessen ziehen die dl auf 3v runter und das
Display erkennt kein high mehr.
@hboy007
also wenn man schon in ASM programmiert dann nicht unbedingt einen
Compiler nachahmen.
im Macro "LCD16080_Write" legst du die zwei Werte auf den Stack, dann
ein call auf "_LCD16080_Write" macht wieder 2Byte auf dem Stack.
und - was liest du nun im Unterprogramm mit deinen 2 Pop's aus??
Sascha
@hboy007
LCD16080_ToggleENA: ; refer to datasheet
rcall WAIT_10us
sbi LCD16080_BITS, LCD16080_ENA
rcall WAIT_10us
sbi LCD16080_BITS, LCD16080_ENA
rcall WAIT_10us
ret
Sollte das zweite sbi nicht besser ein cbi sein, um Enable zu toggeln.
Thomas
hoppla, das sbi ist da beim Aufräumen durch copy&paste reingerutscht
(da standen vorher Port und Bitnummer). Ich habs repariert und getestet,
geändert hat diese Selbstverständlichkeit leider noch nichts.
In der Zwischenzeit habe ich auch das Display mal gewechselt, falls das
vorherige wider Erwarten über den Jordan gegangen sein sollte.
Die Aufrufkonvention war ein kleines Experiment dem Interesse halber,
aber ich bin mit dem Overhead auch nicht zufrieden :-)
Ok, es tut noch immer nicht, aber ich habe nun den Grund gefunden: PortC
2..5 liefern keinen Strom. Ich hoffe nur, dass das nicht aufgrund der
bidirektionalen Kommunikation mit dem Display zustande kam.
Mit Pull-Up-Getrickse konnte ich auch keine Daten senden... schade.
Vielen Dank!
Ich benutze AVRdude erst seit ein paar Tagen, es lag an dem jtag fuse
bit. Nun läuft der Textmodus, Grafikmodus dürfte auch kein Problem sein.
Ich hätte eine Frage bezüglich der Initialisierung:
RST ist im Prinzip überflüssig, wenn ich lese, was im Datenblatt steht.
Gibt es Fälle, bei denen man !CS ändern müsste? Ansonsten kann man sich
diese beiden Leitungen sparen und alles läuft bequem über eine
Parallelport-Schnittstelle (ich arbeite gerade mit dem NET-IO Board von
Pollin).
hboy007
hboy007 schrieb:
> Gibt es Fälle, bei denen man !CS ändern müsste?
Ja, die gibt es. Ich betreibe 2 Displays an einem ATMega32. Bis auf die
CS-Pins ist alles parallel geschaltet. Ausgewählt wird mit 2 Portpins.
Übrigens hat die Samsung-Variante des Pollin DG16080 32KByte an Board.
Wenn man 3 zusätzliche Drähte reinbastelt, ist der Speicher verwendbar
und man kann wunderschön durch ändern der Displaystartadresse die Seiten
umschalten.
Gruß allu
Hey Leute, heute kam endlich mein erwartetes Päckchen, zwei neue
Displays(Samsung) sowie reichlich kleinkram !
Und ich habe endlich mal ein paar Atmega32 mehr gekauft, wer weiß was da
noch so alles kaputt gehen wird !!
Werde hoffentlich nächste WE dann anfangen die Software einigermaßen auf
vordermann zu bringen um sie dann hier zu veröffentlichen !!
Alex D. schrieb:
> Übrigens hat die Samsung-Variante des Pollin DG16080 32KByte an Board.> Wenn man 3 zusätzliche Drähte reinbastelt, ist der Speicher verwendbar> und man kann wunderschön durch ändern der Displaystartadresse die Seiten> umschalten.
Könntest du das mal genauer beschreiben, das klingt verdammt interessant
!
Hast du auch Codebeispiele und vorallem wofür nutzt du diese Technik ??
Bis dahin,
Greetz Oliver
Danke für die Info. Ich werde nun RST über Bord werfen. Um Die Portzahl
zu begrenzen, werde ich eine 8-fach d-latch an den Datenbus hängen und
dessen Clock an !CS klemmen, damit kann ich die Speicherseite durch
Pulsen von !CS setzen.
Von Vorteil ist dies, wenn man Animationen mit minimalem Rechenaufwand
erzeugen möchte, da man nach Duplizieren der frames nurnoch in einem
timer interrupt die Speicherseiten durchzappen muss :-)
hboy007 schrieb:
> Von Vorteil ist dies, wenn man Animationen mit minimalem Rechenaufwand> erzeugen möchte, da man nach Duplizieren der frames nurnoch in einem> timer interrupt die Speicherseiten durchzappen muss :-)
Du meinst layer Funktion ? des wehre natürlich interessant, meins leuft
grade im mischbetrib also text und grafig und dafür wer des ganz nett
neu initialisieren Grafik nach vorne holen und andersherum mit dem
textmode das gleiche.
Oliver schrieb:
> Könntest du das mal genauer beschreiben, das klingt verdammt interessant> !
Der LC7981 könnte das 32KByte-RAM komplett ausnutzen, leider sind aber
die drei Ausgänge MA12 bis MA14 nicht mit dem RAM verbunden. Ich habe
die Pins A12 und A14 am RAM abgelötet und hochgebogen und vor Pin A13
die Leiterbahn durchtrennt und dann mit dünnen Drähten mit MA12, MA13
und MA14 des LC7981 verbunden. Allerdings nicht so wie die Wertigkeiten
im Datenblatt stehen, sondern wie es am besten zu löten war. Aber das
ist für die Funktion egal.
Oliver schrieb:
> Hast du auch Codebeispiele und vorallem wofür nutzt du diese Technik ??
Damit möchte ich einige Dinge im Haus überwachen, wie Türen,
Rauchmelder, Temperaturen usw. und vielleicht auch mal eine Lampe
schalten. Im oberen Display sind auf den ersten 4 Seiten die Grundrisse
von Keller, Erdgeschoss, 1.Stock und Dach gespeichert.
Im Moment schicke ich die Displaystartadresse noch "zu Fuss" zum
Display.
Gruß allu
Do
If Touch_meldet = Ja Then
Select Case F_taste
Case "K" : Gosub Keller
Case "U" : Gosub Eg
Case "O" : Gosub Og
Case "D" : Gosub Dach
End Select
Touch_meldet = Erledigt
End If
Loop Until F_taste = _menue
Gosub Auswahl
Return
Keller:
Lcd_select = 2
Command = &H08 'Befehl: Display Start Low
Datenwert = &H00
Gosub Zum_glcd
Command = &H09 'Befehl: Display Start High
Datenwert = &H00
Gosub Zum_glcd
Lcd_select = 1
Return
usw.: Eg: ..... Og: ...
Dach:
Lcd_select = 2
Command = &H08 'Befehl: Display Start Low
Datenwert = &H80 '
Gosub Zum_glcd
Command = &H09 'Befehl: Display Start High
Datenwert = &H16 '
Gosub Zum_glcd
Lcd_select = 1
Return
@Alex D.
Vielen Dank für die Informationen, das ist ja wirklich genial...
Ich ändere die Adresse, schreibe mein Bild rein, nächste Adresse,
nächstes Bild....
Gibt es dort festgelegte ADR Bereiche oder sind die dynamisch (wie hast
du die Anfangsadressen gewählt) ???
Ich habe eigenlich so etwas ähnliches vor, allerdings wollte ich die
"grafiken" von einer SD Karte holen und dann ausgeben.. wobei ja jetzt
deine Möglichkeit das ganze noch erheblich vereinfachern würde !!
Ich sehe auf deinem Bild dass du zwei Displays mit einem Inverter am
laufen hast.... ich habe den Inverter vom großen C... der sackt mir
leider ein bischen ein wenn ich das zweite Display mit anschließe..
Mal jetzt ne ganz blöde frage nebenbei...
Ich würde gerne den Atmega32 unter das Display setzen
(Platinentechnisch).
Oberhalb des Displays sollen die Anschlüssen sowie der Inverter und das
Kontrastpoti hin... Stört zufällig der Inverter vielleicht irgentwelche
Sachen vom Display oder Controller ?
Vielleicht kommt später noch ein RFM12 Modul dazu, ich denke spätestens
dann wird es mit dem Inverter Probleme geben... Hoffe nur dass die zwei
Leiterbahnen unter dem Display (welche aber mit Massefläche rundherum
versehen sind) nicht auf das Touchscreen streuen !!!
Vielleicht kann mir einer diese kleine Frage netterweise beantworten..
Greetz Oliver
Oliver schrieb:
> Gibt es dort festgelegte ADR Bereiche oder sind die dynamisch (wie hast> du die Anfangsadressen gewählt) ???
Der Controller selbst kennt keine festgelegten Bereiche. Im ersten
Schritt habe ich mal Seiten verwendet. Initialisiert wird das Display im
Grafik Mode mit 23 Zeichen (nur gerade Adressen = 24 Byte) je
Pixelzeile, ergibt einen Speicherbedarf von:
24 Byte/Pixelzeile * 80 Pixelzeilen = 1920 Byte (Hex 0780)
Start: Seite_0 = 0, Seite_1 = 1920, Seite_2 = 3840, Seite_3 = 5760 (Hex
1680). Man könnte aber auch um 24 erhöhen um pixelzeilenweise zu
scrollen.
Oliver schrieb:
> Ich sehe auf deinem Bild dass du zwei Displays mit einem Inverter am> laufen hast.... ich habe den Inverter vom großen C... der sackt mir> leider ein bischen ein wenn ich das zweite Display mit anschließe..
Der Inverter liefert nur etwa 80 V, reicht aber für den "Nachtbetrieb".
Oliver schrieb:
> Ich würde gerne den Atmega32 unter das Display setzen> (Platinentechnisch).
Gute Idee, ist in meinem Versuchsaufbau auch so (unter dem oberen
Display). Dadurch lässt sich der B-Port kreuzungsfrei mit dem
Display-Datenbus verbinden. Und hat den weiteren Vorteil, dass man
gleich den Programmieradapter parallel mit anschliessen kann.
Vorsichtshalber hat noch jeder !CS einen 22kOhm-Pullup. Funktioniert mit
meinem AVR ISP MK II problemlos.
Oliver schrieb:
> Stört zufällig der Inverter vielleicht irgentwelche> Sachen vom Display oder Controller ?
Da habe ich noch nichts bemerkt.
Oliver schrieb:
> Vielleicht kommt später noch ein RFM12 Modul dazu
Da das Ding etwas sinusähnliches erzeugt, ist keine Störung der RFM12 zu
erwarten, eher wird der der ATMega Störungen verursachen.
Gruß allu
So bin endlich mal dazu gekommen einen Schaltplan für meinen neuen
Versuchsaufbau zu erstellen könnt ihr da mal eben drüber schauen, ob ich
was gravierendes vergessen habe, oder ob das so passt.
@ Oliver
Hattest du schon wieder zeit dich mit der DisplayTouch-Auswetung zu
beschäftigen ?
Gruß Stefan Feismann
Ok alles klar hab ich geändert.
Beim letzten Mal habe ich immer beim Programmieren meinen Atmega8
zerschossen, weil das Display fest dran war( also auch beim
Programmieren)
Kann das auch hier passieren, oder muss ich noch Widerstände oder
Kondensatoren an die ISP Pins hängen?
Hallo zusammen,
ich habe mir auch mal so ein Display zu gelegt und habe ein
funktionierendes (mit TP) bekommen. Auf dem Bild mit den verschiedenen
Versionen das in der Mitte.
Habe auch alles soweit angeschlossen und die Verbindungen überprüft.
Das Display hängt bei mir an einem PIC18F4550.
Wenn ich das Display initialisiere kriege ich auf dem Display alle
möglichen Zeichen dargestellt (s. Foto).
Also nochmal schnell eine Display Clear eingebaut und alles ist weg
soweit so gut jetzt habe ich es als Charakter Display initialisiert und
wollte mit dem eingebauten Generator mal ein bisschen was schreiben aber
das Display will einfach nichts anzeigen?
Vielleicht hatte ja jemand schon mal dieses Verhalten und kann mir sagen
was ich falsch mache. Bei der Init war mir auch nicht ganz klar wofür
die Einstellung "Cursor lower und upper Adress" ist. Wo das Display
starten soll lege ich doch schon mit den Adressen "Display Start
upper/lower" fest?
Nun gut, hier mal meine Init.. und wie ich versuche was auf dem Display
zu schreiben:
1
voidGLCD_Init(void)
2
{
3
GLCD_RES=0;
4
Delay10KTCYx(1);
5
GLCD_RES=1;
6
7
GLCD_writecom(0x00);// Mode Con
8
GLCD_writedata(0x3C);// Character Mode, Cursor blink
Hallo,
ich habe nochmal eine Frage an die Profis hier: Ich kann mit der
Funktion von Benedikt, zum "springen" zu einer Adresse im Display:
1
voidGLCD_SetAdress(unsignedcharx,unsignedchary)
2
{
3
unsignedshortadress;
4
adress=y*20+x;
5
GLCD_writecom(0x0A);// write adress low
6
GLCD_writedata(adress&255);
7
GLCD_writecom(0x0B);// write adress high
8
GLCD_writedata(adress/256);
9
}
..nur bis zur Zeile 7 springen danach geht es nicht mehr, bzw. wird ab
hier dann nichts mehr geschrieben =( Wenn ich aber keine Zeile anwähle
sondern einfach nur wild aufs LCD drauf los schreibe schreibt er sauber
das ganze Display voll aufgrund des inkrementieren um 1 je Datensatz.
Meine Initialisierung sieht so aus:
1
voidGLCD_Init_C(void)
2
{
3
GLCD_RES=0;
4
Delay10KTCYx(1);
5
GLCD_RES=1;
6
7
GLCD_writecom(0x00);// Mode Con
8
GLCD_writedata(0x3C);// Character Mode, Cursor blink
9
10
GLCD_writecom(0x01);// Character Pitch
11
GLCD_writedata(0x77);// 8x8 Chars
12
13
GLCD_writecom(0x02);// Number of Characters
14
GLCD_writedata(19);// 19 Zeichen <--->
15
16
GLCD_writecom(0x03);// Set Duty
17
GLCD_writedata(0x4F);// 80-1
18
19
GLCD_writecom(0x04);// Cursor Position
20
GLCD_writedata(0x07);// Line 1
21
22
GLCD_writecom(0x08);// Start Adresse Low
23
GLCD_writedata(0x00);// 0
24
25
GLCD_writecom(0x09);// Start Adresse High
26
GLCD_writedata(0x00);// 0
27
28
GLCD_writecom(0x0A);// Cursor lower adress
29
GLCD_writedata(0x00);// 1
30
31
GLCD_writecom(0x0B);// Cursor upper adress
32
GLCD_writedata(0x00);// 1
33
}
..hier frage ich mich zum Bleistift auch, warum darf ich eigentlich nur
19 Zeichen einstellen? Ein Font ist doch 8x8 also würden rein
theoretisch bei 160 Dots in der Breite doch genau 20 Zeichen neben
einander passen, warum aber wird hier 19 eingestellt..mh
UND: Auch wenn ich 19 einstelle, kann ich an der 20. Stelle dann
trotzdem ein Zeichen schreiben =/!
Im Anhang ist nochmal ein Foto wie das dann ausschaut, programmiert ist,
dass er "eigentlich" bis zur Zeile 10 runter weiter das Muster verfolgt.
Dann nochmal ein paar Kleinigkeiten:
1. Wo ist der unterschied zwischen Cursor Adresse und Start Adresse?
2. Warum wird ein Font o. Char von 8x8 eingestellt, wenn doch die Fonts
vom integrierten Generator 5x7 (6x8) groß sind?
3. Die selbe Sache wie mit der Breite -> Warum stellt man 80-1 Zeilen
ein?
So das soll erstmal reichen, ich hoffe es nimmt sich jemand die Mühe
auch wenn es vielleicht so trivial erscheint..
schönen Abend! Nico
> ..hier frage ich mich zum Bleistift auch, warum darf ich eigentlich nur> 19 Zeichen einstellen?> 3. Die selbe Sache wie mit der Breite -> Warum stellt man 80-1 Zeilen> ein?
Das steht doch im Datenblatt des LC7981 und außerdem in den Kommentaren
der diversen Codebeispiele auf dieser Seite.
Hat leider nicht geholfen, in den Zeilen 8-10 schreibt er leider immer
noch nichts. Er platziert den blinkenden Cursor beim 1 Zeichen der 8.
Zeile (s. Foto) aber macht dann nichts =/
Was mich jetzt gerade ein wenig wundert... ich habe selber diese
Displays, 4 Stück an der Zahl.
Hab mir nun heute mal meinen Inverter gebaut und, zu meiner Freude,
festgestellt das mein Display Weiß / Schwarz ist. Jedoch sieht man hier
viele verschiedene Displaytypen... z.b. Nicolas seins ist ja schwarz /
blau...
Warum?!
Nicolas M. schrieb:> Achso! Ist doch auch schick =)
Jaja, sagt ja keiner was :D
Wo wir da gerade bei sind: Tausche einmal Hintergrund weiß / Schrift
schwarz zu Hintergrund schwarz / Schrift weiß XD
Rene K. schrieb:> Hab mir nun heute mal meinen Inverter gebaut
haett ich auch interresse, haste ein schaltbild f. mich (uns)?,
vielen dank & ein schoenes WE
Charly
Charly B. schrieb:> haett ich auch interresse, haste ein schaltbild f. mich (uns)?,> vielen dank & ein schoenes WE
Ja gut, was heißt gebaut... "Gebaut" in dem Sinne das ich ihn mit
Anschlüssen "versehen" und am Eingang geglättet habe. Hatte mir für
2,95€ die EL Inverter 08 bei Reichelt gekauft. Klappt wunderbar. Und für
den Preis stelle ich mich nicht hin und baue selber einen ;)
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
ich glaube ich hab den Beitrag aus versehen, in den alten Forum ab
gelegt.
Du brauchst einfach eine 1s Basis, einen Temperaturfühler + AD Wandler
und die Befehle zur Ausgabe auf dem Display evtl. noch eine Zahlensystem
Umwandlung und gut =)
LG Nico
Hallo Nico,
wie es funktioniert weiß ich ja, habe es auch schon oft genug in ein
normales LCD an zeigen lassen, nur hier für das GLCD bin ich nicht in
der Lage.
ach, übrigens ich versuche es in bascom.
wie ich normale Wörter anzeige ist auch klar wie hier.
Locate_zeile = 07
Locate_spalte = 0
'Muster = "01234567890123456789012"
Lcd_string = " A U S W A H L"
Gosub Lcd_write_string
aber wie bindet man eine temp oder die zeit ein.
gruß Migelito
Hi, ja blöd von Bascom hab ich gar keinen Schimmer. Aber es geht
eigentlich immer am einfachsten so:
1. Z.B. mit einem KTY die Temperatur über einen Spannungsteiler messen,
diese wird dann mit einem µC in einen digitalen Wert umgewandelt.
2. Jetzt musste die Spannung wohl noch entsprechend umrechnen, je
nachdem wie der Temperaturkoeffizient im Datenblatt des Sensors ist.
3. Dann hast du ja immer noch einen Binärwert, den dann einfach in
dezimal umrechnen (Division durch 10).
4. Jetzt ist es einfach, einfach identifizieren welche dez Zahl
vorhanden ist (Einer, Zehner, evtl. Hunderter) und dann dem entsprechend
die Zahlen aus dem ASCII Satz auf dem Display darstellen lassen.
Aber das wusstest du wahrscheinlich eh schon... sry =/
LG Nico
Für die Temperatur würde ich mir die Mühe mit dem Umrechnen nicht
machen. DS18S20(Pollin) heißt die Alternative. Da wird die Temperatur
über OneWireBus aus dem Sensor gelesen. Für das Datum und die Zeit nehme
ich den DS3234 mit SPI Interface. Der hat übrigens auch schon einen
Temperaturfühler integriert, da kann man sich den DS18S20 u.U. sparen.
Meik
Hallo Maik,
ich glaube ich habe mich total besch.... ausgedrückt ;) wie und was ich
für Sensoren nehme, um eine Temperatur aus zu lesen oder berechnen, habe
ich schon gemacht und ich weiß wie es geht, habe auch genug auf den
normalen LCds angezeigt mit.
Nur hir, im Programm von Allu, für das Pollin GLCD, bekomme ich es nicht
zur anzeige.
Am besten ihr schickt mir mal ein kurzen ausschnitt vom Programm wie ihr
es in bascom auf das Display (Pollin GLCD) ausgibt, dann sehe ich wie es
von statten geht.
Also, noch mal, ich weiß wie es geht, mit herkömmlichen LCDs die Zeit
oder dir Temperatur dort aus zu geben.
Wie aber beim Pollin GLCS ?? ich habe mit GLCDs noch nicht gearbeitet.
Gruß Migeleito
Migelito schrieb:> Locate_zeile = 07> Locate_spalte = 0> 'Muster = "01234567890123456789012"> Lcd_string = " A U S W A H L"> Gosub Lcd_write_stringMigelito schrieb:> Also, noch mal, ich weiß wie es geht, mit herkömmlichen LCDs die Zeit> oder dir Temperatur dort aus zu geben.
"Gosub Lcd_write_String" schreibt ab der Position
"Locate_zeile/Locate_spalte" den Text in "Lcd_string" ins Display.
Wie für dein herkömmliches LCD berechnest Du den Anzeigestring, zum
Beispiel: Temperatur_in_Ascii = "38,5". Diesen Wert möchstest Du in die
3. Zeichenzeile ab der 9. Spalte eintragen und "Grad" anhängen:
Locate_zeile = 21 'Eine Zeichenenzeile = 10 Pixelzeilen / gerechnet ab 0
Locate_spalte = 8 ' gerechnet ab Spalte 0
Lcd_string = Temperatur_in_Ascii + " Grad"
Gosub Lcd_write_string
Gruß allu
Hallo allu,
ich habe nach deine vorgaben mal es so eingesetzt, mit meiner Temperatur
Ausgabe.
Aber er sagt, es wäre kein Wert vorgegeben und compiliert nicht ?
In der normalen LCD Variante würde es so aussehen, wie du es sicherlich
kennst.
Locate 1 , 1
Lcd Fusing(temp1 , "#.&") ; Chr(0) ; "C "
Locate_zeile = 10
Locate_spalte = 8
Lcd_string = Temp1 "Grad"
Gosub Lcd_write_string
Gruß Migelito
Problem: Viel Text mit kleinem Zeichensatz darstellen
Hallo Displayprogrammierer
danke an alle hier im Forum, mit Eurer Hilfe habe ich auch mein Display
zum Laufen gebracht. Ich verwende die Anschlussbelegung von Benedikt,
einen Atmega32 und Libs in C von Sebastian, der im Forum bei Roboternetz
gepostet hat.
Folgendes fehlt noch zum letzten Glück: Ich möchte gerne viel Text
komprimiert auf dem GLCD ausgeben und einen 5x7 Zeichensatz verwenden.
Ich habe dazu je einen Lösungsansatz für den Textmodus und den
Grafikmodus, jeder natürlich jeder mit einem Problem, was sonst:
1) Textmodus + interner Zeichensatz, schön klein, spart Speicherplatz
Das funktioniert allerdings nur mir 20 Zeichen pro Zeile statt 26
möglichen und ist mir nicht dicht genug. Bei 26 Zeichen gibt es irgendwo
in der Mitte jeder Zeile Pixel die nicht angesprochen werden. Das
gleiche Problem wurde hier im Forum schon einmal mit Foto nachgefragt.
Man muss also die horizontal pitch und number of characters entsprechend
Datenblatt anpassen. Die Erklärung ist sicher, dass mit einer Hp von 8
und einer Pixelanzahl von 160 pro Zeile eben nur 20 Zeichen glatt
aufgehen. Sonst müsste man den LC7981 irgendwie überlisten, wie weiß ich
leider nicht.
So funktioniert es im Textmodus:
1
lcd_write_command(0x01,0x77);//Hp=8 stellt die pitch-Werte ein
2
lcd_write_command(0x02,20-1);//Anzahl Zeichen pro Zeile (minus 1)
Frage 1: hat jemand einen Tip, wie ich auch 26 Zeichen pro Zeile im
Textmodus fehlerfrei darstellen kann, 160/7 =26,6 das geht nicht auf!!
Textmodus so einstellen, aber das gibt besagte Fehler:
1
lcd_write_command(0x01,0x75);//Hp=6
2
lcd_write_command(0x02,26-1);//Anzahl Zeichen pro Zeile (minus 1)
2) Grafikmodus + selbst erstellter Zeichensatz 5x7
Das würde ja funktionieren, aber ich habe keinen freien
Zeichensatzgenerator und die verfügbaren Zeichensätze sind anders
kodiert als ich es brauche, nämlich SB last!!
Frage 2: Kann jemand einen Zeichensatzgenerator oder einen Zeichensatz
empfehlen?
Gruß Tom_W
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.
Gruß Migelito
Dim Temperatur As String * 3
Dim Temp As String * 3
Do
Temperatur = Str(temp1)
Temp = Format(temperatur , "00.0")
Loop
Locate_zeile = 10
Locate_spalte = 8
Lcd_string = temperatur + "Grad"
Gosub Lcd_write_string
Hi zusammen ich bin jetzt von dem Charakter in den Grafik Modus
umgestiegen und wollte zum Testen mal einfach einen Kasten rund ums
Display darstellen also ein Rechteck so groß wie es geht (4 Linien) aber
komischerweise kann ich nur eine Linie zeichnen und den Anfang einer
zweiten, danach ist Schluss =( Wer kann mit weiter helfen?
Ich verwende die Funktionen aus Benedikts Programm...
LG Nico
Ich habe Not gedrungen mal ein zweites neues Display angeschlossen, es
weist das selbe Verhalten auf. Ich verwende wie schon geschrieben die
Zeilen von Benedikt, hier mal die wichtigsten:
Die Initialisierung
Hallo zusammen!
Da ich auch schon lange mit dem Display rumspiele, möchte
ich heute auch mein Beitrag dazu geben und hatte
mir mal paar Gedanken zum Anzeigen von Bilder gemacht.
Ich habe mal meinen kleinen Sohn auf dem Display gezaubert.
Leider ist dabei auch zu sehen das die Pixel des LCD nicht quadratisch
sind. Das Bild wird etwas in der Höhe gestreckt.
Hier ein Ausschnitt der ergänzte Source von mir aus der lc7981.c die ich
hier aus dem Forum habe. Ich benutze einen Atmega32 mit 16 MHz.
if(xend>LCD_WIDTH){lcd_gotoxy(xp,yp);lcd_writestring("error");return;}//Fehler wenn außerhalb des Displays
22
bwidth=width/8;//Anzahl Bytes horizontal
23
for(i=0;i<height;i++)//Höhe schreiben
24
{
25
lcd_setadress(xp/8,yp);
26
for(j=0;j<bwidth;j++)//Breite schreiben in Bytes
27
{
28
by=pgm_read_byte(bitmap);
29
lcd_writebyte(tausch(by));//(tausch) 8 Bit spiegeln um richtig anzuzeigen, wegen MSB first
30
bitmap++;//bei LSB first kann tausch() weggelassen werden
31
}// schleife j ende
32
yp++;
33
}// schleife i ende
34
}
Ich habe einen Grafikkonverter (Freeware) gefunden der bmp und jpg
Bilder convertiert. Leider hat die Software einen kleinen Fehler... Man
kann kein LSB first schreiben, deswegen auch der Umweg über "tausch()"
Bei der Convertierung ist darauf zu achten das die Breite durch 8
Teilbar ist weil ich ja immer gleich 1 Byte auf das Display schreib.
Also wie z.B. in meinem Beispiel Breite 152 Pixel und Höhe 80 Pixel. Bei
der Höhe ist das egal. Bei dem Converter verwendet man das
Floyd-Steinberg Verfahren. Dann kann das Bild als .c abgespeichert
werden. Alle andere ist noch mal in der lcd_test.c erklärt. Anbei die
Bilder, der Converter und mein Source. Ich hoffe ich hab nichts
vergessen! :) Viel Spaß damit!
MfG
Tony
Hallo,
ich versuche gerade selbst ein Bild anzuzeigen.
Ich habe mir mit dem Grafikkonverter ein C18 Code ausgeben lassen.
Nun setzte ich meinen Coursor auf X0 Y0 und schiebe alle Bytes aus dem
Array nacheinander auf das Display...
Leider scheint es so nicht zu funktionieren das ganze Bild ist mehrfach
verschoben.
Das sollte doch eigentlich funktionieren oder mache ich einen Fehler???
hier mein C Code
lcd_coursor(0,0);
for (i=0;i<=1600;i++)
{
lcd_send_byte(data_demo_image[i]);
}
Gruß Max
Max Pohl schrieb:> Leider scheint es so nicht zu funktionieren das ganze Bild ist mehrfach> verschoben.
Hallo Max!
Hast du eventuell ein Bild von dem verschobenen Bild?
Dann kann ich dir vielleicht helfen. Ich denke mal das
du hauptsächlich das Problem mit dem LSB und MSB hast.
Das würde man daran erkennen das das gesendete Byte immmer
spiegelverkehrt auf dem Display angezeigt wird.
Also z.B "01100101" = 0x65 auf dem Display so angezeigt wird
"10100110" = A6 weil der LC7981 das MSB zuerst schreibt.
Was mir auch aufgefallen ist das du den Cursor mit "lcd_coursor(0,0)"
setzt. Da gab es bei mir auch Probleme deswegen setze ich den Coursor
so "lcd_setadress(xp/8,yp);" Schick mal ein Bild und deinen source dazu
und dann sehen wir weiter!
Gruß
Tony
Hallo miteinander!
Ich fass es nicht, ich bin am Ende des Threads angekommen ;-)
Ich hab alles gelesen, was in diesem Thread steht, hab auch das meißte
verstanden ^^ und viele Beispielprogramme ausprobiert.
Zuerst zu meiner Hardware/Software: Ich benutze einen ATmega168, den ich
per avrisp programmiere, was wunderbar funktioniert.
Das Display, das ich bekommen habe, entspricht dem Mittleren auf dem
Bild von Benedikt (->
Beitrag "Re: Display mit Touchscreen bei Pollin?").
Ich programmiere mit AVR-Studio in C.
Weder das Testprogramm von Benedikt, noch ein auf den ATmega168
angepasstes Programm funktioniert.
Wenn der Kontrast richtig eingestellt ist, sehe ich nur einen komplett
ausgefüllten Bildschirm, d.h. jedes Pixel ist schwarz. (Wenigstens weiß
ich somit, dass das Display theoretisch funktioniert :-) )
Als ich vorgestern zum ersten Mal das Programm von Sigint 122
ausprobiert habe, hat es mir auf Anhieb das Sigint-Logo angezeigt! Zuvor
habe ich im Sourcecode von Sigint die Ports auf meine Schaltung
angeglichen und die Frequenz angepasst auf 16MHz, weil ich einen
externen Oszi am ATmega168 verwende.
Sogar der Touch hat soweit funktioniert, dass das Programm merkt, wenn
er berührt wird und dann auf die nächste Seite, das Tastenfeld,
umschaltet.
Das ganze war aber nur ein winziger Lichtblick, der schnell wieder
vorbei war: Seit dem einen Erfolg funktioniert garnichts mehr. Die
Kontakte hab ich alle durchgemessen, die Widerstände und Kondensatoren
stimmen, das Programm ist auf den ATmega168 zugeschnitten, aber der
Bildschirm wird einfach nur schwarz.
Vielleicht hilft das noch weiter: Wenn ich den Kontrast runter drehe,
schaut mein Display wie das in diesem Post aus ->
Beitrag "Re: Display mit Touchscreen bei Pollin?"
Ich hoffe ich habe keine wichtige Angabe vergessen und dass jemand eine
Lösung kennt, die ich noch nicht versucht habe.
Grüße, Stefan
Stefan R. schrieb:> Ich hoffe ich habe keine wichtige Angabe vergessen und dass jemand eine> Lösung kennt, die ich noch nicht versucht habe.
Hallo Stefan!
Ich schätze mal das es kein Fehler in der Software
ist sondern in deiner Hardware. Hast du mal alle Ports
die das Display braucht geprüft, ob da auch was ankommt?
Also einfach mal ein Testprogramm schreiben wo alles auf HIGH ist
und mit nem Oszi oder Spannungsmesser nachprüfen.
Ich habe auch schon den Fall gehabt das ein Portpin defekt war und
dann sucht man sich dumm und dusslig!
Oder versuch es mal mit einem anderen Controller wenn du einen
rumliegen hast!
Gruß
Tony
@Tony:
Hat leider nicht geholfen, alle Ports am leben (zum Glück :-) ), aber
schöne Idee, darauf wär ich nicht allein gekommen.
Ich hab leider nur noch den einen ATmega168 und sonst nur Tinys. Die
Pins vom ATtiny2313 würden zwar reichen, aber das Programm passt nicht
drauf.
Ich werd demnächst mal wieder beim Reichelt bestellen, da nehm ich dann
ein paar ATmegas mit. Vllt auch mal einen Mega8, den hatte ich noch
nicht. Dann kann ich 1:1 die Schaltungen nachbauen, die hier beschrieben
sind. Wenigstens liegts wohl nicht am Display.
Bis dann! Stefan
Stefan R. schrieb:> Wenigstens liegts wohl nicht am Display.
kann trotzdem ein Irrtum sein. Bei mir hatten sich durch häufiges Löten
Haarrisse in der Leiterbahn gebildet, die mit dem Auge nicht sofort
erkennbar waren.
MfG
Ich hab an das Display eine 20-Pol Stiftleiste gelötet, alle Kontakte in
Ordnung. Der Rest ist nur Gesteckt auf nem Breadboard.
Reicheltbestellung ist raus ;-) in ein paar Tagen kann ich's mit nem
Mega8 versuchen...
Stefan
Wahrscheinlich habe ich es überlesen.
Bei mir werden mit dem IS TSC2003 die Koordinaten des berührten Punktes
ermittelt. (funktioniert schon)
Der Bildschirm des DG-16080 soll z. B. in 5 x 7 = 35 Planquadrate
(Schaltflächen) eingeteilt werden.
Schaltfläche 1 soll liegen bei
X Y
P1 40 40
P2 80 40
P3 40 80
P4 80 80
Schaltfläche 2 soll liegen bei
X Y
P1 80 40
P2 120 40
P3 80 80
P4 120 80
usw.
Werden z. B. die Koordinaten x=60 y= 65 ermittelt, dann sehe ich, dass
der berührte Punkt in der Schaltfläche 1 liegt.
Wie kann man dies jetzt programmtechnisch lösen bzw. wo nachlesen, um
die berührte Schaltfläche zu ermitteln? (MSP430, vorzugsweise in C)
MfG
Wolfgang_G schrieb:> Der Bildschirm des DG-16080 soll z. B. in 5 x 7 = 35 Planquadrate> (Schaltflächen) eingeteilt werden.> Wie kann man dies jetzt programmtechnisch lösen bzw. wo nachlesen, um> die berührte Schaltfläche zu ermitteln? (MSP430, vorzugsweise in C)> MfG
Mein Display habe ich in 23*8 = 184 Planquadrate unterteilt. Welches
Feld berührt wurde, wird aus den AD-Wandler Messwerten berechnet. Im
wesentlichen ist es eine Multiplikation und ein Division. Das dauert
unabhängig davon wo die Berührungsstelle liegt etwa 50usec. 5 x 7 = 35
Planquadrate gingen natürlich auch.
In C habe ich leider nichts, das Prinzip sollte aber auch in C gut
realisierbar sein. Kurze Beschreibung:
Beitrag "Re: Display mit Touchscreen bei Pollin?"
Gruß allu
Nicolas M. schrieb:> Hallo,>> ich habe nochmal eine Frage an die Profis hier: Ich kann mit der> Funktion von Benedikt, zum "springen" zu einer Adresse im Display:>> ..nur bis zur Zeile 7 springen danach geht es nicht mehr, bzw. wird ab> hier dann nichts mehr geschrieben =( Wenn ich aber keine Zeile anwähle> sondern einfach nur wild aufs LCD drauf los schreibe schreibt er sauber> das ganze Display voll aufgrund des inkrementieren um 1 je Datensatz.
Kann mir hier vielleicht nochmal jemand helfen =( ?
LG Nico
könntest du mir bitte einmal alles was du über das Display schon hast
geben, denn ich habe auch dieses Display und den PIC 18F4550 und ich
schaffe es einfach nicht das Display anzusprechen. Also wenn du mir
helfen könntest wäre das super
lg Johannes :)
Hallo Nicolas.
Könntest du vielleicht auch eine Anschlussbelegung mit posten. Ich habe
selber auch noch einige dieser LCD's rumliegen und würde sie gerne
nutzen. Wahrscheinlich steht irgendwo oben auch welcher Schaltplan du
benutzt. Es wäre aber trotzdem nett, wenn du den noch einmal hochladen
könntest. Ein Bild davon würde mir schon reichen.
besten dank und schöne grüße
Hi, hier:
GLCD_RES LATBbits.LATB0
GLCD_RS LATCbits.LATC2
GLCD_RW LATCbits.LATC7
GLCD_E LATCbits.LATC6
GLCD_Data LATD
edit: Und natürlich das Potentiometer (100K) zwischen Vdd und Pin 17
sowie den Schleifer an Pin 3!
Hi!
Und wo hängt bei dir der Touch dran. Das wird aus der Beschreibung nicht
ganz ersichtlich.
Wenn ich deinen Code richtig verstehe müssten das dann
Oben LATEbits.LATE0
Unten LATBbits.LATB3
Rechts LATBbits.LATB4
Links LATBbits.LATB5
sein. Gibt es einen Grund warum du Oben nicht auf LATB6 gesetzt hast?
Spricht irgendetwas dagegen es dahingehend zu ändern, weil ich sehe da
grade keinen Grund.
Hallo zusammen,
ich musste eben feststellen das mein Display DG-16080 den Geist
aufgegeben hat.
Den größten Schock habe ich jedoch bekommen als ich bemerkt habe das
Pollin keine mehr auf Lager hat.
Hat jemand ein oder zwei Stück übrig bei denen auch der Touch
funktioniert?
Wäre bereit 20€ für beide zu zahlen.
Bzw.10€ für eins.
MfG Max
Hat sich erledigt das Ganze. Ich habe leider etwas auf dem Schlauch
gestanden. Die Geschichte hat sich damit dann erstmal erledigt, ich
werde mir die Tage erstmal einen Inverter besorgen gehen.
Also im Textmode funktioniert es jetzt bei mir zu 100% allerdings kann
ich im Grafikmodus immer noch nicht richtig arbeiten... =(
Man springt zu den Adressen doch in beiden Modis gleich oder?
Also durch verändern der Cursor Adresse, oder nicht?
Übrigens im Textmodus war die Busy Abfrage fehlerhaft kp warum habe sie
einfach mal durch eine Schleife ersetzt!
LG Nico
Nicolas M. schrieb:> Also im Textmode funktioniert es jetzt bei mir zu 100% allerdings kann> ich im Grafikmodus immer noch nicht richtig arbeiten... =(
was geht nicht ??
> Man springt zu den Adressen doch in beiden Modis gleich oder?> Also durch verändern der Cursor Adresse, oder nicht?
ja, aber
in Y-Richtung adressierst du nur eine Pixelzeile und nicht ein ganzes
Zeichen, das selbst aus n-Zeilen besteht. Und in X-Richtung must du
dafür sorgen das ein Byte auch 8Bit breit ist, sonst wird's mist.
> Übrigens im Textmodus war die Busy Abfrage fehlerhaft kp warum habe sie> einfach mal durch eine Schleife ersetzt!
die Busy-Abfrage ist von der Betriebsart unabhängig.
Sascha
Hi Sascha,
ok also wie gesagt Textmode klappt!
Im Grafikmodus allerdings nichts so richtig.
Ich habe eigentlich das meiste fürs Display aus der Bibliothek von
Benedikt.
Also ich initialisiere das GLCD für den Grafikmodus so:
1
voidGLCD_Init_G(void)
2
{
3
GLCD_RES=0;
4
Delay10KTCYx(1);
5
GLCD_RES=1;
6
7
GLCD_writecom(0x01);// Character Pitch
8
GLCD_writedata(0x77);// Chars
9
10
GLCD_writecom(0x02);// Number of Characters
11
GLCD_writedata(19);// 20-1 (0-19)
12
13
GLCD_writecom(0x08);// Start Adresse Low
14
GLCD_writedata(0x00);// 0
15
16
GLCD_writecom(0x09);// Start Adresse High
17
GLCD_writedata(0x00);// 0
18
19
GLCD_writecom(0x0A);// Start Adresse Low
20
GLCD_writedata(0x00);// 0
21
22
GLCD_writecom(0x0B);// Start Adresse High
23
GLCD_writedata(0x00);// 0
24
25
GLCD_writecom(0x03);// Set Duty
26
GLCD_writedata(79);// 80-1 (0-79)
27
28
GLCD_writecom(0x00);// Mode Con
29
GLCD_writedata(0x32);// Grafik Mode
30
31
GLCD_Clear();// GLCD Inhalt löschen
32
}
dann wird das Display einmal gelöscht:
1
voidGLCD_Clear(void)
2
{
3
unsignedinti;
4
GLCD_SetAdress(0,0);
5
for(i=0;i<160/8*80;i++)
6
GLCD_writebyte(0);
7
}
die Adresse wird dabei über die Funktion ausgeführt:
1
voidGLCD_SetAdress(unsignedcharx,unsignedchary)
2
{
3
unsignedintadress;
4
adress=y*20+x;
5
GLCD_writecom(0x0A);// write adress low
6
GLCD_writedata(adress&255);
7
GLCD_writecom(0x0B);// write adress high
8
GLCD_writedata(adress/256);
9
}
Die habe ich z.B. auch von Benedikt übernommen verstehe sie aber kaum,
bzw. verstehe ich das System vom Display nicht wie wird die Adresse
eigentlich eingestellt. Der cursorcounter ist ja 16bit 0 bis 65535 und
das
Display hat 160x80=12800.. wie wird das jetzt gesteuert?
Nagut und so versuche ich dann ein Pixel zu setzten:
1
GLCD_Setpixel(80,40);
mit der Funktion:
1
voidGLCD_Setpixel(unsignedcharx,unsignedchary)
2
{
3
if((x>=160)||(y>=80))
4
{
5
return;
6
}
7
GLCD_SetAdress(x/8,y);
8
GLCD_writecom(0x0F);
9
GLCD_writedata(x&7);
10
}
Aber bei dem Versuch wird dann ein Pixel ganz oben und ca. 8-9 pixel von
links gesetzt... häää?
LG Nico
Nicolas M. schrieb:> Hi also die Addressierung in der X Achse klappt wohl aber ich komme> nicht nach unten (Y)... =(
Hallo Nicolas!
Beim vergleich meiner INIT mit deiner ist mir aufgefallen das du
sowas machst..
1
GLCD_writecom(0x0A);// Start Adresse Low
2
GLCD_writedata(0x00);// 0
3
4
GLCD_writecom(0x0B);// Start Adresse High
5
GLCD_writedata(0x00);// 0
Wozu soll das gut sein?
Lass das einfach mal in deiner INIT weg und versuche es ohne den Zeilen!
Den Code brauchst du erst später für:
Hi Tony,
ich habe die Init mal geändert hat nichts verändert.
Auch das austauschen von int gegen short ändert nichts.
Und meine Funktionen writecom und writedata sind identisch zu deinen!
Mh.. Weitere Tipps?
Nicolas M. schrieb:> Mh.. Weitere Tipps?
Hallo Nicolas!
Um eine genaue Analyse zu machen, schick doch einfach
mal deinen gesamten code! Dann kann ich vielleicht helfen.
MfG
Tony
Hi Leute!
Ich hab folgendes Problem mit dem Display, das wir ja hier alle zu haben
scheinen...
Hab die Schaltung auf einem Steckbrett so weit aufgebaut... Mit einem
Atmega88 funktioniert das ganze auch einwandfrei (Data: D0-D7, Ctrl:
PB0-2).
Sobald aber ein Atmega32 ins Spiel kommt, scheint das Display die beine
Breit zu machen... Es funktioniert einfach nicht. Egal auf welchen Pins
an welchem Port... Es will einfach nicht. Ich hab gelesen, dass sobald
PortC verwendet werden will man die JTag Fuses deaktivieren soll. Hab
ich gemacht... Gut, ich muss jetzt nicht zwangsweise PortC verwenden,
Aber es funktioniert genauso wenig mit PortB und PortA. Habt ihr
vielleicht irgendeine Idee? Der AVR läuft noch mit factory 1MHZ... aber
daran wird es ja wohl nicht liegen, oder?
Zum Glück hatte ich noch nen kleinen AVR rumliegen, sonst wüsst ich
nicht mal, dass es nur mit dem 32er nicht geht... Immerhin :)
Habt ihr Ideen?
Grüße
Armin
Hey Dirk!
Danke für deine Antwort! Nein, da kann es kein Problem geben. Aber das
steht ja schon in meinem letzten Post... es ist wie verhext :)
Grüße Armin
Armin schrieb:> Datenbus vertauscht... shame on me. es geht :)
Morgen!
Hätte mich auch gewundert wenn es nicht geht!
Ich benutze ja schließlich auch einen Atmega32!
@Nicolas
Ich hab deinen Code mal angeschaut, ich finde eigentlich
keinen Fehler in der Soft! Ist soweit identisch mit meiner.
Ich kann mir nur vorstellen das da irgendwas mit dem Timing
nicht stimmt oder der Compiler was weg optimiert! Da ich
leider keine PIC programmiere, kann ich auch nicht viel testen.
MfG
Tony
Hi Tony, trotzdem danke!
Also ich benutze den C18 Compiler von Microchip und den PIC18F4550 mit
20Mhz Taktung. Wie gesagt im Textmode funktioniert das Display wunderbar
nur im Grafikmodus funktioniert die Y Adressierung nicht.
Ich hoffe es gibt noch jemanden der mir helfen kann.
LG Nico
@Nicolas
setze in deiner INIT für GFX-Mode mal die Auswahl der Betriebsart (CMD
0x00)
an den Anfang der Initroutine und nicht ans Ende!
Nicht das dadurch irgendwelche Werte die du vorher einstellst verworfen
werden.
Sascha
Hi!
Hab mich hier jetzt angemeldet...
Hier mein Source... is mehr oder ne kleine Techdemo mit nem kleinen
Menue...
Alles einfach mal reingehackt... vielleicht hilft es ja jemanden weiter.
Grüße Armin
Hallo!
Ich habe mir auch noch 3 von diesen Displays ergattert (Bei Pollin gibts
die ja im Augenblick nicht mehr :-O ).
Ich habe das mittlere Modell im Bild oben bekommen. Zwischen den beiden
Touchscreen Pins messe ich jeweils so ca. 300 und 600 Ohm. Zwischen den
anderen beiden, ohne Berührung unendlich Ohm, bei Berührung ändert sich
der Wert dementsprechend. Ich denke das der Touch funktioniert, oder?
Und wenn ich das GLCD an die 5V Versorgungsspannung hänge, leuchten auch
alle Pixel, es hat also soweit ich das beurteilen kann keine Zeilen die
fehlen oder so.
Ich habe folgende Hardware aufgebaut um meine Displays zu testen.
(Schaltplan oben) Ist der gleiche Schaltplan wie in Benedikt weiter oben
schon mal gepostet hat.
Dann habe ich in einen neuen ATmega8 verschiedene der oberen
Assembler-Testprogramme geladen (z.B.: "dg16080.hex" von Benedikt), aber
so bald das Programm geflasht ist, erlöschen alle Pixel auf dem Display
und dann tut sich gar nichts mehr! (Bei den meisten oberen
Testprogrammen sollte man da ja dann was zeichen können) Wenn ich das
Programm dann wieder vom mega lösche, leuchten wieder alle Pixel. Habe
es auch mit einem oberen Programm, wo eigentlich nur Text angezeigt
werden sollte, probiert geht aber auch nicht!
Nun weiss ich nicht was ich falsch mache. Habe ich vielleicht was im
Schema vergessen, oder muss ich irgend was machen wenn ich nen ATmega
zum ersten mal brenne(habe noch nicht so viel Erfahrung mit uCs, binns
am erlernen, aber ich will eben diese GLCDs mal schnell testen)?
Ich hoffe es kann mir einer helfen.
Gruss und gute Nacht ;-)
Michi
tach,
ich hab da man ne Frage und zwar habe ich grade den Code 2 postings
über mir runtergeladen und bin nu am verdrahten des Atmegas32, wie muss
da die Beschaltung von RES und CS sein, davon steht im Code ja nichts
beschrieben?
Gruß
Hi!
Diese Leitungen hab ich auf feste Pegel gelegt... Reset ist low aktiv,
also auf 5V und CS auf GND... Aber das kannst du auch im Datenblatt
selbst nochmal nachsehen!
Grüße Armin
Ja den Kontrast habe ich richtig eingestellt. Wenn der mega kein
Programm geflasht hat, leuchtet jedes Pixel und ist gut zu erkennen. Ich
habe auch schon wärhrend dem Programmablauf am Kontrastpoti
herumgedreht, aber es tut sich einfach nichts!
Ich denke mal dass ich es richtig verdratet habe, so wie im Schema,
vielleicht ist es ein Softwarefehler?
Gruss
Michi
@Michael Sutter:
Also wenn selbst das "dg16080.hex" von Benedikt bei Dir nichts anzeigt,
dann passt was anderes nicht. Weil die Datei funktioniert wunderbar. Von
Deiner Beschreibung her, würde ich sagen, dass die HW auch in Ordnung
ist. Ich tippe dann mal eher auf die Fuses. Hast Du auch den internen
RC-Oszillator (und kein externes) auf 8MHz eingestellt? Die
XTAL-Anschlüsse werden ja für das Display benötigt.
Nein an den Fusebits habe ich nichts verstellt. Muss ich dann zuerst das
Programm in den ATmega laden und dann diese Fusebits setzten oder?
Wie stelle ich denn die Fuse-Bits bei PonnyProg richtig ein?
Und was bedeutet HW?
Gruss
Michi
:-) HW = Hardware; damit meinte ich Dein Display ;-)
Was PonnyProg angeht, kann ich Dir leider nicht helfen, da ich eben
AVR-Studio benutze. Ich glaube, da muss man immer "invertiert" denken.
Aber da kann Dir mit Sicherheit jemand anderes hier weiterhelfen.
Prinzipiell würde ich jetzt vom Bauchgefühl her sagen, dass man zuerst
die Fuses richtig setzen sollte; kann aber sein, dass das - vorallem bei
dem Projekt hier - auch egal ist.
EDIT: Schau mal hier:
http://halvar.at/elektronik/kleiner_bascom_avr_kurs/fusebits_standard/
Das sollte weiterhelfen :-) Da ist ein Screenshot speziell für 8MHz
interner RC-Oscillator. Keine Ahnung, ob das noch aktuell ist, aber
klicke zuerst auf Read, dann ändere und dann auf Write
Vielen vielen Dank!!!!
Es funktioniert nun!
Ich habe die Fusebits nun so wie auf deiner verlinkten Seite gesetzt.
Und noch ein wenig am Kontrast geschraubt, wahr anscheinend doch nicht
ganz richtig.
--> und siehe da es funktioniert!
Gruss und DANKE!
Michi
Sascha Weber schrieb:> @Nicolas>> setze in deiner INIT für GFX-Mode mal die Auswahl der Betriebsart (CMD> 0x00)> an den Anfang der Initroutine und nicht ans Ende!> Nicht das dadurch irgendwelche Werte die du vorher einstellst verworfen> werden.>> Sascha
Hat leider nicht geholfen =(
LG Nico
Stefan Feismann schrieb:> @ Armin Sch.>> Wie ist das denn mit den Datenleitungen, da hast du doch von Db0 bis Db7> alle auf den Port D 0 bis Port D 7 gelegt oder ?>> Gruß
Genau.
@ Armin Sch.
Und zwar hab ich mal eine frage bezüglich der grafikausgabe:
Und zwar wenn ich Cursortasten selber erstellen will und dann mit
image2Code umwandle und auf dem Display ausgeben will ( z.B. ein
einfaches Viereck 30x30 ) erscheint wohl ein teil, aber der untere teil
des Vierecks scheint zu fehlen.
Woran kann das liegen?
Gruß Stefan
Thorsten schrieb:> @ Armin Sch.>> Und zwar hab ich mal eine frage bezüglich der grafikausgabe:>> Und zwar wenn ich Cursortasten selber erstellen will und dann mit> image2Code umwandle und auf dem Display ausgeben will ( z.B. ein> einfaches Viereck 30x30 ) erscheint wohl ein teil, aber der untere teil> des Vierecks scheint zu fehlen.> Woran kann das liegen?>> Gruß Stefan
Hi!
Ja das Problem kenn ich... das Problem ist meine Funktion um diese
Bitmaps auszugeben. Ich gebe immer ein Byte aus. D.h. mit dieser
Funktion muss die Breite ein vielfaches von 8 sein... also mach das bild
32x30 gross, dann is alles gut :)
Ich wollte mich eh mal ransetzen um eine neue Funktion schreiben, die
auch andere Breiten als x*8 kann... Aber hab momentan dazu keine Zeit.
Geht alles andere denn?
Grüße Armin
Ja echt super Programm hätt ich niemal hinbekommen ^^
hab schon ein eigenes Menü und alle sowas erstellt und durch deine
Funktionen scheint alles klar und deutlich wie man das anstellen kann
Wenn ich mal fragen darf wie lange hast du da dran gesessen ?
Gruß
Thorsten schrieb:> Ja echt super Programm hätt ich niemal hinbekommen ^^> hab schon ein eigenes Menü und alle sowas erstellt und durch deine> Funktionen scheint alles klar und deutlich wie man das anstellen kann> Wenn ich mal fragen darf wie lange hast du da dran gesessen ?>> Gruß
ka.. n tag halt zwischen uni und schlafen :)
Ich brauch auch noch ein oder zwei, die hälfte (1 von 2) geht ned,
Umtausch, wegen haben keine mehr, nicht möglich........
oder nen Tip für ein anderes Bezahlbares GLCD mit Touch
lcdler schrieb:> hat jetzt jemand noch eins?!
hab noch eins hier, komplett funktionsfähig.
Ist eins wo die Beleuchtung den Hintergrund beleuchtet und die Pixel
immer schwarz erscheinen - ist vom Kontrast nicht so besonders.
zum Pollin Preis + VP&Porto abzugeben - bei Interesse PM
Sascha