Jste zde

Návod na používání watchdogů na asynchronním portu PC

Dále popsaný watchdog pravidelně monitoruje aktivitu na sériovém portu počítače a v případě jeho

nečinnosti vyvolá reset. Tím lze předejít nepříjemnostem způsobeným "zatuhnutím" PC pracujících bez

dozoru.

Popis watchdogu

Schéma zapojení watchdogu je na obrázku 1. Jádrem zařízení je jednočipový MCU ATtiny12L-4PI (pouzdro SOIC8), který byl vybrán zejména pro své malé rozměry, přijatelnou cenu, nízkou spotřebu, vnitřní watchdog a datovou EEPROM, do které je uživatelem uloženo vlastní nastavení (viz dokument Nastavení a komunikace).
 


Schéma zapojení Watchdogu


Modul je napájen z osobního počítače přes linky TX, RTS a DTR (piny 3,4 a 7 na konektoru DB9) příslušného UARTu (COMu). V klidovém stavu (logická 1 RS232) je na TX, RTS a DTR napětí mezi -12V (bez zatížení) až -8V (při odběru 5mA). Z tohoto důvodu je napájení posíleno, sdruženo diodami D1 až D3. V okamžiku vysílání dochází na výstupech ke změnám napěťových úrovní, neboť logické nule odpovídá napětí až +12V, diody plní tedy i funkci oddělovací. V okamžicích přenosu dat může být, podle typu ovladače, v jedné chvíli na všech třech výstupech kladné napětí a watchdog bude napájen pouze z kapacitoru C1. Na výstupu stabilizátoru 79L05 dostáváme přibližně -5V, kterými napájíme samotný jednočip.

Uvedený MCU nemá hardwarrovou podporu UART, je tedy čtení asynchronních dat výlučně programovou záležitostí a protože přesnost časové základny určuje spolehlivost přijímání dat z asynchronního rozhraní, je MCU časován krystalem 4MHz, což je maximální, výrobcem doporučená hodnota pro ATtiny12L-4PI. Při 4MHz a vnitřním přerušení od volně běžícího časovače bez preskaleru, bez korekce obsahu registru časovače, vychází četnost přerušení 4000000/256=15625 za sekundu, tím byla zvolena přenosová rychlost 4800 baudů a čtení 3 vzorků na jeden bit dat. Poměr 15625/4800=3.255 není celé číslo, proto je po identifikaci hrany start-bitu čten 2. , 5. vzorek a tomu odpovídá kontrola start-bitu, čtení d0, d1 až d7 a kontrola stop-bitu. Více podrobností v přiloženém zdrojáku.

Správně přijatý řetězec MCU potvrdí krátkým bliknutím led. Nepřijme-li jednočip do nastaveného timeoutu další řetězec, nastaví na výstupu GP2 logickou jedničku, čímž se stane kanál source-drain tranzistoru T1 (JFET) vodivý a po dobu jedné sekundy je tak simulováno stisknutí resetovacího tlačítka, které je připojeno paralelně k source a drain tranzistoru T1. Pro nižší odpor ron kanálu výrobce tranzistoru doporučuje, aby byl na source nižší potenciál než na drain ( proto označení reset- a reset+), na funkčnost zařízení ale opačně zapojený JFET vliv nemá.


Strana součástek plošného spoje


Přijme-li MCU řetězec wdtpor120s , uloží do své EEPROM hodnotu 120, která odpovídá timeoutu 120 sekund po zapnutí počítače ( Power On Reset ). Po každém zapnutí počítače (napájení) nebo pokud watchdog vyresetuje počítač, je první hodnota timeoutu hodnotou z řetězce wdtpor. Po naprogramování jednočipu je wdtpor nastaven na 900 sekund ( 15 minut ).


Strana spojů plošného spoje


Konstrukce

DPS je vyrobena tak, aby se po vyfrézování a napájení konektoru DB9 dala vložit do standartní plastové krytky DB9. Z otvoru v krytce, kde jinak vychází kabel, vykukuje s přesahem asi 3mm ledka a slabý dvojžilový kablík v délce asi 70cm, na jehož konci je napájen dutinkový jumper, který je mechanicky zasunut na pozici resetovacího tlačítka na mainboardu. Pokud není kablík příliš tlustý, vejde se do otvoru v krytce i 5mm ledka.

