MPLABX XC( 環境で、PIC16F88のシリアル通信テストとファイルの分割をやってみます。
PICでのシリアル通信は、PIC16F628Aシリアル通信テストですでに行いました。PIC16F88のシリアル通信ピンは、PIC16F628Aと若干異なります。パソコンとの接続は、USBシリアル変換モジュールFT234Xを使います。
回路図(接続図)は次のとおりです。電源もFT234Xから供給します。
プログラムです。今回は、シリアル通信の部分を「serial,c」というソースファイルに書きます。プログラム本体は、「main.c」に書きます。この2つのファイルを繋ぐのが、ヘッダーファイルで「serial.h」です。
ソースファイル、メインファイル、ヘッダーファイルへの分割方法やそれらのファイルの関係は、「一週間で身につくC言語の基本」というサイトに分かりやすく書いてあります。参考になりました。
また、プログラムは、このところお世話になっている渓鉄さんのサイトを参考にさせていただきました。
メインファイル main.cです。
通信関係をserial.cに書きましたので、見通しがよくなりました。
-----------------------------------------------------------
/*
* File: main.c
* Author: JH7UBC Keiji Hata
* PIC16F88 Serial communication
* Created on 2018/11/19
*/
* File: main.c
* Author: JH7UBC Keiji Hata
* PIC16F88 Serial communication
* Created on 2018/11/19
*/
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include "serial.h"
#include <stdio.h>
#include <stdlib.h>
#include "serial.h"
// CONFIG1
#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 WRT = OFF
#pragma config CCPMX = RB0
#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 WRT = OFF
#pragma config CCPMX = RB0
#pragma config CP = OFF
// CONFIG2
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#pragma config FCMEN = OFF
#pragma config IESO = OFF
#define _XTAL_FREQ 8000000
void main() {
ANSEL = 0x00; //アナログポートを使わない
OSCCON = 0b01110000;//内部クロック8MHz
TRISA = 0b00100000; //RA5はinput 他はoutput
TRISB = 0b00000100; //RB2はinput 他はoutput
PORTA = 0x00; //PORTA初期化
PORTB = 0x00; //PORTB初期化
serial_init(); //AUSART設定
while(1){ //無限ループ
printf("JH7UBC\r\n");
__delay_ms(500);
}
}
ANSEL = 0x00; //アナログポートを使わない
OSCCON = 0b01110000;//内部クロック8MHz
TRISA = 0b00100000; //RA5はinput 他はoutput
TRISB = 0b00000100; //RB2はinput 他はoutput
PORTA = 0x00; //PORTA初期化
PORTB = 0x00; //PORTB初期化
serial_init(); //AUSART設定
while(1){ //無限ループ
printf("JH7UBC\r\n");
__delay_ms(500);
}
}
----------------------------------------------------------
ヘッダファイル serial.h です。
今回は、プロトタイプ宣言だけにしました。
----------------------------------------------------------
/*
* File: serial.h
* Author: JH7UBC Keiji Hata
* Created on 2018/11/19
*/
* File: serial.h
* Author: JH7UBC Keiji Hata
* Created on 2018/11/19
*/
#ifndef SERIAL_H
#define SERIAL_H
#define SERIAL_H
/*プロトタイプ宣言*/
void serial_init();
void putch(unsigned char);
unsigned char getch();
unsigned char getche();
void serial_init();
void putch(unsigned char);
unsigned char getch();
unsigned char getche();
#endif /* SERIAL_H */
----------------------------------------------------------
ソースファイル serial.c です。
----------------------------------------------------------
/*
* serial.c
* シリアル通信関係関数
*/
* serial.c
* シリアル通信関係関数
*/
#include <xc.h>
#include <stdio.h>
#include "serial.h"
/*シリアル通信設定*/
void serial_init(){
TXSTA = 0x24; //非同期 高速
RCSTA = 0x90; //非同期 継続受信可
SPBRG = 51; //クロック8MHz 9600bps
}
/*1文字送信*/
void putch(unsigned char byte){
while(!TXIF); //TXIFが1になるまで待つ
TXREG = byte; //1文字送信
}
void putch(unsigned char byte){
while(!TXIF); //TXIFが1になるまで待つ
TXREG = byte; //1文字送信
}
/*1文字受信*/
unsigned char getch(){
while(!RCIF); //RCIFが1になるまで待つ
return RCREG; //1文字受信
}
unsigned char getch(){
while(!RCIF); //RCIFが1になるまで待つ
return RCREG; //1文字受信
}
/*エコーバック付き入力*/
unsigned char getche(){
unsigned char c;
c = getch();
putch(c);
return c;
}
unsigned char getche(){
unsigned char c;
c = getch();
putch(c);
return c;
}
----------------------------------------------------------
それぞれのファイルは、MPLABXでは、つぎのように配置して、コンパイルしました。
しかし、それぞれのファイルをmain.cと同じ場所においてもコンパイルしてもOKでした。この辺がまだよくわかっていません。
TeraTermには、0.5秒ごとにJH7UBCが表示されます。