Hallo,
Ich möchte auf einem mega16 verschiedene Interruptprioritäten
realisieren.
Das Projekt ist ein Leistungsmessgerät für Netzgeräte ("Stromzähler" +
Extras). Strom und Spannung wird mit 5Khz gemessen, multipliziert und
integriert...
Vorhandene ISRs:
TIMER1_COMPA_vect:
400Hz
darf unterbrochen werden, deswegen "sei();" am Anfang der Routine
(7-segment display, Auswertungen, Taster entprellen etc.)
TIMER0_COMP_vect:
5Khz
Triggert die Erste von zwei AD-Wandlungen (Spannung).
ADC-Ergebnisse der letzten Messugen multiplizieren und integrieren
ADC_vect:
Holt die ADC-Ergebnisse aus den Registern und triggert die 2te der zwei
AD-Wandlungen (Strom).
Was ich erreichen möchte: Dass die Timer0-isr vom der ADC-isr
unterbrochen werden kann, um die 2te Messung so früh wie möglich
auszulösen.
Als Umsetzung ist das geplant:
1 | ISR(TIMER0_COMP_vect)
|
2 | {
|
3 | uint16_t Current,Voltage;
|
4 | //Spannungsmessung Starten
|
5 | ADMUX=3;//Wählen von Channel 3
|
6 | ADSCRA=0b11001110;//ADC on, ADC start , interrupt enabled, 250KHz ADC-Clock
|
7 |
|
8 | //Alte Ergebnisse abholen
|
9 | Voltage=strADCControl.u16Voltage;
|
10 | Current=strADCControl.u16Current;
|
11 |
|
12 | TIMSK&=~(1<<OCIE1A);//Deaktiviere den niederprioren Interrupt
|
13 | sei();//Lasse den höherprioren Interrupt (ADC) zu
|
14 |
|
15 | ...
|
16 | Alte Ergebnisse werden hier multipliziert und integriert
|
17 | ...
|
18 |
|
19 |
|
20 | cli();
|
21 | TIMSK|=(1<<OCIE1A);//Aktivieren den niederprioren Interrupt wieder
|
Wird das so funktionieren?
Der Punkt, bei dem ich mir nicht sicher bin: Wenn die Interrupt Flag von
Timer 1 gesetzt wird, während OCIE1A deaktiviert ist, wird die ISR genau
nach Verlassen der ISR(TIMER0_COMP_vect) ausgeführt, oder?
Grüße