PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョン HOMEへ

☆はじめに

☆仕様・製作

◎PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンハード

◎PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンソフト

◎簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込みツール(Windowsパソコン用)

◎PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンの時刻調整方法 

☆まとめ


☆はじめに

先回製作したPIC簡易プログラムタイマ(PIC12F683)の時計精度が悪いので、時計用水晶振動子を使用してもう少し実用性のある精度の良い、簡易プログラムタイマを作ってみました。先回と同じピン数の少ない8ピンのPIC12F683をあえて使用して製作してみました。

1日1秒位の精度を目標としましたが、テストした結果、2週間(14日間)で、10秒(1日当たり約0.71秒)の遅れでした。

先回製作したPIC簡易プログラムタイマ(PIC12F683)とほぼ同じ仕様ですが一部違いがあります。

設定した時間に出力をON、OFFするプログラムタイマで、出力は最大3出力(3チャンネル)で、最大35個のタイマ設定が出来ます。時刻表示は無しですが、RS232C出力を使用してパソコン等で時刻を表示する事が出来ます。但し、今回のは出力を3出力に設定した場合は、RS232C出力は無しとなりパソコン等で時刻表示する事は出来ません。

下記の簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込みツールで、設定、書込み、時刻表示を行います。

簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込みツール

 


☆仕様・製作

◎PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンハード

PIC簡易プログラムタイマ 水晶振動子バージョン ボード

 

先回製作したPIC簡易プログラムタイマ(PIC12F683)では内部発振を使用しましたが、今回は水晶振動子を使用するので、IOピンが2個少なくなり出力が1個しか取れません。先回のPIC簡易プログラムタイマ(PIC12F683)と同じ様な仕様にしたいので、下記のようにスイッチで切り替えて使用して出力を増やすようにしました。

PICのRS232Cの受信側は、設定モード時には使用しますが、制御モード時には時刻データ送信のみで受信は使用していないので制御モード時には、スイッチで切り替えて時刻修正用の入力IOピンとして使用します。IOピンを兼用するのでIOピンが1個余り2出力(2チャンネル)とする事が出来ます。

製作した当初は時刻精度確認調整用として制御モード時にRS232C出力(送信)を使用しますが、時計精度を確認した後は、時計精度も良くなっていて、制御モード時にRS232C出力(送信)を使用する機会も少なくなると思うので、スイッチで切り替えてRS232Cの送信側をOUT出力用に使用出来るようにしました。3出力(3チャンネル)にしたい場合は、設定書込み時に3出力設定にして書込み、制御モード時にスイッチSW3で出力側に切り替えて使用します。但し、RS232C出力(送信)は無しの為、時刻表示は出来ません。

 

ブレッドボードに回路を組んで確認しました。

 

 

 

PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョン 

 

 

このページのTOPへ

 


 

◎PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンソフト

PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョン HEXファイル    (lzhで圧縮)

 

 

PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョン IOピン割付

入力1ピン 出力3ピン
GP3(設定時RS232C受信用、制御時時刻修正入力用) GP0(RS232C送信用又はCH3)、GP1(CH1)、GP2(CH2)

設定について(上記のIOピン割付表参照)

設定モード時RS232C受信用、制御モード時時刻(正時)修正入力用として入力は1ピン使用し、RS232C送信用(タイマ設定出力兼用)で1ピン、タイマ設定出力用で2ピンで、出力は3ピン使用します。

 

 

PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョン EEPROM割付

EEPROM番地

割付内容
10進数 16進数
0 00 EEPROM設定有無のフラグ(有の時1、無の時0)
1 01 GP0がRS232C送信設定又は出力CH3設定のフラグ(RS232C送信設定の時0、出力CH3の時1)
2 02 *********
3 03 時(初期時刻設定値)
4 04 分(初期時刻設定値)
5 05 秒(初期時刻設定値)
6 06 タイマ1 出力チャンネル
7 07 タイマ1 ON設定時間 時
8 08 タイマ1 ON設定時間 分
9 09 タイマ1 ON設定時間 秒
10 0A タイマ1 OFF設定時間 時
11 0B タイマ1 OFF設定時間 分
12 0C タイマ1 OFF設定時間 秒
13 0D タイマbQ 出力チャンネル
14 0E タイマbQ ON設定時間 時
15 0F タイマbQ ON設定時間 分
16 10 タイマbQ ON設定時間 秒
17 11 タイマbQ OFF設定時間 時
18 12 タイマbQ OFF設定時間 分
19 13 タイマbQ OFF設定時間 秒
20 14 タイマ3 出力チャンネル
21 15 タイマ3 ON設定時間 時
22 16 タイマ3 ON設定時間 分
23 17 タイマ3 ON設定時間 秒
24 18 タイマ3 OFF設定時間 時
25 19 タイマ3 OFF設定時間 分
26 1A タイマ3 OFF設定時間 秒
27 1B タイマ4 出力チャンネル
28 1C タイマ4 ON設定時間 時
29 1D タイマ4 ON設定時間 分
30 1E タイマ4 ON設定時間 秒
31 1F タイマ4 OFF設定時間 時
32 20 タイマ4 OFF設定時間 分
33 21 タイマ4 OFF設定時間 秒
34 22 タイマ5 出力チャンネル
35 23 タイマ5 ON設定時間 時
36 24 タイマ5 ON設定時間 分
37 25 タイマ5 ON設定時間 秒
38 26 タイマ5 OFF設定時間 時
39 27 タイマ5 OFF設定時間 分
40 28 タイマ5 OFF設定時間 秒
41〜236 29〜EC

