Vyhodnocování stavu LED na desce Web 51
a jeho ovládání

není předchozí kap.  projekty.html  Web 51 - Setup serveru, priklady pouziti CGI
Podadresáře led1, led2 a led3 z adresáře projekt obsahují vzorové projekty, demonstrující použití základních vlastností vývojového systému Web 51 pouze se dvěma LED osazenými na desce. Zde jsou tyto projekty podrobněji popsány a jejich vývoj od led1 k led3 ukazuje možnosti obsluhy periférií. U led3 dokonce i použití jednoduchého stavového automatu.

Obsah

LED 1 - Základní ukázka jednoduchého http serveru, s CGI skriptem na straně serveru.
LED 2 - 2x CGI skript na straně serveru (nastavení stavu z formuláře a výpis podle zpětného přečtení).
LED 3 - Jako led2 ale přidáno ovládání stavu "blikej" ve smyčce a javascript.

LED 1

Základní ukázka jednoduchého http serveru, s CGI skriptem na straně serveru. CGI skript zjišťujeje svícení LED na desce Web 51. Na základě testu vloží do stránky buď obrázek svíticí LED či LED unavené životem.

Jednoduchý CGI skript testP3 v závislosti na parametru uvedeném při jeho volání otestuje bit P3.4 či P3.5, na kterém jsou připojeny LED a tlačítka. Nulová hodnota bitu, v tomto případě reprezentující svíticí LED, nastavuje Zflag na hodnotu 1. Podle hodnoty Zflag je http serverem vypsán příslušný text, tak jak je již zmíněno v časti popisující modul http.asm

;; Adresářová položka
        .section cpu_dir, #alloc
        .word   't'+'e'+'s'+'t'+'P'+'3'+'.'+'c'+'g'+'i'
        .byte   0x10            ;cgi
        .byte   0               ;reserved
        .word   cgibegin
        .word   cgiend

;; Vlastní volání cgi procedury
        .section cpu_files, #alloc
cgibegin:                       ;testP3.cgi
        .pcode  testP3
        .pcode  pret
cgiend:

;; Výkonná část cgi procedury
        .text
testP3: mov     a,P3
        clr     zflag	
        anl     a,state80
        jnz     retP3
        setb    zflag
retP3:  ret

LED 2

Složitější ukázka jednoduchého http serveru, s CGI skripty na straně serveru. První CGI skript zjišťuje svícení LED na desce Web 51. Na základě testu vloží do stránky příslušný symbol (***). Druhý CGI skript vyhodnocuje vrácené údaje z html formuláře a na základě vrácených dat LED zhasíná, či rozsvěcuje.

Skript LEDsetup.cgi, řídicí svícení LED, je o něco složitější.

;LEDsetup.cgi
        .section cpu_dir, #alloc

        .word   'L'+'E'+'D'+'s'+'e'+'t'+'u'+'p'+'.'+'c'+'g'+'i'
        .byte   0x10            ;cgi
        .byte   0               ;reserved
        .word   cgibegin
        .word   cgiend

        .section cpu_files, #alloc

cgibegin:                       ;LEDsetup.cgi
        .pcode  LEDsetup
        .pcode  pret
cgiend:

        .text
.global	LEDsetup

Ve html požadavku je hledána sekvence "0=." nebo "1=.". Na základě nalezené sekvence je podle jejího parametru nastaven stav příslušné LED.

LEDsetup:
        mov     state80,#'0'     ; find '0' item
        lcall   scanpar
        jnb     zflag, no0cmd
        ;; cmd0
        mov     a,@r0
        mov     C,acc.0
        mov     LED0,C
no0cmd: mov     state80,#'1'     ; find '1' item
        lcall   scanpar
        jnb     zflag, no1cmd
        ;; cmd1
        mov     a,@r0
        mov     C,acc.0
        mov     LED1,C
no1cmd: ret

LED 3

