Hallo.
Ich habe hier ein kleines Problem mit meinem ATxmega128A1.
Es soll mit einer Frequenz von 250kHz Werte vom ADc eingelesen werden.
Der ADC ist momentan im Freerun modus konfiguriert und der
Interrupt-mode ist auf "complete" gestelt.
Die ISR des ADCs sieht so aus:
1 | ISR(ADCA_CH0_vect) {
|
2 | PORTF.OUTTGL = PIN1_bm;
|
3 | if (protectFlag == 0) {
|
4 | adcAvgVal += val;
|
5 | adcSamples++;
|
6 | }
|
7 | }
|
So weit so gut. Bis hierher funktioniert alles ohne Probleme. Die 250kHz
wurden mittels Oszi kontrolliert.
Jetzt habe ich einen Timer, welcher mit 40kHz getaktet ist. Dieser Timer
soll in jeden Taktzyklus das arithmetische Mittel des ADC-Wertes
berechnen und diesen in einer Variable speichern.
Den Timer prüfe ich manuell in der Main-While-Schleife ab (ich dachte so
kann ich einen interrupt vermeiden, da ich nur auf das Flag prüfe)
1 | if ((TCC0.INTFLAGS & TC0_OVFIF_bm) != 0) {
|
2 | TCC0.INTFLAGS = TC0_OVFIF_bm;
|
3 | //PORTF.OUTTGL = PIN1_bm;
|
4 | protectFlag = 1;
|
5 | currentVal = adcAvgVal / adcSamples;
|
6 | adcSamples = 0;
|
7 | adcAvgVal = 0;
|
8 | protectFlag = 0;
|
9 | }
|
Jetzt zum eigentlichen Problem:
Sobald der ADC und der Timer die slebe Interrupt-Priorität haben, kommt
der ADC-Interrupt nicht mehr an die Reihe. Es ist immer ein entweder
oder.