2015年3月16日月曜日

EZ-USB FX2LP を動かしてみる (7) TIMER割り込みでLEDチカチカ

アニメ「銀河英雄伝説」を観ています.果てしなく長い作品だ.いま観ているのは50話ぐらいですが、本編だけではなくて外伝もあるんでまだ1/3ぐらいしか消化してない段階と思われます.
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とTIM1のブロック図です.TIM2と似ていますが、カウンタが8bitなのが違うところです.reloadデータはTHxというレジスタに入れておきます.仮に12MHzを÷12してFFまでカウントすると、最遅で3900Hzで割り込みできます.
割り込み番号
後にサンプルプログラムで出てきますが、各タイマ割り込みには「割り込み番号」がついています.タイマの他にも割り込みがありますので、その一覧はこうなります.ここで憶えておくべきなのは、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

4 件のコメント:

  1. 朝のNHKで「中高年の再就職支援のユニークな“人生塾”。」というのをやってました。
    その中の一人はS社のレーザーディスクの回路屋さんだったようです。
    名前が出てたのでググると、こんなのを書かれてました。
    http://www.cqpub.co.jp/toragi/TRBN/trsample/2004/tr0401/0401sp5.pdf

    返信削除
    返信
    1. 赤塚さん、、、存じませんが相当年配の方のようですね. facebookには共通の友人な人がいますw.再就職できたのでしょうか???

      削除
  2. 勉強に成ります!
    感謝感激

    返信削除
    返信
    1. いま見直したところ、すでに自分が忘れてますw

      削除