としぶぅ~の「工作部屋」...毎日少しのお勉強

趣味・関心事を書いていこうと思います。

PIC12F1822を動かしてみる。。。その5(DAC)

2013-06-24 21:27:24 | PIC12F1822

こんばんわ

としぶぅ~です。

 

ひらめきました!

朝+VREF入力を使用するとうまく動かない・・・・・と書いたけど、その原因が

わかりました。

実は、RA1ポートの設定が”出力”になっていた!!

 TRISA = 0b00010000;

と記入していた。。。。

 TRISA = 0b00010010;

こう記入してRA1ポートを入力にしないといけなかった!

これで。。。。あ~ら不思議(笑)

VREFの入力を+3Vくらいにして、

  (クリックすると大きくなりますよ)

ボリューム最小/中間/最大(LEDの光かた見てもらえばわかりやすいと思う・・・)

0-3Vまで変化するようになる。

ちゃんと外部から入れた+VREFが効いているということですね!

 

よかった中途半端にしておかずに済んで(笑)

 

さ~て今日はゆっくりねれるかな!

 

それでは皆様おやすみなさい!(-o-)/

 


PIC12F1822を動かしてみる。。。その4(DAC)

2013-06-24 05:07:08 | PIC12F1822

おはようございます。

としぶぅ~です。

 

今日も雨ですかね。。。憂鬱ですね。。。。またびしょぬれか?

 

本日は、PIC12F1822のDAC機能の動作を確認しました。

昨日作成したボードにチェック用の回路を追加しました。

こんな感じ。。。

 

プログラム書き込み時に外からの影響を受けないようにスイッチを追加。

後は+VREF入力をつかえるようにボリューム追加。

後は、ソフトをDACがらみで追加するだけですが、設定の必要なレジスタは2個+1個だけですね。

DACCON0とDACCON1の2つがメインです。

DACCON1については、出力用の5bitのデータを入力するだけです。

DACCON0は、 

 bit7:DACEN DACを使用するかどうかを設定します。 1=Enable 0=Disable

 bit6:DACLPS DAC用の基準電圧を決定します。 1:+REF 0:-REF

 bit5:DAOE DAC出力用のポートpinをONにするかOFFにするかを指定。 1:out 2:No out

 bit4:No USE

 bit3-2:DAC用の基準電圧の選択です。

      00:Vdd

      01:+VREF pin

      10:FVR output

      11:-

 bit1-0:No USE

です。

普通に使うには、バイナリーで書きますと、0b11100000でいいかなと思います。

この設定でDACの出力ピンに0-5Vがでてきます。(確認済み)

bit3-2の設定で出力電圧が0V~何Vまで振らせるかを決めますが。。。。

回路図の追加ボリュームで+VREFにいれた電圧を基準電圧に設定するとうまく動かない。。。

0b11100100という設定ですね。。。

どうも上記設定をすると分圧した電圧が変な電圧になってしまっているので多分、オペアンプ

のバッファでも入れないといけないのかな?

もう一点PIC内部で4V、2V、1Vの基準電圧を作ることのできるFVRをDACの基準電圧を

使用したところうまく動いていることを確認しました。

AD入力用のボリュームをまわすと、PWM出力につけてあるLEDの明るさと同期して明るさが

変化します。

こんな感じ

醜いですが後ろのマルチメーターにDACの出力電圧が表示されています。

出力も他の機器に接続する場合は、オペアンプのボルテージフォロワーを追加しないといけませんね。

手元にレール・ツウ・レールのオペアンプないのでまた今度やってみます。

とりあえずDACは動作しました。。。。問題なく!

データシートにもっとDACが入っているとはっきり書いてくれればいいんですが。。。書いてないんですね。

ま、いいですが。。。

 

とりあえず確認完了・・・・ということで。

DACは基準電圧を制御できるので意外と用途はあると思っているんですがね。。。。あまり使っている

記事をみませんね。。。なんか応用してみますかね。。

 

今日はこの辺で。。。みなさまよい一日を~(^o^)/

 

 

 

 

 


PIC12F1822を動かしてみる。。。その3

2013-06-23 12:35:55 | PIC12F1822

こんいちわ

としぶぅ~です。

 

昨日PIC12F752のチップが届きました。

そこで、動く環境を・・・ということで以前購入しておいたPIC12F1822が動く環境を作って

そのまま差し替えて動かそうかなと思い。。。依然作った回路図を引っ張り出してボードを作りました。