JavaScript Složitější ukázka jednoduchého http serveru, s CGI skripty na straně serveru a procesem na pozadí. První CGI skript zjišťujeje svícení LED na desce Web 51. Na základě testu vloží do stránky příslušný symbol (***). Druhý CGI skript zjišťuje stav řídicích proměnných procesu na pozadí (nesviť, blikej, sviť). Třetí CGI skript vyhodnocuje vrácené údaje z html formuláře a na základě vrácených dat nastavuje řídicí proměnné procesu na pozadí (nesvícení, blikání, svícení LED). Proces na pozadí, synchronizovaný timerem, na základě svých řídicích proměnných rozsvěcuje, zhasíná či bliká s LED. Jeho úkolem je rovněž na základě stisknutí tlačítek na desce Web 51 přepnutí režimu svícení. Pro zjednodušení obsluhy je na klientské straně použit JavaScript.

Skripty použité v příkladu LED3, řídicí svícení LED, jsou mnohem složitější. Skript testP3.cgi je stejný, jako v příkladech LED1 a LED2. Skript LEDsetup.cgi je obdobný skriptu z příkladu LED2, neřídí však LED přímo, ale nastavuje bity 0 a 1, popř. 2 a 3 proměnné LEDmode. Hodnotu této proměnné je možno měnit i stiskem tlačítek na desce Web 51

LEDsetup:mov    state80,#'0'   ; find '0' item
        lcall   scanpar
        jnb     zflag, no0cmd
        ;; cmd0
        mov     a,@r0
        cjne    a,#'F',noFlash0
        mov     a,LEDmode
        clr     Acc.0   ;Off LED0
        setb    Acc.1   ;Flash LED0
        sjmp    SetL0
noFlash0:cjne   a,#'0',noOn0
        mov     a,LEDmode
        setb    Acc.0   ;On LED0
        clr     Acc.1   ;NoFlash LED0
        sjmp    SetL0
noOn0:  mov     a,LEDmode
        anl     A,#0b11111100   ;Of LED0
SetL0:  mov     LEDmode,a	

no0cmd: mov     state80,#'1'    ; find '1' item
        lcall   scanpar
        jnb     zflag, no1cmd
	;; cmd1
        mov     a,@r0
        cjne    a,#'F',noFlash1
        mov     a,LEDmode
        clr     Acc.2   ;Off LED1
        setb    Acc.3   ;Flash LED1
        sjmp    SetL1
noFlash1:cjne   a,#'0',noOn1
        mov     a,LEDmode
        setb    Acc.2   ;On LED1
        clr     Acc.3   ;NoFlash LED1
        sjmp    SetL1
noOn1:  mov     a,LEDmode
        anl     A,#0b11110011   ;Of LED1
SetL1:  mov     LEDmode,a	

no1cmd: ret

Skript testLED.cgi vyhodnocuje na rozdíl od skriptu testP3.cgi hodnotu interní proměnné LEDmode.

Podle proměnné LEDmode je v části fast hlavní smyčky (uvedené v souboru www8051.asm) řízen svit LED.

        .section fast, #alloc
;*************************************************************
        mov     a,LEDmode
        jb      Acc.1,nosetL0   ;Flash LED0
        mov     C,Acc.0
        cpl     C
        mov     LED0,C
nosetL0:
        jb      Acc.3,nosetL1   ;Flash LED1
        mov     C,Acc.2
        cpl     C
        mov     LED1,C
nosetL1:

Druhou funkcí, kterou hlavní smyčka ve vztahu k LED zabezpečuje, je prohledávání tlačítek. Tlačítka jsou vyhodnocována každých cca 50 ms v sekci slow hlavní smyčky.

        .section slow, #alloc
;*************************************************************
;~50 ms loop
        dec     flashtimer
        setb    LED0            ;enable readout keyboard
        setb    LED1
