Valvetaimer

Ajalugu

Clementine kosmoseaparaat, mis lennutati kosmosesse 1994. aasta jaanuaris, suundus pärast kahekuulist Kuu kaardistamist Maa-lähedase asteroidi Geographos suunas. Clementini põhiline juhtprotsessor oli kahetuumaline Honeywell 1750, mis juhtis telemeetriat ning palju teisi funktsioone. Kuigi 1750 sai juhtida ka kosmoseaparaadi tõukureid, siis tegi see seda ainult hädaolukorras. Kogu tõukurite juhtimine toimus manuaalselt maapealsest juhtimiskeskusest.
Nagu oli juhtunud varemgi, tekkis ka 7. mail 1994 tarkvaras aritmeetikaviga. Varem oli tuvastatud umbes 3000 sarnast probleemi, kuid kõik saavutasid lahenduse ning kosmoseaparaat sai oma tööga jätkata. Pärast vea tekkimist 7. mail sai juhtimiskeskus kosmoseaparaadilt segast infot ning veidi hiljem kogu andmevahetus katkes. Kosmoseaparaadil olev kontroller üritas äratada 1750 protsessorit taas ellu, saates sellele 20 minutit käske tarkvaraliseks taaskäivitamiseks. Alles pärast riistvaralise taaskäivitamise käsku ning protsessori algkäivitamist sai tarkvara normaalset tööd jätkata.
Kosmoseaparaat oli küll taas töökorras, kui tarkvara vea tõttu käivitas Honeywell 1750 tõukurid, mis kulutasid ära kogu saadaoleva kütuse. Samal ajal kui protsessorit püüti taas töökorda saada, tiirles kosmoseaparaat ringiratast 80 pööret minutis, kuniks riistvaraline taaskäivitamine sulges kütuseventiili.
Honeywell 1750-l oli sisseehitatud valvetaimer olemas, aga seda ei kasutatud.

Üheastmeline ehk lihtne valvetaimer

Üheastmelise valvetaimeri puhul on kasutusel üks taimer, mille aja lõppedes alustab süsteem kohe taaskäivitamise protseduuri. Seda tüüpi valvetaimerit kasutatakse enamikus mikrokontrollerites. Valvetaimer saab taktsageduse enamasti samast allikast nagu ka protsessor, millega see ühendatud on. On ka selliseid taimereid, mille taktsignaal on pärit erinevast allikast. Mõlemad taktsignaali allikatüübid on kasutusel nii sisemiste kui ka välimiste valvetaimerite puhul. Seda tüüpi struktuuri puuduseks on see, et aja täitumisel tehakse arvutile kohe taaskäivitus, kuigi tekkinud viga võib olla lahendatav mõnel muul viisil.

Mitmeastmeline valvetaimer

Mitmeastmelise struktuuri puhul on pandud mitu taimerit jadamisi, kus ainult esimest taimerit söödetakse. Selle struktuuri eelis lihtsa struktuuriga võrreldes on võimalus süsteem parandada ilma taaskäivitamiseta. Esimese astme aja lõppedes saab arvuti vastava signaali ning käivitatakse ka järgmine aste. Esimeselt astmelt saadud signaaliga arvuti otsustab, kas on võimalik süsteemi parandada või peab tegema süsteemile taaskäivitamise. Samuti paneb arvuti vea kirja vastavasse logisse, mida kasutaja saab hiljem kasutada süsteemi hooldamiseks või parandamiseks. Arvuti poolt positiivse parandamiskatse puhul toimub kõigi mitmeastmelise valvetaimeri astmete taastamine ning arvuti saab alustada uuesti normaalset tööd. Juhul kui probleem on tõsisem ja arvuti ignoreerib esimeselt astmelt saadud signaali, siis loendab teine aste aja lõppemiseni. Kaheastmelise valvetaimeri puhul alustatakse pärast teist astet kogu süsteemi taaskäivitamisega. Kolmeastmelise puhul aga pärast teise astme aja lõppemise signaali alustatakse protseduuriga mida teostatakse ka juhul, kui arvuti enam ei reageeri. Selle protseduuriga kirjutatakse vastav viga logisse ning oodatakse valvetaimeri kolmanda astme täitumist, mille väljundsignaali ilmumisel alustatakse süsteemi taaskäivitamist.

Intervall

