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
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
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!
Gast
#363323
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...
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.