KeitetsuWorks
KeitetsuWorks

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 公開開始