Valvetaimeri ajaline intervall on kas konstantne või muudetav. Konstantse puhul on väärtus juba eelnevalt tootja poolt seadistatud. Muudetava puhul toimub väärtuse seadistamine kas riistvaraliselt või tarkvaraliselt. Riistvaraliselt seadistatav ajaline intervall on peamiselt eraldiseisva integraallülitusega valvetaimeritel. Riistvaraline seadistamine tähendab, et taimeri intervall seadistatakse väliselt, kas täiendavate elektroonikakomponentidega või signaaliradadega. Tarkvaraliselt seadistatavat taimerit saab seadistada programmi algkäivitamisel kirjutades vajalikud väärtused õigesse kohta valvetaimeri konfiguratsiooni registrisse. Olenevalt arvutist on võimalik ka seadistada väärtused programmist eraldi.

Aknaga valvetaimer

Tavapärast valvetaimeri ajaline intervall on 0 kuni n, kus n on seadistatud lõppväärtus. Kui taimerit sööta ajavahemikul 0 kuni n, siis taimeri väärtus on tagasi nullis ning alustatakse uut loendamist. Sellisel kujul valvetaimer ei pruugi alati tuvastada tark- või riistvaras juhtuvaid vigu. Kui tarkvaras tekkiva vea tõttu jääb tarkvara konstantselt valvetaimerit söötma, kuigi tarkvara enam normaalset tööd ei jätka, on tavalise 0 kuni n loendava valvetaimeri kasutamine kasutu. Sellist tüüpi vigade vältimiseks kasutatakse aknaga valvetaimerit. Aknaga valvetaimer võimaldab leida tark- või riistvara vigu ka siis, kui söötmine toimub ebanormaalselt kiiresti. Nimest tulenevalt on aknaga valvetaimeril ajaaken ehk kindel aeg, mille jooksul tuleb taimer nullida. Kui nullimine toimub aknast väljaspool saadab valvetaimer välja veasignaali. Nagu ka tavaline valvetaimer loendab aknaga valvetaimer 0 kuni n, kuid nende kahe väärtuse vahel asub ka väärtus m, mis märgib ära akna algusaja.

Väline valvetaimer

STM6321 on integraallülitus, mis võimaldab lisada valvetaimeri eraldiseisvana elektroonikadisaini. Seda mikrokiipi on saadaval viiejalgses SOT-23 pakendis. See on mõeldud protsessoritele või mikrokontrolleritele millel pole integreeritud ehk sisse-ehitatud valvetaimerit. STM6321 on ST Microelectronics poolt toodetud valvetaimer. On palju teisi tootjaid ning mudeleid, mis on oma parameetrite poolest ligilähedased.
Lisaks valvetaimerile on 6321-l ka toitepinge jälgimise üksus, mis mõõdab ning tuvastab toitepinge muutuse üle etteantud lävendi. Pingelävendite väärtused on saadaval erinevaid ning see sõltub STM6321 täpsemast mudelist. Pingelävendi ületamine tekitab samasuguse väljundsignaali nagu ka valvetaimeri loenduri täitumine. STM6321 valvetaimeri ajaline intervall on tüüpiliselt 1.6 sekundit. Taimeri söötmine toimub kasutades 6321 sisendviiku numbriga 4. Sisendviik numbriga 4 on tähistatud tähisega WDI (Watchdog input). Seni kuni WDI sisendsignaal on kõrge (1) või madal (0) toimub taimeri loendamine. Taimeri nullimiseks ehk söötmiseks tuleb WDI sisendi olekut muuta ehk tuleb muuta olekut kõrgelt madalaks või madalast kõrgest. Kui valvetaimeri aeg saab täis või pingenivoo on üle etteantud lävendi, väljundviik numbriga 1 ehk RST(Reset) muudetakse madalaks. WDI on avatud neeluga aktiivselt madal väljund, seega sobib see hästi ühendamiseks otse protsessori või mikrokontrolleri taaskäivitamise sisendi külge.

Integreeritud ehk sisemine valvetaimer

