PIC簡易プログラムタイマ(PIC12F683)  HOMEへ

☆はじめに

☆仕様・製作

PIC簡易プログラムタイマ(PIC12F683)ハード

PIC簡易プログラムタイマ(PIC12F683)ソフト

◎簡易プログラムタイマ PIC12F683 設定・書込みツール(Windowsパソコン用)

◎PIC簡易プログラムタイマ(PIC12F683)の時刻調整方法 

☆まとめ

 

 

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

 


☆はじめに

先回製作したPICミニミニ簡易プログラマブルコントローラ(PLC)(PIC12F683)のハードを利用して、簡易プログラムタイマを作ってみました。

設定した時間に出力をON、OFFするプログラムタイマで、出力は3出力(3チャンネル)で、最大35個のタイマ設定が出来ます。時刻表示は無しですが、RS232C出力を使用してパソコン等で時刻を表示する事が出来ます。タイマに使用するクロック発振回路には、水晶振動子等を使用しないと精度が出ませんが、今回はPICミニミニ簡易プログラマブルコントローラ(PLC)(PIC12F683)のハードをそのまま使用するので、水晶振動子ではなくPIC内部のRC発振回路を使用します。RC発振回路を使用している為、発振周波数は温度により大きく変化するので、時刻精度は非常に悪いです。どれ位の精度になるのか試しに作ってみました。1日の温度変化が少なく、設定が温度に合った時は10秒前後/日の時も有りますが、誤差が積算されるし、温度変動も有るので、数分/日の誤差があっても問題ないような精度の必要の無い簡易的なタイマ用途にしか使用出来ません。

下記の簡易プログラムタイマ PIC12F683 設定・書込みツールで、設定、書込み、時刻表示を行います。

簡易プログラムタイマ PIC12F683 設定・書込みツール


☆仕様・製作

◎PIC簡易プログラムタイマ(PIC12F683)ハード

PICミニミニ簡易プログラマブルコントローラ(PLC)(PIC12F683)のハード使用の時

PIC簡易プログラムタイマ専用ボード使用の時

 

PICミニミニ簡易プログラマブルコントローラ(PLC)(PIC12F683) 入出力ハードを使用します。GP0がRS232Cの送信用、GP3がRS232Cの受信用専用で、GP4が時刻(正時)修正入力、GP1、GP2、GP5がタイマ設定出力で、入力2、出力4の設定となります。よってJMP1、JMP2のスイッチはON(出力側)の設定です。時刻データをRS232Cで常時出力するので、スイッチSW2は常時設定側に設定します。

 

新たにPIC簡易プログラムタイマ用としてハードを製作する時は、上記のPIC簡易プログラムタイマ専用ボードの回路で製作した方が良いでしょう。

 

 

PIC簡易プログラムタイマ(PIC12F683)

(PICミニミニ簡易プログラマブルコントローラ(PLC)(PIC12F683) 入出力ハード使用時)

 

 

このページのTOPへ

 


 

◎PIC簡易プログラムタイマ(PIC12F683)ソフト

PIC簡易プログラムタイマ(PIC12F683) HEXファイル    (lzhで圧縮)

 

 

PIC簡易プログラムタイマ(PIC12F683) IOピン割付

入力2ピン 出力4ピン
GP3(RS232C受信用)、GP4(時刻(正時)修正入力用) GP0(RS232C送信用)、 GP1(CH1)、GP2(CH2)、GP5(CH3) (タイマ設定出力3)

 

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

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

 

 

PIC簡易プログラムタイマ(PIC12F683) EEPROM割付

EEPROM番地

割付内容
10進数 16進数
0 00 時刻修正有無(0で時刻修正無、1で時刻修正有)
1 01 ハードタイマの設定値 (基準値:4  カウント値252=256-4)
2 02 ソフトタイマのカウント値 (1秒タイマのカウント値)
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バイト
253 FD 時刻修正のインターバル値の下位1バイト
254 FE *********
255 FF *********

 

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

PIC簡易プログラムタイマ(PIC12F683)を動作させるには、まずPIC12F683のEEPOMにEEPROM割付表の初期条件を書き込む必要があります。

