緑の中に

緑の中に
国立天文台

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

 

}

}


10/24/2021

伝送スピードの高速化

                 伝送スピードの高速化

Data loggerの現在のボーレートは2400bpsです。

このボーレートを9600bpsで送信するように、ハードおよびソフトを変更しています。

PIC12F675において、外部発振子(コンデンサー内臓セラミック発振子)8MHzを取り付けました。

PIC12F675においては内部発振子が存在しており,その最高振動数が4MHzです。そこで、伝送スピードを上げるにはシステムクロックの振動数さらに上げてあげる必要があります。

そこで、外部発振子を取り付けて対応します。PIC12F675の2pin,3pinに取り付けます。

発振子には3本端子がありますが、左から数えて2番目の端子はGNDへ接続します。1番目と3番目の端子をPIC12F675の2番、3番へ接続しました。

以下、プログラムの関連する部分を抜き書きしました。


-----------  関連するプログラムの部分 -------外部振動子の使用---


// 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)

 

------------ 関連するプログラムの部分 --- 外部振動子8MHz ------------

#define _XTAL_FREQ 8000000    //



--------- 関連するプログラムの部分 ----- 時間タイミング -------------------

void func (unsigned short  tx_byte ) //  [型] 関数名 ([型と仮引数並び])

{

int i; //関数内変数の宣言


    GPIO2=1;   // スタートビット   


__delay_ms(10);


    GPIO2=0;    // スタートビット 

 

for (i=0;i<10;i++){     //1ビット分のスターとビットと2ビット分のストップビット 合計10ビット分。?

    

__delay_us(85);  

                    //★ __delay_us(345); を変更する-> __delay_us(85); ◎  TeraTerm 9600で 0000-A  0000-A  0000-A

 

     GPIO2=(tx_byte & 0x01);     //<5p> データビット  &はビットのAND .これにより0ビット目だけを取出している

     

tx_byte>>=1;     //tx_byte の内容を1ビット右へシフト。次のビットを送る準備

tx_byte  |=  0x80;     //ストップビットを作っておく。 ORしてtx_byte に書く。都度,8bitを”1”に入れ換える。

 

}

--------------------------------------------------------------------------

///////////////////////////// 確認方法 /////////////////////////

受信ターミナルソフト Tera Termを起動して、受信します。

このとき、Tera Termに  設定-->シリアルポート-->スピード  とあります。

スピードを2400から9600へセットします。

これにより、意図する受信が確認できればまずはOKです。

PIC12F675のプログラムでは、A/D変換はまだ行わないようにしています。

数値として4桁の「0000」を送信します。よって、受信プログラムでこの数値が再現されれば伝送スピードに同期したと考えます。もっと、シビアな確認方法も現在検討中です。

0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A  0000-A

Tera Termの画面をCopyしました。