PIC16F628AのUSARTを使ってシリアル通信を行います。
MPLAB IDE アセンブラで既に経験済みですが、MPLABX XC8では、どのようなプログラムになるのでしょうか。
シリアル通信のTX(送信)は、7番ピン(RB1)で、RX(受信)は、8番ピン(RB2)で、両方ともTRISは入力設定(1)にします。
USBシリアル変換モジュールは、秋月電子のFT234Xを使います。(これすごく小さいです。)
接続は、
PIC FT234X
RX TxD
TX RxD
です。
回路図です。電源は、FT224Xから5Vを供給します。FT234XのTxD出力は3.3Vで、入力は5VトレラントですからPICと直接接続できます。クロックは内蔵発振器で4MHzとします。
USARTの設定です。
送信設定は、TXSTAで行います。非同期通信、高速サンプル指定(BRGH=1)ですので、TXSTA = 0x24とします。
送信データをTXREGにセットすると自動的にシリアル送信されます。
受信設定は、RCSTAで行います。非同期通信、継続受信ですので、RCSTA = 0x90とします。
エラーチェックはしません。
シリアルデータを受信するとRCIFが1になり、データはRCREGに保存されます。
通信速度jは9600bpsとします。クロック4MHzで、BRDH=1ですので、SPBRG=25とします。
この値の計算方法は、PIC16F628Aの説明書にかいてありますが、今回はサンプルにあった値をつかいました。
/*
* File: PIC16F628A_serial_com.c
* Author: JH7UBC Keiji Hata
* Created on 2018/11/05
*/
* File: PIC16F628A_serial_com.c
* Author: JH7UBC Keiji Hata
* Created on 2018/11/05
*/
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
#define _XTAL_FREQ 4000000
// CONFIG
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF
#pragma config FOSC = INTOSCIO
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = OFF
#pragma config BOREN = OFF
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config CP = OFF
/*1文字送信 */
void putch(unsigned char byte){
while(!TXIF );
TXREG = byte;
}
void putch(unsigned char byte){
while(!TXIF );
TXREG = byte;
}
/* 1文字受信 エラーチェックなし*/
unsigned char getch(){
while(!RCIF);
return RCREG;
}
unsigned char getch(){
while(!RCIF);
return RCREG;
}
/* エコーバック付き入力 */
unsigned char getche(){
unsigned char c;
c = getch();
putch(c);
return c;
}
unsigned char getche(){
unsigned char c;
c = getch();
putch(c);
return c;
}
void main() {
CMCON = 0x07; //comparator OFF
TRISA = 0b00010000; //RA5 input 他は output
TRISB = 0b00000110; //RB1,RB2はinput 他はoutput
/*USART設定*/
TXSTA = 0x24; //送信設定 非同期 高速
RCSTA = 0x90; //受信設定 非同期 継続受信
SPBRG = 25; //クロック4MHz レート9600bps
unsigned char work;
while(1){
work = getch();
printf("Echo: %c\r\n", work);
}
CMCON = 0x07; //comparator OFF
TRISA = 0b00010000; //RA5 input 他は output
TRISB = 0b00000110; //RB1,RB2はinput 他はoutput
/*USART設定*/
TXSTA = 0x24; //送信設定 非同期 高速
RCSTA = 0x90; //受信設定 非同期 継続受信
SPBRG = 25; //クロック4MHz レート9600bps
unsigned char work;
while(1){
work = getch();
printf("Echo: %c\r\n", work);
}
}
Tera Termを使ってテストをしました。キーボードで打った文字がエコーバックされます。