以下、タイマ6からタイマ33まで同様

237 ED タイマ34 出力チャンネル
238 EE タイマ34 ON設定時間 時
239 EF タイマ34 ON設定時間 分
240 F0 タイマ34 ON設定時間 秒
241 F1 タイマ34 OFF設定時間 時
242 F2 タイマ34 OFF設定時間 分
243 F3 タイマ34 OFF設定時間 秒
244 F4 タイマ35 出力チャンネル
245 F5 タイマ35 ON設定時間 時
246 F6 タイマ35 ON設定時間 分
247 F7 タイマ35 ON設定時間 秒
248 F8 タイマ35 OFF設定時間 時
249 F9 タイマ35 OFF設定時間 分
250 FA タイマ35 OFF設定時間 秒
251 FB *********
252 FC 1秒タイマカウント値 HI
253 FD 1秒タイマカウント値 LO
254 FE *********
255 FF *********

 

EEPROM設定内容について(上記のEEPROM割付表参照)

PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンを動作させるには、まずPIC12F683のEEPOMにEEPROM割付表の初期条件を書き込む必要があります。但し、PICにプログラム書込み後、EEPOMに設定値を書き込まない前に制御モードにした場合は、初期値(1秒カウント値=32768、初期時刻=00時00分00秒)にて今回のはタイマ動作するようにしました。

EEPROMに設定値を書き込むと、EEPROMの0番地にEEPROM設定有無のフラグを書き込み(書き込むとフラグは1)、制御モード時にEEPROMの0番地が1以外の時は、EEPOMに設定されていないと判断して、初期値(1秒カウント値=32768、初期時刻=00時00分00秒)にてタイマ動作します。

パソコンの簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンの専用プログラム設定書込ツールで、OUT3(CH3)出力有無、1秒タイマカウント値、時刻初期値、タイマ設定時間等を編集後、RS232CでPICのEEPROMに書込みます。

 

PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョン RS232C通信制御命令

制御名称(パソコン⇒PIC)

制御コマンド

応答(PIC⇒パソコン)

接続確認

O

O

PIC EEPROMデータ書込

W

(256バイトのEEPROMデータ書込後)256バイトのEEPROMデータ送信

PIC EEPROMデータ読込

R

256バイトのEEPROMデータ送信

PIC 設定モード解除

E

(PICを設定モードから制御モードに切替えます)

RS232Cの制御コマンドは、上記です。

設定モードでパソコンよりPICへ"O"コマンドが送信されると、"O"をPICからパソコンへ送信して、接続を確認します。"W"コマンドが送信されると、PICは書込みモードとなり、パソコンよりデータが送信されるのを待ち、データが送信されるとEEPROMの0番地から順にデータを255番地まで書込み、その後EEPROMの0番地から順位に255番地までデータを読取り、データを順次パソコンに送信します。"R"コマンドが送信されると、EEPROMの0番地から順位に255番地までデータを読取り、データを順次パソコンに送信します。"E"コマンドが送信されると、設定モードから抜け出して、ソフト的には制御モードとなり、制御プログラムを実行します。

 

電源投入時の設定モードと制御モードの切替は、スイッチSW1で設定、制御を切替えてIOピンのGP1をON、OFFさせてハードにて切替えます。電源ON時は、GP1を入力設定にして、GP1がON(HI)の時は、設定モードとして、EEPROMの書込み、読込が可能です。電源ON時に、GP1が0FF(LO)の時は、制御モードとして、GP1を出力に変更して、タイマ制御を開始します。

 

今回使用した時計用の水晶振動子は、不要となったおもちゃのような安価なデジタル腕時計の水晶振動子を外して使用しましたが、精度等は不明です。

時計用の水晶振動子は、周波数は主に32.768kHzが多いとの事ですが、今回使用した水晶振動子も32.768kHzでした。

タイマ0(TMR0)を使用して、256でフリーランさせると、

(4/発振周波数)×256(フリーラン)×プリスケラー値=(4/32768)×256×32=1(秒)となり、1秒毎に割り込みを発生する事が出来るので、PIC12F683 のクロック周波数として使用すれば良いのですが、32.768kHzのクロック周波数では低すぎて、RS232Cの通信速度を9600bpsにする事が出来ません。

 

PIC12F683 のクロック周波数は、内蔵クロックオシレータの最大値の8MHzを使用して、通信速度9600bpsを可能としました。

32.768kHzの水晶振動子はタイマ1(TMR1)専用の発振器として使用します。タイマ1(TMR1)を使用して、フリーランさせると、タイマ1は16ビットのタイマなので、(1/32768)×65535=1.9999694(秒)となり、約2秒毎の割り込みとなってしまいます。PIC12F683にはCCP機能があるのでCCPのコンペア機能を使用して、タイマ1の値がコンペアの設定値(CCPR1)になったらタイマ1がクリアされ割り込みがかかり、周期的に1秒の割り込みが発生するようにコンペアの設定値(CCPR1)を設定します。

