備忘録のために「あねご」ソフト作成時の特記事項を書いておこう。
1.I/Oポートの設定
マイコンのPC制御用I/Oポートを以下のように割り当てた。
電源スイッチの制御(出力): Port 4 bit 0-1
電源モニタ(USBの電源をモニタ。入力): Port A bit 5-6
上記のように入出力を設定。アセンブラで設定するところがあったのでそこを書き換える。データディレクションレジスタの相当するビットを'1'にすると出力になる。
Port A bit4は、Ethetコントローラのリセット信号に使用しているので出力にしておく必要がある。
-- RESETV.ASM
P4DDR .EQU H'FFFFC5 ;PORT4 データディクションレジスタ
PADDR .EQU H'FFFFD1 ;PORTA データディレクションレジスタ
MOV.B #H'FF,R0L
MOV.B R0L,@P4DDR:8 ;PORT4 0-7 OUTPUT
MOV.B #H'90,R0L
MOV.B R0L,@PADDR:8 ;PORTA 0-3:入力, 4:出力, 5-6:入力, 7:出力
--
1.I/Oポートの設定
マイコンのPC制御用I/Oポートを以下のように割り当てた。
電源スイッチの制御(出力): Port 4 bit 0-1
電源モニタ(USBの電源をモニタ。入力): Port A bit 5-6
上記のように入出力を設定。アセンブラで設定するところがあったのでそこを書き換える。データディレクションレジスタの相当するビットを'1'にすると出力になる。
Port A bit4は、Ethetコントローラのリセット信号に使用しているので出力にしておく必要がある。
-- RESETV.ASM
P4DDR .EQU H'FFFFC5 ;PORT4 データディクションレジスタ
PADDR .EQU H'FFFFD1 ;PORTA データディレクションレジスタ
MOV.B #H'FF,R0L
MOV.B R0L,@P4DDR:8 ;PORT4 0-7 OUTPUT
MOV.B #H'90,R0L
MOV.B R0L,@PADDR:8 ;PORTA 0-3:入力, 4:出力, 5-6:入力, 7:出力
--
2.HTTP/HTML受信処理
HTTP受信処理はサンプルプログラムそのままでOK。
受信されたHTMLの解析部分を変更。
(1)PCからの要求を解析 http.c HttpService関数
(a)PCからステータス要求
PCからホーム(http://anego/)のURLを送ってくる。(受信パケットに"GET / HTTP/1"が含まれている)現在のステータスのHTMLを作成するのみで、PCに作成したHTMLを返送する。(http.c MakeHttpStr)
(b)PCから電源制御用要求
PCからURLとして押されたボタンの情報を送ってくる。このとき受信パケットに"GET /modify.cgi"が含まれているので、まずこの文字列があることをチェックし、あれば以下のボタンの情報がURLに含まれているか確認する。
ONボタン: ON_x (xはPC#。URL例: http://anego/modify.cgi?ON_1=ON)
停止ボタン: STOP_x (xはPC#。URL例: http://anego/modify.cgi?STOP_1=%92%E2%8E%7E)
強制OFFボタン: FOFF_x (xはPC#。URL例: http://anego/modify.cgi?FOFF_1=%8B%AD%90%A7OFF)
(2)電源スイッチ制御時間
「ON」と「停止」はチョイ押しでいいので1~2秒くらい。LCD用のダミー待ち時間関数があったので流用した。
for(i=0; i<0x80; i++){
LcdDummyWait(0x7fff);
}
「強制OFF」は4秒以上。6秒くらいになる以下のようにした。
for(i=0; i<0x300; i++){
LcdDummyWait(0x7fff);
}
3.文字列・日本語
(1)文字列の登録 http.c
(a)Ascii文字の場合
const CHAR *HttpMsg_1_1="<HTML><HEAD><TITLE>";
(b) Asciiではない文字を含む場合(日本語Shift-Jis等)
const CHAR HttpMsg_2_4[]={0x83, 0x7D, 0x83, 0x56, 0x83, 0x93, 0};
(a)の書き方ではコンパイラがShift JISを通さなかったので、JIS Codeを試してみた。できなくはなかったが、JIS CodeはESC(16進で0x1B)を使う漢字IN、漢字OUTが必要でさらに%、'、"等の記号を使う。複雑ながらHTML上は混在可能にはなってい るが、Cコンパイラはうまく通らないケースあり。PC用のCコンパイラの「LSIC86」は、%を通してくれなかった。デバッグが難しかったので Shift JISを(b)の表記で書いた。バイナリエディタでコードをコピーしてきた。
4.Main関数
LanHttpApp.cにある。LCD表示くらいしか変えてない。バージョンはLCD表示のコメントを書き換える。
5.デバック用機能
ディップスイッチの4をONにするとディップスイッチでPC電源状態をデバッグ用に返られる。1:PC#、2:PC#2に割り当て。
6.C言語/HTMLリファレンス
分からないところがあったらここを見た。
(1)C言語: http://www5c.biglobe.ne.jp/~ecb/c/index.html
(2)HTML: http://www.tagindex.com/html_tag/index.html
HTTP受信処理はサンプルプログラムそのままでOK。
受信されたHTMLの解析部分を変更。
(1)PCからの要求を解析 http.c HttpService関数
(a)PCからステータス要求
PCからホーム(http://anego/)のURLを送ってくる。(受信パケットに"GET / HTTP/1"が含まれている)現在のステータスのHTMLを作成するのみで、PCに作成したHTMLを返送する。(http.c MakeHttpStr)
(b)PCから電源制御用要求
PCからURLとして押されたボタンの情報を送ってくる。このとき受信パケットに"GET /modify.cgi"が含まれているので、まずこの文字列があることをチェックし、あれば以下のボタンの情報がURLに含まれているか確認する。
ONボタン: ON_x (xはPC#。URL例: http://anego/modify.cgi?ON_1=ON)
停止ボタン: STOP_x (xはPC#。URL例: http://anego/modify.cgi?STOP_1=%92%E2%8E%7E)
強制OFFボタン: FOFF_x (xはPC#。URL例: http://anego/modify.cgi?FOFF_1=%8B%AD%90%A7OFF)
(2)電源スイッチ制御時間
「ON」と「停止」はチョイ押しでいいので1~2秒くらい。LCD用のダミー待ち時間関数があったので流用した。
for(i=0; i<0x80; i++){
LcdDummyWait(0x7fff);
}
「強制OFF」は4秒以上。6秒くらいになる以下のようにした。
for(i=0; i<0x300; i++){
LcdDummyWait(0x7fff);
}
3.文字列・日本語
(1)文字列の登録 http.c
(a)Ascii文字の場合
const CHAR *HttpMsg_1_1="<HTML><HEAD><TITLE>";
(b) Asciiではない文字を含む場合(日本語Shift-Jis等)
const CHAR HttpMsg_2_4[]={0x83, 0x7D, 0x83, 0x56, 0x83, 0x93, 0};
(a)の書き方ではコンパイラがShift JISを通さなかったので、JIS Codeを試してみた。できなくはなかったが、JIS CodeはESC(16進で0x1B)を使う漢字IN、漢字OUTが必要でさらに%、'、"等の記号を使う。複雑ながらHTML上は混在可能にはなってい るが、Cコンパイラはうまく通らないケースあり。PC用のCコンパイラの「LSIC86」は、%を通してくれなかった。デバッグが難しかったので Shift JISを(b)の表記で書いた。バイナリエディタでコードをコピーしてきた。
4.Main関数
LanHttpApp.cにある。LCD表示くらいしか変えてない。バージョンはLCD表示のコメントを書き換える。
5.デバック用機能
ディップスイッチの4をONにするとディップスイッチでPC電源状態をデバッグ用に返られる。1:PC#、2:PC#2に割り当て。
6.C言語/HTMLリファレンス
分からないところがあったらここを見た。
(1)C言語: http://www5c.biglobe.ne.jp/~ecb/c/index.html
(2)HTML: http://www.tagindex.com/html_tag/index.html
コメントする