;unpack packed bit array
        mov     a,LEDmode
        anl     a,#0b00000011   ;LED0
        mov     R4,a
        mov     a,LEDmode
        anl     a,#0b00001100   ;LED1
        mov     R5,a
        mov     a,LEDmode
        anl     a,#0b00110000   ;KBD0
        mov     R6,a
        mov     a,LEDmode
        anl     a,#0b11000000   ;KBD1
        mov     R7,a

Načteme hodnotu stisknutého tlačítka a porovnáme ji z dalšími dvěma vzorky, získanými při předchozích průchodech.

        mov     C,LED1
        mov     Acc.5,C
        cjne    a,#0b10000000,NCH1     ;test KBD1 change 1->0

A při platném stisku tlačítka, tj. předposlední vzorek je 1, poslední 0 a současný 0, změníme cyklycky stav svícení LED.
Pozn. V R7 se dočasně ukládá poslední dvojbitový vzorek "stisku". Prakticky by jsme měli provést rotaci nové hodnoty do tohoto dvoibitového pole a jeho vymaskování, nicméně v tomto případě testujeme konkrétní hodnotu a tak je výsledkem rotace a maskování konstanta, kterou můžeme zadat přímo.

        mov     R7,#0b00000000

Následující sekvence příkazů mění cyklicky hodnoty bitů 2 a 3 v registru R5 v pořadí ....00.. -> ....01.. -> ....10.. -> ....00..

        mov     a,R5
        add     a,#0b00000100
        jb      P,no11L1                ;jmp if 00000100 or 00001000
        clr     a                       ;00001100 -> 00000000
no11L1: mov     R5,a
        sjmp    tstL0

V případě, že není detekován stisk tlačítka uložíme nový navzorkovaný stav tlačítka

NCH1:   rl      a
        anl     a,#0b11000000
        mov     R7,a

A celé vyhodnocení zopakujeme s druhým tlačítkem

tstL0:  mov     a,R6
        mov     C,LED0
        mov     Acc.3,C
        cjne    a,#0b00100000,NCH0      ;test KBD1 change 1->0
        mov     R6,#0b00000000
        mov     a,R4
        add     a,#0b00000001
        jb      P,no11L0                ;jmp if 00000001 or 00000010
        clr     a                       ;00000011 -> 00000000
no11L0: mov     R4,a
        sjmp    packarr
NCH0:   rl      a
        anl     a,#0b00110000
        mov     R6,a
packarr:mov     a,R4
        orl     a,R5
        orl     a,R6
        orl     a,R7
        mov     LEDmode,a
        jnb     Acc.1,noFl0    ;Flash LED0

Pokud je požadováno blikání, tak do LED zkopírujeme příslušný "blikací" průběh z čítače flash.

        mov     a,flashtimer
        mov     C,Acc.4
        mov     LED0,C
        mov     a,LEDmode
noFl0:	
        jnb     Acc.3,noFl1    ;Flash LED1
        mov     a,flashtimer
        mov     C,Acc.4
        mov     LED1,C
noFl1:

JavaScript  Co v celém příkladu dělá JavaScript? Jeho první, nezanedbatelnou funkcí je automatizovat odeslání formuláře. Přepneme-li režim svícení LED, formulář se automaticky odešle na stránku "index.html". A zde po přepnutí čeká druhá část skriptu, která po uplynutí 50 ms stránku znovu natáhne, tentokrát se jménem "/". Ptáte se proč tak složitě? Důvod je jednoduchý, svícení LED se nastavuje asynchroně na pozadí a tak po přepnutí obvykle vidíme jiný stav svíticích LED než odpovídá stavu přepínače svícení. Proto se formulář natáhne znovu, tentokrát již s korektním zobrazením stavu LED.





Sponzored by LPhard Ltd. Graphics by GIMP Created by EasyPad

(c)Copyright 2000, 2001, HW server & Radek Benedikt
Web51@HW.cz, Web51.HW.cz

Final applications of the Web51 : www.HWgroup.cz
není předchozí kap.  Obsah  Web 51 - Setup serveru, priklady pouziti CGI