mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 ADC / Touchscreen


Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint16_t ReadChannel(uint8_t mux)
{
  uint8_t i;
  uint16_t result;
 
  ADCSRA = (1<<ADEN) | (1<<ADPS1) | (1<<ADPS0);    // Frequenzvorteiler 
                               // setzen auf 8 (1) und ADC aktivieren (1)
 
  ADMUX = mux;                      // Kanal waehlen
  ADMUX |= (1<<REFS1) | (1<<REFS0); // interne Referenzspannung nutzen 
 
  /* nach Aktivieren des ADC wird ein "Dummy-Readout" empfohlen, man liest
     also einen Wert und verwirft diesen, um den ADC "warmlaufen zu lassen" */
  ADCSRA |= (1<<ADSC);              // eine ADC-Wandlung 
  while ( ADCSRA & (1<<ADSC) ) {
     ;     // auf Abschluss der Konvertierung warten 
  }
  result = ADCW;  // ADCW muss einmal gelesen werden,
                  // sonst wird Ergebnis der nächsten Wandlung
                  // nicht übernommen.
 
  /* Eigentliche Messung - Mittelwert aus 4 aufeinanderfolgenden Wandlungen */
  result = 0; 
  for(i=0; i<3; i++) {
    // Eine Wandlung
    ADCSRA |= (1<<ADSC);
    // Auf Ergebnis warten...
    while(ADCSRA & (1<<ADSC));
    
    result += ADCW;
  }
  ADCSRA &= ~(1<<ADEN);             // ADC deaktivieren (2)
 
  result /= 3;                     // Summe durch vier teilen = arithm. Mittelwert
 
  return result;
}

void debug(void)
{
  char string[100];
  uint16_t adcval1;
  uint16_t adcval2;
  uint16_t adcval3;
  uint16_t adcval4;

  DDRA  |=  (1<<PA0) | (1<<PA2); // ADC0 & ADC2 = Output
  PORTA  |=  (1<<PA0);   //  ADC0 = High
  PORTA  &=   ~(1<<PA2);  // ADC2 = low
  DDRA  &=  ~(1<< PA1) | (1<< PA3); // ADC1 & ADC3 = Input
  _delay_ms(20);

  adcval4 = ReadChannel(3); /* MUX-Bits auf 0b0011 -> Channel 3 */
  adcval4 = 1024 - adcval4;

  DDRA  |=  (1<<PA1) | (1<<PA3); // ADC1 & ADC3 = Output
  PORTA  |=  (1<<PA1);   //  ADC1 = High
  PORTA  &=   ~(1<<PA3);  // ADC3 = low
  DDRA  &=  ~(1<< PA0) | (1<< PA2); // ADC0 & ADC2 = Input

  adcval3 = ReadChannel(2); /* MUX-Bits auf 0b0010 -> Channel 2 */
  adcval3 = 1024 - adcval3;

  lcd_ClearScreen();
  lcd_GotoXY(1,1);
  lcd_SelectFont(Arial, lcd_ReadFontData, BLACK);
  
  sprintf(string, "CA0: %i\nCA1: %i\nCA2: %i\nCA3: %i ", adcval1, adcval2, adcval3, adcval4);    
  lcd_Puts(string);
  _delay_ms(20);
}



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?

Autor: qf (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?!

Autor: Daniel Steiner (sany)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.