Při osazování je nejvhodnější začít stranou součástek: D2 a D3, R2, R1, C1, C2, pokračovat stranou spojů: D1, R3, R4 a C4. Na DPS zapájet konektor JP1 a dále na straně součástek osadit naprogramovaný MCU, dále IO2 a T1. Pokračovat na straně spojů: C3 a X1 a naposled na straně součástek napájet D4 a kablík.

Popis činnosti

Základem je jednočipový mikropočítač MCU , který od okamžiku zapnutí počítače (resetu) začne odměřovat nastavený timeout, tak zvaný čas po zapnutí ( TimeOnPOR *). Po zapnutí je vnitřní registr MCU WdtDownCounter nastaven na výchozí čas a každou sekundu je jeho hodnota snížena o 1. Jakmile je hodnota WdtDownCounter rovna 0, je vyvoláno na jednu sekundu sepnutí výstupního spínače, který vyresetuje PC, registr WdtDownCounter je opět naplněn výchozí hodnotou TimeOnPOR a odměřování je spuštěno znovu jako v předešlém případě.

Úkolem PC je pravidelně posílat po asynchronním rozhraní do jednočipového MCU příkazy ( WdtTime ), které provedou nové nastavení registru WdtDownCounter na vyslanou hodnotu a to ještě dříve, než nastane jeho vynulování, které by vedlo k resetu počítače.

V prostředí linuxu spusťte:

nohup bash -c "while true; do echo wdt240s > /dev/ttyS0; sleep 60s; done" & 

Vysvětlení:

  • nohup - způsobí, že program zůstane běžet i po uzavření konzole
  • bash - interpret skriptu
  • wdt240s - řetězec, který je odeslán sériovým portem do MCU (popis dále)
  • /dev/ttyS0 - je port, na který je řetězec vyslán
  • sleep 60s - doba mezi relacemi (odesláním řetězce po 60 sekundách)
  • done - provedení operace, nastala-li podmínka while true (tedy do echo řetězec)

Od spuštění této příkazové řádky začne počítač pravidelně (dokud nezatuhne) posílat na asynchronní port řetězec "wdt240s". Po odladění je vhodné zapsat do nějakého skriptu, spouštěného brzy po bootu, např. /etc/rc.d/rc.sysinit (závisí na konkrétní distribuci).

Nastavení činnosti Watchdogu

Vzhledem k rozdílným platformám PC, na kterých běží odlišně konfigurované různé verze Linuxů, je žádoucí, aby si každý uživatel mohl nastavit vlastní TimeOnPOR , ba i specifické WdtTime.

  1. TimeOnPOR v rozsahu od 1 sekundy do 9999 sekund (2hod 46 minut 39 sekund)
  2. WdtTime v rozsahu od 1 sekundy do 9999 sekund (2hod 46 minut 39 sekund)
     

TimeOnPOR

Nastavení TimeOnPOR provedeme příkazem wdtpor XXXX s , kde XXXX je počet sekund, t.j. doba, do které po zapnutí/resetu MCU resetuje počítač.

Příklad:

wdtpor480s nastaví TimeOnPOR na 480 sekund, tato hodnota je uložena do vnitřní, energeticky nezávislé, paměti MCU a je vždy po zapnutí/resetu načtena do registru WdtDownCounter.
wdtpor99s nastaví TimeOnPOR na 99 sekund
wdtpor600s nastaví TimeOnPOR na 600 sekund (10minut)
wdtpor3600s nastaví TimeOnPOR na 3600 sekund (1 hodinu) a pod.

Přípustná je libovolná honota v intervalu <1,9999>

Poznámka : Správné přijetí příkazu wdtporXXXXs MCU potvrdí dvojitým bliknutím zelené led.
 

WdtTime

Pravidelné nastavování WdtDownCounter (osvěžování) hodnotami WdtTime provedem příkazem wdtXXXXs , kde XXXX je po čet sekund, t.j. doba, po které po přijetí řetězce MCU vyresetuje počítač. Touto hodnotou je vždy naplněn čítač WdtDownCounter (tato hodnota není ukládána do energeticky nezávislé paměti MCU)

Příklad:

