JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F1827 MCC RTC(DS1307)テストその2

2021-07-17 22:15:24 | MPLAB X MCC
 前回のテストで、リアルタイムクロックRTC(DS1307)をPIC16F1827でコントロールすることができました。

 今回は、DS1307から1Hzの方形波を出力して、波形の立ち上がりで、RB0にIOC(状態変化割込み)をかけ、1secごとに時刻を表示するテストをします。

 回路図です。

 MCCのセッティングをします。
 System ModuleとMSSP1の設定は、テストその1と同じです。
 Pin Managerで、RB0を入力に設定します。(RB2,RB3,RB5は、次回のテストでスイッチを付ける予定なので、入力に設定しています。)


IOC割込みをInterrupt Moduleで設定します。(IOCIにチェックを入れます)
 Pin ModuleでRB0のIOCを立ち上がり(positive)に設定します。

プログラムです。
その1のプログラムの次の部分を変更します。

まず、DS1307のSQW出力に1Hzの信号を出力するようにします。
これは、DS1307のレジスタ0x07番地に0x10を書き込めばよいので、レジスタへの書き込みデータ初期値REG[8]の最後のデータにセットします。
REG[8] = {0x00,0x00,0x00,0x01,0x01,0x01,0x20,0x10};

IOC割込みの設定は、pin_manager.cのIOCBF0_ISR(void) に下のように設定します。
RB0の入力がLOWからHIGHに変化した(立ち上がり)時に割込みがかかります。
割込みがあったら、IntFlag=1;として割込みフラッグを立てます。


main.cの中のmain()関数の中身です。
-------------------------------------------------------------------------
void main(){
// initialize the device
SYSTEM_Initialize();
// Enable the Global Interrupts
INTERRUPT_GlobalInterruptEnable();
// Enable the Peripheral Interrupts
INTERRUPT_PeripheralInterruptEnable();


LCD_init();

Time_data_write();//時刻をセット

while (1){
if(IntFlag == 1){ //RB0にIOC割込みがあったら
Time_data_read();//RTCから時刻を読み出し
Time_disp(); //時刻を表示する
IntFlag = 0; //割込みフラッグを降ろす
}
__delay_ms(10);
}
}
------------------------------------------------------------------
IntFlagという変数を使うmain.cとpin_manager.cの最初の方で、
volatile int IntFlag = 0;
を書いておきます。

ブレッドボードです。時刻の初期値
2020/01/1 (MON)
00:00:00
から1sec1ごとに時刻が動き始めます。

 次回は、スイッチを付けて、時刻設定ができるようにして、時計に仕上げます。


最新の画像もっと見る

コメントを投稿