Problem beim Vergleich von zwei ADC Werten

OP #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.
OP #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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.