パソコンの簡易プログラムタイマ(PIC12F683)の専用プログラム設定書込ツールで、ハードタイマカウント値、ソフトタイマカウント値、時刻初期値、タイマ設定時間等を編集後、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の制御コマンドは、上記です。

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

 

PIC12F683 の内蔵クロックオシレータは最大値の8MHzを使用します。RS232Cの通信速度は9600bps固定です。

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

 

時計としては、水晶発振回路を使用するのが精度良く出来ますが、今回はPIC内部のRC発振回路を使用して、1秒毎の割込みにより、時間を更新します。

タイマ0(TMR0)を使用しますが、本来は256でフリーランさせるのが、時間が一定で良いのですが、

割込み時間(1秒)=(4/発振周波数)×256(フリーラン)×プリスケラー値×ソフトタイマカウント値

発振周波数=8MHzでは、上の計算式では割込み時間が、1秒ジャストにはならなく、誤差が出来てしまいます。又、データシートでは、発振周波数は工場での校正値は、±1%以内となっているので、フリーランで動かしても、さらに1秒の誤差が大きくなる可能性も有り、一定時間内で定期的にソフトカウント値を替えて誤差を修正する必要があります。フリーランですとソフトカウント値しか替える事が出来ないので、1秒に出来るだけ割込み時間が近くなるようにする為、フリーランではなく、ハードタイマカウント値とソフトタイマカウント値の組合せで調整するようにしました。周波数カウンタもオシロスコープも無く、テスタしか持っていないので、周波数を測定することは出来ません。温度等による周波数の変化もどれ位か判らないので、現物合わせで調整する必要が有ります。

割込み時間(1秒)=(4/発振周波数)×ハードタイマカウント値×256(プリスケラー値)×ソフトタイマカウント値

ハードタイマカウント値及びソフトタイマカウント値は、PIC簡易プログラムタイマを動作させて、時間の精度が良くなるような値を作成後調整する必要があります。作成後調整して見ましたが、ハードタイマカウント値及びソフトタイマカウント値の組合せだけでは、1秒ジャストにはならない様で、時間が長くなると誤差が積算され、時間のずれが大きくなるので、さらに細かく調整する必要がありました。 一定の間隔で、ソフトタイマカウント値を変更してこの時に誤差分を修正するように、時刻修正機能を追加して、インターバル値とカウント値で誤差修正するように追加しました。(4年に1回、誤差を閏年で調整しているのと同じ考え方です。)

1秒になるハードタイマカウント値及びソフトタイマカウント値の組合せの最適値を決め、時間が進む場合は、インターバル値(秒)に1回、ソフトカウント値をカウント値(基本は、ソフトタイマカウント値+1)に替えてカウント数を多くして、1秒を長くします。遅れる場合は、インターバル値(秒)に1回、ソフトカウント値をカウント値(基本は、ソフトタイマカウント値−1)に替えてカウント数を少なくして、1秒を短くします。

インターバル値は、2バイト命令にしたので、設定は0〜65535秒までです。

 

時刻表示は有りませんが、RS232Cで1秒毎に時刻データを出力します。必要時にはパソコン等で時刻を確認する事が出来ます。

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

時計精度が悪く、頻繁に時刻合わせが必要ですので、時刻(正時)修正機能を付けました。簡単に時刻を**時00分00秒(正時)に修正出来る様に、GP4ピンを時刻修正入力用としました。GP4ピンを2秒以上ONした後で、OFFにした時点で、**時00分**秒から**時29分**秒までの時は、進みすぎと解釈して**時00分00秒(正時)に時刻修正を行い、又、**時30分**秒から**時59分**秒までの時は、遅れ気味と解釈して(**+1)時00分00秒(正時)に時刻修正します。

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

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

ハードタイマカウント値252の設定の時、(4/8,000,000)×256×252=0.032256秒毎に割込みが入りますが、RS232Cの時刻データの送信には時間がかかり、タイミングによっては割込みが入る事があり、正常なデータでない時が有ったので、割込み回数により、時、分、秒のデータに分割して送信します。他の処理も分割して時間に余裕が持てるように処理しました。

 

時刻(正時)修正機能では、時刻合わせは出来ますが、気温等の季節変化に対しての時間変化が修正出来ないので(1秒の長さが変化するので)、長期に対しては、時間誤差が大きくなります。簡易プログラムタイマ(PIC12F683)の専用プログラム設定書込ツールで、頻繁に設定し直すのも使いにくいです。

時刻(正時)修正機能時に、自動時刻修正機能を追加しました。時刻(正時)修正時に、GP4ピンを10秒以上ONした後、OFFにすると、自動時刻修正機能がONとなり、インターバル値を1秒変化させます。カウント値がソフトカウント値より小さい場合は、**時00分**秒から**時29分**秒までの時は、進みすぎと解釈してインターバル値に1加算します。又、**時30分**秒から**時59分**秒までの時は、遅れ気味と解釈してインターバル値に1減算します。カウント値がソフトカウント値より大きい場合は、**時00分**秒から**時29分**秒までの時は、進みすぎと解釈してインターバル値に1減算します。又、**時30分**秒から**時59分**秒までの時は、遅れ気味と解釈してインターバル値に1加算します。

EEPROMの252番地、253番地のインターバル値も最新なインターバル値に書換えます。

但し、インターバル値が0秒になった時は1減算しません、又、65535秒になった時は1加算しなく、そのままとなります。

時刻(正時)修正を定期的に行えば、最適な値に近づきある程度の範囲まで誤差を小さく出来ます。それ以上は、ある期間の気温変化量により遅れたり進んだりして、積算の誤差となります。GP4ピンのON時間が10秒未満の時は、自動時刻修正機能はOFFで、カウント値は変化なく、

時刻(正時)修正機能のみ働き、時刻を正時に合わせます。

 

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

 

以下が、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,2,5)(OUT2,3,4)
'入力・・GP3(RS232C用)、GP4(時刻修正入力用、IN2)  出力・・GP0(RS232C用)、GP1、GP2、GP5

Dim rcvByte as byte        '受信データ
Dim recOk as byte          '受信データ有無
Dim tone as byte           'ハードタイマの設定値(基準値:4  カウント値256-4=252)
Dim secount as byte        'ソフトタイマのカウント値 1秒カウント値 (基準値:30)
Dim RunFlg as byte         '制御モード時の実行フラグ  実行時は、RunFlg=0
Dim time1sFlg as byte      '1Sタイマーフラグ
Dim time1s as word         '1Sタイマーのカウンタ
Dim setflg as byte         '設定モードのフラグ
Dim j as integer           '繰返しの変数
Dim s as byte              '秒
Dim m as byte              '分
Dim h as byte              '時
Dim hflag as byte          '時のフラグ(フラグ0の時、時を送信)
Dim mflag as byte          '分のフラグ(フラグ0の時、分を送信)
Dim sflag as byte          '秒のフラグ(フラグ0の時、秒を送信)
Dim GP4port as byte        'GP4ポートの入力状態
Dim GP4portOnflg as byte   'GP4の入力のフラグ
Dim Timeset as word        '時刻(正時)修正入力のON時間を確認するタイマセット時間
Dim Timesetflg as byte     '時刻(正時)修正有無確認のフラグ
Dim Revisitimesetflg as byte  '時刻(正時)修正入力時で、インターバル値自動修正有無確認のフラグ
Dim txts as string[5]      '秒の文字列
Dim txtm as string[5]      '分の文字列
Dim txth as string[5]      '時の文字列
Dim revisiononflg as byte  '時刻修正有りのフラグ
Dim revisecount as byte    '時刻修正のソウトタイマのカウント値
Dim interval as word       '時刻修正インターバル値
Dim intervaltime as word   '時刻修正インターバルタイマ
Dim Eepromwriteflg as byte 'インターバル値自動修正時、EEPROMにインターバル値書込み時のフラグ
Dim intervalLow as byte    'インターバル値の下位1バイト値
Dim intervalUper as byte   'インターバル値の上位1バイト値


