Forum: Compiler & IDEs ADC funzt net so wie er soll


von Markus R. (nil)


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;

}

von Sebastian (Gast)


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

von peter dannegger (Gast)


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

von Markus R. (nil)


Lesenswert?

D'oh!

Man man Achim... wie blöd von mir.

Aber tausend Dank euch zweien. Hätte bestimmt noch ewig nach dem Fehler
gesucht obwohl er so offensichtlich war...

Funktioniert jetzt überigens Perfekt!

von neuer (Gast)


Lesenswert?

warum führst du das immer wieder an.....:

//Initialisieren..und...und..

umständlich geproggt.

von Markus R. (nil)


Lesenswert?

Einmal zu Beginn initialisieren und nicht ständig wieder abstellen oder
was meinst du damit? Oder kann ich den dann besser direkt als 'free
running' einstellen?
Bin für jeden Vorschlag und jede Hilfestellung dankbar...

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.