Forum: Mikrocontroller und Digitale Elektronik Display mit Touchscreen bei Pollin?


von Sven B. (svenba)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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

...

von Sven B. (Gast)


Lesenswert?

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?

von allu (Gast)


Lesenswert?

Versuch mal, messen und sofort nochmal messen und nur den 2. Messwert 
auswerten.
Gruß   allu

von Sven B. (Gast)


Lesenswert?

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)  
56
    ldi disdata1, 0x0c
57
    ldi disdata2, 0x53
58
    rcall sende_daten
59
    ldi disdata2, 0x32
60
    rcall sende_daten
61
    ;;;;;;;;
62
          
63
    inc adhigh
64
    st z, adhigh
65
    rjmp Timer_ende
66
Schwelle_drei:  
67
    ldi disdata1, 0x0c
68
    ldi disdata2, 0x53
69
    rcall sende_daten
70
    ldi disdata2, 0x33
71
    rcall sende_daten  
72
    rcall touch_auswerten
73
Touch_reset:  
74
    clr adhigh
75
    st z, adhigh
76
77
Timer_ende:  
78
    pop zh
79
    pop zl
80
    pop temp4
81
    pop adhigh        
82
    pop temp1
83
    out sreg, temp1
84
    pop temp1
85
          
86
          
87
    reti

von allu (Gast)


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

@ Sven B.

zeig mal den Rest des Programms: ADC starten/auslesen, Touchports 
einstellen!

Displayausgaben in der ISR - gruselig.

Sascha

von Hannes L. (hannes)


Lesenswert?

Deshalb halte ich mich ja zurück, das ist nicht das, was ich empfohlen 
hatte...

...

von Sven B. (Gast)


Angehängte Dateien:

Lesenswert?

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.
1
Touch_messen:
2
  push temp1
3
  push temp2      
4
  ldi temp2, 3  ; x-mal dummy messen
5
messen:
6
  lds   temp1, adcsra
7
  sbr     temp1,(1<<ADSC)
8
  sts     ADCSRA, temp1        ; den ADC starten    
9
warten_adc2:
10
  lds   temp1, adcsra
11
  sbrc     temp1, ADSC        ; fertig?
12
  rjmp     warten_adc2
13
   
14
; ADC einlesen:
15
  lds      adlow, ADCL
16
  lds      adlow, ADCH
17
  dec temp2
18
  brne messen
19
  rcall touch_ruhe
20
  pop temp2
21
  pop temp1
22
  ret     ; In ADLOW steht das Ergebnis

von Sven B. (svenba)


Lesenswert?

Oh!
Die angehängte Datei könnt ihr IGNORIEREN, hatte gedacht, die wäre nicht 
angenommen worden. Das meiste ist nur Baustelle der letzten Tage...

von Hannes L. (hannes)


Lesenswert?

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.

...

von Sven B. (svenba)


Lesenswert?

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!

von Hannes L. (hannes)


Lesenswert?

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

...

von Sven B. (svenba)


Lesenswert?

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

von Chriz X. (tc-maxx)


Lesenswert?

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

von Alex D. (allu)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Alex D. (allu)


Lesenswert?

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

von Chriz X. (tc-maxx)


Angehängte Dateien:

Lesenswert?

@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

von Alex D. (allu)


Lesenswert?

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

von K. J. (Gast)


Lesenswert?

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

von allu (Gast)


Lesenswert?

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

von Chriz X. (tc-maxx)


Lesenswert?

