Beseda reset se pogosto uporablja. Včasih v zvezi s programskim postavljanjem in brisanjem posameznih bitov SET/RESET, včasih v zvezi s ponastavitvijo mikrokontrolerja. Kakorkoli pa je ta RESET videti “vauu”, je to čisto prava in povsem običajna prekinitvena rutina, ena od mnogih, ki jih lahko uporabimo v svojih programih. Mikrokontroler ima več virov prekinitev, pa tudi več virov ponastavitve – reseta. Velikokrat je bolj pomembno »trdno mirovanje« v stanju reseta, kot »labilno delovanje« z nepredvidljivimi posledicami. Spoznali bomo, da reset ni le reset, ampak s sabo prinaša tudi informacijo, kateri od virov je povzročil prekinitev, kar lahko pomembno vpliva na to, kako bomo po resetu nadaljevali z izvajanjem programa.
Ponastavitev mikrokontrolerja – Reset
Ob resetu se vsi V/I (vhodno-izhodni) registri postavijo na svoje začetne vrednosti in prične se izvajanje programa, na katerega skočimo prek RESET vektorja, ki se nahaja ravno na naslovu $0000H.Morda je dobro vedeti tudi to, da imajo AVR mikrokontrolerji 16-bitno organizacijo Flash programskega spominskega prostora, ker so tudi ukazi na binarnem strojnem nivoju v 16-bitni ali 32-bitni obliki. S tem, ko je na naslovu 0000 zapisano, kje naj se začne izvajanje programa porabimo 32 bitov (2 x Word) Flash programskega prostora, vendar to pomeni le dve lokaciji programskega pomnilnika, ker je ena programska lokacija predstavljena s 16-timi biti. Preden se odločimo, kateri mikrokontroler bomo uporabili v naši aplikaciji, je dobro vsaj preleteti vsebino tehnične dokumentacije, v kateri bomo našli vse mogoče prekinitve, ki jih mikrokontroler podpira. Na sliki 1 je primer takšne tabele z naslovi prekinitvenih vektorjev za mikrokontroler ATMega 32.
Prekinitve
Prekinitveni vektor je vnaprej določen naslov v programu, kjer je zapisano, kam skočiti v primeru, ko se ta prekinitev zgodi. Mi moramo poskrbeti za to, da je na naslovih prekinitvenih vektorjev vpisan skok na lokacijo v programu, kjer se začne podprogram s prekinitveno rutino. Vsaka prekinitvena rutina se konča z ukazom RETURN.
Na sliki 2 imamo narisano blok shemo izvajanja programa, v katerem pride do prekinitve. V trenutku prekinitve izvajamo ukaz, ki je zapisan na lokaciji $0078h. Ukaz se najprej izvede do konca, potem pa se na programski sklad zapiše naslov naslednjega ukaza, ki bi ga sicer izvajali, če vmes ne bi prišlo do prekinitve, v našem primeru je to naslov $007Ah. Potem program samodejno skoči na naslov, kjer ima zapisan prekinitveni vektor za tisto prekinitev.Če je to prekinitev INT1, bi bil to naslov $004h. Tu je zapisano, na katerem naslovu se nahaja prekinitvena rutina za INT1, v našem primeru je to lokacija $13Fh. Izvede se neposreden skok na to lokacijo in izvedejo se vsi ukazi znotraj prekinitvenega podprograma. Ob ukazu RETURN se samodejno naloži naslov ukaza, ki naj bi ga izvedli že prej, če ne bi vmes prišlo do prekinitve (v našem primeru je to naslov $007Ah). Izvede se neposreden skok na to lokacijo in nadaljuje z izvajanjem programa. Vse, kar na sliki 2 ni na obarvani podlagi, se izvaja samodejno.Na modri podlagi je običajni program, na rdeči pa je prekinitveni podprogram.