Forum: Mikrocontroller und Digitale Elektronik Atmega16 ADC / Touchscreen


von Daniel S. (sany)


Lesenswert?

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?

von qf (Gast)


Lesenswert?

2.5V ist nur die referenzspannung des adc, nutzt du die portpins als 
reguläre ausgänge, liegen dir natürlich normale pegel dort an.

die 100ohm-widerstände über welche dein touchscreen mit den portpins 
verbunden ist fanden beachtung?!

von Daniel S. (sany)


Lesenswert?

Jupp fanden beachtung... Wollte nur mal anfragen, ob ich diese auch 
durch 470 ohm ersetzen könnte?

Oder wie setzte ich ein ADC als Ausgang ?

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.