Problem beim Vergleich von zwei ADC Werten

#3106631
Lesenswert?

Hallo,
dieser Code soll bewirken, dass die LED an PB5 erst angehen soll, wenn 
die Werte der Potis an ADC0 und ADC1 höher als 200 sind. Jedoch dimmt 
die LED nur, wenn die beiden Werte unterschiedlich sind (ADC1 > 200, 
ADC0 < 200). Dabei sollte sie ausgehen. Wo liegt mein Fehler?
1
/*
2
 * PotentiometerCompare.c
3
 *
4
 * Created: 28.03.2013 13:54:33
5
 *  Author: Benedikt_2
6
 */ 
7

8

9
#include <avr/io.h>
10

11
int main(void)
12
{
13
  DDRB |= (1<<5);
14
  
15
  ADMUX |= (1<<REFS0); //sets Reference to AVCC
16
  ADMUX |= (1<<ADLAR); //sets ADC Result to ADCH
17
  ADCSRA |= (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0); //Prescaler = 128 -> ADC Clock = 125 kHz
18
  ADCSRA |= (1<<ADEN);
19
  
20
    while(1)
21
    {
22
        int ADC_0 = getADC0();
23
    int ADC_1 = getADC1();
24
    
25
    if (ADC_0 > 200 && ADC_1 > 200)
26
    {
27
      PORTB |= (1<<5);
28
    }
29
    else
30
    {
31
      PORTB &= ~(1<<5);
32
    }
33
    
34
}
35

36
int getADC0(void){
37
  int ADC0Result;
38
    ADMUX &= ~(1<<MUX0); //ADC Pin = ADC0
39
  ADCSRA |= (1<<ADSC); //start Conversion
40
  ADC0Result = ADCH; //ADC Result
41
  return ADC0Result;
42
}
43

44
int getADC1(void){
45
  int ADC1Result;
46
  ADMUX |= (1<<MUX0); //ADC Pin = ADC1
47
  ADCSRA |= (1<<ADSC); //start Conversion
48
  ADC1Result = ADCH; //ADC Result
49
  return ADC1Result;
50
}

Vielen Dank schonmal im vorraus,
Benedikt
#3106660
Lesenswert?

Benedikt K. schrieb:
> Okay, ich denke ich habe es selber herausgefunden. Ein kurzer delay von
> 20 ms vor jeder Conversion hat gerreicht.

Nein, ein Delay ist erstens Zeitverschwendung, und zweitens was soll es 
vor der Conversion machen? Du wartest erst, und wenn du mit Warten 
fertig bist, startest du die Conversion und liest sofort das Ergebnis 
ein. Ohne zu wissen, ob er überhaupt schon fertig damit ist.

Für diesen Zweck ist das Flag da (ADSC), das zeigt dir an, ob er noch 
arbeitet oder schon fertig ist. Das ist die einzige Möglichkeit, es 
genau zu wissen.
#3106664
Lesenswert?

Bernd S. schrieb:
> Benedikt K. schrieb:
>> Okay, ich denke ich habe es selber herausgefunden. Ein kurzer delay von
>> 20 ms vor jeder Conversion hat gerreicht.
>
> Nein, ein Delay ist erstens Zeitverschwendung, und zweitens was soll es
> vor der Conversion machen? Du wartest erst, und wenn du mit Warten
> fertig bist, startest du die Conversion und liest sofort das Ergebnis
> ein. Ohne zu wissen, ob er überhaupt schon fertig damit ist.
>
> Für diesen Zweck ist das Flag da (ADSC), das zeigt dir an, ob er noch
> arbeitet oder schon fertig ist. Das ist die einzige Möglichkeit, es
> genau zu wissen.

Danke. Verstanden :)

MfG Benedikt
#3109037
Lesenswert?

Rolf Magnus schrieb:
>
> Es gibt noch eine andere: Man kann den ADC auch so einstellen, daß er
> einen Interrupt auslöst, wenn er fertig ist.

Hallo Rolf,

das stimmt, das spart Rechenzeit.
Ich habe aber dem Benedikt nur den Fehler gezeigt, also seine 
Vorgehensweise korrigiert, ohne sein Konzept zu verändern. Es ist eben 
eine Art, wie man es machen kann.
Ich hoffe, du siehst es mir nach? ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren