作成2015.09.21
AE-USBPIC44基板2個を使用して、PIC18F4553のシリアル通信USART(非同期)のプログラム方法を理解します。
- 参照プログラム
以下のアドレスを参照しました。
「https://electrosome.com/uart-pic-microcontroller-mplab-xc8/」にジャンプする。
PIC 16F877Aを前提に解説していますが、シリアル通信USART(非同期)部分はPIC18F4553もほぼ同じです。
- シリアル通信USART(非同期)評価回路図
参照プログラムでは、8個のスイッチと8個のLEDをしようしていますが、AE-USBPIC44基板に実装してあるSW1とLEDのみの使用としました。
- シリアル通信USART(非同期)評価回路外観
シリアル通信USART(非同期)評価回路外観を以下に示します。
*USBから電源を供給しますが、USB通信は使用しません。
- シリアル通信USART(非同期)評価用ソースプログラムム
(1)秋月電子通商サンプルプログラム「MPLABを使った使用例1」ソースプログラム
「newmain18.cの内容変更ファイル」にいく。
をベースに修正します。
(2)シリアル通信USART(非同期)機能の追加
「https://electrosome.com/uart-pic-microcontroller-mplab-xc8/」にジャンプする。
を参照して修正を加えます。
(3)AE-USBPIC44基板用シリアル通信USART(非同期)評価用ソースプログラム(送信側)
AE-USBPIC44基板用シリアル通信USART(非同期)評価用ソースプログラム(送信側)を以下に示します。
「USART(非同期)評価用ソースプログラム(送信側)」にいく。
(4)AE-USBPIC44基板用シリアル通信USART(非同期)評価用ソースプログラム(受信側)
AE-USBPIC44基板用シリアル通信USART(非同期)評価用ソースプログラム(送信側)を以下に示します。
「USART(非同期)評価用ソースプログラム(受信側)」にいく。
- 送信側void main(void)概要
送信側void main(void)を以下に示します。
void main(void)
{
init();//初期設定
UART_Init(9600);//UART初期設定、ボーレイト設定
while(1)
{
if(SW1==0)//SW1=ON
{UART_Write('j');}
else
{UART_Write('a');}
__delay_ms(10);
}
}
(1)ボーレイト9600で初期設定します。
(2)SW1がONのときアスキーコード'j'を送信します。
(3)SW1がOFFのときアスキーコード'a'を送信します。
(4)次の送信まで10ms待ちます。
- 受信側void main(void)概要
受信側void main(void)を以下に示します。
void main(void)
{
init();//初期設定
UART_Init(9600);//UART初期設定、ボーレイト設定
//割り込み使用時は以下を有効にします。
//RCIF = 0; //reset RX pin flag
//RCIP = 1; //high priority
//RCIE = 1; //Enable RX interrupt
//PEIE = 1; //Enable pheripheral interrupt (serial port is a pheripheral)
//INTCONbits.GIE = 1;//Global Interrupt Enable bit
while(1)
{
if(UART_Data_Ready())
{
char c = UART_Read();
if(c=='j'){LED=1;}
else{LED=0;}
__delay_ms(10);
}
}
}
(1)ボーレイト9600で初期設定します。
(2)この例では割込み処理を使用しません。
(3)受信レジスターのデータを1バイト読取ます。
(4)受信データがアスキーコード'j'のときLEDを点灯します。
(5)受信データがアスキーコード'a'のときLEDを消灯します。
(6)次の受信まで10ms待ちます。
- シリアル通信USART(非同期)信号波形
(1)ボーレイト9600におけるアスキーコード'a'=0x61と'j'=0x6Aの信号波形とボーレイト実測結果を以下に示します。
*ボーレイト9600は設定値と実測値が良く一致します。
(2)ボーレイト76800におけるアスキーコード'a'=0x61と'j'=0x6Aの信号波形とボーレイト実測結果を以下に示します。
*ボーレイト76800は設定値と実測値が良く一致します。
(3)ボーレイト115200におけるアスキーコード'a'=0x61と'j'=0x6Aの信号波形とボーレイト実測結果を以下に示します。
*ボーレイト115200は設定値と実測値が良く一致します。
- ボーレイトの計算
(1)ボーレイト設定定数の計算式
unsigned int x;
BRGH = 1; //Setting High Baud Rate
x = (_XTAL_FREQ - baudrate*16)/(baudrate*16); //SPBRG for High Baud Rate
if(x>255) //If High Baud Rage Required
{
BRGH = 0;
x = (_XTAL_FREQ - baudrate*64)/(baudrate*64); //SPBRG for Low Baud Rate
}
(2)ボーレイト設定定数xとボーレイトの関係式
*BRGH = 0の時
ボーレイト=_XTAL_FREQ/(64*(x+1))
*BRGH = 1の時
ボーレイト=_XTAL_FREQ/(16*(x+1))
(3)具体的な計算結果
具体的な計算結果を以下の表に示します。
ボーレイト | 9600 | 76800 | 115200 |
_XTAL_FREQ | 48000000 | 48000000 | 48000000 |
BRGH | 0 | 1 | 1 |
設定値(x) | 77 | 38 | 25 |
計算ボーレイト | 9615 | 76923 | 115385 |
- シリアル通信USART(非同期)まとめ
(1)PIC 16F877Aを前提したサンプルプログラム(https://electrosome.com/uart-pic-microcontroller-mplab-xc8/)が大変参考になりました。
(2)PIC18F4553とPIC 16F877Aとでは、機能が大幅に異なるのですが、シリアル通信USART(非同期)に限ればほぼ同じでした。
(3)本サンプルプログラムは、単純化されており、シリアル通信USART(非同期)プログラムの理解に最適でした。
(4)本サンプルプログラムは割込み処理を使用しておらず、処理の流れが単純です。
(5)反面文字列の高速通信には、てきしません。
(6)実用的には、本サンプルプログラムをベースに割込み処理を追加する必要があります。
(7)PIC 16F877Aを前提したサンプルプログラム(https://electrosome.com/uart-pic-microcontroller-mplab-xc8/)において、ボーレイト設定の計算部分にミスがあり、ボーレイト9600では正確に設定されるが、ボーレイト76800とボーレイト115200において誤差が大きくなる問題がありました。
(8)ボーレイトの計算ミスに関しては、修正しました。