前回のテストで、リアルタイムクロックRTC(DS1307)をPIC16F1827でコントロールすることができました。
今回は、DS1307から1Hzの方形波を出力して、波形の立ち上がりで、RB0にIOC(状態変化割込み)をかけ、1secごとに時刻を表示するテストをします。
回路図です。![](https://blogimg.goo.ne.jp/user_image/31/00/a9eb0b5a6abbe9d2aaf1eeeb8fff046b.png)
![](https://blogimg.goo.ne.jp/user_image/31/00/a9eb0b5a6abbe9d2aaf1eeeb8fff046b.png)
MCCのセッティングをします。
System ModuleとMSSP1の設定は、テストその1と同じです。
Pin Managerで、RB0を入力に設定します。(RB2,RB3,RB5は、次回のテストでスイッチを付ける予定なので、入力に設定しています。)
![](https://blogimg.goo.ne.jp/user_image/5b/0b/92688dbeb60578fe84f0d76450c94ca3.png)
IOC割込みをInterrupt Moduleで設定します。(IOCIにチェックを入れます)
![](https://blogimg.goo.ne.jp/user_image/4f/b0/93ea311bcad80bf84267ac37bd2a93a6.png)
Pin ModuleでRB0のIOCを立ち上がり(positive)に設定します。
![](https://blogimg.goo.ne.jp/user_image/05/b3/2d3dbae8508c18626ff08cce9e07d7d0.png)
プログラムです。
その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;として割込みフラッグを立てます。
![](https://blogimg.goo.ne.jp/user_image/67/71/07cc5ad037f8abac4d2fe7e0a5084c48.png)
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);
}
}
------------------------------------------------------------------
// 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ごとに時刻が動き始めます。
![](https://blogimg.goo.ne.jp/user_image/71/a3/ad623ae2d56f41f542a1db8ce0da5b88.jpg)
次回は、スイッチを付けて、時刻設定ができるようにして、時計に仕上げます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます