9600bpsへの準備実験
プログラムを公開します
9600bpsへの準備です。A/D変換をStopさせています。とにかく伝送スピードの状況を
実験しています。Good. です。
送信プログラム側↓↓↓↓↓↓
折り返して見ずらくなっています。これをCopyしてTXT画面でご覧ください。
/* PIC12F675
* file name Logger-external_osc-6505.c 外部発振子 8MHz
* AD変換を止めて、外部振動子を8MHzで動作するか。 #define _XTAL_FREQ 8000000 で整合させた。Good!
*265行あたりの __delay_us(85); #define _XTAL_FREQ 8000000 -> このマージンを検査したい ◎ TeraTerm 9600で 0000-A 0000-A 0000-A
* __delay_us(82);◎ ? __delay_us(93);◎ ===> 88 ここあたりに設定する __delay_us(88)としよう!
* 外部発振子 8MHz GP0<7pin>AN0入力 <5pin> 出力 TeraTerm 9600で 0000-A 0000-A 0000-A
* 2pin,3pin そして振動子の真ん中の端子はアースへ
*
* ★ダミ-数値データを読む事を試したい!
* 9600bpsへの準備実験
* 9600bps送信している事の 確認方法 その1 その2
* AD-sender-2400bps-7000.c の遺伝子を持つ
*
*
*
*
*
*
* -------Regacy ----------------------------------------------------------------------------------------
* AD-sender-2400bps-7000.c pinをchangeする GP1 <6pin>AN1 を有効にできた。GP1<6pin>の場合無信号時(センサーリード断)に数十ミリVのA/D変換出力を返すので注意のこと。
* GP0<7pin>AN0入力 GP2<5pin>は出力でMAX232Cへ 予定通り GP1<7pin>が動作している ■■
* Data形式 4160-A (真値4240)、465-A (真値464) 2種類の電圧を用意した 100K+20Kの分圧, 1K+10Kの分圧
* GP0<7pin>AN0 受けて変換している
*
*
*
* ●● この AD-sender-2400bps-3.cが 現在最高スピードで伝送する ● ●
*
* ■■ 照度センサーより データを採取する ■■ 温度センサーでも良好
* ■ Build 成功 Pickit3書き込み成功(プロジェクトファイル名を右フォーカスしプロパテイ,Pickit3より4.75V供給 * DC5V_OFF
* RS232Cコネクタは接続のまま 書き込み )
* TeraTermを起動する。2400bps
* 素晴らしい。これが本来の2400bpsの送信と思われる(160行あたりのdelayをすべてコメントアウト)
* AD-sender-2400bps-1.c > AD-sender-2400bps-2.c > AD-sender-2400bps-3.c の順に速くなった
*
*
* -------------------PICkit3 について-------------------------------------------------------------------------------------------------------------------------------
*
* * File ->ProjectProperties->マウス右 ー>PICKit3->option categories ->Power を選択する. Power target circuit from PICkit3.
* を選択し、Voltage Level 4.75 を選択した。PICkit3より回路ボードに電源が供給されます。よって、ボード側の電源をOFFとすること。
*
* ボード側の電源をOFFとしなくって良い設定もあります。Power Target circuit from PICkit3 □ チェックは入れない。
* Voltage Level 4.75
*
* プログラム書き込み後は、PICkit3のコネクタピンは外しターゲットボードのPICがプログラム通りに実行するか確認する
* ---------------------------------------------------------------------------------------------------------------------------------
*
*
*-------------- AD変換クロック-------------------------------------------------------------------------------------------
//AD変換するとき、AD変換クロックが使われる。AD変換クロックの周期のことをTADといい、1回のAD変換には11TADかかる。
//FRCをAD変換クロックにする場合
//ADコンバータには、専用のRC発振器がついている。この専用のRC発振器で作ったAD変換クロックをFRCという。FRCの周期は4μsecになっている。
//FRCを使うとスリープ・モード中でもAD変換ができる。
//なお、CPUクロックが1MHZ以上で動作している場合は、FRCを使うとAD変換の結果が悪くなる場合があるので、ほかのAD変換クロックを使った方がよい。
//FRC以外をAD変換クロックにする場合
//FRC以外のAD変換クロックを使う場合は、システム・クロックの周波数とADCS0~2ビットの内容の組み合わせで、AD変換クロックの周期が選べる。
// AD変換クロックの周期は1.6μsec以上になるように選ぼう。長くなりすぎるとホールド・コンデンサが自己放電するかもしれないので、
//(1.6μsec以上で)1.6μsecにできるだけ近くしよう。
//例えば、システム・クロックが4MHZの場合、AD変換クロックはFosc/8を選ぼう(AD変換クロックの周期は2μsecになる)
//ただし、発振クロックが4MHzでも、スリープ・モード中にAD変換を行う場合はFRCを選ぼう。
//--------------------------------------------------------------------------------------------------------------------------------------------------
*
*/
#include <stdio.h>
#include <xc.h>
#define _XTAL_FREQ 8000000 //XT mode 4MHz または 4e6 と書いてよい . この記述が無いと __delay_ms(200); でエラーが発生する
/////////////////////環境設定 外部発振子///////////////////////////////////////////////////////////////////////////////
// CONFIG これを生成したもの
// PIC12F675 Configuration Bit Settings
// 'C' source line config statements
// CONFIG
#pragma config FOSC = HS // Oscillator Selection bits (HS oscillator: High speed crystal/resonator on GP4/OSC2/CLKOUT and GP5/OSC1/CLKIN)
#pragma config WDTE = OFF // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = ON // Power-Up Timer Enable bit (PWRT enabled)
#pragma config MCLRE = OFF // GP3/MCLR pin function select (GP3/MCLR pin function is digital I/O, MCLR internally tied to VDD)
#pragma config BOREN = ON // Brown-out Detect Enable bit (BOD enabled)
#pragma config CP = OFF // Code Protection bit (Program Memory code protection is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
// #pragma config statements should precede project file includes.
// Use project enums instead of #define for ON and OFF.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <xc.h>
#define VDD 5000 //電源電圧
void func (unsigned short ); //プロトタイプ宣言 第1引数の型を定義
unsigned short adc(unsigned char ch); //プロトタイプ宣言 第1引数の型を定義
int main(void) // [型]main([引数])
{
//★ OSCCAL=0b010011; //ブレッドボード上のPICはこれで正しく伝送した。PICDに装着したPIC12F675もこれで正しく伝送した。
//=======■■と●● を切り換える==========================================================================================================================================
//======================================================================================================================================================================
//ADIE=1; // PIE1bits.ADIE=1; //A/D変換終了割り込みを許可
//PEIE=1; //INTCONbits.PEIE=1; /* Peripheral Interrupt Enable 1=Enables all unmasked peripherall interrupts 0=Disable all peripheral interrups */
unsigned long ad_data0; //0~4294967295 (32bit) 数値型の整数型
unsigned short ad_data; //0~65535 (16bit) 数値型の整数型
int n;
int n_1,n_2,n_3,n_4; //4桁の整数の各桁の数値を抜き出すプログラムである
n_1=0; //下位1桁目
n_2=0;
n_3=0;
n_4=0; //上位4桁目
TRISIObits.TRISIO2=0; // GP2<5pin>ピンは出力 ◎
ad_data0= (long)adc(0)*VDD;
ad_data=ad_data0/1024;
n=ad_data;
if(n>=1000)
n_4=n/1000;
if (n<1000)
n_4=0;
if ((n-n_4*1000)>=100)
n_3=(n-n_4*1000)/100;
if ((n-n_4*1000)<100)
n_3=0;
if ((n-n_4*1000-n_3*100)>=10)
n_2=(n-n_4*1000-n_3*100)/10;
if ((n-n_4*1000-n_3*100)<10)
n_2=0;
n_1=(n-n_4*1000-n_3*100-n_2*10);
func ( 0x20); //空白文字 SPACE
func(48+n_4); //数値をASCIIコードへ変換する。10進数でちょうど48を加算した数値となっている。
func(48+n_3);
func(48+n_2);
func(48+n_1);
func(0x2D); //0x20 - func ( 0x6D); //0x6D m
func(0x41); //0x41 A func ( 0x76); //0x76 v
func ( 0x20); //空白文字 SPACE
}
unsigned short adc(unsigned char ch) // [型] 関数名 ([型と仮引数並び])
{
//★ ADCON0=((ch<<2) & 0X0C); //アナログ入力チャネルを設定。ch0を指定しても、ch1を指定しても ビットが整合してセットが整う。まことに考えたものだ。
////////// ADCON0 レジスタ/////////////////////////////////////////////
//★ ADON=1; //ADコンバータの電源をONにする ADCON0レジスタの0bit
//★ ADFM=1; //AD変換結果を右詰めにする ADCON0レジスタの7bit
///////////////////////////////////////////////////////////////////////
////////////// ANSEL レジスタ///////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////////
//★ ADCS2=1; //AD変換クロックはFRC ここは後で詳述する ADコンバータには、専用のRC発振器がついている。この専用のRC発振器で作ったAD変換クロックをFRCという
//★ ADCS1=1;
//★ ADCS0=1;
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////
///////// ADCON0 レジスタ /////■■と●● ここだけの変更で良い AN0<7pin>GP0を有効にできた ////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
return((ADRESH*256)+ADRESL); //上位桁への数への変換
}
void func (unsigned short tx_byte ) // [型] 関数名 ([型と仮引数並び])
{
int i; //関数内変数の宣言
GPIO2=1; // スタートビット ●
__delay_ms(10); //既定値 __delay_ms(50); これでspeed up した __delay_ms(25); ● このdelayを外したら、受信文字が化けた
GPIO2=0; // スタートビット ●
//__delay_us(12); //既定値 __delay_us(12); __delay_us(100);としたが2種類のデータを交互に受信した。
for (i=0;i<10;i++){ //1ビット分のスターとビットと2ビット分のストップビット 合計10ビット分。?
__delay_us(88); // 9600bps TeraTerm 9600で 0000-A 0000-A 0000-A
//★ __delay_us(345); を変更する-> __delay_us(85); ◎ TeraTerm 9600で 0000-A 0000-A 0000-A
// __delay_us(80);× __delay_us(81);× __delay_us(82);◎ __delay_us(83);◎ __delay_us(84);◎
// __delay_us(85); ◎ ---------- __delay_us(90);◎ __delay_us(91);◎ __delay_us(92);◎ __delay_us(93);◎
//__delay_us(94);× __delay_us(95);× __delay_us(100);×
GPIO2=(tx_byte & 0x01); //<5p> データビット &はビットのAND .これにより0ビット目だけを取出している
tx_byte>>=1; //tx_byte の内容を1ビット右へシフト。次のビットを送る準備
tx_byte |= 0x80; //ストップビットを作っておく。 ORしてtx_byte に書く。都度,8bitを”1”に入れ換える。
}
}