前回の続き
内容をメモメモ
【スイッチ】
・アクティブLOWとアクティブHighがある
→それを感じさせないスイッチの状態の関数GetSW(int SW_id)
を作ればよい
GetSW(int SW_id)
・ピンモードをGPIO
・プルアップに設定
・出力に設定
・マスクなし(0)
・if( PIN&0x10 == 0x10)
(0x10がスイッチがおされると1になるとき)
のような形でアクティブHighはつくる
アクティブLOWは!= 0x10と聞く
【チャタリング・長おし】
forで一定時間まつ
【通信】
・RS232CをUSBで行うUART
・RS232Cの通信CTS:アサートすると、通信とめる
・通信関数
InitUART(int rate)
・UODLLレジスタ:ボーレート
・U0LCRレジスタ:動作モード
・U0LSRレジスタ:以下を初期化
5ビット目→送信バッファエンプティ(送信できる)
1ビット目→受信完了
・U0THRレジスタ:送信バッファ(下位8ビット)
U0RBRレジスタ:受信バッファ(下位8ビット)
SendData(char c) 送信
・U0LSRレジスタ:5ビット目が1であること確認
・U0THRレジスタ:送信データ書き込み
RecvData() 受信
・U0LSRレジスタの最下位確認
・U0RBRの下位8ビットを読み出す
・実際に行うときは
・ボードをプログラム書き込みでなく、通信用にして
・TeraTermから入力
端末:モード設定注意!変更必要かも
【割り込みの基礎知識】
・関数名が決められていたりする(interrupt_handler())
→main関数とのやり取り:グローバル変数で
・VIC=Vectored Interrrupt Controller
→いろんな情報が集約されている
・mainで開始して、
interrupt_handler()で
割り込み判断:割り込みあったら
処理
割り込みクリア
【スイッチの割り込み】
・全体的に
main
・EnableSWInt(); // 割り込み初期化
interrupt_handler()で
・if (SWInt() != 0) // 割り込みあったら
{
// 割り込み処理
SWIntClr(); // 割り込みクリア
}
・EnableSWInt();
・GPIOピンに入力セット
・割り込み有効化
VICIntSelect設定
VICIntEnable設定
IO0INTERレジスタ=立ち上がりに反応させるSW指定
IO0INTEFレジスタ=立ち下がりに反応させるSW指定
・SWInt()
・割り込み判定
IO0INTSTATUS & 01 チェック
・SWIntClr()
・割り込み解除
IO0INTCLRセット
【タイマー割り込み】
・全体的に
main
・StartTimer(int msec) // 割り込み時間:初期化
interrupt_handler()で
・if (TimerInt() != 0) // 割り込みあったら
{
// 割り込み処理
TimerIntClr(); // 割り込みクリア
}
・StartTimer()
・VIC設定
VICIntSelect設定
VICIntEnable設定
・タイマーリセット
T0TCR
T0CTCR
T0PR
・割り込み時間セット
T0MR0に引数*1ミリ秒の割合(4650くらい?)
・タイマースタと
T0MCR
T0TCR
・TimerInt()
・割り込みチェック
T0IR & 0x1
・TimerIntClr()
・割り込みフラグリセット
T0IR
【通信割り込み】
・全体的に
main
・InitUART(ボーレート); // 通信初期化
・EnableUARTRXInt(); // 受信割り込みイネーブル
interrupt_handler()で
・if (UARTInt() != 0) // 受信割り込み
{
// 割り込み処理
}
・EnableUARTRXInt();
・VIC設定
VICIntSelect設定
VICIntEnable設定
・U0IERの1ビット目をセット
・UARTInt()
・U0IIRの1ビット目をチェック
【割り込みハンドラを呼び出す仕組む】
アセンブラで・・
割り込みベクタ
0x00 Reset
:
:
0x18 IRQ
B _startup
nop
:
:
B _IRQ_handle
_IRQ_handle:
:
:
interrupt_handler()
:
:
つまり、はじめ、0x00のリセットから割り込み処理が実施され、0x18のIRQにいくと
B _IRQ_handle
が実行されて、_IRQ_handleに飛ぶ。
この_IRQ_handle内でinterrupt_handler()が、実行される。