作るのに。。。昨日の23時までかかった。。。(^^;

回路図は

こんな感じ。

問題はここから。。。。一応動作確認はしておいたと思っていたので、すぐ動くと思ったんだけど。。。。

これがうごかん!(笑)

そこからデバッグ開始・・・・・かなり前に確認していたので、どういう風に動かしていたのか忘れてしまった・・・

動いていたはずのプログラムがぜんぜんだめ。。。。

マニュアルの読み直しです。

引っかかっていたのは、ADのポートが違うこと・・・・AD値→PWM値の変換がうまくできていないこと。。。。

ただ、役に立ったのは、先日PIC12F1822をDEBUGできるようにしてあったこと・・・・これは助かった!

でも。。。。朝方4時くらいまでかけてもうまく動かず。。。朝9時に起きてまた初めて昼ころようやく動き出した(^^;

長かった・・・・

動いている状況は、

絞ったところ

  

中間くらい

  

MAXちかく

 

波形は、CH1:PWM出力(5pin=RA2)、CH2:AD入力(3pin:AN3)です。

さてこれで下準備ができました。

で、急になぜPIC12F752・・・・?

かというとPICのDAC・・・デジタル-アナログ・コンバーターを使ってみようと思いまして。。。。

ま、5bitなんですけどね。。。。32段階ですか。。。+VREF入力を使えば、使いたいところを絞れるので

そこそこ使えるんではないか?・・・と考えております。

で、昨日動かないのでいろいろマニュアルを読み漁っていたところ・・・・PIC12F1822にもDACがついている!?

えぇぇ・・・・(笑)

ちょっとこちら(PIC12F1822)で作ってみますかね。。。。

 

今日はとりあえずこのへんで。。。。

 

それでわっよい休日を!(^o^)/

 

 


PIC12F1822でデバッグ

2013-03-23 15:33:27 | PIC12F1822

こんにちわ

としぶぅ~です。

 

先日アップしましたブログで紹介しましたが、

「1ランク上のPICマイコンプログラミング」

に書かれていた、PIC16F1xxx or PIC12F1xxxはヘッダなしでデバッグできる・・・・

をとりつかれたように検証してました。。。。というか動かないので「なぜ!」「なぜ!」「WHY!」

という状態になって調べまくっていただけですが(笑)

しか~し!無事にデバッグできる事を確認できました。

これを必死になってやる意味?

あるでしょう~

だって。。。。いちいちヘッダ準備しなくても内部のレジスタとか確認できるんですから・・・

ただし、ヘッダなしでデバッグするときは、3pin分のポートは使用できませんが。。。。

それでもですね~。。。PIC12F1822とかの8pinPICでデバッグができるのは非常に

うれしいです。

それで、何が原因でデバッグできずにはまってしまっていたか・・・・

実は先日Pickit3に逆電圧かけて壊しちゃったんですが・・・・それを修理したんですが。。。

ちゃんと治っていなかった・・・というところでしょうか・・・

書籍に書いてあるように、コンフィグレーションビットを設定してデバッグモード用のプログラムを

書き込むところまでは行くんですが。。。。”RESET” または、”RUN”を実行すると、

「コンフィグレーションビットがおかしいからデバッグできないよ!」というようなメッセージが!!!

コンフィグレーションビットをいくらさわっても・・・・上記現象はとれない・・・

相当これで悩みました。。。

で、昨日夜から「これはおかしすぎる」と・・・

今朝から、依然作ったボードでPickit3がちゃんとデバッグ動作するか確認しました。

すると。。。Pickit2ではデバッグできているが。。。Pickit3にしたとたんできなくなる・・・

通信はできるが、IDが取れたりとれなかったり。。。。。また、ターゲットボードがない・・・とか

ちょっと挙動がおかしいのでPickit3を疑って、先日交換したチップを再度半田であたってみ

ました。。。で、動作確認!

おぉ・・・・ちゃんとデバッグできるようになりました。(旧ボードでです。)

では、PIC16F1827をのせたプレッドボードではどうか・・・・「おぉ!」

ちゃんと動く・・・・少し感動(笑)

いいですね~

では、PIC12F1822をのせたブレッドボードで確認!

おぉ~動く~(笑)

ちゃんとどちらもブレイクポイントに止まり、レジスタの内容も見れています。

いや~

いいですね~

これでどんどんいろいろなことができる!

あと、最後に補足です。

デバッグができる状況でPickit3とターゲットボードを接続すると下記のような表示が

でます。

左はヘッダを使わずにデバッグするとき

右はヘッダを使ってデバッグするとき、

クリックします。

こんな表示始めてみました^^;

とりあえず動作してよかった。。。

今日はこんなところでしょうか・・・・


桜・・・・咲き始めましたね・・・みなさん花見でしょうか・・・・わたしもいきたいな~(^o^)







PIC12F1822を動かしてみる。。。その2(昨日動かした回路図を作っとく)

2012-10-16 23:23:02 | PIC12F1822

こんばんわ

としぶぅ~です。

 

昨日今日と明日はかけないかも・・・・といいつつ書いてます(^^;

一応いとこのそばでお線香の番をしようと思ったけど、本日はいっぱいいるということで

いりませんとのことでした。。。

だから今日も少し・・・

従兄弟がなくなって思ったこと。

「いつ死んでもいいように日々悔いのない生き方をしなければ・・・・」と思いました。

よって、今日も少しだけですがお勉強!

といっても昨日動かした回路を回路図にして残す!

ということで回路図書きました。

一応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だとかなり違っていたように思います。

バージョン変わるとかな~りエラーが山のようになりますので、そしたらヘッダーファイル見て

ヘッダーファイルに合わせましょう・・・(レジスタ名等)

 

今日はこんなところでしょうか…

もう少しお勉強しないと!?

 

頑張ります。。。明日は葬儀に参列してきます。

ではおやすみなさい(^^)/