(1秒/32768kHz(水晶振動子周波数))×32768(コンペア設定値)=1秒

タイマ1はフリーランさせているので、コンペア設定値(CCPR1)を32768と設定すれば正確な1秒となります。

 

時刻表示は有りませんが、RS232Cで1秒毎に時刻データを出力します。必要時にはパソコン等で時刻を確認する事が出来ます。但し、3出力(3チャンネル)にしたい場合は、設定書込み時に3出力設定にして書込み、制御モード時にスイッチSW3で出力側に切り替えて使用しますが、RS232C出力(送信)は無しの為、時刻表示は出来ません。

 

制御モードで電源ONにした時の、時刻初期値は、EEPROMの03番地から05番地の値を読込んで、この値を時刻の初期値とします。

 

プログラムタイマは、EEPROMの容量全部を使用したので、タイマ1からタイマ35までの35個のタイマがあります。

各タイマ毎に、出力チャンネルとON時間、OFF時間を設定します。タイマの設定は、パソコンの簡易プログラムタイマ(PIC12F683)水晶振動子バージョンの専用プログラム設定書込ツールで、設定します。

 

時刻(正時)修正機能を付けました。簡単に時刻を**時00分00秒(正時)に修正出来る様に、制御モード時には、GP3ピンは時刻修正入力用としました。スイッチSW2(GP3ピン)を2秒以上ONした後で、OFFにした時点で、**時00分**秒から**時29分**秒までの時は、進みすぎと解釈して**時00分00秒(正時)に時刻修正を行い、又、**時30分**秒から**時59分**秒までの時は、遅れ気味と解釈して(**+1)時00分00秒(正時)に時刻修正します。但し、SW2がONしてから2秒以上経過したかどうかの確認時間は、1秒毎の割り込みで確認しているので±1秒以内の誤差があります。

 

使用する水晶振動子の精度は不明ですが、水晶振動子周波数が32.768kHzジャストであれば良いですが、例えば±50PPMの精度とすると±0.0016kHzの誤差があるので、1秒タイマカウント値(コンペアの設定値(CCPR1))を変更する必要があります。

時刻(正時)修正機能では、時刻合わせは出来ますが、1秒の長さは変えれないので、1秒タイマカウント値(コンペアの設定値(CCPR1))を簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンの専用プログラム設定書込ツールで、設定し直すのも使いにくいので、制御モード時に変更出来るようにしました。

時刻(正時)修正機能時に、自動時刻修正機能(1秒タイマカウント値変更)を追加しました。時刻(正時)修正時に、スイッチSW2(GP3ピン)を20秒以上ONした後、OFFにすると、自動時刻修正機能がONとなり、1秒タイマカウント値を変化させます。**時00分**秒から**時29分**秒までの時は、進みすぎと解釈して1秒タイマカウント値に1加算します。又、**時30分**秒から**時59分**秒までの時は、遅れ気味と解釈して1秒タイマカウント値に1減算します。

EEPROMの252番地、253番地の1秒タイマカウント値も最新な1秒タイマカウント値に書換えます。

スイッチSW2(GP3ピン)のON時間が20秒未満の時は、自動時刻修正機能はOFFで、1秒タイマカウント値は変化なく、2秒以上の時は、時刻(正時)修正機能のみ働き、時刻を正時に合わせます。

 

以上の仕様で、PICのソフトをmikroBasic Version: 6.0.0.0で作成しました。

mikroBasicのバージョンにより下記のプログラムでは正常に動作しない場合がありました。

最初は、mikroBasic Version 7.0.0.1でコンパイルしましたが、スイッチSW1を設定モードにして電源をONにしても、制御モードで動作してしまい設定モードに切り替えが出来ませんでした。最新バージョンのmikroBasic Version 7.0.0.2でもコンパイルしましたが、今度は動作出来ませんでした。前回mikroBasic Version: 6.0.0.0を使用して製作したPIC簡易プログラムタイマ(PIC12F683)のソフトもそれぞれのバージョンでコンパイルしてみましたが、同じ様に正常に動作出来ませんでした。

よって下記のプログラムは、mikroBasic Version: 6.0.0.0では正常に動作しますが、mikroBasic Version: 7.0.0.*では正常に動作しません。

 

以下が、mikroBasicのプログラムリストです。

program PICTIMER683

'PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョン
'コンフィグ (OSC INT 8MHz, BODEN_ON、BOREN_OFF、CP_OFF、DATA_CP_OFF、PWRTE_ON、WDT_OFF、LVP_OFF、MCLRE_OFF、INTRC_OSC_NOCLKOUT)

'出力3チャンネル・・・GP1(OUT1、CH1)、GP2(OUT2、CH2)、時刻データ(RS232C)出力無効時GP0(OUT3、CH3)
'入力・・GP3(設定時RS232C用、制御時時刻修正入力用)、GP4、5(水晶振動子発振入力用)
'出力・・GP1(OUT1、CH1)、GP2(OUT2、CH2)、GP0(RS232C出力用又はOUT3、CH3用)

