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


von Gepi (Gast)


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:
1
void compareValues(void){
2
  int adcCh1 = 0x00; //Value Channel 1
3
  int adcCh2 = 0x00; //Value Channel 2
4
  int waste = 0x00; //discarded HighBytes
5
6
  ADCSRA |= (1<<ADSC); //start conversion
7
  while(ADCSRA & (1<<ADSC)){ //wait till conversion finished
8
    asm volatile("NOP");  
9
  }
10
11
  adcCh1 = ADCL; //LowByte einlesen
12
  waste = ADCH; //HighByte einlesen (wird nicht berücksichtigt)
13
14
  ADMUX = 0x01; //Kanal 2 einstellen
15
  ADCSRA |= (1<<ADSC); //start conversion
16
  while(ADCSRA & (1<<ADSC)){ //wait till conversion finished
17
    asm volatile("NOP");
18
  }
19
  
20
  adcCh2 = ADCL; //LowByte einlesen
21
  waste = ADCH; //HighByte einlesen (wird nicht berücksichtigt)
22
23
  if(adcCh1 > adcCh2){
24
    doLED1();
25
  }
26
  if(adcCh1 < adcCh2){
27
    doLED2();
28
  }
29
  if(adcCh1 == adcCh2){
30
    PORTA = PORTA | 0x0C;
31
  }
32
}

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:
1
int main(void) {
2
  DDRA = 0x0C;
3
  
4
  ADMUX = 0x00;
5
//  DIDR0 = 0xFC;
6
  ADCSRA = 0x83;
7
8
  while(1){
9
    compareValues();
10
  }

Bin für jede Hilfe dankbar.

Gruß

Gepi

von Karl H. (kbuchegg)


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-Tutorial#ADC_.28Analog_Digital_Converter.29

von Gepi (Gast)


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?

von Johannes M. (johnny-m)


Lesenswert?

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

von Michael L. (Gast)


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.

von Gepi (Gast)


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.

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.