@Besserwessi
Der ADC Wert wird nur gespeichert und direkt im Interupt verwendet um das Tastverhältnis des Timer 2 anzupassen.
Hier liegt auch mein Problem:
Ich konnte den Fehler jetzt stark eingrenzen. Wenn ich nur einen Kanal ausführen lasse, dann funkioniert es. Abgesehen von einem Faktor 2 den ich mir nicht erklären kann. Wenn 500mV am Shunt anliegen erhalte ich anscheinend 512 als ADC wert. Bei 10 facher Verstärkung und 5V referenz sollten es aber 1024 sein. Aber ansonsten funktioniert jeder Kanal für sich. Erst wenn ich im Interupt den Kanal wechseln will, klappt nichts mehr.
Das Problem liegt in den drei ADMUX Befehlen im ADC Interrupt.
Darf ich vielleicht nicht das ganze admus neu schreiben sondern nur die entsprechenden Bits toggeln lassen? Ich kann mir das Problem nicht erklären.
Code:SIGNAL(SIG_ADC) { if(ADC_COUNT) //drop first Measurement ADC_TMP+=(ADC<<1); //eigenartigerweise Anpassung der ADC WERTE ADC_COUNT++; if(ADC_COUNT>1) { switch(ADC_CHANNEL) { case(0): // BATTERY UBAT=ADC_TMP; ADC_CHANNEL=1; ADMUX|= 0b01001001; // AREF/right/2-CH amp./10*ADC1->0 break; case(1): // NEAR LED I1=ADC_TMP; if((I_SET>I1) && (OCR1A>400)){ OCR1A--;} else if((I_SET<I1) && (OCR1A<1022)){ OCR1A++;} ADC_CHANNEL=2; ADMUX|= 0b01001101; // AREF/right/2-CH amp./10*ADC3->2 break; case(2): // FAR LED I2=ADC_TMP; if((I_SET>I2) && (OCR1B>400)){ REDOFF GREENON OCR1B--;} else if((I_SET<I2) && (OCR1B<1022)){ REDON GREENOFF OCR1B++;} ADC_CHANNEL=0; ADMUX|= 0b01000111; // AREF/right/8 unipol./ADC7 break; } ADC_COUNT=0; ADC_TMP=0; } ADCSRA|= (1<<ADSC); //start next Conversion*/ }
Lesezeichen