Hi, also ich habe jetzt nochmal angeschlossen wie es eigentlich sein 
müsste! (oder?)
1
'---[Readtouch]-----------------------------------------------------------------
2
'
3
'                Y- (1)
4
'                Pina.0
5
'                *
6
'                |
7
'                |
8
'  X+ (3) *------+-----*    X- (4)
9
'  Pina.2        |          Pina.3
10
'                |
11
'                *
12
'                Y+ (2)
13
'                Pina.1
14
'
15
' #-----------------#
16
' | Aktion:         |
17
' #-----------------+-------------#------------#------------#------------#
18
' | Folie           |  links X-   |  rechts X+ |  oben Y-   |  unten Y+  |
19
' | Pin am LCD      |  (4) unten  |  (3)       |  (1) oben  |  (2)       |
20
' | Pin am µC       |  Pina.3     |  Pina.2    |  Pina.0    |  Pina.1    |
21
' #-----------------+-------------+------------+------------+------------#
22
' | X-Wert messen   |  L-Pegel    |  H-Pegel   |  hochohmig |  ADC-IN    |
23
' | Y-Wert messen   |  hochohmig  |  ADC-IN    |  L-Pegel   |  H-Pegel   |
24
' | Test:is touched |  hochohmig  |  IN mit PU |  L-Pegel   |  hochohmig |
25
' #-----------------#-------------#------------#------------#------------#
26
27
Readtouch:
28
 '-[Read X]---------------------------------------------------------------------
29
 Config Pina.3 = Output                                     ' Output
30
 Reset Porta.3                                              '  Low
31
32
 Config Pina.2 = Output                                     ' Output
33
 Set Porta.2                                                ' High
34
35
 Config Pina.0 = Input                                      ' Input
36
 Config Pina.1 = Input                                      ' Input
37
38
 Waitms 20                                                  ' Wait until the port is stable
39
 X = Getadc(1)                                              ' Read the ad value for the y
40
 X = 1024 - X                                               ' Invert the reading
41
42
 '-[Read Y]---------------------------------------------------------------------
43
 Config Pina.3 = Input                                      ' Input
44
 Config Pina.2 = Input                                      ' Input
45
46
 Config Pina.0 = Output                                     ' Output
47
 Reset Porta.0                                              ' Loq
48
49
 Config Pina.1 = Output                                     ' Output
50
 Set Porta.1                                                ' High
51
52
 Waitms 20                                                  ' Wait until the port is stable
53
 Y = Getadc(2)                                              ' Read the ad value for the x
54
 Y = 1024 - Y                                               ' Invert the reading
55
Return
56
57
'---[Is_Touched?]---------------------------------------------------------------
58
Function Is_touched() As Byte
59
 '-[ X1 ]-----------------------------------------------------------------------
60
 Config Pina.0 = Input                                      ' Input
61
 Porta.0 = 0                                                ' Pullup aus -> Hochohmig
62
63
 '-[ X2 ]-----------------------------------------------------------------------
64
 Config Pina.2 = Input                                      ' Input
65
 Porta.2 = 1                                                ' Pullup ein
66
67
 '-[ Y1 ]-----------------------------------------------------------------------
68
 Config Pina.1 = Output                                     ' Output
69
 Reset Porta.1                                              ' Low-Pegel
70
71
 '-[ Y2 ]-----------------------------------------------------------------------
72
 Config Pina.3 = Input                                      ' Input
73
 Porta.3 = 0                                                ' Pullup aus  -> Hochohmig
74
75
 '-[Touch gedrückt ?]-----------------------------------------------------------
76
 Waitms 20
77
78
 If Pina.3 = 0 Then
79
   Lcdat 20 , 1 , "Touched"
80
 Else
81
   Lcdat 20 , 1 , "       "
82
 End If
83
84
 Is_touched = Pina.3
85
End Function

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

von allu (Gast)


Lesenswert?

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

von Chriz X. (tc-maxx)


Lesenswert?

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

von Chriz X. (tc-maxx)


Lesenswert?

Hi, ich habe das Problem gefunden:

Ich hatte in der ADC-Config die Referenzspannung auf Internal statt auf 
Avcc stehen.

Gruß MaXX

von allu (Gast)


Lesenswert?

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

von Chriz X. (tc-maxx)


Lesenswert?

Danke allu, ich habe es so umgesetzt.
Gruß MaXX

von Klaus (Gast)


Lesenswert?

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 ?

von Florian S. (der_picknicker)


Lesenswert?

Vielleicht Fuses falsch gesetzt? Was hast du denn "gefused"?

von Klaus (Gast)


Lesenswert?

Also ich habe folgende gesetzt:
SUT1
SUT0
CKSEL3
CKSEL1
CKSEL0
BOOTSZ0
BOOTSZ1

von Klaus (Gast)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

@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

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Klaus (Gast)


