こんばんわ
としぶぅ~です。
昨日今日と明日はかけないかも・・・・といいつつ書いてます(^^;
一応いとこのそばでお線香の番をしようと思ったけど、本日はいっぱいいるということで
いりませんとのことでした。。。
だから今日も少し・・・
従兄弟がなくなって思ったこと。
「いつ死んでもいいように日々悔いのない生き方をしなければ・・・・」と思いました。
よって、今日も少しだけですがお勉強!
といっても昨日動かした回路を回路図にして残す!
ということで回路図書きました。
一応ADコンバーター用のボリュームをつけていたりします。
(実はPWMも動作確認したりしました。。。。ちゃんと動きますよ^^。。。また今度書きますね。。)
デバッガが使えないので、ADがうまく動いているかわかりませんね。。。でも動いてることは確認
しました。。。こういう時シリアルポートが使えるとデバッグ簡単なんですけどね。。。
上で書きましたが、PWMをささっと動かしてみました。。。今度機会があれば書きますが。。。。
今日は時間がないので動いたよというところだけ紹介しておきます。
ちょっとソースをはっときます。
/*================================================================================
Templateプログラム
タイマー割り込みを使って時間をカウントして処理を時分割させる
File Name : main.c
Target Compiler: HI-TECH C PRO(Lite MODE)
Programer : としぶぅ~
Verion : 1.0
================================================================================ */
//PIC用の定義ファイルのインクルード
//HI-TECH Cでは、必ず指定する
#include <htc.h>
#include "ad.h" //AD用の関数(20120908追加)
#include "delay.h" //Delay用関数(20120908追加)
//#include "lcd_f88.h" //LCD用関数(20120916追加)
//コンフィグレーションメモリの設定
__CONFIG(FOSC_INTOSC & WDTE_OFF & PWRTE_ON & MCLRE_OFF & CPD_OFF & BOREN_OFF & LVP_OFF & CP_OFF & FCMEN_OFF & IESO_OFF);
//タイマの再設定値を定義
// 2000cycle@(8MHz / 4) == 1ms
// そこからTimer1再設定に要するサイクルを引いたもの
#define WAIT_CYCLE (2000-5)
#define TMR1H_INIT ((unsigned char)(((unsigned short)(65536-WAIT_CYCLE))>>8))
#define TMR1L_INIT ((unsigned char)(((unsigned short)(65536-WAIT_CYCLE))&0x00ff))
//ビット操作命令のマクロを定義
#define clear_bit( reg, bitNumb ) ((reg) &= ~(1 << (bitNumb))) //指定されたビットをクリア
#define set_bit( reg, bitNumb ) ((reg) |= (1 << (bitNumb))) //指定されたビットをセット
#define test_bit( reg, bitNumb ) ((reg) & (1 << (bitNumb))) //指定されたビットをテスト
unsigned char tmr_1ms;
unsigned char tmr_4ms;
unsigned char tmr_4ms_up;
unsigned char tmr_cnt_up;
//割り込み関数
//1/100秒の、タイマのオーバーフロー割り込みで、計測値のインクリメントと、スイッチの確認を行う
void interrupt f_int( void )
{
//タイマ割り込みかどうかをチェックして、タイマ割り込み以外の場合は、処理をしない
if(TMR1IF) {
//タイマの値を再設定し、次の割り込みが1/1000秒後に発生するように設定する
TMR1H = TMR1H_INIT;
TMR1L = TMR1L_INIT;
TMR1IF=0; //タイマ1の割り込みフラグをクリアする
tmr_4ms++; //10msごとのカウンタをインクリメント
if(tmr_4ms >= 4){
tmr_4ms = 0;
tmr_4ms_up = 1;
tmr_cnt_up++;
//PORTB 0bitをon/offして4msでtmr_cnt_upが4msになっていることを確認する。
if(test_bit(PORTA,2)){
clear_bit(PORTA,2);
}else{
set_bit(PORTA,2);
}
}
}
}
//ハードウェアの初期化
//使用する回路に合わせて、I/Oポートの方向などを設定する
void IoInit(void)
{
OSCCON = 0x70; //CLK=8MHzに設定する
//ポートの設定
TRISA = 0b00010000; //ポートAは使用しないが、出力に設定 PORTA-bit3=SW入力
// TRISB = 0b00000000; //ポートBは使用しないが、出力に設定
PORTA = 0; //ポートAの初期値を0にする
// PORTB = 0; //ポートBの初期値を0にする
ANSELA = 0b00000000; //アナログモードは使用しないので、0を指定
}
//タイマ1の初期化
void Tmr1Init(void)
{
T1CON = 0x00; //プリスケーラを、内部クロック、1:1に設定
TMR1H = 0; //タイマ1の初期値を0にする
TMR1L = 0;
TMR1IF = 0; //割り込みフラグをクリアする
//タイマ1割込を有効にする
TMR1IE = 1;
PEIE = 1;
//グローバルの割り込み制御ビットを有効にする
GIE = 1;
}
//メインルーチン
void main( void )
{
unsigned char ansel;
int i;
IoInit(); // I/Oポートの初期化
Tmr1Init(); // タイマ1の初期化
ansel = 0x10; // AD4を指定(20120908追加)
adinit(ansel); // RA4をAD4ポートとして初期化する(20120908追加)
//タイマ周期が1/100秒になるように、初期化する
TMR1H = TMR1H_INIT;
TMR1L = TMR1L_INIT;
//時間のカウンタの初期化
tmr_1ms = 0;
tmr_4ms = 0;
tmr_4ms_up = 0;
tmr_cnt_up = 0;
//タイマ1を開始する
TMR1ON=1;
ad_disp = 0;
ad_data_old = 0;
ad_data = 0;
//無限ループ
while(1){
if(tmr_4ms_up == 1){
tmr_4ms_up = 0;
switch(tmr_cnt_up){
case 0: ad_4ms(); //処理1 ADを実施(20120920追加)
break;
case 1: /*disp_ad3();*/ //処理2 ADを実施(20120920追加)
break;
case 2: //処理3
break;
case 3: //処理4
break;
case 4: //処理5
break;
}
}
}
}
一応LCD等は使えないのでコメントにして外してあります。
マーカー部分が変更必要なところです。
ポートAしかないのと、ADもAN3までしかない。。。
あと、CONFIGも少し違うところありました。
HITEC-Cは9.82使っています。
9.83だとかなり違っていたように思います。
バージョン変わるとかな~りエラーが山のようになりますので、そしたらヘッダーファイル見て
ヘッダーファイルに合わせましょう・・・(レジスタ名等)
今日はこんなところでしょうか…
もう少しお勉強しないと!?
頑張ります。。。明日は葬儀に参列してきます。
ではおやすみなさい(^^)/