'mikroBasic Version: 6.0.0.0 使用

Dim rcvByte as byte        '受信データ
Dim recOk as byte          '受信データ有無
Dim RunFlg as byte         '制御モード時の実行フラグ  実行時は、RunFlg=0
Dim time1sFlg as byte      '1Sタイマーフラグ
Dim setflg as byte         '設定モードのフラグ
Dim j as integer           '繰返しの変数
Dim s as byte              '秒
Dim m as byte              '分
Dim h as byte              '時
Dim GP3port as byte        'GP3ポートの入力状態
Dim GP3portOnflg as byte   'GP3の入力のフラグ
Dim Timeset as byte        '時刻(正時)修正入力のON時間を確認するタイマセット時間
Dim Timesetflg as byte     '時刻(正時)修正有無確認のフラグ
Dim txts as string[5]      '秒の文字列
Dim txtm as string[5]      '分の文字列
Dim txth as string[5]      '時の文字列
Dim Recountsetflg as byte  '時刻(正時)修正入力時で、1秒カウント値自動修正のフラグ
Dim Eepromwriteflg as byte '1秒カウント値自動修正時、EEPROMに1秒カウント値書込み時のフラグ
Dim Countno as word        '1秒カウント値
Dim Eepromsetflg as byte   'EEPROMに設定値を書込み済みかのフラグ(1で書込み済み)
Dim OUT3flg as byte        'OUT3(CH3)を有無のフラグ(1で有)


sub procedure interrupt
     PIR1.CCP1IF = 0              'CCP1割込みフラグ
     time1sFlg=1                  '1Sタイマーフラグが1で時刻更新
    if s<59 then                  '59秒未満の時、1加算
       Inc(s)
    else                          '59秒の時
         s=0                      '秒を0に変更
         if m<59 then             '59分未満の時、1加算
            Inc(m)
         else                     '59分の時
            m=0                   '分を0に変更
            if h<23 then          '23時未満の時、1加算
               Inc(h)
            else                  '23時の時
                h=0               '時を0に変更
            end if
         end if
    end if
    
    if GP3portOnflg=1 then          'GP3入力がONした時
      if Timeset>0 then             'ON確認時間が20秒になっていない時
         Dec(Timeset)               '時間を1減算
      else                          'ON確認時間が20秒以上になったら
         Recountsetflg=1            '1秒カウント値自動修正のフラグを1
      end if
      if Timeset<18 then            'ON確認時間が2秒以上経っている時
         Timesetflg=1               '時刻(正時)修正有無確認のフラグを1
      end if
    end if
end sub

sub procedure EPromWrt                'EEPROMデータ送信処理(RS232C)
    j=0
    for j=0 to 255                    'EEPROMの0番地から255番地の
      Soft_Uart_Write(Eeprom_Read(j)) 'データを読み出して送信(RS232C)
      Delay_ms(20)                    '20ms遅延時間
    next j
end sub


'main procedure
main:
  OSCCON=%01110001       '内蔵クロックの設定8MHz(111)とシステムクロックの選択1(OSCCONの設定値使用)
  CMCON0 = %00000111     'コンパレータは使用しない
  TRISIO = %00111010     'GP0、2は出力(GP0はRS232Cの出力), GP1、3、4、5は入力(GP3はRS232Cの入力)、GP1がONの時は、設定モード
  ANSEL = %00000000      'A/Dは使用しない
  GPIO = %00000000       '出力はOFF

  setflg=0               '設定モードのフラグを0

if GPIO.1=1 then         '設定モードの時(GP1が1の時)
    setflg=1                            '設定モードのフラグを1
    Soft_UART_init(GPIO,3,0,9600,0)     'RS232C設定
   While setflg=1                       '設定モードのフラグが1の間、以下を繰り返す
      rcvByte = Soft_Uart_Read(recOk)   '受信データ待ち
      select case rcvByte               '受信データの選択
        case "O"                        '"O"の時(接続確認)
             Soft_Uart_Write("O")       '"O"を送信
             Delay_ms(50)               '50ms遅延時間
             Soft_Uart_Write(0x0D)      '"CR"を送信(改行)
        case "W"                        '"W"の時(EEPROM書込み処理)
            j=0                         'J=0にセット
            while j<=255                '受信データをEEPROMの0番地から255番地まで、データを書き込む
                 rcvByte = Soft_Uart_Read(recOk)  '受信データ待ち
                 Eeprom_Write(j, rcvByte)         '受信データをEEPROMに書き込む
                 j=j+1
            wend
            Delay_ms(100)            '100ms遅延時間
            EPromWrt                 'EEPROMデータ送信処理(RS232C)
         case "R"                    '"R"の時、EEPROMデータ送信
            EPromWrt                 'EEPROMデータ送信処理(RS232C)
         case "E"                    '"E"の時、設定解除
            setflg=0                 '設定モードのフラグを0(制御モード)
      end select
    wend
end if

