Forum: Compiler & IDEs Problem beim Vergleich von zwei ADC Werten


von Benedikt K. (benek)


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

von Peter II (Gast)


Lesenswert?

du solltest mal warten bis der ADC fertig ist.

von Benedikt K. (benek)


Lesenswert?

Peter II schrieb:
> du solltest mal warten bis der ADC fertig ist.

Wie bewerkstellige ich das?

von Bernd S. (bernds1)


Lesenswert?

Benedikt K. schrieb:
> Peter II schrieb:
>> du solltest mal warten bis der ADC fertig ist.
>
> Wie bewerkstellige ich das?
1
while ( ADCSRA & ( 1<<ADSC ) )
2
{
3
   ;
4
}

Außerdem sollte erstmal eine Auslesung des ADC erfolgen, die
verworfen wird, damit der ADC sich stabilisiert.

von Benedikt K. (benek)


Lesenswert?

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

MfG Benedikt

von Bernd S. (bernds1)


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.

von Benedikt K. (benek)


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

von Rolf M. (rmagnus)


Lesenswert?

Bernd S. schrieb:
> 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.

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

von Bernd S. (bernds1)


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? ;-)

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.