前回「PIC24FJ64GA002 RTCCを試す -とりあえず動かす-」で、まあ、とりあえずそれっぽく時を刻むようにはなったPIC24FJ64GA002のRTCCだが、参考にさせていただいたコードまんまなので、改良して使いやすくするためにも、とっつきやすいところから少しづつコードを眺めてみることにした。
Configuration Bits
これは、そのままMPLAB X IDE に吐かせたものに書き換えた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// CONFIG2 #pragma config POSCMOD = NONE // Primary Oscillator Select (Primary oscillator disabled) #pragma config I2C1SEL = PRI // I2C1 Pin Location Select (Use default SCL1/SDA1 pins) #pragma config IOL1WAY = OFF // IOLOCK Protection (IOLOCK may be changed via unlocking seq) #pragma config OSCIOFNC = OFF // Primary Oscillator Output Function (OSC2/CLKO/RC15 functions as CLKO (FOSC/2)) #pragma config FCKSM = CSDCMD // Clock Switching and Monitor (Clock switching and Fail-Safe Clock Monitor are disabled) #pragma config FNOSC = FRCPLL // Oscillator Select (Fast RC Oscillator with PLL module (FRCPLL)) #pragma config SOSCSEL = SOSC // Sec Oscillator Select (Default Secondary Oscillator (SOSC)) #pragma config WUTSEL = LEG // Wake-up timer Select (Legacy Wake-up Timer) #pragma config IESO = OFF // Internal External Switch Over Mode (IESO mode (Two-Speed Start-up) disabled) // CONFIG1 #pragma config WDTPS = PS32768 // Watchdog Timer Postscaler (1:32,768) #pragma config FWPSA = PR128 // WDT Prescaler (Prescaler ratio of 1:128) #pragma config WINDIS = OFF // Watchdog Timer Window (Windowed Watchdog Timer enabled; FWDTEN must be 1) #pragma config FWDTEN = OFF // Watchdog Timer Enable (Watchdog Timer is disabled) #pragma config ICS = PGx1 // Comm Channel Select (Emulator EMUC1/EMUD1 pins are shared with PGC1/PGD1) #pragma config GWRP = OFF // General Code Segment Write Protect (Writes to program memory are allowed) #pragma config GCP = OFF // General Code Segment Code Protect (Code protection is disabled) #pragma config JTAGEN = OFF // JTAG Port Enable (JTAG port is disabled) |
それはいいんだが、元にあった BKBUG_OFF、COE_OFF がデータ・シートのどこを探しても無い。
分らないので、とりあえず無いまま無視したが、特に問題なく動いてはいる。
追記
それぞれ以下のようなC30の機能の設定らしい。
Background Debugger : MPLAB ICD2でのインサーキットデバッグをおこなう時のデバッグモードのイネーブルビット
Clip-on Emulation mode : エミュレーションモードのイネーブルビット
RtccInitClock();
C:¥Program Files (x86)¥Microchip¥xc16¥v1.24¥support¥peripheral_30F_24H_33F¥rtcc.h
で定義されている、RTCCを初期化する関数。
決まり文句だと思って書いておけばいいんだろう。
RtccWrOn();
RCFGCALレジスタのRTCWREN(RTCC Value Registers Write Enable bit)を設定する関数。
同上。
以下、全てライブラリ上の関数。
名前から目的や動作は明らか。
RtccWriteDate(&RtccDate, TRUE);
RtccWriteTime(&RtccTime, TRUE);
RtccSetCalibration(0);
RtccReadTime(&RtccTimeNew);
RtccReadDate(&RtccDateNew);
具体的にどんな風にやってんだろと思ってちょっと探してみたら、
C:¥Program Files (x86)¥Microchip¥xc8¥v1.33¥sources¥pic18¥plib¥rtcc
の中にいろいろ入っているのを見つけたが、xc16では、
C:¥Program Files (x86)¥Microchip¥xc16¥v1.24¥src¥peripheral_24F.zip
の中に圧縮されて入っていた。
どういう仕組みで呼び出しているんだかは不明。
mRtccOn();
mが付いているのはマクロ。
rtccTime, rtccDate
ともにrtcc.hで定義されているunion。
参考までにrtccTimeの定義
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
// union/structure for read/write of time into the RTCC device typedef union { struct { BYTE rsvd; // reserved for future use BYTE sec; // BCD codification for seconds, 00-59 BYTE min; // BCD codification for minutes, 00-59 BYTE hour; // BCD codification for hours, 00-24 }f; // field access BYTE b[4]; // BYTE access UINT16 w[2]; // 16 bits access UINT32 l; // 32 bits access }rtccTime; |
いつも思うことだが、こういうライブラリって便利なのかなあ、2度手間のような気がする。
ま、構造体とやらが良く分ってないのが原因かもしれないけど。
_RCDIV = 0;//PostScaler ( 0 : 32MHz 1 : 16MHz )
なんだこれ。
馴染みのある、
CLKDIVbits.RCDIV = 0b000;//FRC Postscaler Select bits 8MHz
にしておく。
オリジナルはせっかくの漢字表示だが、個人的にあまり好かないので英語表記に変更する。
前にも使ったこんな関数だが、今回はLCDへの表示用の関数はそのまま流用したので
lcd_gotopos(,);
lcd_putstr();
に書き換えて使う。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
void ddaydisp(unsigned char dday){ lcd_gotopos(0,13); switch(dday){ case 1:lcd_putstr("(Sun)"); break; case 2:lcd_putstr("(Mon)"); break; case 3:lcd_putstr("(Tue)"); break; case 4:lcd_putstr("(Wed)"); break; case 5:lcd_putstr("(Thu)"); break; case 6:lcd_putstr("(Fri)"); break; case 7:lcd_putstr("(Sat)"); break; } } |
追記(2015/04/09)
結局、スイッチとプル・アップ抵抗を取り付けて、日時、曜日を設定できるようにした。
コードは「Real Time Clock Module ( DS1307 + AT24C32 ) + PIC18F2550 + SC1602B」で使ったコードからのコピペでほとんど間に合った。
RTCモジュールとの差は、電源を落とした際のバックアップ電源の有無のみだが、どうせ液晶は別電源なので、PIC側を3Vくらいのボタン電池で駆動することにすればほとんど同じことに出来ると思う。
あるいは5VのACアダプタで駆動することにして、PIC用の降圧回路だけを追加する方がコンパクトに出来るという気もする。
いずれにしても、ブレッドボード上にこれ以上部品を載せるスペースが無いのでまだ試していない。