STM8S on ST Microelectronicis poolt toodetud mikrokontroller, millel on intergeeritud harilik valvetaimer kui ka aknaga valvetaimer. Mõlemad valvetaimerid on tarkvaraliselt seadistatavad. Protsessor ning harilik valvetaimer saavad oma taktsignaali eri allikatest, selleks et valvetaimer püsiks aktiivne ka siis, kui protsessori taktsignaal lõpetab töötamise. Harilik valvetaimer saab oma taktsignaali integreeritud aeglase taktsignaali generaatorilt, milleks on 128 kHz. Edasi toimub taktsignaali kahega jagamine ning seejärel on tarkvaraliselt signaali veel omakorda võimalik jagada seitsme erineva väärtusega (4, 8, 16, 32, 64, 128, 256). Erinevad eeljagamise väärtused annavad võimaluse valvetaimeri ajalise intervalli muutmiseks. Samuti on võimalik tarkvaraliselt muuta loenduri loendamisaega mille väärtus saab olla 0–255. Muutes taktsignaali eeljagamis väärtust ja loenduri loendamisaja väärtust on võimalik ajaline intervall muuta 128 kHz taktsignaali korral vahemikus 62,5–1,02 s. STM8 valvetaimer kasutab allalugevat loendurit, seega valvetaimeri toitmisel ei nullita taimerit, vaid see hoopis algväärtustatakse. Taimeri jõudmisel nulli saadetakse taaskäivitusliinile signaal ning kogu mikrokontroller taaskäivitatakse. Kõik seadistusregistrid on kirjutuskaitstud selleks, et vigase tarkvara tõttu ei toimuks nendes registrites kindlasti mitte mingeid muudatusi. Samal põhjusel on ka valvetaimeri söötmise jaoks vajalik kirjutada ettemääratud väärtus kindlasse registrisse. 
 1 /* 2 Näide valvetaimeri seadistamisest ja söötmisest STM8S mikrokontrollerile C keeles. 3 */ 4  5 #include "stm8s.h" 6  7 void wtd_init(void){ 8     // Valvetaimeri seadistamine 9     IWDG_KR = 0xCC;      // Valvetaimeri käivitamine10     IWDG_KR = 0x55;      // Kirjutuskaitse inaktiveerimine11     IWDG_PR |= 6;        // Taktsageduse eeljagamine 256-ga12     IWDG_RLR = 250;      // Ajaline intervall 1 sekund13     IWDG_KR = 0xAA;      // Taasta kirjutuskaitse värskendades taimerit14 }15 16 void main(void){17 18     wtd_init();19     
20     while(1){21     
22         /*23         Programmi põhitsükkel asub siin24         */25         
26         IWDG_KR = 0xAA; // Perioodiline valvetaimeri söötmine27     }28 }
Aknaga valvetaimer STM8S mikrokontrolleril saab oma taktsageduse põhikellalt ehk kiirelt taktsignaali generaatorilt. Kellasignaali allikas võib olla sisemine kui ka väline generaator. Aknaga valvetaimeri üksuse taktsignaal on alati konstantselt jagatud 12288-ga, seega 16 MHz taktsignaali puhul jõuab taimerini 1.302 kHz. Antud taktsagedusega on võimalik saavutada 0.768 kuni 49.152 millisekundiline ajaline intervall. STM8 aknaga valvetaimeril on ainult 2 seadistus registrit. Üks neist annab ette taimeri loendamise väärtuse ning teine akna alguse väärtuse. Taimeri loendamise väärtus saab olla vahemikus 64 kuni 127 ning akna alguse väärtus saab olla 64 kuni väärtuseni seadistatud loendamise väärtuseni. Süsteemi taaskäivitamine toimub kui taimeri väärtus loendatud alla 64 või kui taimeri algseadistamine toimus väärtuse juures mis on suurem kui akna alguse väärtus.
/*Näide aknaga valvetaimeri seadistamisest ja söötmisest STM8S mikrokontrollerile C keeles.*/#include "stm8s.h"#include "delay.h"void wwtd_init(void){
    // Valvetaimeri seadistamine
    WWDG_CR |= (1 << WDGA); // Valvetaimeri käivitamine
    WWDG_CR |= (1 << T6);   // T6 biti kõrgeks tõstmine, et vältida kohest taaskäivitamist
    WWDG_CR |= 0x7F;        // Ajaline intervall 49,152 ms
    WWDG_WR = 0x68;         // Akna alguse väärtus 18,432 ms}void main(void){

    wwtd_init();
    
    while(1){
    
        /*        Programmi põhitsükkel asub siin mis võtab aega umbes 25-30 ms        */
        
        delay_ms(30); // Põhitsükli viide
        
        WWDG_CR |= 0x7F; // Perioodiline valvetaimeri söötmine
    }}