18世紀ごろのお行儀の良い戦争(軍人同士の戦闘で基本的に民間人を巻き込まない戦争)が延々と繰り広げられています.それって必ずしもリアルではないかなぁ、と若干フラストしておりますが、知人によるとやがてゲリラ戦みたくなるらしく、現代風のえげつない戦争に変化したらリアリティが増してよろしいかと思いつつ... 登場人物の中ではグリーンヒルさんが最も好きですかな.
-----
EZ-USB FX2LPでやっとタイマ割り込みを動かせるようになりました.LEDをチカチカさせて遊びました.
タイマの概要
様々なタイマ機能のうち、LEDチカチカに使う機能は、一定周期で割り込みをかける機能です.それ以外のタイマ機能はとりあえずシカトしておきます.
CY7C68013Aには、TIM0,TIM1,TIM2の3つのタイマが載っています.3つそれぞれに微妙に機能が異なるのですが、基本的にはこういうブロック図です.
↓これはTIM2のブロック図です.×がついた外部pinは、ピン数の少ないCY7C68013Aには存在しません.概要はこうです.
・clockソースは、CPUのclockと同じものです.12 or 24 or 48MHzのいずれかです
・÷12または÷4の分周器があります
・{TH2,TL2}の16bitカウンタでclockがカウントされます.(外部clock T2はさておく)
・16bitカウンタはインクリメントのみです (デクリメントはできない)
・16bitカウンタがFFFFになったら、{RCAP2H,RCAP2L}の16bitをリロードします
・それと同時に割り込みします
・仮に12MHzを÷12してFFFFまでカウントすると、最遅で15Hzで割り込みできます.
割り込み番号
後にサンプルプログラムで出てきますが、各タイマ割り込みには「割り込み番号」がついています.タイマの他にも割り込みがありますので、その一覧はこうなります.ここで憶えておくべきなのは、TIM0=1、TIM1=3、TIM2=5 だというコトです.
サンプルプログラム
こちらにタイマのサンプルプログラムを置きます.解凍して、次のフォルダの下に置いてください.
C:\Cypress\USB\CY3684_EZ-USB_FX2LP_DVK\1.1\Firmware
timer.Uv2をダブルクリックするとKeilのIDEが開きます.
projectのファイル構成はこうなっています.
やっていること
・CPU clock = 48MHz に設定
・タイマclock = 48÷12 = 4MHz
・タイマ0は100分周で割り込み = 40kHz毎に割り込み
・タイマ1は100分周で割り込み = 40kHz毎に割り込み
・タイマ2は40000分周で割り込み = 100Hz毎に割り込み
・タイマ0の割り込みルーチンは、20000回毎にLEDチカチカ = 2Hz 外部ポートPB0
・タイマ1の割り込みルーチンは、5000回毎にLEDチカチカ = 8Hz 外部ポートPB1
・タイマ2の割り込みルーチンは、50回毎にLEDチカチカ = 2Hz 外部ポートPB2
ソースコード (抜粋)
↓これはタイマ0の割り込みルーチン.interrupt 1というのがタイマ0の割り込みルーチンであるという修飾子になっています.1が上述の割り込み番号に対応します.内部では、20000回カウントしています.
void timer0_ISR (void) interrupt 1 {
timer0_cnt++;
if(timer0_cnt==20000) {
PB0=~PB0; 外部ポートPB0を反転
timer0_cnt=0;
}
}
↓これはタイマ1の割り込みルーチン.interrupt 3というのがタイマ1の割り込みルーチンであるという修飾子になっています.内部では、5000回カウントしています.
void timer1_ISR (void) interrupt 3 {
timer1_cnt++;
if(timer1_cnt==5000) {
PB1=~PB1; 外部ポートPB1を反転
timer1_cnt=0;
}
}
↓これはタイマ2の割り込みルーチン.interrupt 5というのがタイマ2の割り込みルーチンであるという修飾子になっています.内部では、50回カウントしています.末尾でTF2という割り込みフラグをクリアしています.TF2クリアを怠ると延々と割り込みしつづけちゃいます.割り込みフラグをクリアしなくちゃいけないのはタイマ2だけです.
void timer2_ISR (void) interrupt 5 {
timer2_cnt++;
if(timer2_cnt==50) {
PB2=~PB2; 外部ポートPB2を反転
timer2_cnt=0;
}
TF2=0; 重要、割り込みフラグをクリア
}
↓以下はメインルーチンです.
void main(void) {
CPU clock周波数を48MHzに設定します.
//CPUCS = (CPUCS & ~bmCLKSPD); // 12MHz
//CPUCS = (CPUCS & ~bmCLKSPD) | bmCLKSPD0; // 24MHz
CPUCS = (CPUCS & ~bmCLKSPD) | bmCLKSPD1; // 48MHz
TIM0,TIM1をグルグル回るモード(リロードモード)にします.
TMOD = 0x22;
全てのタイマのクロックを、48÷12=4MHzにする
CKCON = (CKCON & 0xf8);
TIM0の設定.100までカウントしてグルグル回す.
TH0 = 256 - 100; reload value 100
TL0 = TH0;
ET0 = 1; 割り込みenable
TR0 = 1; スタートTIM0
TIM1の設定.100までカウントしてグルグル回す.
TH1 = 256 - 100; reload value 100
TL1 = TH1;
ET1 = 1; 割り込みenable
TR1 = 1; スタートTIM1
TIM2の設定.40000までカウントしてグルグル回す.
TH2 = (65536 - 40000)>>8; reload value 40000
TL2 = (65536 - 40000);
RCAP2H = TH2;
RCAP2L = TL2;
ET2 = 1; 割り込みenable
TCLK = 0;
RCLK = 0;
CP_RL2 = 0;
TR2 = 1; スタートTIM2
割り込みイネーブル
EA = 1; // Global Interrupt Enable
ポートBを出力に設定
OEB = 0xFF;
while(1);
}
その6へ その8へ
かしこ
INDEXページへ
https://hirasakausb.blogspot.com/2019/03/ez-usb-fx2lp-index.html
朝のNHKで「中高年の再就職支援のユニークな“人生塾”。」というのをやってました。
返信削除その中の一人はS社のレーザーディスクの回路屋さんだったようです。
名前が出てたのでググると、こんなのを書かれてました。
http://www.cqpub.co.jp/toragi/TRBN/trsample/2004/tr0401/0401sp5.pdf
赤塚さん、、、存じませんが相当年配の方のようですね. facebookには共通の友人な人がいますw.再就職できたのでしょうか???
削除勉強に成ります!
返信削除感謝感激
いま見直したところ、すでに自分が忘れてますw
削除