16F819覚書

〔PICの動かせ方入門に戻る〕


忘れないうちにメモします。
ここでの記載はHI-TECH C Compiler for PIC10/12/16 MCUs(Lite Mode)を使用しての内容です。
データシートはこちらです。英語だけどね

内蔵発振回路
 内蔵クロックを利用するには、
 __CONFIG(INTIO)を宣言して、OSCCONレジスターにて利用する周波数を選択します。
 OSCCON = 0b01110000 ;赤い数字部分を変更する事により周波数を変更できます。
111 8MHz
110 4MHz
101 2MHz
100 1MHz
011 500KHz
010 250KHz
001 125KHz
000 31.25KHz
注)電源電圧が2.5V以下の時には4MHz以上の周波数では動作しません。
外付けクロックを行うと最大周波数20MHzで動作します。
精度が良いクロック発振周波数が欲しいなら外付けの発振子を付けて下さい。
ソフトで通信を行う場合、どうしてもタイミングが合わないなどの時に外付けの発振子を付けると出来る場合があります。
外付けの発振子を付ける場合は、__CONFIG(INTIO) ;を__CONFIG(HS) ;に代えます。

delay
delay関数を使用する場合は、
#include <htc.h>のヘッダファイルを追加して
#define _XTAL_FREQ 8000000の行を追加するただしこれはクロックが8MHzの場合

__delay_us(98560) __delay_ms(98) クロック8MHzならこの値まで設定可能
ただし、( )の中は変数使用不可です、直接数値を入力、うんん...ちょっとぉいまいち!
98ms以上待たせたいなら、
for (i=0 ; i < 100 ; i++) __delay_ms(10) ; // 1秒待つ
という感じにします。

PS.
air variableさんのブログ情報によればHI-TECH C Compiler Ver9.80以降では delay関数の設定可能時間がのびているらしいです。
クロック8MHzで__delay_us(25231232) __delay_ms(25231)
コンフィギュレーション
__CONFIG(DEBUGDIS):ICDによるデバッグモードは禁止、RB6/RB7がデジタル入出力で使えます。
__CONFIG(LVPDIS):プログラミングの低電圧書き込み禁止、RB3がデジタル入出力で使えます。
__CONFIG(INTO):INTIOの代わりにHSとすると外部周波数4,8,20MHzが使用できます。
__CONFIG(MCLRDIS):外部リセット信号は使用しない、RA5がデジタル入出力で使えます。
              リセット信号を使用する場合は、MCLRENとします。
__CONFIG(BOREN):電源電圧降下の常時監視機能を許可します、
            だいたい3.65V-4.35Vに降下したらリセットがかかります。
            電源電圧を4V以下で駆動する場合はBORDISとしてこの機能を禁止して下さい。
__CONFIG(CCPRB2/CCPRB3):アナログ出力(PWM)するピンを選択、
                   CCPRB2で8番ピンから、CCPRB3で9番ピンからです。
                   どちらか一方しか利用出来ません。

4番ピンの使い方
Vpp
 PICチップにプログラムを書込む時の、書込み電圧を負荷するピンという意味なので、
 動作時には気にしなくて良い。

MCLR
 外部リセット信号を入力する場合のピンとして使用。
 リセット信号はLOW(0V:GND接続)でリセットが掛かります、だから
 外部リセットを使わない時は100Ω〜10KΩ抵抗を介してVddに接続しなければならない。

RA5
 Vddに接続するのは面倒なのでMCLRをDisable(禁止)にし、RA5の入力端子とした方が良いでしょう。
 __CONFIG(MCLRDIS)を記述すればDisableに出来ます。

アナログ入力ピン(デジタルRA0-RA4)の設定
 初期値のピン割り当てはアナログ入力となっています。
 デジタルRA0-RA4とアナログAN0-AN4の切替え方はADCON1で行ないます。
 ADCON1 = 0b00000110 ;赤い数字部分を変更する事により切替えます。
3番ピン 2番ピン 1番ピン 18番ピン 17番ピン
0000 AN4 AN3 AN2 AN1 AN0
0100 RA4 AN3 RA2 AN1 AN0
011x RA4 RA3 RA2 RA1 RA0
1110 RA4 RA3 RA2 RA1 AN0
注)011xは0110でも0111でもOKです。

 アナログI/Oの使い方はこちらを参照して下さい。

CCP1(PWM)機能
次の順番で使用します。
@ PWM機能を使用する事の宣言を行います。
   CCP1CON = 0b00001100 ;
A TMR2プリスケーラ値の設定を行います。
   T2CON = 0b00000010 ; この設定は16倍に設定
   赤い数字部分にて設定します、1倍=00 4倍=01 16倍=10(または11)
B PWMの周期を設定します。
   PR2 = 124 ; この設定はPWM周波数1000Hz(1KHz)で設定
C カウンターなどのレジスターを初期化します
   CCPR1L = 0 ; // デューティ値は0で初期化
   CCPR1H = 0 ;
   TMR2 = 0 ; // タイマー2カウンターを初期化
D TMR2(PWM機能)のスタート要求を行います。
   TMR2ON = 1 ;
E あとはデューティ値を(CCPR1L/CCP1CON)に設定します。
   (PR2が255設定でないので、デューティ値解像度は10ビットの内8ビットのみ使用される)

PR2の値を計算する(PWM周波数=1KHz)

 PR2 = ( クロック周波数 / (PWM周波数 × 4 × TMR2プリスケール値) ) - 1

 ・PICのクロック周波数が8MHzとします。
  PR2 = ( 8,000,000 / (PWM周波数 × 4 × TMR2プリスケール値) ) - 1
 ・PWM周波数を1000Hz(1KHz)にしたい場合です。
  PR2 = ( 8,000,000 / (1000 × 4 × TMR2プリスケール値) ) - 1
 ・TMR2プリスケール値を1倍・4倍・16倍で計算します。
  PR2 = 1999 = ( 8,000,000 / (1000 × 4 × 1) ) - 1
  PR2 = 499 = ( 8,000,000 / (1000 × 4 × 4) ) - 1
  PR2 = 124 = ( 8,000,000 / (1000 × 4 × 16) ) - 1

 結果PR2の最大値は255までですので、16倍での124を選択します。
 TMR2プリスケール値を16倍にしてPR2を124に設定します。

デューティ値の設定方法

memo1

 デューティ値は10ビット(0-1023)で
 指定します。

 CCPR1Lレジスターは8ビットなので、
 CCPR1Lを上位8ビットとして、
 下位2ビットをCCP1CONレジスター
 の4-5ビット目を使用しセットします。

この様にセットするのは面倒なので、CCP1CONレジスターの4-5ビット目は0でセットして置き、
設定したいデューティ値を4で割り、その値をCCPR1Lレジスターにセットします。

PWM周波数(1KHz)とデューティ値のPWM波形概要

memo2
但し、デューティ値10ビット(0-1023)はPR2が255の場合で、それ以外は10ビット以下になります。
(PWM制御についてのもう少し詳しい話はこちらのページを参考にして下さい。)

CCP1のサンプルプログラムは「可変抵抗のツマミを回してLEDの明るさを可変します」を参照して下さい。

その他




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2011 Shigehiro Kimura All Rights Reserved.