if setflg=0 then            '制御モード
  GPIO = %00000000          'ポートの初期化
  TRISIO = %00111000        'GP0、1、2は出力(GP0はRS232Cの出力), GP3、4、5は入力
  T1CON=%00001011           'TMR1の設定
  CCP1CON=%00001011         'コンペアモード使用 RC2/CCP1ピンの状態は変化しない。タイマー1をリセット
  PIR1.TMR1IF = 0           'clear TMR1IF
  PIR1.CCP1IF = 0           'CCP1割込みフラグ
  TMR1H = $00               'Timer1レジスタのイニシャライズ
  TMR1L = $00
  Eepromsetflg=Eeprom_Read(00)        'EEPROMに設定値を書込み済みかをEEPROMより読み取って確認
  if Eepromsetflg=$01 then            'EEPROMに設定値が書き込まれた時
       CCPR1H=Eeprom_Read(252)        '1秒カウント値の上位桁
       CCPR1L=Eeprom_Read(253)        '1秒カウント値の下位桁
       s=Eeprom_Read(05)              '秒の初期値セット
       m=Eeprom_Read(04)              '分の初期値セット
       h=Eeprom_Read(03)              '時の初期値セット
  else                  'EEPROMに設定値が書き込まれていない時の初期値
       CCPR1H=$80       'コンペア上位設定値(基準値$8000=32768)
       CCPR1L=$00       'コンペア下位設定値
       s=0              '秒の初期値セット
       m=0              '分の初期値セット
       h=0              '時の初期値セット
  end if

  PIE1.CCP1IE = 1                'CCP1割り込み許可
  INTCON = %11000000             'グロバル割り込み許可、拡張機能割り込み許可(GIE, PEIE)

  GP3port=0                      'GP3ポートの入力状態を0にセット(時刻修正入力)
  GP3portOnflg=0                 'GP3の入力のフラグを0にセット(時刻修正入力フラグ)
  Timesetflg=0                   '時刻(正時)修正有無確認のフラグを0にセット
  Recountsetflg=0                '1秒カウント値自動修正のフラグ
  Eepromwriteflg=0               'EEPROMに1秒カウント値書込み時のフラグ

  OUT3flg=Eeprom_Read(01)            'OUT3(CH3)出力の有無のフラグ設定をEEPROMより読み込む
  if OUT3flg<>1 then                 'OUT3(CH3)出力有りで無い時
    Soft_UART_init(GPIO,3,0,9600,0)  '時刻データ用RS232C設定
  end if

  time1sFlg=0                       '1Sタイマーフラグを0
  RunFlg=0                          '制御モード時の実行フラグを0
 while RunFlg=0                     '制御モード時の実行フラグが0の間、以下を繰り返す
   if time1sFlg=1 then              '1秒経過した時(1秒更新時処理)
       time1sFlg=0                  '1秒タイマフラグを0にリセット
     if OUT3flg<>1 then              'OUT3(CH3)出力有りで無い時
        WordToStrWithZeros(s, txts)  '秒を文字列に変換
        WordToStrWithZeros(m, txtm)  '分を文字列に変換
        WordToStrWithZeros(h, txth)  '時を文字列に変換

      '時データ(**:)を送信
        Soft_Uart_Write(txth[3])
        Soft_Uart_Write(txth[4])
        Soft_Uart_Write(":")

      '分データ(**:)を送信
        Soft_Uart_Write(txtm[3])
        Soft_Uart_Write(txtm[4])
        Soft_Uart_Write(":")

      '秒データ(**CR)を送信
        Soft_Uart_Write(txts[3])
        Soft_Uart_Write(txts[4])
        Soft_Uart_Write(0x0d)
      end if

      for j=6 to 244 step 7       'ON,OFFタイマ設定時間処理(タイマbP〜35)
           if (h=Eeprom_Read(j+1)) and (m=Eeprom_Read(j+2)) and (s=Eeprom_Read(j+3)) then  '時刻データとON時間の設定値(EEPROMのデータ)が同一時
               select case  Eeprom_Read(j)         '出力チャンネルの設定値(EEPROMデータ)が
                      case 1                       '1の時、チャンネル1出力をON
                         GPIO.1=1
                      case 2                       '2の時、チャンネル2出力をON
                         GPIO.2=1
                      case 3                       '3の時、チャンネル3出力をON
                         GPIO.0=1
               end select
           end if
           if (h=Eeprom_Read(j+4)) and (m=Eeprom_Read(j+5)) and (s=Eeprom_Read(j+6)) then  '時刻データとOFF時間の設定値(EEPROMのデータ)が同一時
               select case  Eeprom_Read(j)         '出力チャンネルの設定値(EEPROMデータ)が
                      case 1                       '1の時、チャンネル1出力をOFF
                         GPIO.1=0
                      case 2                       '2の時、チャンネル2出力をOFF
                         GPIO.2=0
                      case 3                       '3の時、チャンネル3出力をOFF
                         GPIO.0=0
               end select
           end if
      next j

      if Eepromwriteflg=1 then         'EEPROMに1秒カウント値書込み時のフラグが1の時
           Eeprom_Write(252,CCPR1H)    'EEPROMに1秒カウント値の上位1バイトを書き込む
           Eeprom_Write(253,CCPR1L)    'EEPROMに1秒カウント値の下位1バイトを書き込む
           Eepromwriteflg=0            'EEPROMに1秒カウント値書込み時のフラグを0
      end if
   end if

    if GPIO.3<>GP3port then            '時刻(正時)修正入力が変化した時
       if GPIO.3=1 then                '時刻(正時)修正入力がONの時
          GP3port=1                    'GP3ポートの入力状態のフラグを1
          GP3portOnflg=1               'GP3ポートのONフラグを1
          Timeset=20                   '20秒タイマのセット時間
          Timesetflg=0                 '時刻(正時)修正有無確認のフラグを0
       else                            '時刻(正時)修正入力がOFFの時
          GP3port=0                    'GP3ポートの入力状態のフラグを0
          GP3portOnflg=0               'GP3ポートのONフラグを0
          if Recountsetflg=1 then      'GP3が20秒以上ONの時
              Recountsetflg=0          '1秒カウント値自動修正のフラグを0
              Countno=(Eeprom_Read(252)*$100 + Eeprom_Read(253)) '1秒カウント値の修正
              if m<=29 then             '29分以内の時(進んでいる時)
                 Inc(Countno)           '1秒カウント値に1加算
              end if
              if m>=30 then             '30分以上の時(遅れる時)
                 Dec(Countno)           '1秒カウント値に1減算
              end if
               CCPR1H=Hi(Countno)       'コンペアの上位設定値変更(1秒カウント値の上位値を入力)
               CCPR1L=Lo(Countno)       'コンペアの下位設定値変更(1秒カウント値の下位値を入力)
               Eepromwriteflg=1         'EEPROMに1秒カウント値書込み時のフラグを1
          end if
          if Timesetflg=1 then          'GP3が2秒以上ONの時、時刻(正時)修正
              Timesetflg=0              '時刻(正時)修正有無確認のフラグを0
             if m<=29 then              '29分以下の時(進んでいる時)
                h=h-1                   '時は1減算
             end if
              m=59                      '分、秒は59
              s=59
              TMR1H =CCPR1H             'Timer1レジスタの値をCCPの設定値にして割り込みを発生
              TMR1L =CCPR1L
          end if
      end if
    end if
 wend