sub procedure interrupt    'タイマー割込み(0.5us×256(プリスケラ)×カウント値(256-tone)
 TMR0 = tone               'TMR0 のカウントを再セットします
 INTCON.T0IF = 0           '割込みフラグをクリア
 if time1s > 0 then        'time1s > 0 の時(1秒にならない時)、1減算
    Dec(time1s)
 else                      'time1s=0の時(1秒になった時)
    time1sFlg=1            '1Sタイマーフラグを1
    time1s=secount         '1Sタイマーのカウンタにソフトタイマのカウント値をセット

    if revisiononflg=1 then       '時刻修正有りの時
       if intervaltime > 0 then   '時刻修正インターバルタイマが0でない時、1減算
          Dec(intervaltime)
       else                       '時刻修正インターバルタイマが0の時
          intervaltime=interval   '時刻修正インターバルタイマに時刻修正インターバル値をセット
          time1s=revisecount      '時刻修正のソウトタイマのカウント値をセット
       end if
    end if
                                  '時刻更新処理
    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
 end if
                                  '時刻(正時)修正入力がONした時のON時間カウント処理
 if GP4portOnflg=1 then           'GP4入力がONした時
    if Timeset>0 then             'ON確認時間が10秒になっていない時
       Dec(Timeset)               '時間を1減算
       if Timeset<(secount*8) then 'ON確認時間が2秒以上経っている時
          Timesetflg=1             '時刻(正時)修正有無確認のフラグを1
       end if
    else                          'ON確認時間が10秒以上になったら
       Revisitimesetflg=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 = %00011010     'GP0、2,5は出力(GP0はRS232Cの出力), GP1、3,4、は入力(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            '制御モード
  TRISIO = %00011000        'GP0、1、2、5は出力(GP0はRS232Cの出力), GP3,4、は入力(GP3はRS232Cの入力)
                            'TMR0割込みを許可
  OPTION_REG = %10000111    'GPIOプルアップルはしない。プリスケーラ割り当てビット,プリスケーラはTMR0へ割り当て プリスケーラレート選択TMR0 256 SET
  INTCON = $A0              'グローバル割込み許可、TMRO割込み許可

  GPIO = %00000000          '出力はOFF

   revisiononflg=Eeprom_Read(00) '時刻修正有りのフラグ(1の時、時刻修正有り)
  tone=Eeprom_Read(01)           'ハードタイマの設定値(基準値:4   カウント値256-4=252)
  secount=Eeprom_Read(02)        'ソフトタイマのカウント値 1秒タイマのカウント値(基準値:30)
  s=Eeprom_Read(05)              '秒の初期値セット
  m=Eeprom_Read(04)              '分の初期値セット
  h=Eeprom_Read(03)              '時の初期値セット
   
  revisecount=Eeprom_Read(251)   '時刻修正のソウトタイマのカウント値セット
  interval=(Eeprom_Read(252)*$100 + Eeprom_Read(253))   '時刻修正インターバル値セット  interval=1000=$03E8=$03*$100+$E8) ($100=256)

  intervaltime=interval          '時刻修正インターバルタイマセット
  time1s=secount                 '1秒タイマのソフトカウント値セット

  GP4port=0                      'GP4ポートの入力状態を0にセット(時刻修正入力)
  GP4portOnflg=0                 'GP4の入力のフラグを0にセット(時刻修正入力フラグ)
  Timesetflg=0                   '時刻(正時)修正有無確認のフラグを0にセット
  Revisitimesetflg=0             'インターバル値自動修正有無確認のフラグを0にセット

  Soft_UART_init(GPIO,3,0,9600,0)   'RS232C設定

  RunFlg=0                          '制御モード時の実行フラグを0
 while RunFlg=0                     '制御モード時の実行フラグが0の間、以下を繰り返す

    if time1sFlg=1 then             '1秒経過した時(1秒更新時処理)
       time1sFlg=0                  '1秒タイマフラグを0にリセット

       WordToStrWithZeros(s, txts)  '秒を文字列に変換
       WordToStrWithZeros(m, txtm)  '分を文字列に変換
       WordToStrWithZeros(h, txth)  '時を文字列に変換

      hflag=0                       '時のデータ送信フラグを0(1で送信済み)
      mflag=0                       '分のデータ送信フラグを0(1で送信済み)
      sflag=0                       '秒のデータ送信フラグを0(1で送信済み)
    end if

    Select case time1s              '1秒タイマのカウント値が
      case (secount-1)              '(ソフトカウント値-1)の値の時
         if hflag=0 then            '未送信の時、時データ(**:)を送信
            Soft_Uart_Write(txth[3])
            Soft_Uart_Write(txth[4])
            Soft_Uart_Write(":")
            hflag=1                 '時のデータ送信フラグを1(送信済み)
         end if
      case (secount-2)              '(ソフトカウント値-2)の値の時
        if mflag =0 then           '未送信の時、分データ(**:)を送信
            Soft_Uart_Write(txtm[3])
            Soft_Uart_Write(txtm[4])
            Soft_Uart_Write(":")
            mflag=1                  '分のデータ送信フラグを1(送信済み)
        END IF
      case (secount-3)              '(ソフトカウント値-3)の値の時
         if sflag=0 then            '未送信の時、秒データ(**CR)を送信
            Soft_Uart_Write(txts[3])
            Soft_Uart_Write(txts[4])
            Soft_Uart_Write(0x0d)
            sflag=1                 '秒のデータ送信フラグを1(送信済み)
         end if
      case (secount-4)              '(ソフトカウント値-4)の値の時
        for j=6 to 125 step 7       'ON,OFFタイマ設定時間処理前半(タイマbP〜18)
            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.5=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.5=0
               end select
            end if
        next j
      case (secount-5)               '(ソフトカウント値-5)の値の時
        for j=132 to 244 step 7      'ON,OFFタイマ設定時間処理後半(タイマ19〜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.5=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.5=0
               end select
            end if
        next j
      case (secount-6)                       'インターバル値自動修正時の変更インターバル値のEEPROM書込み処理
        if Eepromwriteflg=1 then             'EEPROMにインターバル値書込み時のフラグが1の時
           intervalUper=Hi(interval)         'インターバル値の上位1バイトを取得
           intervalLow=Lo(interval)          'インターバル値の下位1バイトを取得
           Eeprom_Write(252,intervalUper)    'EEPROMにインターバル値の上位1バイトを書き込む
           Eeprom_Write(253, intervalLow)    'EEPROMにインターバル値の下位1バイトを書き込む
           Eepromwriteflg=0                  'EEPROMにインターバル値書込み時のフラグを0
        end if
    end select

    if GPIO.4<>GP4port then         '時刻(正時)修正入力が変化した時
       if GPIO.4=1 then             '時刻(正時)修正入力がONの時
          GP4port=1                 'GP4ポートの入力状態のフラグを1
          GP4portOnflg=1            'GP4ポートのONフラグを1
          Timeset=secount*10        '10秒タイマのセット時間
          Timesetflg=0              '時刻(正時)修正有無確認のフラグを0
          Revisitimesetflg=0        'インターバル値自動修正有無確認のフラグを0
       else                         '時刻(正時)修正入力がOFFの時
          GP4port=0                 'GP4ポートの入力状態のフラグを0
          GP4portOnflg=0            'GP4ポートのONフラグを0
          if Revisitimesetflg=1 then           'GP4が10秒以上ONの時、インターバル値を修正
              if m<=29 then                    '29分以内の時(進んでいる時)
                  if revisecount<secount then  '時刻修正のソウトタイマのカウント値がソウトタイマのカウント値より小さい時
                     if interval<$FFFF then    'インターバル値がFFFFより小さい時
                       interval=Inc(interval)  'インターバル値に1加算
                     end if
                  end if
                  if revisecount>secount then  '時刻修正のソウトタイマのカウント値がソウトタイマのカウント値より大きい時
                     if interval>0 then        'インターバル値が0より大きい時
                       interval= Dec(interval) 'インターバル値に1減算
                     end if
                  end if
              end if
              if m>=30 then                    '30分以上の時(遅れる時)
                 if revisecount<secount then   '時刻修正のソウトタイマのカウント値がソウトタイマのカウント値より小さい時
                     if interval>0 then        'インターバル値が0より大きい時
                       interval=Dec(interval)  'インターバル値に1減算
                     end if
                  end if
                  if revisecount>secount then  '時刻修正のソウトタイマのカウント値がソウトタイマのカウント値より大きい時
                     if interval<$FFFF then    'インターバル値がFFFFより小さい時
                       interval=Inc(interval)  'インターバル値に1加算
                     end if
                  end if
               end if
              Eepromwriteflg=1                 'EEPROMにインターバル値書込み時のフラグを1
          end if
          if Timesetflg=1 then      'GP4が2秒以上ONの時、時刻(正時)修正
             if m<=29 then          '29分以内の時(進んでいる時)
                m=59                '分、秒は59
                s=59
                h=h-1               '時は現在の時間にする為、1減算
                time1s=0            '1秒タイマのカウントを0
             end if
             if m>=30 then          '30分以上の時
                m=59                '分、秒は59、時は1時間進める為変更無し
                s=59
                time1s=0            '1秒タイマのカウントを0
             end if
          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にタイマカウント値、時刻初期値、タイマ設定値等を書込む為に使用する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ファイルが出来ますが、通信ポートやタイマカウント値の設定内容を保存する保存ファイルです。削除しても良いですが、ファイルが無い時は、デフォルト値で開きます。

(1日で、プログラムタイマの時刻が、パソコンの時刻より、8秒進みました。)

 

 

●簡易プルグラムタイマ PIC12F683 設定・書込ツール説明

 この設定書込ツール画面上で、タイマのカウント値、タイマ時刻初期値、タイマ設定値他の設定値を設定します。設定値は保存ボタンでテキストファイルに保存されます。保存したテキストファイルを読込ボタンで読込むことにより、設定値を再度画面表示し編集する事が出来ます。設定書込ボタンで、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にして下さい。(RS232C切替用スイッチSW2は、常時設定側へセットして下さい。JMP1、JMP2のスイッチはON(出力側)にセットして下さい。)スイッチSW1が設定側の時は、設定モードとなりPICと通信接続が可能となります。スイッチSW1が設定側になっているかの確認は電源立ち上げ時のみ確認しているだけなので、電源立ち上げで設定モードになった後は、スイッチSW1を制御側に切替えても設定モードのままです。設定モードでPIC書込み後、設定解除ボタンを押すと、ソフト的には制御状態となり、制御プログラムを実行します。スイッチSW1を制御側に切替え後、設定解除ボタンを押すとハード側もソフト側も制御モードとなります。スイッチSW1を制御側にして、電源をONにすると制御モードで立ち上がり、直ちにタイマプログラムを実行して、時刻初期値から時刻をカウントして、1秒毎に時刻データを出力します。

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

 

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

 

 ・タイマカウント値設定

ハードタイマカウント値:割込み時間(1秒)=(4/発振周波数)×ハードタイマカウント値×256(プリスケラー値)×ソフトタイマカウント値

のハードタイマカウント値の設定値、入力範囲は、1〜256

ソフトタイマカウント値:割込み時間(1秒)=(4/発振周波数)×ハードタイマカウント値×256(プリスケラー値)×ソフトタイマカウント値

のハードタイマカウント値の設定値、入力範囲は、0〜255

  ・時刻修正

時刻修正有:時刻修正有にチェックを入れた時は、時刻修正機能が有効となります。

インターバル値の間隔時間で、ソフトタイマカウント値をカウント値に変更して、このカウント値の値で1秒をカウントします。

カウント値:割込み時間(1秒)=(4/発振周波数)×ハードタイマカウント値×256(プリスケラー値)×ソフトタイマカウント値

のインターバル値の間隔時間の時のソフトタイマカウント値の設定値、入力範囲は、0〜255

インターバル値:ソフトタイマカウント値をカウント値に変更して、1秒をカウントする間隔時間(秒)の設定値。入力範囲は、0〜65535

 ・終了ボタン:簡易プログラムタイマ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簡易プログラムタイマ(PIC12F683)のハードは、GP0がRS232Cの送信用、GP3がRS232Cの受信用専用で、GP4が時刻修正入力、GP1、GP2、GP5がタイマ設定出力で、入力2、出力4の設定なので、JMP1、JMP2のスイッチはON(出力側)の設定にします。時刻データをRS232Cで常時出力するので、スイッチSW2は常時設定側に設定します。                                    

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

簡易プログラムタイマ PIC12F683 設定・書込ツールを開きます。