Lesenswert?

Ich meine natürlich 0 bedeutet häkchen.

von Sascha W. (sascha-w)


Lesenswert?

läuft denn das Programm noch - auch wenn er sich nicht proggen lässt?

Sascha

von Klaus (Gast)


Lesenswert?

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?

von Sascha W. (sascha-w)


Lesenswert?

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

von Klaus (Gast)


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

evl. mit einem Pullup an CS vom Display dafür sorgen, das während des 
programmierens das Display wirklich inaktiv ist.

Sascha

von Klaus (Gast)


Lesenswert?

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?

von Alex D. (allu)


Lesenswert?

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

von Julius H. (julius)


Lesenswert?

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

von Hannes L. (hannes)


Lesenswert?

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.

...

von Julius H. (julius)


Lesenswert?

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.

von Klaus (Gast)


Angehängte Dateien:

Lesenswert?

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:
1
int main(void)
2
{
3
  lcd_init();
4
  adc_init();
5
  lcd_clear();
6
7
  int t=0;
8
9
  while(1){
10
    
11
  lcd_line(20,20,20,35);
12
  lcd_line(21,35,70,35);
13
  lcd_line(70,35,70,20);
14
  lcd_line(21,20,70,20);
15
16
      lcd_gotoxy(28,24);
17
      lcd_writestringP(PSTR("Button"));
18
19
20
    while(!touched()){}
21
22
      lcd_gotoxy(51,50);
23
      lcd_writestringP(PSTR("das ist ein Test"));
24
    
25
    }
26
27
  while(1);
28
29
  return 0;
30
}

von DerDieter (Gast)


Lesenswert?

Wenn du dir die adc.c anguckst findest du die Funktionen für die 
touchauswertung im folgenden Teil:
1
//Is LCD touched?
2
int touched(void)
3
{
4
  TOUCH_PORT=0x01;
5
  TOUCH_DDR=0x04;
6
  _delay_ms(1);
7
  return (TOUCH_PIN&0x01)?0:1;
8
}
9
10
//Read raw X
11
int read_x(void)
12
{
13
  TOUCH_PORT=0x04;
14
  TOUCH_DDR=0x0C;
15
  _delay_ms(2);
16
  return adc_read(1);
17
}
18
19
//Read raw Y
20
int read_y(void)
21
{
22
  TOUCH_PORT=0x02;
23
  TOUCH_DDR=0x03;
24
  _delay_ms(1);
25
  return adc_read(2);
26
}
27
28
//Read screen X
29
int read_xval(void)
30
{
31
  long tx=read_x();
32
  tx-=280;
33
  tx*=327;
34
  tx/=1000;
35
  if(tx<0){tx=0;}
36
  if(tx>160){tx=160;}
37
  return tx;
38
}
39
40
//Read screen Y
41
int read_yval(void)
42
{
43
  long ty=read_y();
44
  ty-=295;
45
  ty*=192;
46
  ty/=1000;
47
  if(ty<0){ty=0;}
48
  if(ty>80){ty=80;}
49
  return ty;
50
}

Damit müsstest du da was machen können aber wie ganu kann ich dir jetzt 
so auch nich sagen.

