hallöle,
ich hab hier ein echtes Problem und weiß nich weiter:
1 | SIGNAL(SIG_ADC)
|
2 | {
|
3 | if (state==0)
|
4 | { ADMUX=VPIN|(1<<REFS0);
|
5 | DDRF&=~(_BV(VPIN));
|
6 | PORTF&=~(_BV(VPIN)); //VPIN als Eingang und pullup aus
|
7 | state=3;
|
8 | ADCSRA|=_BV(ADSC);
|
9 | }
|
10 |
|
11 | if (state==3)
|
12 | { voltage=ADC;
|
13 | ADMUX=YP|(1<<REFS0);
|
14 | if (status==PRESSED)
|
15 | x=x-x/32+ADC; //x=ADCspannungswert an XP===> Y-koordinate!!!
|
16 |
|
17 | DDRF&=~(_BV(YP)); //Y Eingang
|
18 | DDRF&=~(_BV(YN));
|
19 | PORTF|=_BV(YP); //Y Pullup
|
20 | PORTF&=~(_BV(YN));
|
21 | PORTF&=~(_BV(XP)); //X auf Low
|
22 | PORTF&=~(_BV(XN));
|
23 | DDRF|=_BV(XP); //X auf Ausgang
|
24 | DDRF|=_BV(XN);
|
25 | state=4;
|
26 | ADCSRA|=_BV(ADSC);
|
27 | }
|
28 |
|
29 | else if (state==4)
|
30 | { if (PINF&(1<<YP)) //Messen ob Verbindung X-Y
|
31 | status=OPEN;
|
32 | else
|
33 | status=PRESSED;
|
34 | PORTF&=~(_BV(YP)); //Y Pullup aus
|
35 | PORTF|=_BV(XP); //X Spannung anlegen
|
36 | state=5;
|
37 | ADCSRA|=_BV(ADSC);
|
38 | }
|
39 | else if (state==5) // Spannung an Y anlegen: an X die Spannung messen: Y Koordinate
|
40 | { ADMUX=XP|(1<<REFS0);
|
41 | if (status==PRESSED)
|
42 | y=y-y/32+ADC; //y=ADCspannungswert an YP===> X-koordinate!!!!
|
43 | DDRF&=~(_BV(XP)); //X Eingang
|
44 | DDRF&=~(_BV(XN));
|
45 | PORTF|=_BV(XP); //X Pullup
|
46 | PORTF&=~(_BV(XN));
|
47 | PORTF&=~(_BV(YP)); //Y auf Low
|
48 | PORTF&=~(_BV(YN));
|
49 | DDRF|=_BV(YP); //Y auf Ausgang
|
50 | DDRF|=_BV(YN);
|
51 | state=6;
|
52 | ADCSRA|=_BV(ADSC);
|
53 | }
|
54 | else if (state==6)
|
55 | { if (PINF&(1<<XP)) //Messen ob Verbindung X-Y
|
56 | status=OPEN;
|
57 | else
|
58 | status=PRESSED;
|
59 | PORTF&=~(_BV(XP)); //X Pullup aus
|
60 | PORTF|=_BV(YP); //Y Spannung anlegen
|
61 | state=0;
|
62 | ADCSRA|=_BV(ADSC);
|
63 | }
|
64 | }
|
die obige Routine ist hier ja hinreichend bekannt...
ursprünglich wurden in (state=0) bis (state=3) die einzelnen Phasen der
Touchpanelkoordinatenermittlung durchlaufen. Funktioniert :-)
ich hab nun versucht noch eine Spannungsmessung (Akkuzustand des Geräts)
hinzuzufügen und dafür die ursprünglichen 4 Durchlaufphasen auf
(state=3) bis (state=6) "nach hinten" verschoben und versuche in
(state=0) die Vorbereitungen für die Spannungsmessung und das
"Anschubsen" des ADC zu realisieren.
Der pin für die Spannungsmessung ist VPIN=PF7=7
Problem:
bei voltage=ADC wird die gemessene Spannung von PF3 zugewiesen und NICHT
von PF7. Dabei funktioniert die allererste Messung des PF7 korrekt. Erst
wenn die Touchscreenfunktionen zumindest 1 mal durchlaufen wurden wird
danach nie wieder PF7 gemessen sondern immer nur PF3.
Wenn ich in (state=3) oder (state=4) den Folgedurchlauf "verbiege" und
danach wieder mit (state=0) weitermache, dann wird korrekt PF7 gemessen
(touchpanel wird dann natürlich nicht mehr vollständig ausgewertet)
Ich hab auch schon direkt vor "voltage=ADC;" den Inhalt von ADMUX in ne
Variable gesichert und ausgeben lassen: 0b01000111
ist m.E. korrekt... der Spannungswert von voltage beinhaltet trotzdem
den Wert an PF3 und nicht den von PF7...
Hat jemand ne Idee was da falsch läuft?