Include: timers.h
Prototype: void WriteTimer0( unsigned int timer );
タイマレジスタに書き込む値の算出
例:3ms必要な時
40MHz 16ビット プリスケーラ1:1
1/40,000,000X4 = 0.1μS----1命令サイクル
3X1000/0.1=30,000---------必要な回数
256X256-30,000=35,536
WriteTimer0( 35536 );
例:10ms必要な時
20MHz 16ビット プリスケーラ1:8
1/20,000,000X4 = 0.2μS----1命令サイクル
0.2X8=1.6μS-------------プリスケーラで8倍に
10X1000/1.6=6,250---------必要な回数
256X256-6,250=59,286
WriteTimer0( 59286 );
59,286からスタートして256X256(65,536)になるまで、カウントした時に割り込みが発生
2010年12月3日金曜日
2010年11月30日火曜日
Delay10KTCYx()
#include <delays.h>
例: Delay10KTCYx(200)
引数は0-255
0は256で計算する。
引数の選択方法:1秒必要な時
8MHz で動作している場合
1/8,000,000=0.125μs
1命令4サイクルなので
0.125x4=0.5μs
1x1,000,000/0.5=2,000,000 =2,000k回
必要 引数は200を選択
例:48MHzで1秒必要な場
200 msを5回繰り返す
1命令1/48*4=0.083=1/12μs
200 msは
200x1,000/(1/12)=2,400,000=2,400k回
Delay10KTCYx(240);
Delay10KTCYx(240);
Delay10KTCYx(240);
Delay10KTCYx(240);
Delay10KTCYx(240);
2010年11月21日日曜日
A/D変換-C18プログラミング-PIC18F2550
未完成
/*
概要:A/D変換値をRS232C通信で送信
HID - Bootloaderを使った書き込み
マイコン:PIC18F2550
ファイル名:RS232C.c
開発環境:MPLAB C18
*/
#include <p18f2550.h>
#include <usart.h>
#include <stdio.h>
#include <adc.h>
#include <stdlib.h>
#include <delays.h>
// リセットベクタ
#pragma code reset_vector=0x1000
extern void _startup(void);
void remapped_reset(void) { _asm goto _startup _endasm}
#pragma code
void main (void){
char ad_value[10] = "AD=";
char v_value[10] = "Volt=";
char str2[8] ="\r\n";
int ADread; //AD変換値
char buf_ad[3]; //一時的に保存
double press; //電圧値整形前
int One_digit; //電圧値の整数部分
int v_m; //小数点以下2桁
TRISA = 0b00001001; //RA0,A/D input RA3 Vref input
TRISB = 0; //all output
TRISC = 0; //all output
LATC = 0; //ポートCの出力ラッチCすべてに0:OFFを出力
ADCON0 = 0b00000001; //bit0=1 AD変換開始
//bit3,4,5の000でAN0を一つのだけのポートに指定
ADCON1 = 0b00011101; //アナログ入力ポートの使い方の設定
//bit4,5の0,1でVss、AN3/Vref+
//bit0,1,2,3の1101でAN0,AN1がアナログ他はデジタル
ADCON2 = 0b10110110; //bit0,1,2 の110で64Tosc
//bit3,4,5の110で16TAD
T0CON = 0b10000110; //Timer0 の設定
//bit0,1,2 110 プリスケーラ使用時の倍率指定256
//bit3=0 プリスケーラ使用有無 使用する
//bit4=0 立ち上がり
//bit5=0 TMR0クロックソース選択 命令サイクル
//bit6=0 16ビットモード
//bit7=1 TMR0有効
INTCONbits.TMR0IE = 1; // Timer0 Interrupt Enable
RCONbits.IPEN = 1; // Interruput Priority Enable
INTCON2bits.TMR0IP = 0; // Timer0 Interrupt is Low Priority
INTCONbits.GIEH = 1; //INTCONの7bit目
//高位割込み許可
INTCONbits.GIEL = 1; //INTCONの6bit目
//低位割込み許可
while(BusyADC()); //AD変換が終わるまで待つ
// configure USART
OpenUSART(USART_TX_INT_OFF & //送信割込みの禁止
USART_RX_INT_OFF & //受信割込みの禁止
USART_ASYNCH_MODE & //非同期(調歩)モード
USART_EIGHT_BIT & //8ビットモード
USART_CONT_RX & //連続受信モード
USART_BRGH_LOW, //低速ボーレート
77); //SPBRGレジスタ 9600 bps
while (1)
{
ConvertADC(); //start A/D
ADread = ReadADC(); //AD変換値読込み int
itoa(ADread,buf_ad); //型変換
putsUSART(ad_value); //
putsUSART(buf_ad); //rs232c通信で送信
putsUSART(str2); //改行
putsUSART(v_value);
press = ADread * 0.005;//電圧値を取得
One_digit = press; //電圧値の整数部分
itoa(One_digit,buf_ad); //型変換
putsUSART(buf_ad); //送信
WriteUSART('.'); //コンマの送信
v_m = press*100 - One_digit*100;//小数点以下2桁取得
itoa(v_m,buf_ad); //型変換
putsUSART(buf_ad); //送信
putsUSART(str2); //改行
Delay10KTCYx(200); //wait about 0.8sec
}
CloseUSART();
}
登録:
投稿 (Atom)