von Thomas (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Thomas (Gast)


Lesenswert?

Also würde das einfach bedeuten, dass man mit tx und ty die Werte 
abfragt?
1
if( 
2
    touched(
3
4
 tx=bla ;
5
 ty=bla ;
6
  )
7
           )
8
{}

Oder wie muss ich das verstehen?

von Oliver (Gast)


Lesenswert?

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
char num_buttons; //ButtonNummerierung
2
3
// Buttons initialisieren
4
void button_init(void)
5
{
6
 num_buttons = 0; // Buttons am anfang zurücksetzen oder falsch gewünscht später aus dem EEProm auslesen ?
7
}
8
9
// Button malen
10
void button_add(height,width,x,y,bitmap,funktion die aufgerufen wird wenn gepushed wird(*push))
11
{
12
13
//Buttongrafik aus dem flash laden und zeichen
14
button_bitmap(bitmap,x,y,width,height);
15
16
// Button zur Buttonliste hinzufügen
17
button[num_buttons].on_press = push;
18
button[num_buttons].x1 = x ;
19
button[num_buttons].y1 = y;
20
button[num_buttons].x2 = x + width;
21
button[num_buttons].y2 = y + height;  
22
num_buttons++;
23
}
24
25
// Buttons abfragen
26
void button_poll(void)
27
{
28
struct Point* coords; // Koordinaten in ein Strukt schreiben
29
30
for (int i=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 *coords x > button x koordinate &
36
2. if *coords x < button x2 koordinate &
37
3. if *coords y > button y koordinate &
38
4. if *coords y < button y2 koordinate
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
void funk_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

von Thomas (Gast)


Lesenswert?

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ß

von Oliver (Gast)


Lesenswert?

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 !!
1
button_add(20,40,X-Koordinate,Y-Koordinate,button_hoch,f_hoch);

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

von Thomas (Gast)


Lesenswert?

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

von Sascha W. (sascha-w)


Angehängte Dateien:

Lesenswert?

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

von Stefan F. (feissy)


Lesenswert?

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ß

von Oliver (Gast)


Lesenswert?

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

von Stefan F. (feissy)


Lesenswert?

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.

von Stefan F. (feissy)


Angehängte Dateien:

Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von Stefan F. (feissy)


Angehängte Dateien:

Lesenswert?

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

von Oliver (Gast)


Lesenswert?

@ 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

von Stefan F. (feissy)


Lesenswert?

@ 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

von Sebastian R. (sebr)


Lesenswert?

@ Hannes Lux:
Kannst du mal das Layout von deinem Testboard hier einstellen?

von tb (Gast)


Lesenswert?

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 ?

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

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.

...

von K. J. (Gast)


Angehängte Dateien:

Lesenswert?

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.
1
disp_init_text        ; Display im TEXTMODE Inialisieren
2
  bcf  RW      ; Startbedinungen herstellen
3
  nop
4
  bcf   CS
5
  movlw  0x00      ; Mode Control REG
6
  call  disp_send_c    ; Send Command
7
  movlw  b'00110000'    ; DB5=ON/OFF, DB4=Master/Slave, DB3=Blink, DB2=Coursor, DB1/DB0=TEXT(00)/GRAFIG(10)
8
  call  disp_send_d    ; Send Data
9
  movlw  0x01      ; Character Pitch REG
10
  call  disp_send_c    ; Send Command
11
  movlw  0x75      ; 7x8px
12
  call  disp_send_d    ; Send Data
13
  movlw  0x02      ; Nummer oh Char REG
14
  call  disp_send_c    ; Send Command
15
  movlw  D'26'      ; Anzahl horit. Zeichen -1
16
  call  disp_send_d    ; Send Data
17
  movlw  0x03      ; Display Duty REG
18
  call  disp_send_c    ; Send Command
19
  movlw  0x4F      ; Display Duty
20
  call  disp_send_d    ; Send Data
21
  movlw  0x04      ; Cursor Position REG
22
  call  disp_send_c    ; Send Command
23
  movlw  D'2'      ; Curserstrich y-Pos -1
24
  call  disp_send_d    ; Send Data
25
  return

von Sebastian R. (sebr)


Lesenswert?

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.)!  :-)

von Thomas F. (igel)


Lesenswert?

@ K. J.

ich benutze folgende init-Werte:

Adresse   wert

  0       32
  1       0x77
  2       19
  3       79
  4       7


Thomas

von Hannes L. (hannes)


Angehängte Dateien:

Lesenswert?

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

...

von K. J. (Gast)


Lesenswert?

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.

von Thomas F. (igel)


Lesenswert?

Mein Display sieht genau so aus wie deines, mit den lötbaren 
Anschlüssen.
Bei mir funktionierts.
Ist dein enable-Impuls lang genug?

Thomas

von Thomas (Gast)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von hboy007 (Gast)


Angehängte Dateien:

Lesenswert?

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

von hboy007 (Gast)


Lesenswert?

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)

von K. J. (Gast)


Lesenswert?

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.

von Sascha W. (sascha-w)


Lesenswert?

@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

von Thomas F. (igel)


Lesenswert?

@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

von hboy007 (Gast)


Lesenswert?

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

von hboy007 (Gast)


Lesenswert?

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.

von Thomas Forster (Gast)


Lesenswert?

> PortC 2..5 liefern keinen Strom.

Ein alter Hut: JTAG Enable in den Fuses ausschalten.

Thomas

von hboy007 (Gast)


Lesenswert?

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

von Alex D. (allu)


Lesenswert?

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

von Oliver (Gast)


Lesenswert?

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

von hboy007 (Gast)


Lesenswert?

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

von hboy007 (Gast)


Lesenswert?

ich vergaß es zu erwähnen, das RAM ist ein
KM62256DLG

http://pdf1.alldatasheet.com/datasheet-pdf/view/37306/SAMSUNG/KM62256DLG-7.html

die drei MSB sind pin 2, 26, 1 (ADR12, ADR13, ADR14)

von tb (Gast)


Lesenswert?

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.

von Alex D. (allu)


Angehängte Dateien:

Lesenswert?

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

von Oliver (Gast)


Lesenswert?

@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

von Alex D. (allu)


Lesenswert?

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

von Stefan F. (feissy)


Angehängte Dateien:

Lesenswert?

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

von Thomas F. (igel)


Lesenswert?

@Stefan:

- Der Gleichrichter braucht noch einen dicken Elko.
- Ich habe das Kontrast-Poti gegen Masse, nicht 5V.
- Kondensator an AVCC gegen Masse.

von Stefan F. (feissy)


Lesenswert?

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?

von PIC N. (eigo) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
void GLCD_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  
9
  
10
  GLCD_writecom(0x01);  // Character Pitch
11
  GLCD_writedata(0x76);  // 7x7 Chars  
12
13
  GLCD_writecom(0x02);  // Number of Characters
14
  GLCD_writedata(25);  // 25 Zeichen <--->
15
16
  GLCD_writecom(0x03);  // Set Duty
17
  GLCD_writedata(79);  // 1/80
18
19
  GLCD_writecom(0x04);  // Cursor Position
20
  GLCD_writedata(0x08);  // 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(0x01);  // 1
30
31
  GLCD_writecom(0x0B);  // Cursor upper adress
32
  GLCD_writedata(0x01);  // 1
33
}

und:
1
  GLCD_writecom(0x0C);      // Writing Display Data
2
  GLCD_writedata(0x48);      // H
3
  GLCD_writecom(0x0C);      // Writing Display Data
4
  GLCD_writedata(0x61);      // a
5
  GLCD_writecom(0x0C);      // Writing Display Data
6
  GLCD_writedata(0x6C);      // l
7
  GLCD_writecom(0x0C);      // Writing Display Data
8
  GLCD_writedata(0x6C);      // l
9
  GLCD_writecom(0x0C);      // Writing Display Data
10
  GLCD_writedata(0x6F);      // o
11
  GLCD_writecom(0x0C);      // Writing Display Data
12
  GLCD_writedata(0x20);      // 
13
  GLCD_writecom(0x0C);      // Writing Display Data
14
  GLCD_writedata(0x57);      // W
15
  GLCD_writecom(0x0C);      // Writing Display Data
16
  GLCD_writedata(0x65);      // e
17
  GLCD_writecom(0x0C);      // Writing Display Data
18
  GLCD_writedata(0x6C);      // l
19
  GLCD_writecom(0x0C);      // Writing Display Data
20
  GLCD_writedata(0x74);      // t

LG Nico

von PIC N. (eigo) Benutzerseite


Lesenswert?

Ok habe es selber hin bekommen! War nach dem löschen logischer weise am 
Ende des Displays und musste dann halt wieder an die Startadresse 
wechseln =)

von PIC N. (eigo) Benutzerseite


Angehängte Dateien:

Lesenswert?

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
void GLCD_SetAdress(unsigned char x, unsigned char y)
2
{
3
  unsigned short adress;
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
void GLCD_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

von Thomas Forster (Gast)


Lesenswert?

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

von Rene K. (draconix)


Lesenswert?

Ums mal das Suchen abzukürzen: 80 Zeilen, gerechnet wird aber 0-79 ;)

von PIC N. (eigo) Benutzerseite


Lesenswert?

Ok ja jetzt hab ich es auch gesehen, wegen Binär also von 0 an, ok.
Aber dann bleibt der Rest trotzdem offen, also das eigentliche Problem..

von Rene K. (draconix)


Lesenswert?

Wechsel mal short mit int aus ;) Hatte bei mir viele Probleme bereitet. 
Jedoch mußte ich den Code von AVR-GCC auf MicroC anpassen.

von PIC N. (eigo) Benutzerseite


Lesenswert?

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

von Rene K. (draconix)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

Meines ist auch S/W.. schaut nur so aus ;)

von Rene K. (draconix)


Lesenswert?

Nicolas M. schrieb:
> Meines ist auch S/W.. schaut nur so aus ;)

Ja aber invertiert oder? Bei mir ist der Hintergrund weiß und die Pixel 
Schwarz?!

von PIC N. (eigo) Benutzerseite


Lesenswert?

Achso! Ist doch auch schick =)

von Rene K. (draconix)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

Hab mir leider nur eins gekauft =)
Hast du alle mit heilem TP bekommen, bzw. alles die selben Modelle?

von Charly B. (charly)


Lesenswert?

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

von Rene K. (draconix)


Angehängte Dateien:

Lesenswert?

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

von Migelito (Gast)


Lesenswert?

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

Danke
Migelito

ich glaube ich hab den Beitrag aus versehen, in den alten Forum ab 
gelegt.

von PIC N. (eigo) Benutzerseite


Lesenswert?

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

von Migelito (Gast)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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

von Meik D. (meik)


Lesenswert?

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

von Migelito (Gast)


Lesenswert?

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

von allu (Gast)


Lesenswert?

Migelito schrieb:
> Locate_zeile = 07
> Locate_spalte = 0
> 'Muster    = "01234567890123456789012"
> Lcd_string = "    A U S W A H L"
> Gosub Lcd_write_string

Migelito 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

von Migelito (Gast)


Lesenswert?

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

von allu (Gast)


Lesenswert?

Hallo Migelito

Migelito schrieb:
> Lcd_string = Temp1 "Grad"     -->   +   fehlt

Lcd_string = Temp1 + " Grad"

Temp1 muss ein Ascii-String sein, sonst umwandeln mit str(Temp1).

Gruß  allu

von Tom_W (Gast)


Lesenswert?

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

von Migelito (Gast)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Angehängte Dateien:

Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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
1
void GLCD_Init_G(void)
2
{
3
  GLCD_RES=0;
4
  Delay10KTCYx(1);
5
  GLCD_RES=1;
6
7
  GLCD_writecom(0x00);  // Mode Con
8
  GLCD_writedata(0x32);  // Grafik Mode  
9
  
10
  GLCD_writecom(0x01);  // Character Pitch
11
  GLCD_writedata(0x77);  // Chars  
12
13
  GLCD_writecom(0x02);  // Number of Characters
14
  GLCD_writedata(0x13);  // 20-1 (0-19)
15
16
  GLCD_writecom(0x03);  // Set Duty
17
  GLCD_writedata(0x4F);  // 80-1 (0-79)
18
19
  GLCD_writecom(0x08);  // Start Adresse Low
20
  GLCD_writedata(0x00);  // 0
21
22
  GLCD_writecom(0x09);  // Start Adresse High
23
  GLCD_writedata(0x00);  // 0
24
25
  GLCD_Clear();      // GLCD Inhalt löschen
26
}

So will ich die Linien schreiben:
1
  GLCD_Line(0,0,159,0);      // Linie oben
2
  GLCD_Line(159,0,159,79);    // Linie rechts
3
  GLCD_Line(0,0,0,79);      // Linie links
4
  GLCD_Line(0,79,159,79);      // Linie unten
