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関数を使用する場合は、
#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番ピンからです。
どちらか一方しか利用出来ません。
Vpp
PICチップにプログラムを書込む時の、書込み電圧を負荷するピンという意味なので、
動作時には気にしなくて良い。
MCLR
外部リセット信号を入力する場合のピンとして使用。
リセット信号はLOW(0V:GND接続)でリセットが掛かります、だから
外部リセットを使わない時は100Ω〜10KΩ抵抗を介してVddに接続しなければならない。
RA5
Vddに接続するのは面倒なのでMCLRをDisable(禁止)にし、RA5の入力端子とした方が良いでしょう。
__CONFIG(MCLRDIS)を記述すればDisableに出来ます。
初期値のピン割り当てはアナログ入力となっています。
デジタル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の使い方はこちらを参照して下さい。
次の順番で使用します。
@ 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に設定します。
※デューティ値の設定方法
デューティ値は10ビット(0-1023)で
指定します。
CCPR1Lレジスターは8ビットなので、
CCPR1Lを上位8ビットとして、
下位2ビットをCCP1CONレジスター
の4-5ビット目を使用しセットします。
この様にセットするのは面倒なので、CCP1CONレジスターの4-5ビット目は0でセットして置き、
設定したいデューティ値を4で割り、その値をCCPR1Lレジスターにセットします。
※PWM周波数(1KHz)とデューティ値のPWM波形概要
但し、デューティ値10ビット(0-1023)はPR2が255の場合で、それ以外は10ビット以下になります。
(PWM制御についてのもう少し詳しい話はこちらのページを参考にして下さい。)
CCP1のサンプルプログラムは「可変抵抗のツマミを回してLEDの明るさを可変します」を参照して下さい。
- 電源電圧は4.0〜5.5Vで駆動可能、ピンにつなげられる電流は最大25mA(通常20mA以下)まで
(16LF819タイプなら電源電圧は2.0〜5.5V:2.7Vから使い物になるみたい)
- 内部プルアップ抵抗の使い方は「スイッチの入/切でLEDを点灯させます」を参照して下さい。
- RA0-RA4のデジタルピンはアナログピンと共有されています。
デジタルピンとしての使い方はこちらを参照して下さい。
- SPI(SSP)の機能はこちらの記事を参考にして下さい
- I2C(SSP)の機能はスレーブモードのみです。
【きむ茶工房ガレージハウス】
Copyright (C) 2006-2011 Shigehiro Kimura All Rights Reserved.