wdt60s nastaví WdtDownCounter na 60sekund (1 minuta )
wdt120s nastaví WdtDownCounter na 120sekund (2 minuty )

Přípustná je libovolná honota v intervalu <1,9999>

Poznámka : Správné přijetí příkazu wdtXXXXs MCU potvrdí krátkým rozsvícením zelené led.

Upozornění: Vzhledem k nepříliš přesnému časovacímu mechanismu počítačů PC je vhodné zasílat řetězce wdtXXXXs v kratším časovém intervalu než je hodnota XXXX v řetězci. Předejdete tak mnohým překvapením, která by Vám mohla zkomplikovat život.

Poznámka : Pro více zatížené servery doporučuji nastavovat XXXX v řetězci wdtXXXXs na čtyřnásobek hodnoty sleep.

Příklad:

nohup bash -c "while true; do echo wdt240s > /dev/ttyS0; sleep 60s; done" & 

I když bude server velmi zaneprázdněn, řetězec wdt240s by měl při 60 sekundovém vysílacím intervalu (sleep 60s) do 240 sekund (watchdog timeout) vyslat vždy ! Následující relaci se raději vyhýbejte:

nohup bash -c "while true; do echo wdt80s > /dev/ttyS0; sleep 60s; done" & 

Může se stát, že při více zatíženém počítači nedorazí řetězec wdt80s do MCU včas, tedy do 80 sekund po předchozím odeslání a MCU počítač vyresetuje.
 

Nastavení asynchronního portu

Před vlastním spuštěním nohup bash je nutné správně nastavit přenosovou rychlost zvoleného asynchronního portu (COM1 nebo COM2) a datový formát, jinak si MCU s počítačem nebudou rozumět.

Parametry

  • Přenosová rychlost 4800 bitů za sekundu
  • 8 datových bitů bez parity, 2 stop bity

Poznámka : Po tomto nastavení je doporučeno registr modemu nastavit do klidového stavu, to znamená na port 3FCH a 2FCH vyslat hodnotu 0. Watchdog je nap á jen z datové linky TX a linek DTR a RTS na asynchronním portu PC a pokud bude DTR a RTS ve stavu logické jedničky (na výstupu DTR a RTS bude fyzicky +10V), pak v okamžiku přenosu řetězce do MCU bude watchdog napájen jen ze záložní kapacity C1 na desce watchdogu. Při malé kapacitě C1 a vyšší spotřebě watchdogu může nastat nechtěné vyresetování počítače. Kromě níže uvedeného nastavení doporučuji použít ATtiny12L-4PI s nižší spotřebou a zelené led s nízkou spotřebou (například L-HLMP-1790 ) nebo led neosazovat.

V Linuxu můžeme použít následující program:

# include 
# include 
# include 
# define BASEPORT1 0x03F8
# define BASEPORT2 0x02F8
int main ()
{
if (ioperm(BASEPORT1+4, 3, 1)) {perror("ioperm"); exit (1);}
outb (0x0, BASEPORT1+4);
usleep (10000);
printf ("Status MCR: %d", inb (BASEPORT1+4));
if (ioperm(BASEPORT1+4, 3, 0)) {perror("ioperm"); exit (1);}
if (ioperm(BASEPORT2+4, 3, 1)) {perror("ioperm"); exit (1);}
outb (0x0, BASEPORT2+4);
usleep (10000);
printf ("Status MCR: %d", inb (BASEPORT2+4));
if (ioperm(BASEPORT2+4, 3, 0)) {perror("ioperm"); exit (1);}
exit (0);
}

Závěrem

Popsaná konstrukce je cenově nenáročná a použitím jednočipu spolehlivější a flexibilnější než podobné konstrukce sestavené z diskrétních a klasických součástek. Několik kusů spolehlivě hlídá servery nejmenované firmy zajišťující internetové služby.

Vážným zájemcům nabízím oboustrannou desku s prokovy a nepájivou maskou včetně jednočipu v pouzdře SOIC8 za konečnou cenu 150,-Kč. Hotový a odzkoušený watchdog za 400,-Kč na adrese Antonín Dlabola, Na Vápence 764, Železný Brod 46822.
 

Antonín Dlabola
antonindlabola@ quick.cz

DOWNLOAD & Odkazy

Hodnocení článku: