2022.10.8
前へ
次へ
ホームページトップへ戻る


PIC−USBIO using BASIC

〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
USBインターフェースを内蔵したPICを使ってWindowsパソコンで外部回路を制御するための各種I/O基板の製作記事です。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

[第71回]



●PICUSBIO−03(20)Timer1(2)TMR1HをPORTCから出力

前回少し書きましたようにTimer1には普通のTimer/Counterの機能のほかにも別の機能があります。
その機能についてもいずれ書いていくことになるかと思いますが、まずは普通のTimer/Counterの機能について確認することにします。
Timer1を普通のTimer/Counterとして見るとその機能はTimer0によく似ています。
Timer0が8bitカウンタとして、あるいは16bitカウンタとして、そのどちらとしてでも使うことができるのに対してTimer1は16bitカウンタとしてのみ使うことができます。
またTimer0は8ビットのプリスケーラが使えて1:256〜1:1までの幅広い分周比で入力周波数を分周することができます。
これに対してTimer1にはわずか2bitのプリスケーラしかないため1:8〜1:1の分周しか行なえません。
Timer1がTimer0と大きく異なるのはその2点です。
それ以外はTimer1はTimer0と基本的に同じ機能なので今までTimer0について行なった動作テストはそのままTimer1でも使えそうです。

Timer0で最初に行なった動作テストは[第65回]のテストです。
Timer0の値(上位バイトの値)を読んでそれをPORTCから出力するプログラムを実行してPORTCの値をオシロで観測しました。
それと同じことをTimer1でもやってみます。
下がプログラムリストです。

[第65回]で使ったTimer0用のテストプログラム(tmr0t1.txt)をもとにしてTimer1用に書き換えました。
といっても簡単なことでT0CON→T1CON、TMR0L→TMR1L、TMR0H→TMR1H、に書き換えて20行の値を$B1にするだけです。
T1CONの値$B1は以下の意味になります。
bit7=1 Time0と同じ16bitレジスタREAD/WRITEモードに設定
bit6=0 Timer1はシステムクロックの供給元ではありません
bit5=1、bit4=1 プリスケーラを1:8に設定
bit3=0 Timer1をオシレータとしては使わず普通のTimer/Counterとして使います
bit2はbit1=0のときは無視されます
bit1=0 入力クロックはシステムクロック(48MHz)/4=12MHz
bit0=1 カウンタ動作スタート
T1CONの各ビットの詳細は前回([第70回])を参照してください。

プログラムを実行しました。
下はPORTCのビット7(RC7)とビット6(RC6)の出力パルスをオシロで観測した画像です。

上側(CH1)がRC7で下側(CH2)がRC6です。
16ビットカウンタの最上位ビットがRC7から出力されています。
プリスケーラを経由したカウンタの入力周波数は12MHz/8=1.5MHzです。
カウンタの最上位ビットの値が出力されているRC7の周波数は1500000/65536≒23Hz(周期は約44msec)です。
上の画像の波形は計算値からかなりずれています。
2波分を合わせると80msecほどでなんとか計算値(44X2=88)に近くなります。
その下位のRC6の波形は計算値(周期22msec)から全くずれてしまっています。
このことについては[第65回]で説明をしています。
USB通信(HID方式)は遅いのでpicout、picinでPICのレジスタにアクセスするのに時間がかかります。
[第65回]のテストではプリスケーラが1:32ぐらいなら大体計算値通りの波形が得られています。
1:16では少しずれが目立ちます。
今回のTimer1のプリスケーラは最大でも1:8までしか使えませんからTimer0と同じテストはできません。
プリスケーラ1:8では相当ずれが目立ちます。
一応動作していることは確認できますから無駄なテストではありませんがもう少しなんとかしたいところです。

次回でもう少しなんとかしてみることにします。

PIC−USBIO using BASIC[第71回]
2022.10.8upload

前へ
次へ
ホームページトップへ戻る