end if
end.

 

PICには、PICライターで、フリーの書き込みソフト”WinPic”を使用して、PIC簡易プログラムタイマ(PIC12F683) HEXファイルを書き込みました。

 

 

このページのTOPへ

 


 

◎簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込みツール(Windowsパソコン用)

 

 簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込ツール(実行ファイル、lzhで圧縮)

 

 

 

     簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込みツール

 

PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンのPICのEEPROMに1秒タイマカウント値、時刻初期値、タイマ設定値等を書込む為に使用するWindowsパソコン用設定書込ツールです。又、PIC簡易プログラムタイマ時刻とパソコン時刻の表示モニタとして使用する事が出来ます。時刻データをテキストファイルに保存する事が出来ます。

VB.NET 2003にて作成していますので、起動しない時は、Microsoftより.NET Framework Version 1.1 再頒布可能パッケージおよび.NET Framework Version 1.1 LanguagePackをダウンロードしてインストールして下さい。

シリアルポート制御モジュールは、アクティブセルさんのフリーソフト EasyComm.NETを使用させて頂きました。

簡易プログラムタイマPIC12F683水晶振動子バージョン 設定・書込みツール.exeを起動すると、同じフォルダ内にTIMER(PIC12F683)-Set.xmlファイルが出来ますが、通信ポートやタイマカウント値の設定内容を保存する保存ファイルです。削除しても良いですが、ファイルが無い時は、デフォルト値で開きます。

 

 

●簡易プルグラムタイマ PIC12F683 水晶振動子バージョン 設定・書込ツール説明

 この設定書込ツール画面上で、タイマの1秒タイマカウント値、タイマ時刻初期値、タイマ設定値他の設定値を設定します。設定値は保存ボタンでテキストファイルに保存されます。保存したテキストファイルを読込ボタンで読込むことにより、設定値を再度画面表示し編集する事が出来ます。設定書込ボタンで、PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンのPICのEEPROMに設定値データを書込みます。又、設定読込ボタンでPICよりEEPROMの設定値を読込みます。

設定書込み後は、PIC簡易プログラムタイマの時刻及びパソコンの時刻を、リアルタイムで表示して、時刻データをテキストファイルに保存する表示モニタとして使用します。

タイマbPからタイマ35までのタイマ設定のON時間、OFF時間を設定しない時(切替えしない時)は、現実に有り得ない時間を設定すればON、OFFの切替えはしないので、現実に有り得ない時間を設定します。デフォルト値は、25:00:00としましたが、他の時間でも可能です。

ON時間のみ設定して、OFF時間はデフォルト値のままの時は、ONに切替え後は、OFFの時間にはならないのでいつまでもON状態のままとなります。

 

PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンに設定値データを書込む時は、電源をONする前に、PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンのスイッチSW1を設定側にしてから、電源をONにして下さい。(スイッチSW3も通信側に設定して下さい。)スイッチSW1が設定側の時は、設定モードとなりPICと通信接続が可能となります。スイッチSW1が設定側になっているかの確認は電源立ち上げ時のみ確認しているだけなので、電源立ち上げで設定モードになった後は、スイッチSW1を制御側に切替えても設定モードのままです。設定モードでPIC書込み後、設定解除ボタンを押すと、ソフト的には制御状態となり、制御プログラムを実行します。スイッチSW1を制御側に切替え後、設定解除ボタンを押すとハード側もソフト側も制御モードとなります。スイッチSW1を制御側にして、電源をONにすると制御モードで立ち上がり、直ちにタイマプログラムを実行して、時刻初期値から時刻をカウントして、1秒毎に時刻データを出力します。3出力(3チャンネル)設定にしたい場合は、設定書込み時にスイッチSW3を通信側にして、3出力設定にして書込み、制御モード時にスイッチSW3を出力側に切り替えて使用しますが、但し、RS232C出力(送信)は無しの為、時刻表示は出来ません。

[注意]設定モードでPIC書込み後、設定解除ボタンで制御モードにして、スイッチSW1を制御側に切替えても、IOが切替え時の状態を保持していますので、1度電源をOFFにしてから、電源をONにして制御プログラムを実行した方が確実です。

 

以下は、簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込ツール画面のボタン操作等の説明です。

  ・OUT3(CH3)出力設定

OUT3(CH3)出力設定有 時刻(RS232C)出力無OUT3(CH3)出力設定有にチェックを入れた場合は、OUT3(CH3)出力設定有 時刻(RS232C)出力無が有効となります。

  ・時刻カウント値

1秒タイマカウント値:1秒タイマカウント値の値で1秒をカウントします。

           コンペア設定値 標準値=32768(水晶振動子=32.768kHzの時、コンペア設定値=32768)

          (1秒/32768kHz(水晶振動子周波数))×32768(コンペア設定値)=1秒

  ・タイマ初期時刻設定

時 分 秒:電源ONで制御モード立ち上がり時の、初期時刻を設定します。

 ・終了ボタン:簡易プログラムタイマPIC12F683 水晶振動子バージョン 設定・書込ツールソフトを終了します。

通信ポート、タイマカウント値設定等の1部の設定値をTIMER(PIC12F683)-Set.xmlファイルに保存します。

 ・時刻

パソコン時刻:パソコンの内蔵時計の時刻を表示します。

表示ONボタンでパソコン時刻を表示更新します。

表示OFFボタンでパソコン時刻の表示更新を中止します。

タイマ時刻:PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンのRS232Cの時刻出力を表示し、パソコン時刻も表示更新します。

表示ONボタンでPIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンと通信して、RS232Cの時刻出力を受信して、表示更新します。

表示OFFボタンでPIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンとの通信を中止して、タイマ時刻及びパソコン時刻表示更新を中止します。

受信時刻データ保存:受信時刻データ保存にチェックを入れた時は、PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンの受信時刻データを保存します。

このプログラムソフトと同じフォルダ内のPIC時間データ.txtとして保存します。

 ・保存ファイル

読込ボタン:保存されたPICタイマ設定ファイルを読込みます。

保存ボタン:設定された設定値をファイルに保存します。  

  ・タイマ設定

オールクリアボタン:タイマ1〜タイマ35までのタイマ設定値をデフォルト値に変更します。

コピーボタン:コピー元のタイマ設定値をコピー先のタイマ設定値にコピーします。コピー先のタイマは、タイマ範囲を選択出来ます。

  ・PIC通信

通信ポート通信ポートを設定します。COM1からCOM16まで設定出来ます。

通信停止表示:休止中は通信停止表示します。設定書込、設定読込、PIC解除時、及びタイマ時刻表示ON時は、通信中表示となります。

設定書込:簡易プログラムタイマPIC12F683 水晶振動子バージョン 設定・書込ツールで設定されている設定値を、PICのEEPROMに書込みます。

設定読込:PICのEEPROMの設定データを読込んで、簡易プログラムタイマPIC12F683 水晶振動子バージョン 設定・書込ツールに表示します。

PIC解除:設定モードを解除して、制御モードに切替えます。ソフト的に切替えますが、ハード的には スイッチSW1を切替えて下さい。

       先にスイッチSW1を切替えて下さい。      

 タイマ設定(プログラムタイマ設定)

タイマ1からタイマ35まで、出力チャンネル、ON、OFF時間を設定します。

チャンネル出力:CH1からCH3までの3出力チャンネルの内、1出力チャンネルを選択します。

ON時間:選択した出力チャンネルをON出力する時間を設定します。

OFF時間:選択した出力チャンネルをOFF出力する時間を設定します。

タイマbPからタイマ35までのタイマ設定のON時間、OFF時間を設定しない時(切替えしない時)は、現実に有り得ない時間を設定すればON、OFFの切替えはしないので、現実に有り得ない時間を設定します。デフォルト値は、25:00:00としましたが、他の時間でも可能です。

ON時間のみ設定して、OFF時間はデフォルト値のままの時は、ONに切替え後は、OFFの時間にはならないのでいつまでもON状態のままとなります。

 

 

このページのTOPへ

 


 

◎PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンの時刻調整方法 

PICにPIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンのソフトを書込み後は、PICのEEPROMにタイマカウント値等のタイマ設定値を書込みます。

簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込ツールを開きます。

簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込ツールの1秒タイマカウント値を入力して、PICタイマの電源ON時のタイマの初期時刻を設定します。PICタイマの時刻データを保存したい場合は、受信時刻データ保存のチェックを入りにします。タイマ設定が必要の時は設定します。この設定画面を保存する時は、保存ボタンを押してファイル保存します。通信ポートをパソコンのCOMポートbノします。PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンのスイッチSW1を設定側にして、スイッチSW3を通信側にして、電源を入れます。設定書込みボタンを押して、PICのEEPROMに1秒タイマカウント値等のタイマ設定値を書込みます。書込み後、1度PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンの電源をOFFにして、スイッチSW1を制御側に設定します。パソコン時刻の表示ONボタンでパソコン時刻を表示させて、パソコン時刻がタイマの初期時刻になった時に、PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンの電源をONすると、タイマの初期時刻から始まります。タイマ時刻の表示ONボタンを押すと通信中となり、PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンの時刻データを受信して、タイマ時刻に表示されます。この時パソコン時刻も更新されます。受信時刻データ保存有りの時は、テキストファイルにデータ保存されます。この簡易プログラムタイマ PIC12F683 水晶振動子バージョン 設定・書込ツールで時間の経過状況を確認します。時間が早い時は割込み時間(1秒タイマカウント値)を大きくして、遅れる時は割込み時間(1秒タイマカウント値)を小さく設定します。

 

1秒タイマカウント値は、正時になった時に、PIC簡易プログラムタイマ(PIC12F683) 水晶振動子バージョンのGP3ピンの時刻(正時)修正入力を20秒以上ONする事により、自動時刻修正機能が働いて、プログラムタイマ単体で時間の進み具合を確認して下記の条件で1秒タイマカウント値を自動修正します。

**時00分**秒から**時29分**秒までの時は、進みすぎと解釈して1秒タイマカウント値に1加算します。又、**時30分**秒から**時59分**秒までの時は、遅れ気味と解釈して1秒タイマカウント値に1減算します。

日々の時刻修正は、正時になった時に、GP3ピンの時刻(正時)修正入力を2秒以上ONする事により正時に合わせます。

 

 

このページのTOPへ         

 


 


☆まとめ

PIC簡易プログラムタイマ(PIC12F683)水晶振動子バージョンは、水晶振動子を使用したので、前回製作したPIC簡易プログラムタイマ(PIC12F683)の内部クロックタイプに比べて格段に誤差が小さくなりました。

1秒タイマカウント値を標準値の32768で設定した時は遅れが大きかったので、1秒タイマカウント値を32767で設定して、14日間での経過をチェックしてみました。14日間で10秒の遅れが発生しました。1日当たり0.71秒の遅れでした。

秒まで正確に測定出来る精度の良い時計は持てなく、パソコンの時計機能も余り正確ではないようなので、PIC簡易プログラムタイマの時刻を定期的にチェックする前に、まずパソコンの時計をNTPサーバで時刻調整してからチェックしました。

 

水晶振動子の発振周波数は回路に接続する負荷容量(コンデンサ)の容量によって変化し、配線パターンや周辺部品の寄生容量の影響を大きく受けるとなっています。

 

水晶振動子の発振回路のコンデンサC10、C11は普通のセラミックコンデンサを使用したので、温度補償型コンデンサにすれば温度影響が小さくなります。今回コンデンサC10、C11に33PFを使用しましたが、PIC12F683のデータシートには、タイマ1の32kHzのコンデンサ容量が記載されていなかったので、16F88、16F877Aのデータシートに33PFと記載されていたので、それと同じ値にしましたが、適切であるかどうかは定かではありません。

 

発振周波数が、32.768kHzでない時に、1秒タイマカウント値32768でカウントした場合の1日の誤差は、下記となります。

  32.767kHzの時(約-31PPM)   1/(32767-32768)×32768×24×3600≒2.64秒(遅れる)

  32.769kHzの時(約31PPM)     1/(32769-32768)×32768×24×3600≒-2.64秒(進む)

 

例えば32.767kHzとか、小数点3桁ジャストであれば1秒タイマカウント値を同じ値にすれば合わせられてジャスト1秒となりますが、小数点4桁となると1秒タイマカウント値では合わせられなくて誤差が発生します。小数点4桁までとした場合、小数点4桁目が5の時が1番誤差が大きくなり1日で最大2.6/2=約1.3秒の誤差となります。(発振周波数が一定の場合)

今回のソフトでは0.001kHz(1Hz)未満の値は調整出来ないので、周波数の値によっては、1日で最大で約1.3秒位(月差約40秒)の誤差が発生する場合があります。

この他に温度変化による発振周波数の変化もあるので誤差はもっと大きくなると思います。

 

精度をもう少し良くするには、水晶振動子の発振回路のコンデンサC10、C11の値を変えたり、C10、C11のコンデンサの1つをトリマコンデンサにして周波数を調整するハードによる方法と、前回製作したPIC簡易プログラムタイマ(PIC12F683)と同じ方法で、一定間隔で1秒タイマカウント値を変えて調整出来る機能を追加して、細かく調整出来るようにするソフトによる方法があります。周波数カウンタを使用することが出来るのであれば、周波数を32.768kHzにぴったり合わせるのが一番簡単ですね。

 

 

HOMEへ    このページのTOPへ