緑の中に

緑の中に
国立天文台

10/25/2021

9600bpsへの準備実験

 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”に入れ換える。

 

}

}