ADC funzt net so wie er soll

OP #363319
Lesenswert?

Hallo,

habe eine Frage zum ADC. Er soll bei Aufruf den Port auslesen und das
Ergebnis zurückgeben. So weit scheint das alles auch zu funktionieren.
Aber die If-Else Anweisung nicht. Egal welche Spannung ich anlege oder
welche Werte ich bei dem If Teil eingebe, er führt immer die Else
Schleife aus... Woran liegt das?


#include <avr/io.h>


uint16_t auswertung (void);
volatile uint16_t wert=0;

int main (void)
{
  uint16_t i=0,ergebnis=0;

  //Ports initialisieren
  DDRC  = 0xFF; //Port C als Ausgang für die LED's
  PORTC = 0XFF; //Pull Up's aktiviert


  while(1)
  {
    ergebnis = auswertung();


    if (1023 > ergebnis > 1)
    {
      PORTC = (0b00001111);
    }
    else PORTC = (0b10101010);

  }
}



uint16_t auswertung (void)
{


//Initialisieren
ADCSRA = ((1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0));
ADMUX = ((1<<MUX0) | (1<<MUX1) | (1<<MUX2));

//Dummy Auslesung als Warm-Up wie im Tutorial
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));

//Messung
ADCSRA |= (1<<ADSC);
while (ADCSRA & (1<<ADSC));

wert = ADCL; //ERR
wert += (ADCH<<8); //Alternativ 'wert = ADCW;'

ADCSRA &= ~(1<<ADEN); //ADC Disable

return wert;

}
Gast #363320
Lesenswert?

Hi Markus,

als das
if (1023 > ergebnis > 1)
ist mir persönlich in der Form noch nicht untergekommen.
Versuch doch mal
if ( (ergebnis < 1023) && (ergebnis > 1) )

Wobei Du beachten solltest, dass die Werte von einem ADC meiner
Erfahrung nach sehr stark schwanken können. Daher sei dir vielleicht
angeraten, noch eine Filterfunktion dahinterzuhängen, oder Du nimmst
einen etwas höheren Wert als 1.

Gruss,
Sebastian
Gast #363321
Lesenswert?

if (1023 > ergebnis > 1) bedeutet: if ((1023 > ergebnis) > 1)

D.h. der Vergleich (1023 > ergebnis) liefert  0 oder 1 zurück und ist
damit nie > 1.

Der Code dürfte also vollständig wegoptimiert worden sein und nur der
else-Zweig wird ausgeführt.


Peter

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