PIC12F1822は、シリアル通信のためのEUARTモジュールを持っています。USBシリアル変換モジュールFT234Xを介してパソコンの通信ソフトTeraTermの間で通信テストを行いました。
RA0がTXピンになり、RA1がRXピンになります。このピン配置は、APFCONレジスタの設定で、RXピンをRA5に、TXピンをRA4に変更することができます。
ブレッドボードです。
プログラムです。パソコンから送られた文字をエコーバックするプログラムです。
PIC12F1822は、内臓クロック8MHzとし、PLLEN = ONとして、クロック32MHzで動作させます。
非同期通信ですが、BRGH=1, BRG16=1とすることにより、広範囲のBaudレートに適合します。
このプログラムで、300bps~230.4Kbpsで通信ができることを確認しました。(このプログラムでは、9600bpsとしていあます)
putch()で定義していますので、printf()構文を使うことができます。
最近のPICは、小さいけれど力持ちですね。次は、I2Cのテストをします。
---------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <stdlib.h>
#include <xc.h>
// CONFIG1
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config FOSC = INTOSC
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = ON
#pragma config CLKOUTEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
// CONFIG2
#pragma config WRT = OFF
#pragma config PLLEN = ON
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF
#pragma config WRT = OFF
#pragma config PLLEN = ON
#pragma config STVREN = ON
#pragma config BORV = HI
#pragma config LVP = OFF
#define _XTAL_FREQ 32000000
void serial_init(unsigned long BR){
TXSTA = 0x24; //SYNC=0 TXEN = 1 BRGH = 1
BRG16 = 1; //BRG 16bit mode
RCSTA = 0x90; //非同期、継続受信可
unsigned int X= _XTAL_FREQ/BR/4 - 1;
SPBRGH = X / 256;
SPBRGL = X % 256;
}
TXSTA = 0x24; //SYNC=0 TXEN = 1 BRGH = 1
BRG16 = 1; //BRG 16bit mode
RCSTA = 0x90; //非同期、継続受信可
unsigned int X= _XTAL_FREQ/BR/4 - 1;
SPBRGH = X / 256;
SPBRGL = X % 256;
}
void putch(unsigned char byte){
while(!TXIF);
TXREG = byte;
while(!TXIF);
TXREG = byte;
}
unsigned char getch(){
while(!RCIF);
return RCREG;
}
while(!RCIF);
return RCREG;
}
unsigned char getche(){
unsigned char c;
c = getch();
putch(c);
return c;
}
unsigned char c;
c = getch();
putch(c);
return c;
}
void main() {
OSCCON = 0b01110000 ; // 内部クロック8MHz
ANSELA = 0b00000000 ; // アナログは使用しない
TRISA = 0b00001010 ; // RA1,RA3は入力、他は出力
PORTA = 0b00000000 ; // 出力ピンの初期化
serial_init(9600); //Baud rate 9600bps
while(1){
getche();
}
}
----------------------------------------
OSCCON = 0b01110000 ; // 内部クロック8MHz
ANSELA = 0b00000000 ; // アナログは使用しない
TRISA = 0b00001010 ; // RA1,RA3は入力、他は出力
PORTA = 0b00000000 ; // 出力ピンの初期化
serial_init(9600); //Baud rate 9600bps
while(1){
getche();
}
}
----------------------------------------