elomax

[ Techniek ] [ Shop ] [ Site map
Routines ] Blokkeren ] Bronnen ] [ Afhandeling ] Voorbeeld ] Mutual exclusion ] Prioriteiten ]

Terug
Omhoog

Interrupt afhandeling

Elke interrupt stuurt de processor naar een, voor elke interrupt specifiek, vast gedefiniëerd adres in het RAM (!) Het is dus zaak ervoor te zorgen dat op deze plaatsen in het RAM geldige instructies staan. Dit kan door bij het starten van het programma deze RAM locaties te laden met de bytes waaruit een JMP instructie is opgebouwd. Als sprongadres voor de JMP instructie kan dan weer een adres in het programmageheugen opgegeven worden. De volgorde van gebeurtenissen bij het afhandelen van een interrupt wordt dan:

  • Er komt een interrupt.

  • Als de interrupts niet geblokkeerd zijn, zoekt de processor uit welke interrupt bron de interrupt activeerde.

  • De processor herkent de interrupt en zet alle registers op de stack. Daarna worden verdere interrupts van dit type geblokkeerd (de processor set het I-bit of het X-bit.) De volgorde waarin de registers op de stack worden gezet is:

PC minst significante byte
PC meest significante byte
IY minst significante byte
IY meest significante byte
IX minst significante byte
IX meest significante byte
Accumulator A
Accumulator B
Conditie-code register

Merk op, dat ook de program counter op de stack wordt gezet. Hierdoor kan de processor aan het eind van de interrupt routine terugkeren naar de plaats in het normale programma waar de interrupt werd geactiveerd.

  • De program counter wordt geladen met het adres van de betreffende interrupt routine. Elke interrupt bron heeft zijn eigen sprongadres. Voor iedere interrupt bron is een stukje van 3 bytes gereserveerd. Daar past precies een 'jmp' instructie in. De code voor een 'jmp' instructie is $7E. Deze code wordt gevolgd door het adres waar naartoe gesprongen moet worden (in 16 bits), in totaal is de instructie dus 3 bytes. De adressen voor de verschillende interrupt bronnen zijn:

adres naam interrupt bron
$C4 sciint bij een interrupt van de seriële interface
$C7 spiint bij interrupt van de uitbreidingspoort
$CA paiint bij een actieve flank op de ingang van de puls teller
$CD paoint als de pulsteller van $FF naar 0 gaat
$D0 timint als de free running counter van $FFFF naar 0 gaat
$D3 toc5int bij een interrupt van output compare 5
$D3 tic4int bij een interrupt van input capture 4
$D6 toc4int bij een interrupt van output compare 4
$D9 toc3int bij een interrupt van output compare 3
$DC toc2int bij een interrupt van output compare 2
$DF toc1int bij een interrupt van output compare 1
$E2 tic3int bij een interrupt van input capture 3
$E5 tic2int bij een interrupt van input capture 2
$E8 tic1int bij een interrupt van input capture 1
$EB rtiint bij een interrupt van de real-time tijdbasis
$EE irqint bij een interrupt via de externe IRQ pin
$F1 xirqint bij een interrupt via de externe XIRQ pin
$F4 swiint bij een software interrupt
$F7 illegalint wanneer een onbekende instructie gelezen wordt
$FA copint wanneer de watchdog actief wordt
$FD cmint wanneer de clock van de micro-controller niet goed werkt

Nadat in volgende lessen de I/O uitgebreider is behandeld, zult U beter begrijpen waar de verschillende interrupts vandaan komen. De lijst hierboven is opgenomen om compleet te zijn, het is niet nodig er nu al veel aandacht aan te schenken.

  • De processor leest de JMP instructie die eerder op deze adressen werd geplaatst, en springt daardoor naar de feitelijke routine, die de interrupt afhandelt. Deze interrupt routine staat natuurlijk gewoon in het programmageheugen.

  • Aan het eind van de interrupt routine staat een RTI (return from interrupt) instructie. Deze instructie zorgt ervoor dat alle registers weer van de stack worden afgehaald. Ook de program counter wordt van de stack teruggehaald, en daardoor gaat het programma verder op de plaats waar het werd onderbroken. Ook wordt het CCR van de stack teruggehaald. Daardoor krijgen het I-bit en het X-bit hun oorspronkelijke waarde, zodat nieuwe interrupts niet langer meer geblokkeerd zijn.

De adressen in het RAM waar de processor na een interrupt naartoe springt zijn voor elk programma hetzelfde. Daarom zijn ook deze adressen opgenomen in de file 'map512.asm' Door deze file in elk programma in te lezen (met de 'incl' pseudo-instructie) heeft in al uw programma's een naam (label) voor deze adressen.


Vorige ] Volgende ]

© 2005...2008 Elomax [Voorwaarden ]