PIC16F883は、PIC16F88とほぼ同じ程度の機能を持っていますが、I/Oが24ポートもあり、Arduinoなどと同じような使い方ができそうです。
まず、シリアル通信をテストします。
回路図です。USBシリアル変換モジュールFT234Xを使います。クロックは精度を考えて、20MHzのセラロックにしています。
ブレッドボードです。
プログラムです。PIC16F883では、SPBRGとSPBRGHを合わせて16bitで設定できます。
そこで、BRG16 = 1として、16bitモードにします。
これにより、Baud rateは、300~115200bpsまで設定できます。
--------------------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <xc.h>
#include <stdlib.h>
#include <xc.h>
// CONFIG1
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config LVP = OFF
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config CP = OFF
#pragma config CPD = OFF
#pragma config BOREN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config LVP = OFF
// CONFIG2
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
#pragma config BOR4V = BOR40V
#pragma config WRT = OFF
#define _XTAL_FREQ 20000000
void serial_init(unsigned long BR){
TXSTA = 0x20; //SYNC=0 TXEN = 1 BRGH = 0
BRG16 = 1; //BRG 16bit mode
RCSTA = 0x90; //非同期、継続受信可
unsigned int X= _XTAL_FREQ/BR/16 - 1;
SPBRGH = X / 256;
SPBRG = X % 256;
}
TXSTA = 0x20; //SYNC=0 TXEN = 1 BRGH = 0
BRG16 = 1; //BRG 16bit mode
RCSTA = 0x90; //非同期、継続受信可
unsigned int X= _XTAL_FREQ/BR/16 - 1;
SPBRGH = X / 256;
SPBRG = 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() {
ANSEL = 0; //アナログポートを使わない
ANSELH = 0;
TRISA = 0b00000000;
TRISB = 0b00000000;
TRISC = 0b10000000; //RC7 input=RX
PORTA = 0x00;
PORTB = 0x00;
PORTC = 0x00;
serial_init(57600);
while(1){
getche();
}
}
getche();
}
}
----------------------------------------------------
Baud rateを変えて、実際にテストしてみました。
300~57600bpsでは問題ありませんでしたが、115200bpsでは文字化けしてしまいました。
実用上はこれで大丈夫ですね。