Quantcast
Channel: JH7UBCブログ
Viewing all articles
Browse latest Browse all 440

PIC16F883 シリアル通信テスト

$
0
0
 PIC16F883は、PIC16F88とほぼ同じ程度の機能を持っていますが、I/Oが24ポートもあり、Arduinoなどと同じような使い方ができそうです。

 まず、シリアル通信をテストします。

 回路図です。USBシリアル変換モジュールFT234Xを使います。クロックは精度を考えて、20MHzのセラロックにしています。

イメージ 1

 ブレッドボードです。

イメージ 2

 プログラムです。PIC16F883では、SPBRGとSPBRGHを合わせて16bitで設定できます。

 そこで、BRG16 = 1として、16bitモードにします。

 これにより、Baud rateは、300~115200bpsまで設定できます。

--------------------------------------------
#include <stdio.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
// CONFIG2
#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;
}
void putch(unsigned char byte){
    while(!TXIF);
    TXREG = byte;
}
unsigned char getch(){
    while(!RCIF);
    return RCREG;
}
unsigned char getche(){
    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();
    }
}
----------------------------------------------------

 Baud rateを変えて、実際にテストしてみました。

 300~57600bpsでは問題ありませんでしたが、115200bpsでは文字化けしてしまいました。

 実用上はこれで大丈夫ですね。

Viewing all articles
Browse latest Browse all 440

Trending Articles