;************************************************************************** ; EYEWATCH.ASM (c) Ing. Miroslav Němeček ;-------------------------------------------------------------------------- ; Modul EyeWatch monitoruje dobu strávenou u obrazovky počítače. Jeho ; hlavním posláním je hlídání zraku uživatele před nadměrným namáháním. ; Modul sleduje dobu aktivity počítače a v případě překročení maximální ; povolené doby (zpravidla 6 hodin) o tom informuje uživatele blikáním ; kontrolní LED diody. ;-------------------------------------------------------------------------- ; Tento program je nejjednodušší variantou softwarové podpory modulu ; EyeWatch. Doba povolené aktivity je určena v programu procesoru (konstanta ; MAXTIME) a není podporováno řízení modulu softwarově. Po aktivaci modulu ; začne modul odpočítávat čas zbývající povolené aktivity. Po dosažení ; zbývajícího času WARTIME změní indikaci na varovnou indikaci (žlutá LED), ; po dosažení stavu 0 rozbliká červenou LED jako indikaci konce doby. ; ; Program EYEWATCH.SCR je stmívačem obrazovky. Při svém spuštění vysílá ; do modulu EyeWatch synchronizační data, která zastavují čítání času. ; Synchronizační data jsou jakákoliv data (doporučeno 00h) vysílaná ; s přenosovou rychlostí asi 1200 Baud a s frekvencí 1 bajt za sekundu. ;-------------------------------------------------------------------------- ; Doporučení pro budoucí rozšíření software modulu: ; - Pomocí sériového portu nastavovat konfiguraci modulu ; - Uchovávat dosažený stav čítače v EEPROM pro případ resetování nebo ; vypnutí počítače; při novém startu počítače je do modulu odeslána ; informace o aktuálním času, o aktuální směně atd.; porovnáním ; s uloženými údaji může modul zjistit, že je již další směna a ; že má inicializovat čítač času pro jiného pracovníka ;************************************************************************** MAXTIME EQU 6*12 ; maximální povolená doba aktivity v 5-minutách WARTIME EQU 6 ; zbývající doba pro varovné hlášení v 5-minutách RADIX DEC CONFIG LP ;-------------------------------------------------------------------------- ; proměnné ;-------------------------------------------------------------------------- CBLOCK Hundr ; čítač zlomků 1/8 sekundy (= 8 až 1) Second ; čítač sekund v minutě (= 60 až 1) Minute ; čítač minut v 5-minutovém kroku (= 5 až 1) Rest ; čítač zbytku 5-minutových kroků (0=konec) Indik ; stav indikace ; bit 0: zelená svítí ; bit 1: žlutá svítí ; bit 2: červená svítí ; bit 3: zelená bliká ; bit 4: žlutá bliká ; bit 5: červená bliká BlinkC ; čítač posuvného blikání (0=není blikání) StopC ; čítač indikace zastavení TempD ; úschova W při zobrazení TempW ; úschova registru W při přerušení TempS ; úschova registru STATUS při přerušení ENDC ORG 0 goto Start ; start programu ORG 4 goto Inter ; obsluha přerušení ;-------------------------------------------------------------------------- ; start programu ;-------------------------------------------------------------------------- ; ----- nastavení směru portů A a B Start bsf STATUS,RP0 ; zapnutí banky 1 movlw 11101b ; RA1 jako výstup movwf TRISA ; nastavení směru portů A movlw 11001111b ; RB4 a RB5 jako výstup movwf TRISB ; nastavení směru portů B ; ----- nastavení časovače Timer0 ; Obsluha přerušení se vyvolává 8x za sekundu. Pro krystal 32768 Hz ; je taktovací frekvence 8192 Hz, požadovaný dělicí poměr je 256 * 4. movlw 1 + bit7 ; dělička 1/4, připojena k TMR0, bez pull-up movwf OPTION_REG ; nastavení OPTION registru časovačů bcf STATUS,RP0 ; zapnutí banky 0 ; ----- inicializace registrů movlw 8 ; čítač zlomku sekundy movwf Hundr ; inicializace čítače zlomku sekundy movlw 60 ; čítač sekund v minutě movwf Second ; inicializace čítače sekund v minutě movlw 5 ; čítač minut v 5-minutovém kroku movwf Minute ; inicializace čítače minut v 5-minutovém kroku movlw MAXTIME ; čítač 5-minutových kroků movwf Rest ; inicializace čítače 5-minutových kroků movlw bit0 ; bude svítit zelená movwf Indik ; nastavení indikace call Disp ; zobrazení příznaků movlw 3*3 ; počet bliknutí movwf BlinkC ; nastavení čítače bliknutí clrf StopC ; nulování čítače indikace vypnutí ; ----- inicializace obsluhy přerušení movlw bit5 + bit7 ; povoleno přerušení od TMR0 a globální přerušení movwf INTCON ; nastavení registru přerušení INTCON ; ----- čekání na synchronizační bit (má úroveň 1) Loop btfss PORTA,0 ; je synchronizační bit? goto Loop ; čekání na synchronizační bit ; ----- zákaz globálního přerušení bcf INTCON,GIE ; zákaz globálního přerušení ; ----- běží stmívač obrazovky - nulování čítače času movlw 8 ; čítač zlomku sekundy movwf Hundr ; inicializace čítače zlomku sekundy movlw 60 ; čítač sekund v minutě movwf Second ; inicializace čítače sekund v minutě movf StopC,W ; načtení čítače zastavení iorlw 18h ; stav čítače zastavení (asi 4 sekundy), ponechá nejnižší 3 bity movwf StopC ; nastavení čítače indikace zastavení ; ----- povolení globálního přerušení bsf INTCON,GIE ; povolení globálního přerušení ; ----- čekání na konec synchronizačního bitu Loop2 btfsc PORTA,0 ; je konec synchronizačního bitu? goto Loop2 ; čekání na konec synchronizačního bitu goto Loop ;-------------------------------------------------------------------------- ; zobrazení indikace (W: bit0=zelená, bit1=žlutá, bit2=červená) ;-------------------------------------------------------------------------- ; ----- úschova bajtu k zobrazení Disp movwf TempD ; úschova bajtu k zobrazení ; ----- zelená btfsc TempD,0 ; má svítit zelená? bcf PORTA,1 ; zapnutí zelené btfss TempD,0 ; nemá svítit zelená? bsf PORTA,1 ; vypnutí zelené ; ----- žlutá btfsc TempD,1 ; má svítit žlutá? bcf PORTB,5 ; zapnutí žluté btfss TempD,1 ; nemá svítit žlutá? bsf PORTB,5 ; vypnutí žluté ; ----- červená btfsc TempD,2 ; má svítit červená? bcf PORTB,4 ; zapnutí červené btfss TempD,2 ; nemá svítit červená? bsf PORTB,4 ; vypnutí červené return ;-------------------------------------------------------------------------- ; obsluha přerušení (vyvolávána 8x za sekundu) ;-------------------------------------------------------------------------- ; ----- úschova registrů W a STATUS Inter movwf TempW ; úschova registru W swapf STATUS,W ; načtení STATUS registru do W movwf TempS ; úschova STATUS registru ; ----- nulování požadavku přerušení od TMR0 bcf INTCON,2 ; nulování příznaku přerušení od TMR0 ; ----- test, zda je již přetečení času movf Rest,F ; test, zda je přetečení měření času btfsc STATUS,Z ; je přetečení měření času? goto Inter2 ; je přetečení měření času ; ----- čítání zlomku sekundy decfsz Hundr,F ; čítání zlomku sekundy goto Inter2 ; není ještě celá sekunda movlw 8 ; čítač zlomku sekundy movwf Hundr ; inicializace čítače zlomku sekundy ; ----- čítání sekund v minutě decfsz Second,F ; čítání sekund v minutě goto Inter2 ; není ještě celá minuta movlw 60 ; čítač sekund v minutě movwf Second ; inicializace čítače sekund v minutě ; ----- čítání minut v 5-minutovém kroku decfsz Minute,F ; čítání minut v 5-minutovém kroku goto Inter2 ; není ještě celý 5-minutový krok movlw 5 ; čítač minut v 5-minutovém kroku movwf Minute ; inicializace čítače minut v 5-minutovém kroku ; ----- čítání 5-minutových kroků decf Rest,F ; čítání 5-minutových kroků ; ----- test, zda je posuvné blikání Inter2 movf BlinkC,F ; test, zda je posuvné blikání btfsc STATUS,Z ; je posuvné blikání? goto Inter3 ; není posuvné blikání decf BlinkC,F ; čítání posuvného blikání ; ----- posun indikace při posuvném blikání bcf STATUS,C ; nulování příznaku C rlf Indik,W ; načtení indikace s rotováním bcf Indik,0 ; nulování příznaku zelené bcf Indik,1 ; nulování příznaku žluté bcf Indik,2 ; nulování příznaku červené andlw 111b ; maskování příznaků btfsc STATUS,Z ; je přetečení? movlw bit0 ; nový stav iorwf Indik,F ; nastavení nových příznaků goto Inter8 ; zobrazení nového stavu ; ----- nulování indikací (ponechá se pouze červená, která může blikat) Inter3 movlw bit2 ; bude ponechán pouze příznak červené LED andwf Indik,F ; maskování pouze červené LED ; ----- indikace přetečení času movf Rest,F ; test, zda je přetečení měření času btfss STATUS,Z ; je přetečení měření času? goto Inter4 ; není přetečení měření času bsf Indik,5 ; zapnutí příznaku blikání červené goto Inter7 ; ----- test, zda je již varovné hlášení Inter4 movlw WARTIME+1 ; čas pro varovnou indikaci subwf Rest,W ; test, zda je již varovná indikace movlw bit0 ; běžná indikace btfss STATUS,C ; je varovná indikace? movlw bit1 ; je varovná indikace movwf Indik ; nastavení nových příznaků ; ----- obsluha indikace zastavení movf StopC,W ; test, zda běží indikace zastavení btfsc STATUS,Z ; běží indikace zastavení? goto Inter7 ; není indikace zastavení decf StopC,F ; dekrementace indikace zastavení andlw 7 ; test, zda je 1/8 času btfsc STATUS,Z ; je 1/8 času? clrf Indik ; bliknutí každou sekundu ; ----- obsluha blikání zelené Inter7 movlw bit0 ; příznak zelené btfsc Indik,3 ; bliká zelená? xorwf Indik,F ; překlopení zelené ; ----- obsluha blikání žluté movlw bit1 ; příznak žluté btfsc Indik,4 ; bliká žlutá? xorwf Indik,F ; překlopení žluté ; ----- obsluha blikání červené movlw bit2 ; příznak červené btfsc Indik,5 ; bliká červená? xorwf Indik,F ; překlopení červené ; ----- zobrazení nového stavu Inter8 movf Indik,W ; načtení příznaků indikace call Disp ; zobrazení příznaků ; ----- návrat registrů W a STATUS Inter9 swapf TempS,0 ; původní STATUS registr k navrácení movwf STATUS ; návrat původního STATUS registru swapf TempW,1 ; předpříprava původního registru W swapf TempW,0 ; návrat původního W registru retfie ; návrat z obsluhy přerušení