Janson: Utgår från att ditt mål är att lära dig som du skrev tidigt i den här tråden. Om inte - säg stopp...
Det jag far efter är att försöka få fram skillnaden mellan "synkron" programmering och interruptstyrd programmering. Den synkrona metoden har du fått till galant - den interruptstyrda har du bara touchat. Din lösning för interrupt utnyttjar inte (ännu) fördelarna med sådan programmering. Du måste både hantera det synkrona i huvudloopen och har samtidigt problemet att synka interrupt och huvudloop. Alla problemen men ingen av fördelarna liksom. Imponerande att få det att fungera ändå
Den viktigaste poängen med min bild är att rensa huvudloopen från allt tidskritiskt och istället låta det styras av interruptrutinen. Interruptrutinen behöver samtidigt rensas från allt som kan göras utanför för att den skall hållas så snabb som möjligt. Du behöver hålla koll på tider och tandluckor i allafall för att hitta rätt tidpunkt. Men du slipper blanda det med sådant som är helt okritiskt med avseende på tidpunkt.
När det gäller ditt svar har jag några konkreta kommentarer:
1) Tandräkning behövs precis som du skriver för att veta var på varvet man är. (Hör hemma i interruptrutinen)
2) Död räkning behövs bara om man skall ha högre upplösning inom en tand. (Hör hemma i interruptrutinen). Detta är enda tillfället när det är motiverat att låta interruptrutinen vara "långsam".
3) Huvudloopen behöver inte veta när tand 16 kommer. (Hör hemma i interruptrutinen)
4) Ingen anledning att stänga av interrupten. Låt interruptrutinen göra snabbt avslut bara i de fallen. Orsaken att stänga av interrupt är att kunna göra annat ostörd. I det här fallet kan du inte göra annat eftersom du istället skulle vara fullt upptagen med att vänta på att spridaren skulle stängas.
En välskriven interruptstyrd lösning kommer:
- fungera med alla varianter av tandhjul
- fungera oavsett cylinderantal
- tillåta allsköns yttrerligare givare
- knappast behöva snabbare CPU (däremot kanske om du behöver fler I/O)
Alla dessa grejer löses med små ändringar på ett ställe vardera i koden.
Dessutom har du redan löst alla svåra kodmässiga problem - så det handlar "bara" om att tänka på ett annat sätt.
Om nyfikenheten tar överhand skall vi nog komma med tips även på den vägen