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; }
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
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
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!
warum führst du das immer wieder an.....: //Initialisieren..und...und.. umständlich geproggt.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.