PIC24FJ64GA002のRTCCで遊んでいる。
「PIC24FJ64GA002 RTCCを試す -とりあえず動かす-」
「PIC24FJ64GA002 RTCCを試す -コードを眺めて少し改造-」
今回は、Alarmを使ってみる。
他の機能は何も使っていないので、割り込みを利用していろいろアラームっぽいことをやる手もあるが、とりあえずはRTCCピンに出力させてみることにする。
1 2 3 4 5 6 |
//Settings for Alarm PADCFG1bits.RTSECSEL = 0;//RTCC alarm pulse is selected for the RTCC pin RCFGCALbits.RTCOE = 1;//RTCC Output Enable bit ALCFGRPTbits.ALRMEN = 1;//Alarm is enabled ALCFGRPTbits.CHIME = 1;//Chime is enabled ALCFGRPTbits.AMASK = 0b0001;// |
一番下のAMASKがアラームの時間間隔を設定するレジスタで、上の例では1秒毎になっている。
実はRTCCピンはRB14なのだが、LCDのデータ用に使っていて、これを変更するのが一番面倒だった。
Alarmというよりは、LCDのデータピンの取り回し奮闘記。
ここにも書いたが、もともとのコードはピンの変更に柔軟に対応できるようになっていた。
ところが、何を血迷ったか、練習のつもりで使い慣れたLCD用のライブラリを組み込んでしまった。
元が8ビットのマイコン用のものなので、書き直すについては、それはそれでいろいろ変更点はあった
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void Putc_LCD4(char c, char rs){ unsigned short reserve; unsigned short chardata; chardata = c; chardata = chardata << 8; __delay_us(52); /* >40us */ LCD_RS = rs; reserve = LCD_PORT & 0x0FFF; LCD_PORT = ((chardata & 0xF000) + reserve); /* E=0, RS=rs, high addr */ LCD_E=1; asm("nop"); LCD_E=0; LCD_PORT=((chardata << 4) + reserve); /* E=0, RS=rs, low addr */ LCD_E=1; asm("nop"); LCD_E=0; } |
のだが、今回は使うピンを中途半端に2つだけずらすことにしたので、さらにもう一手間が必要だった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void Putc_LCD4(char c, char rs){ unsigned short reserve; unsigned short chardata; chardata = c; //chardata = chardata << 8; chardata = chardata << 6; __delay_us(52); /* >40us */ LCD_RS = rs; reserve = LCD_PORT & 0xC3FF;// = 0b1100001111111111 // 0x3C00 = 0b0011110000000000 LCD_PORT = ((chardata & 0x3C00) + reserve); /* E=0, RS=rs, high addr */ LCD_E = 1; asm("nop"); LCD_E = 0; LCD_PORT=((chardata << 4) + reserve);/* E=0, RS=rs, low addr */ LCD_E = 1; asm("nop"); LCD_E = 0; } |
ブレッドボード上が混んでいて分りにくいが、赤い矢印で示したのがRTCCピンからの出力でLEDを光らせているところ。