www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATTiny24 ADC weiß nicht weiter


Autor: Gepi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Servus zusammen,

ich versuche hier seit Stunden das der ADC meines ATTiny24 das macht was 
ich will ... jetzt wärs mal interessant wenn sich jemand meinen 
relevanten Code anschaut ob da ein grober Fehler drin ist:
void compareValues(void){
  int adcCh1 = 0x00; //Value Channel 1
  int adcCh2 = 0x00; //Value Channel 2
  int waste = 0x00; //discarded HighBytes

  ADCSRA |= (1<<ADSC); //start conversion
  while(ADCSRA & (1<<ADSC)){ //wait till conversion finished
    asm volatile("NOP");  
  }

  adcCh1 = ADCL; //LowByte einlesen
  waste = ADCH; //HighByte einlesen (wird nicht berücksichtigt)

  ADMUX = 0x01; //Kanal 2 einstellen
  ADCSRA |= (1<<ADSC); //start conversion
  while(ADCSRA & (1<<ADSC)){ //wait till conversion finished
    asm volatile("NOP");
  }
  
  adcCh2 = ADCL; //LowByte einlesen
  waste = ADCH; //HighByte einlesen (wird nicht berücksichtigt)

  if(adcCh1 > adcCh2){
    doLED1();
  }
  if(adcCh1 < adcCh2){
    doLED2();
  }
  if(adcCh1 == adcCh2){
    PORTA = PORTA | 0x0C;
  }
}

Das ist die Routine in der ich die Werte von Kanal 1 (PA0) und Kanal 2 
(PA1) einlese, vergleiche und dann je nachdem welcher größer ist meine 
LED 1 oder LED2 einschalte. Allerdings leuchten immer beide LEDs was 
bedeuten würde, dass meine Werte gleich sind. Habs aber nachgemessen, es 
liegen Werte von 0,9V (PA0) und 1,5V (PA1) an. VREF ist die 
Versorguingsspannung (5V), die ADC-Register sollten auch alle richtig 
eingestellt sein. Wens aber interessiert (vielleicht liegt der Fahler 
aber auch hier) mal meine main()-Routine:
int main(void) {
  DDRA = 0x0C;
  
  ADMUX = 0x00;
//  DIDR0 = 0xFC;
  ADCSRA = 0x83;

  while(1){
    compareValues();
  }

Bin für jede Hilfe dankbar.

Gruß

Gepi

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst in ADCSRA den ASDC auch einschalten und den Prescaler setzen.

Schau dir doch mal die Routine im Tutorial an
http://www.mikrocontroller.net/articles/AVR-GCC-Tu...

Autor: Gepi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja aber den Prescaler habe ich ja gesetzt mit

ADCSRA = 0x83;

und mit

ADCSRA |= (1<<ADSC);

setz ich ADSC auf 1, starte also die Konvertierung ... oder?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst den ADC einschalten vor der Konvertierung. Dafür muss ADEN 
gesetzt werden!

Autor: Michael L. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du verwirfst das High-Byte und damit die "wichtigsten" obersten 2 Bits. 
Versuch mal das Ergebnis links zu justieren und dann das Low-Byte zu 
verwerfen und nur das High-Byte zu verwenden.

Nach einer Umstellung des AD-Kanals ist die erste Wandlung unbrauchbar 
und muss verworfen werden.

Autor: Gepi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab den Fehler gefunden ... einfach wieder auf Kanal 1 zurückwechseln 
und schon gehts. Und natürlich jedes mal den Wert der ersten Wandlung 
verwerfen.

Na jedenfalls danke für die Hilfe.

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.