1
void GLCD_Line (unsigned char x1, unsigned char y1, unsigned char x2, unsigned char y2)
2
{   unsigned char temp;
3
  if (y1==y2)
4
  {  if (x1>x2)
5
    {  temp=x1;
6
      x1=x2;
7
      x2=temp;
8
    }
9
    for (temp=x1; temp<=x2; temp++)
10
      GLCD_Setpixel (temp,y1);
11
12
  }
13
  else if (x1==x2)
14
  {  if (y1>y2)
15
    {  temp=y1;
16
      y1=y2;
17
      y2=temp;
18
    }
19
    for (temp=y1; temp<=y2; temp++)
20
      GLCD_Setpixel (x1,temp);
21
  }
22
}

Kann mir irgendjemand sagen, was ich falsch mache??

LG Nico

von Tony G. (tonyg)


Angehängte Dateien:

Lesenswert?

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.
1
unsigned char tausch( unsigned char a )
2
{
3
  a = ((a >> 4) & 0x0F) | ((a << 4) & 0xF0);
4
  a = ((a >> 2) & 0x33) | ((a << 2) & 0xCC);
5
  a = ((a >> 1) & 0x55) | ((a << 1) & 0xAA);
6
7
  return a;
8
}
9
10
11
void lcd_bmp(unsigned const char *bitmap,unsigned char xpos , unsigned char ypos, unsigned char width, unsigned char height)
12
{
13
 unsigned char bwidth, i,j,yp,xp;
14
 unsigned char by;
15
 unsigned int xend;
16
 
17
 yp=ypos;
18
 xp=xpos;
19
  
20
 xend=(unsigned int)xpos + (unsigned int)width;
21
 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

von Max P. (max1988)


Lesenswert?

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

von tonyg (Gast)


Lesenswert?

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

von Alex D. (allu)


Lesenswert?

Migelito schrieb:

> Hallo Allu,
> irgendwie will es nicht, ich denke aber doch das ich es soweit richtig
> umgesetzt habe, oder ?

Weil Bascom, schau mal unter 
Beitrag "Re: Pollin 16080 Touch mit ATMEGA32 und BASCOM" dort findest Du 
meine Antwort.

Gruß  Allu

von Max P. (max1988)


Lesenswert?

Hallo Tony,
ich habe es mit deiner Tausch Funktion versucht.
Nun funktioniert es einwandfrei.
Dank dir!!!

Gruß Max

von Stefan R. (esbit)


Lesenswert?

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

von Tony G. (tonyg)


Lesenswert?

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

von Stefan R. (esbit)


Lesenswert?

@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

von Wolfgang-G (Gast)


Lesenswert?

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

von Stefan R. (esbit)


Lesenswert?

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

von Wolfgang_G (Gast)


Lesenswert?

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

von Alex D. (allu)


Lesenswert?

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

von Wolfgang_G (Gast)


Lesenswert?

Recht vielen Dank an Alex D. (allu)
Prima Lösung. Teilprogramm läuft schon.
MfG

von PIC N. (eigo) Benutzerseite


Lesenswert?

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

von Johannes (Gast)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi, na klar! Alles im Anhang..
Würde mich dann brennend interessieren ob du in die unteren Zeilen 
springen kannst...

von Johannes (Gast)


Lesenswert?

Danke :)

von Johannes (Gast)


Lesenswert?

Danke :)
ja, ich werd mir das mal anschaun

von PIC N. (eigo) Benutzerseite


Lesenswert?

Wenn irgendwas unklar ist kannst du einfach fragen.
Hoffentlich funktioniert es bald =) dann kann ich das Display endlich 
voll ausnutzen! Hehe

von Marco S. (sharkman)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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!

von Marco S. (sharkman)


Lesenswert?

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.

von Max P. (max1988)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

@Marco: Nein gibt keinen besonderen Grund!

von Marco S. (sharkman)


Lesenswert?

Ich muss leider nochmal ganz dumm fragen, wafür genau ist die EL Drive 
Voltage und muss diese angeschlossen werden?

von Marco S. (sharkman)


Lesenswert?

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.

von PIC N. (eigo) Benutzerseite


Lesenswert?


