12. naloga: Prekinitve IRQ

Namesto čakanja v zanki na postavitev bita CPCS kot v podprogramu DELAY_TCO (8. naloga), izvedite merjenje časa s pomočjo prekinitev:

1.    Napišite podprogram INIT_TC0_PSP, kjer nastavite TC0 tako, da bo CPCS predstavljal prekinitveno zahtevo.

2.    Napišite podprogram INIT_AIC, v katerem ustrezno nastavite prekinitveni krmilnik AIC. Za nastavitev AIC je v grobem potrebno narediti naslednje:
      • v AIC_SMR17 vpišite primerno prioriteto, npr. 4. (0 – najnižja, 7 – najvišja). ID številka za TC0 je 17.
      • v AIC_SVR17 vpišite naslov vašega PSP.
      • z vpisom 1 v bit 17 AIC_IECR omogočite prekinitve za TC0.

3.    Napišite prekinitveni servisni program (PSP), ki šteje prekinitve in ko poteče pol sekunde, nastavi globalno spremenljivko MSEC_500 na 1. Pred izhodom iz PSP morate opraviti "slepo" pisanje v AIC_EOICR!

4.    Napišite podprogram ENABLE_IRQ, v katerem je potrebno pobrisati bit I v CPSR.

5.    Napišite glavni program, v katerem pokličete podprograme za ustrezne nastavitve: INIT_AIC, INIT_TCO_PSP, INIT_IO (za krmiljenje LED diode s signalom PC1 – 6. in 7. naloga), ENABLE IRQ. Nato naj glavni program čaka v neskončni zanki, da se vrednost globalne spremenljivke HALF_SEC spremeni na 1. Ko se to zgodi, naj glavni program spremenljivko MSEC_500 postavi na 0 in pokliče ustrezen podprogram, s katerim  preklopi LED diodo.

Pri rešervanju poskusite biti karseda samostojni. Glejte prosojnice in tovarniško listino.

Opomba: Preklapljanje diode bi sicer lahko v celoti opravili tudi v PSP, vendar je običajno koristno, da v prekinitvah postavljamo spremenljivke, ki nam označujejo pomembnejše časovne intervale. Tako potem lahko v glavnem programu opravljamo koristno delo, občasno pa v enakomernih časovnih intervalih sprožamo različna opravila (npr. branje senzorjev, pregled prejetih znakov, itd...).