最適なハードタイマカウント値とソフトカウント値を決める為、初めは時刻修正は使用しません。(時刻修正有のチェックな無しです。)

内蔵クロックオシレータは8MHzを使用しているので、割込み時間(1秒)=0.0000005秒×ハードタイマカウント値×256(プリスケラー値)×ソフトタイマカウント値を1秒にするには、割込み時間計算表より、ハードタイマカウント値=252とソフトカウント値=31の時、割込み時間(1秒)は0.999936秒で1番誤差が小さいのですが、実際の回路では、発振器の周波数精度及びソフト処理の関係で計算通りにはならないです。いろいろ組み合わせた結果から誤差の小さい値を決めます。私の場合は、ハードタイマカウント値=252とソフトカウント値=31では大きく進み過ぎてしまいました。ハードタイマカウント値=252とソフトカウント値=30の時が1番誤差が少なかったです。

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

誤差が少ない場合は時刻修正は使用しなくて良いですが、誤差が大きい時は、時刻修正有のチェックを入れて時刻修正有りとします。

時間が進む時は、定期的に遅れ部分を作る為、カウント値は(ソフトカウント値+1)として、遅れる時は早め部分を作るので、(ソフトカウント値−1)と設定します。

インターバル値のおおよその目安は、

インターバル値=0.0000005秒×ハードタイマカウント値×256(プリスケラー値))÷(誤差時間(秒)÷経過時間(秒)) です。

ハードタイマカウント値=252、ソフトカウント値=30で、1日に60秒進む場合は、カウント値=31で、

インターバル値=(0.0000005秒×252×256)÷{60÷(24×60×60)}=46 です。46秒に1回、カウント値=31で1秒をカウントします。

カウント値とインターバル値を設定して、上記と同じ様にPICのEEPROMに書込み後、時間経過を確認して、誤差が小さくなるように下記の要領でインターバル値を調整します。

  ・カウント値(ソフトカウント値−1)の時

     進む場合は、インターバル値を大きく

     遅れる場合は、インターバル値を小さく

   ・カウント値(ソフトカウント値+1)の時    

     進む場合は、インターバル値を小さく

     遅れる場合は、インターバル値を大きく

 

インターバル値の微調整は、正時になった時に、PIC簡易プログラムタイマ(PIC12F683)のGP4ピンの時刻(正時)修正入力を10秒以上ONする事により、自動時刻修正機能が働いて、プログラムタイマ単体で時間の進み具合を確認して上記の条件でインターバル値を自動修正します。気温等の季節変化による温度変化に対しての微調整はこちらでも行えます。但し、1回でのインターバル値の変更は、1の増減のみです。但し、インターバル値が0秒になった時は1減算しません、又、65535秒になった時は1加算しなく、そのままとなりますので、注意して下さい。

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

 

 

このページのTOPへ         

 


 


☆まとめ

PIC簡易プログラムタイマ(PIC12F683)で使用したPIC12F683 の内蔵クロックオシレータが温度変化でどのように発振周波数が変化するのか周波数カウンタが無いので判りませんが、PIC簡易プログラムタイマ(PIC12F683)の時刻とタイマ周辺温度とのデータを取ってどのように変化するのか、時刻と温度のデータを取ってみました。

下記のグラフは、2日半以上のデータを1分間隔に間引きして書いたグラフです。

 

この時の設定されたハードカウント値とソフトカウント値の組合せでは、パソコンの時刻との時間差が水平になっている部分がちょうどパソコンの時刻と合っている個所で、23℃〜24℃前後の温度の時、時間の狂いが少なくなります。温度が上がれば時間が早くなる方に、下がれば時間が遅れる方に変化します。2日半で、約6度の温度差で、最大13秒の進み、最大1秒の遅れ、14秒のバラツキとなりました。この時は1日の気温変化が少ない時で有り、ハードカウント値とソフトカウント値の組合せが気温内の温度に合っていたので、時刻のバラツキも小さくなりました。時刻(正時)修正で、定期的に自動時刻修正機能を働かせる事により、その時の気温内でインターバル値を修正して最適値に近づける事により、時間精度をある程度まで上げる事が出来ます。

 

HOMEへ    このページのTOPへ         


Counter