Vyhodnocování stavu LED na desce Web 51 |
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.
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.
- Zdrojová html stránka projektu LED1
<html><head> <meta http-equiv="Cache-Control" content="no-cache"> <title>89C8252 WWW server</title> <head> <body> <center><H1>AT89C8252 WWW server</H1></center> <table border=0> <tr><td width=100><b>LED0</b></td> <td>'?testP3.cgi?0x10'<img src="black.gif" alt="" border=0 width=16 height=16> {<img src="red.gif" alt="" border=0 width=16 height=16>}</td></tr> <tr><td width=100><b>LED1</b></td> <td>'?testP3.cgi?0x20'<img src="black.gif" alt="" border=0 width=16 height=16> {<img src="yellow.gif" alt="" border=0 width=16 height=16>}</td></tr> </table> </body></html>Pro přehlednost byly v tomto výpisu barevně zvýrazněny jednotlivé prvky CGI metajazyka:
volání CGI skriptu vypsaný text v případě, že výstupem CGI skriptu je Zflag = 0 vypsaný text v případě, že výstupem CGI skriptu je Zflag = 1- Zdrojová html stránka, získaná převodem pomocí skriptu html2db.pl, uložená v serveru Web 51
(Pozn. Netištitelné znaky · reprezentují binární parametr příslušné CGI procedury)
<html><head> <meta http-equiv="Cache-Control" content="no-cache"> <title>89C8252 WWW server</title> <head> <body> <center><H1>AT89C8252 WWW server</H1></center> <table border=0> <tr><td width=100><b>LED0</b></td> <td>'?testP3.cgi?·<img src="black.gif" alt="" border=0 width=16 height=16> {<img src="red.gif" alt="" border=0 width=16 height=16>}</td></tr> <tr><td width=100><b>LED1</b></td> <td>'?testP3.cgi?·<img src="black.gif" alt="" border=0 width=16 height=16> {<img src="yellow.gif" alt="" border=0 width=16 height=16>}</td></tr> </table> </body></html>- Expandovaná html stránka, odeslaná serverem Web 51
<html><head> <meta http-equiv="Cache-Control" content="no-cache"> <title>89C8252 WWW server</title> <head> <body> <center><H1>AT89C8252 WWW server</H1></center> <table border=0> <tr><td width=100><b>LED0</b></td> <td><img src="black.gif" alt="" border=0 width=16 height=16></td></tr> <tr><td width=100><b>LED1</b></td> <td><img src="yellow.gif" alt="" border=0 width=16 height=16></td></tr> </table> </body></html>- A takto vidí stránku uživatel
AT89C8252 WWW server
LED0 LED1 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
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.
- Zdrojová html stránka projektu LED2
<html><head> <meta http-equiv="Cache-Control" content="no-cache"> <title>89C8252 WWW server</title> <head> <body> <center><H1>AT89C8252 WWW server</H1></center> 'LEDsetup.cgi'<form action="/" method="GET"><table border=0> <tr> <td width=100><b>LED0</b></td><td>'?testP3.cgi?0x10'<font color="Black" size=9>*</font> {<font color="Red" size=9>*</font>}</td> <td>On<input type="radio" name=0 value=0 '?testP3.cgi?0x10'{checked} alt=""> Off<input type="radio" name=0 value=1 '?testP3.cgi?0x10'checked{} alt=""></td> </tr> <tr> <td width=100><b>LED1</b></td><td>'?testP3.cgi?0x20'<font color="Black" size=9>*</font> {<font color="Yellow" size=9>*</font>}</td> <td>On<input type="radio" name=1 value=0 '?testP3.cgi?0x20'{checked} alt=""> Off<input type="radio" name=1 value=1 '?testP3.cgi?0x20'checked{} alt=""></td> </tr> <tr><td> </td><td><input type="submit="Set LED" alt=""></td></tr> </table></form> </body></html>- Expandovaná html stránka, odeslaná serverem Web 51
<html><head> <meta http-equiv="Cache-Control" content="no-cache"> <title>89C8252 WWW server</title> <head> <body> <center><H1>AT89C8252 WWW server</H1></center> <form action="/" method="GET"><table border=0> <tr> <td width=100><b>LED0</b></td><td><font color="Red" size=9>*</font></td> <td>On<input type="radio" name=0 value=0 checked alt="">Off<input type="radio" name=0 value=1 alt=""></td> </tr> <tr> <td width=100><b>LED1</b></td><td><font color="Black" size=9>*</font></td> <td>On<input type="radio" name=1 value=0 alt="">Off<input type="radio" name=1 value=1 checked alt=""></td> </tr> <tr><td> </td><td><input type="submit="Set LED" alt=""></td></tr> </table></form> </body></html>- A takto vidí stránku uživatel
AT89C8252 WWW server
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 LEDsetupVe 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
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.
- Zdrojová html stránka projektu LED3
<html><head> <meta http-equiv="Cache-Control" content="no-cache"> <title>89C8252 WWW server</title> <script language="JavaScript"> <!-- b="/"; function w() { if (document.URL.indexOf("index.html")!=-1) { window.setTimeout("location.replace(b);",50); } } // --> </script></head> <body onLoad="w();"> <center><H1>AT89C8252 WWW server</H1></center> 'LEDsetup.cgi'<form action="index.html" method="GET"><table border=0> <tr> <td width=100><b><font color="Red">LED0</font></b></td><td>'?testP3.cgi?0x10'<font color="Black" size=9>*</font> {<font color="Red" size=9>*</font>}</td> <td> On<input type="radio" name=0 value=0 '?testLED.cgi?0x01'checked{} alt="" onClick="submit();"> Flash<input type="radio" name=0 value=F '?testLED.cgi?0x02'checked{} alt="" onClick="submit();"> Off<input type="radio" name=0 value=1 '?testLED.cgi?0x03'{checked} alt="" onClick="submit();"> </td> </tr> <tr> <td width=100><b><font color="Yellow">LED1</font></b></td><td>'?testP3.cgi?0x20'<font color="Black" size=9>*</font> {<font color="Yellow" size=9>*</font>}</td> <td> On<input type="radio" name=1 value=0 '?testLED.cgi?0x04'checked{} alt="" onClick="submit();"> Flash<input type="radio" name=1 value=F '?testLED.cgi?0x08'checked{} alt="" onClick="submit();"> Off<input type="radio" name=1 value=1 '?testLED.cgi?0x0C'{checked} alt="" onClick="submit();"> </td> </tr> </table></form> </body></html>- Expandovaná html stránka, odeslaná serverem Web 51
<html><head> <meta http-equiv="Cache-Control" content="no-cache"> <title>89C8252 WWW server</title> <script language="JavaScript"> <!-- b="/"; function w() { if (document.URL.indexOf("index.html")!=-1) { window.setTimeout("location.replace(b);",50); } } // --> </script></head> <body onLoad="w();"> <center><H1>AT89C8252 WWW server</H1></center> <form action="index.html" method="GET"><table border=0> <tr> <td width=100><b><font color="Red">LED0</font></b></td><td><font color="Red" size=9>*</font></td> <td> On<input type="radio" name=0 value=0 alt="" onClick="submit();"> Flash<input type="radio" name=0 value=F checked alt="" onClick="submit();"> Off<input type="radio" name=0 value=1 alt="" onClick="submit();"> </td> </tr> <tr> <td width=100><b><font color="Yellow">LED1</font></b></td><td><font color="Black" size=9>*</font></td> <td> On<input type="radio" name=1 value=0 alt="" onClick="submit();"> Flash<input type="radio" name=1 value=F alt="" onClick="submit();"> Off<input type="radio" name=1 value=1 checked alt="" onClick="submit();"> </td> </tr> </table></form> </body></html>- A takto vidí stránku uživatel
AT89C8252 WWW server
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: retSkript 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,aNač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->0A 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,#0b00000000Ná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 tstL0V případě, že není detekován stisk tlačítka uložíme nový navzorkovaný stav tlačítka
NCH1: rl a anl a,#0b11000000 mov R7,aA 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 LED0Pokud 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: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.
POPIS Web51 | NOVINKY | FAQ | OBJEDNÁVKA | DOWNLOAD |
(c)Copyright 2000, 2001, HW server & Radek Benedikt
Web51@HW.cz, Web51.HW.cz Final applications of the Web51 : www.HWgroup.cz |