Jag har variabeln, MeasurementStatus, som flaggregister, där bit0 falggar för fel i mätningen, bit1 flaggar för att en ny mätning gjorts. Och i ISR (Interrupt Service Routine) vill jag sätta just biten som flaggar för att en ny mätning gjorts.
Så här ser de relevanta delarna av koden ut:
Kod: Markera allt
//Globala variabler och definitioner
#define NEW_MEASUREMENT 0b00000010
unsigned char MeasurementStatus = 0;
//ISR:
ISR(TIMER1_CAPT_vect) //Rising edge on ICP1-pin (Flow Sensor Pulses) detected
{
TCNT1 = 0; //Clear Timer1 (16bit) for the following measurment
MeasurementStatus |= NEW_MEASUREMENT; //Flag for a complete period time measurment
// PORTB ^= (1<<PORTB2); //BARA TESTRAD FÖR FELSÖKNING!! FUNGERAR DOCK!
}
//I main():
if(MeasurementStatus & NEW_MEASUREMENT) //Is the NEW_MEASUREMENT flag bit set from ISR?
Jag har provat att sätta en annan global variabel (unsigned char temp) temp = 1; i ISR och sedan bara kollat if(temp) i main, men den köper inte det heller!
Jag ser ju på togglingen (det som är bortkommenterat i ISR) att avbrotten fungerar fint, exakt när de ska, så ISR körs ju uppenbarligen!
Och jag har testat att sätta en negation i if(!temp) och då körs den ju så jag tycker att det är uppenbart att det är skrivningen av variabeln i ISR som inte fungerar, men varför???
Vad missar jag?? Jag har läst i databladet för ATM48 om interrupt och jag hittar iaf inget om detta..