Internet försvann hemma lagom till Lilla M's nannadags...
Koden i mitt förra inlägg är sk pseudokod, dvs kod som inte nödvändigtvis behöver fungera, den bara visar en princip. Semikolon och annat kan saknas.
Jag ska försöka ta det steg för steg.
Koden, det finns en hantering i loop-funktionen som i sig är ointressant för att beskriva det här.
Men vad den gör är att hämta ett värde och släcka en flagga, i princip.
ISR rutinen gör det motsatta, sätter en flagga och sätter en tid i en variabel, om flaggan är satt så anropas PANIC().
- Kod: Markera allt
void setup() {
setup_INT0();
pinMode(13,OUTPUT);
digitalHigh(13);
sei(); //Globala interrupt på
}
- Kod: Markera allt
setup_INT0();
Här sätts alla register osv så att hw-interrupt INT_0 (
pinne 2) ska fungera.
Sedan gör vi lite initiala saker som oxå tar tid
- Kod: Markera allt
pinMode(13,OUTPUT);
digitalHigh(13);
Jag testade även att ta bort dessa rader, det blev kanske något bättre, men inte alls bra!
Och till sist slår vi på globala interrupt
- Kod: Markera allt
sei(); //Globala interrupt på
Problemet är att den sista funktionen inte har någon inverkan då globala interrupt redan är på.
Och därmed kommer, ISR:en (Interrupt Service Routine) att kunna anropas redan innan vi var lämnat setup_INT0(), dvs även innan vi har hamnat i loop- funktionen. En gång är inget problem, men händer det två så har inte flaggan släckts.
Jag vet inte om Arduinon har en massa hyss för sig innan setup() och/eller innan loop(), troligen, så att det är därför det blir som det blir.
Men om vi stänger av globala interrupt det första vi gör så borde det
iaf bli bättre. cli() i andra kodsnutten i förra inlägget!
Det blir iaf så pass bra att är pulsgeneratorn inställd på 8000rpm så missas bara en av femtio omstarter av den andra Unon, mot förut ca en på trettio som gick bra vid 800rpm! Och en start med pangpå 8000rpm lär väl aldrig ske!
E'du'me?