von PIC N. (eigo) Benutzerseite


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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
void GLCD_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
void GLCD_Clear(void)
2
{
3
  unsigned int i;
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
void GLCD_SetAdress(unsigned char x, unsigned char y)
2
{
3
  unsigned int adress;
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
void GLCD_Setpixel(unsigned char x, unsigned char y)
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

von PIC N. (eigo) Benutzerseite


Lesenswert?

Hi also die Addressierung in der X Achse klappt wohl aber ich komme 
nicht nach unten (Y)... =(

von Tony G. (tonyg)


Lesenswert?

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:
1
void lcd_setadress(unsigned char x, unsigned char y)
2
{  unsigned short adress;
3
  adress=y*20+x;
4
  lcd_writecom(0x0A);        // writeadress low
5
  lcd_writedat(adress&255);
6
  lcd_writecom(0x0B);        // writeadress high
7
  lcd_writedat(adress/256);
8
}

MfG
Tony

von Tony G. (tonyg)


Lesenswert?

Ich benutze übrigens
1
unsigned short adress;
und du
1
unsigned int adress;
und die lcd_writedat und lcd_writecom sehen so aus
1
void lcd_writedat(unsigned char byte)
2
{
3
  RS=0;
4
  lcd_write(byte);
5
}
6
7
void lcd_writecom(unsigned char byte)
8
{
9
  lcd_waitbusy();
10
  RS=1;
11
  lcd_write(byte);
12
}

von PIC N. (eigo) Benutzerseite


Lesenswert?

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?

von Tony G. (tonyg)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hatte ich oben schon mal gepostet aber hier nochmal...

LG Nico

von Armin (Gast)


Lesenswert?

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

von Dirk B. (garag)


Lesenswert?

Hallo Armin,

bei deinem ATmega32 könnte es nicht zufällig ein Problem mit der JTAG 
Fuse und PortC sein ?

Gruß
Dirk

von Armin (Gast)


Lesenswert?

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

von Armin (Gast)


Lesenswert?

Hi!
Ihr dürft mich jetzt steinigen!
Datenbus vertauscht... shame on me. es geht :)

Grüße Armin

von Tony G. (tonyg)


Lesenswert?

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

von Eigo als Gast (Gast)


Lesenswert?

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

von Sascha W. (sascha-w)


Lesenswert?

@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

von Armin S. (knallerbse)


Angehängte Dateien:

Lesenswert?

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

von Michael S. (suttermichi)


Angehängte Dateien:

Lesenswert?

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

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Haste den Kontrast richtig eingestellt?

von Stefan F. (feissy)


Lesenswert?

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ß

von Armin Sch. (Gast)


Lesenswert?

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

von Michael S. (suttermichi)


Lesenswert?

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

von Stefan F. (feissy)


Lesenswert?

weil im Datenblatt steht, dass beide aktiv low sind. Aber dann mache ich 
das so wie du Res aktiv low und Cs aktiv high
Gruß

von Michael B. (planlessmichi)


Lesenswert?

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

von Michael B. (planlessmichi)


Angehängte Dateien:

Lesenswert?

@Michael Sutter:
Anbei mal ein Screenshot von den Fuse-Einstellungen...
Überprüfe Deine doch einfach mal...

von Stefan F. (feissy)


Lesenswert?

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

von Michael S. (suttermichi)


Lesenswert?

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

von Michael B. (planlessmichi)


Lesenswert?

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

von Michael S. (suttermichi)


Lesenswert?

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

von PIC N. (eigo) Benutzerseite


Lesenswert?

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

von Armin S. (knallerbse)


Lesenswert?

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.

von Thorsten (Gast)


Lesenswert?

@ 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

von Armin S. (knallerbse)


Lesenswert?

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

von Thorsten (Gast)


Lesenswert?

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ß

von Armin S. (knallerbse)


Lesenswert?

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

von Stefan F. (feissy)


Lesenswert?

Hallo, habt ihr noch Dipslays, die ihr zum angemessenen Preis loswerden 
wollt, ich bräuchte noch welche ??

Gruß Stefan Feismann

von Stephan B. (s_bronco)


Lesenswert?

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

von lcdler (Gast)


Lesenswert?

Joa, gibts denn jetzt noch Displays irgendwo im netz?!
Oder eben ähnliche um den Preiß?! Vllt auch bissle teurer?

von lcdler (Gast)


Lesenswert?

hat jetzt jemand noch eins?!

von Sascha W. (sascha-w)


Lesenswert?

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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.