PIC16FのXC8と勝手が違っていたので,メモ。
参考リンク
テストとして,プルアップしたスイッチをADCとして読み,読み値をOLEDに表示。
MCCを使ったセットアップ。
saharaさんのページの通り,[Enable Auto Sampling]にチェック。TADが指示された値より大きくなるように,Conversion Clockを設定。Conversion Triggerは[Internal counter...]を選ぶ。
これだけかと思った。プログラムを走らせてみると,どうもRA0の値を読んでいるっぽい。読みたいのはRB3なのに...
というわけで,MCCのADC画面の下,RB3=AN5のところ,[Scan Enable]にチェックを入れる。これが正解だった。複数チャンネルの時はどうするんだろう... 後で考えよう。
main.cでは,ADC1_ConversionResultGet()を使えば良い。
無事,5Vっぽい値が読めている。スイッチを押すと,ゼロになる。
(追記)
タイマー割り込みを使い,どのぐらいたくさんのサンプリングが行えるか実験した。
結果,5usec間隔の206k サンプル/秒 ぐらいが限界点だと思われた。
ADCの設定では1usecで変換が終わることになっているが,無理は禁物...
PLL使用の32MHz動作。検証は以下のmain.c 生存確認のため,Lチカのスイッチテストと,稼働時間が表示されている。
#include "mcc_generated_files/system.h"
#include "mcc_generated_files/rtcc.h"
#include "mcc_generated_files/mcc.h"
#define FCY 16000000UL
#include <libpic30.h>
#define address 0x3C
struct tm CURRENT_RTCC;
unsigned long int ADC_COUNT = 0;
unsigned long int ADC_COUNT_PREV = 0;
int PREV_SEC = 0;
void My_TMR1_ISR(void) {
ADC1_ConversionResultGet();
ADC_COUNT++;
}
int main(void)
{
// initialize the device
SYSTEM_Initialize();
__delay_ms(500);
OLED_Init(0x3C);
OLED_clear();
OLED_string("This is from my", 0, 0);
OLED_string(" PIC24FV16KM202", 0, 8);
OLED_string("with OLED 128*64.", 0, 24);
OLED_write();
__delay_ms(500);
OLED_clear();
OLED_write();
char d1[30]="";
TMR1_SetInterruptHandler(My_TMR1_ISR) ;
TMR1_Start();
while(1) {
RTCC_TimeGet(&CURRENT_RTCC);
if (CURRENT_RTCC.tm_sec != PREV_SEC) {
PREV_SEC=CURRENT_RTCC.tm_sec;
sprintf(d1,"%02d:%02d:%02d",CURRENT_RTCC.tm_hour,CURRENT_RTCC.tm_min,CURRENT_RTCC.tm_sec);
OLED_string(d1,0,0);
TMR1_Stop();
sprintf(d1,"ADC_COUNT = %8lu",ADC_COUNT);
OLED_string(d1,0,8);
OLED_write();
ADC_COUNT=0;
TMR1_Start();
}
_LATA0=_RA1; // for switch test
};
return 1;
}
0 件のコメント:
コメントを投稿