16F88 XC8開発例 - 調歩同期式シリアル通信(AUSARTモジュール)
はじめに
本ページでは,PIC16F88とMPLAB XC8 C Compilerを使用した開発例として,調歩同期式シリアル通信を行う方法を紹介します. 調歩同期式シリアル通信には,PIC16F88に搭載されているAUSARTモジュールを使用しています. 今回はPIC16F88を使用していますが,同様のAUSARTモジュールやUSARTモジュールが搭載されている,PIC12FおよびPIC16Fシリーズでも下記のプログラムを応用可能です.
下記の環境で動作を確認しておりますが,動作を保証するものではありません. 掲載情報は自己責任の上でご利用ください.
PIC | 16F88-I/P |
---|---|
MPLAB X IDE | MPLAB X IDE v2.26 |
MPLAB XC8 | MPLAB XC8 C Compiler v1.32 |
PICkit 2 | MPLAB X IDEを使用して書込み |
通信仕様
通信仕様は下表のとおりです. ターミナルソフトウェアの設定変更を忘れないようにしてください.
ボーレート | 9,600 bps |
---|---|
データビット | 8 bit |
パリティビット | なし |
ストップビット | 1 bit |
フロー制御 | なし |
回路
回路図
今回はブレッドボード上に回路を組むことにしました. PICkit 2によるICSP (In Circuit Serial Programming)と電源供給を行うことし,回路部品数を必要最低限に抑えています.
USBシリアル変換モジュールを用いて,PICとパソコンとの間で調歩同期式シリアル通信を行います. 事前に,USBシリアル変換モジュールのドライバや,Tera Termなどのターミナルソフトウェアのインストールを完了しておきましょう.
回路部品
上記の回路図中で使用している回路部品のリストです. 参考単価は,特に記載がない限り,秋月電子通商で購入した場合のものです.
番号 | 部品名 | 型番 | 数量 | 参考単価 |
---|---|---|---|---|
U1 | PICマイコン | Microchip 16F88-I/P | 1 | 200円 |
U2 | USBシリアル変換 モジュールキット |
秋月電子通商 AE-UM232R | 1 | 800円 |
X1 | セラロック | 村田製作所 20MHz | 1 | 30円 |
LED1 | LED | 各社 各色 | 1 | 10円 |
R1 | 炭素皮膜抵抗 | 各社 1/4W 10kΩ | 1 | 1円 |
R2 | 炭素皮膜抵抗 | 各社 1/4W 330Ω | 1 | 1円 |
その他 | リード線など | 適量 |
プログラム
概要
このプログラムはMPLAB XC8 C Compiler向けです.Cコンパイラの種類にご注意ください. プログラムの作成にあたり,下記のWebページを参考にしました.
回路の電源を投入すると,パソコンのターミナルソフトウェア上に,PICから受信した「Press a key:」という文字列が表示されます. パソコンのキーボードの英数字キーを押下すると,ターミナルソフトウェア上に「Echo: 」に続いて1文字ずつ文字が表示されます. また,文字のキャラクタコードの最下位bitに応じて,回路のLEDが点滅します.
main.c
下記はソースファイル「main.c」です.
#include <xc.h>
#include <stdio.h>
#include "uart.h"
// 16F88
// CONFIG1
#pragma config FOSC = HS
#pragma config WDTE = OFF
#pragma config PWRTE = ON
#pragma config MCLRE = ON
#pragma config BOREN = ON
#pragma config LVP = OFF
#pragma config CPD = OFF
#pragma config WRT = OFF
#pragma config CCPMX = RB3
#pragma config CP = OFF
// CONFIG2
#pragma config FCMEN = OFF
#pragma config IESO = OFF
void main(void)
{
char work;
PORTA = 0x00; // PORTAを初期化
PORTB = 0x00; // PORTBを初期化
TRISA = 0b00000000; // PORTAの入出力設定
TRISB = 0b00000100; // PORTBの入出力設定
initUART(); // 調歩同期式シリアル通信設定
printf("Press a key:\r\n");
while (1) {
work = getch();
printf("Echo: %c\r\n", work);
PORTB = work & 0x01;
}
}
uart.h
下記はヘッダファイル「uart.h」です.
#ifndef __UART_H__
#define __UART_H__
#ifndef _XTAL_FREQ
#define _XTAL_FREQ 20000000 // 20MHz
#endif
#define BAUDRATE 9600 // 9.6kbps
#define TX9_RX9_BIT 0 // 0: 8bit, 1: 9bit
#define BRGH_BIT 1 // 0: 低速サンプル指定, 1: 高速サンプル指定
#if TX9_RX9_BIT == 1
#define TX9_RX9_DATA 0x40
#else
#define TX9_RX9_DATA 0x00
#endif
#if BRGH_BIT == 1
#define BRGH_DATA 0x04
#define SPBRG_DATA ((unsigned char)(((_XTAL_FREQ / 16) / BAUDRATE) - 1))
#else
#define BRGH_DATA 0x00
#define SPBRG_DATA ((unsigned char)(((_XTAL_FREQ / 64) / BAUDRATE) - 1))
#endif
// プロトタイプ宣言
void initUART();
void putch(unsigned char byte);
unsigned char getch();
unsigned char getche();
#endif // __UART_H__
uart.c
下記はソースファイル「uart.c」です.
#include <xc.h>
#include <stdio.h>
#include "uart.h"
void initUART()
{
SPBRG = SPBRG_DATA;
TXSTA = (TX9_RX9_DATA | BRGH_DATA | 0x20);
RCSTA = (TX9_RX9_DATA | 0x90);
}
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;
}
更新履歴
日付 | 内容 |
---|---|
2014/11/30 | 公開開始 |