Hallo zusammen,
Ich hab eine Frage und zwar benutze Ich zum auslesen der ADC Port's den
Tutorial Code vom AVR-GCC Code.
Ich habe mein Touchscreen das Resistiv arbeitet, von PIN1-4 an PA0-PA3
meines Atmegas angeschlossen.
Hab nun folgende Seite gefunden wo steht:
"Touchscreen x read, Set PF0 high and PF2 low and read PF1 or PF3.
Touchscreen y read, Set PF1 high and PF3 low and read PF0 or PF2."
Wobei PF bei mir zu ADC ersetzt wird.
Die Pins sind jeweils mit 100 Ohm wiederständen an den Ports
angeschlossen.
Ich hab nun aktuell folgenden Code:
1 | uint16_t ReadChannel(uint8_t mux)
|
2 | {
|
3 | uint8_t i;
|
4 | uint16_t result;
|
5 |
|
6 | ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0); // Frequenzvorteiler
|
7 | // setzen auf 8 (1) und ADC aktivieren (1)
|
8 |
|
9 | ADMUX = mux; // Kanal waehlen
|
10 | ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen
|
11 |
|
12 | /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
|
13 | also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
|
14 | ADCSRA |= (1<<ADSC); // eine ADC-Wandlung
|
15 | while ( ADCSRA & (1<<ADSC) ) {
|
16 | ; // auf Abschluss der Konvertierung warten
|
17 | }
|
18 | result = ADCW; // ADCW muss einmal gelesen werden,
|
19 | // sonst wird Ergebnis der nächsten Wandlung
|
20 | // nicht übernommen.
|
21 |
|
22 | /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
|
23 | result = 0;
|
24 | for(i=0; i<3; i++) {
|
25 | // Eine Wandlung
|
26 | ADCSRA |= (1<<ADSC);
|
27 | // Auf Ergebnis warten...
|
28 | while(ADCSRA & (1<<ADSC));
|
29 |
|
30 | result += ADCW;
|
31 | }
|
32 | ADCSRA &= ~(1<<ADEN); // ADC deaktivieren (2)
|
33 |
|
34 | result /= 3; // Summe durch vier teilen = arithm. Mittelwert
|
35 |
|
36 | return result;
|
37 | }
|
38 |
|
39 | void debug(void)
|
40 | {
|
41 | char string[100];
|
42 | uint16_t adcval1;
|
43 | uint16_t adcval2;
|
44 | uint16_t adcval3;
|
45 | uint16_t adcval4;
|
46 |
|
47 | DDRA |= (1<<PA0) | (1<<PA2); // ADC0 & ADC2 = Output
|
48 | PORTA |= (1<<PA0); // ADC0 = High
|
49 | PORTA &= ~(1<<PA2); // ADC2 = low
|
50 | DDRA &= ~(1<< PA1) | (1<< PA3); // ADC1 & ADC3 = Input
|
51 | _delay_ms(20);
|
52 |
|
53 | adcval4 = ReadChannel(3); /* MUX-Bits auf 0b0011 -> Channel 3 */
|
54 | adcval4 = 1024 - adcval4;
|
55 |
|
56 | DDRA |= (1<<PA1) | (1<<PA3); // ADC1 & ADC3 = Output
|
57 | PORTA |= (1<<PA1); // ADC1 = High
|
58 | PORTA &= ~(1<<PA3); // ADC3 = low
|
59 | DDRA &= ~(1<< PA0) | (1<< PA2); // ADC0 & ADC2 = Input
|
60 |
|
61 | adcval3 = ReadChannel(2); /* MUX-Bits auf 0b0010 -> Channel 2 */
|
62 | adcval3 = 1024 - adcval3;
|
63 |
|
64 | lcd_ClearScreen();
|
65 | lcd_GotoXY(1,1);
|
66 | lcd_SelectFont(Arial, lcd_ReadFontData, BLACK);
|
67 |
|
68 | sprintf(string, "CA0: %i\nCA1: %i\nCA2: %i\nCA3: %i ", adcval1, adcval2, adcval3, adcval4);
|
69 | lcd_Puts(string);
|
70 | _delay_ms(20);
|
71 | }
|
Kann mir jemand Sagen ob der Code so passt, oder ob ich dessen noch
anpassen kann?
Was mich aber etwas Irritiert, das ich auf einem PIN PA1 knappe 5V
messen kann? Obwohl die AREF doch eigentlich nur 2,5V sein sollte?