PIC 16F1827 ENHANCED UNIVERSAL SYNCHRONOUS ASYNCHRONOUS RECEIVER TRANSMITTER (EUSART) 簡易送信使用例(備忘録)
PIC 16F1827 の EUSART の簡易な送信機能のみの使用例です。
PICの初期化のベースは「PIC 16F1827,16F8313 A/D利用向け初期化例(備忘録)」を使用しています。
RB5をTXとして使用しています。
■主要部分抜粋
下図は検証用に使用した回路です。
PIC 11ピン(RB5)がEUSARTの送信用出力ピンです。
RB5(TX)から送信されたデータは下図の通りです。
下図は送信データをPCで受け、EUSART_Write(0x01); EUSART_Write(rand()%255);で送信されたものを一組の2Byteデータとして扱い、グラフ化したものです。ランダムな変化を確認しています。
PICの初期化のベースは「PIC 16F1827,16F8313 A/D利用向け初期化例(備忘録)」を使用しています。
RB5をTXとして使用しています。
■主要部分抜粋
//main.c
EUSART_Initialize();
EUSART_Enable();
EUSART_TransmitEnable();
HSSync; //動作確認テスト用 本来不要
while(true){
while (EUSART_IsTxReady() == false){} EUSART_Write(0x01); //送信バッファ空きを待ち、1Byte送信
while (EUSART_IsTxReady() == false){} EUSART_Write(rand()%255); //送信バッファ空きを待ち、1Byte送信
}
//uart.c EUARTをuartと省略しています。
//UART関連レジスタ設定
void EUSART_Initialize(void){
//ビット 4 SCKP: 同期クロック極性選択ビット
//非同期モード:
// 1 = RB7/TX/CKピンへの反転データ送信
// 0 = RB7/TX/CK 端子に非反転データを送信する。
BAUDCONbits.SCKP = 0;
//ビット3 BRG16:16ビット・ボーレート・ジェネレータ・ビット
// 1 = 16ビット・ボーレート・ジェネレーターが使用される
// 0 = 8ビット・ボーレート発生器が使用される
BAUDCONbits.BRG16= 0; //将来、自動設定するかもしれない。
// bit 1 WUE:ウェイクアップイネーブルビット
//非同期モード:
// 1 = 受信機は立ち下がりエッジを待っている。
//キャラクタは受信されず、バイト RCIF が設定される。
//RCIF が設定された後、WUE は自動的にクリアされます。
// 0 = 受信機は正常に動作しています。
//同期モード:
// 気にしない
// BAUDCONbits.WUE = 0; //R/Wではあるが、設定不要と思われる。
//ビット 0 ABDEN: 自動ボー検出イネーブルビット
//非同期モード:
// 1 = 自動ボー検出モードが有効(自動ボーが完了するとクリアされる)
// 0 = オートボー検出モード無効
//同期モード:
// 気にしない
BAUDCONbits.ABDEN = 0;
//bit 7 SPEN:シリアルポートイネーブルビット
// 1 = シリアルポートイネーブル(RX/DTおよびTX/CKピンをシリアルポートピンとして設定)
// 0 = シリアルポートディセーブル(リセット状態に保持)
RCSTAbits.SPEN = 1;
//bit 6 RX9: 9ビット受信イネーブル bit
// 1 = 9ビット受信を選択
// 0 = 8ビット受信を選択
RCSTAbits.RX9 = 0;
//bit 5 SREN: シングル受信イネーブルビット
//非同期モード:
// 気にしない
//
//同期モード - マスター:
// 1 = シングル受信を有効にする
// 0 = シングル受信無効
//このビットは受信完了後にクリアされる。
// RCSTAbits.SREN = //非同期のため無設定
//ビット4 CREN: 連続受信イネーブルビット
//非同期モード:
// 1 = 受信可能
// 0 = レシーバー無効
//同期モード:
// 1 = イネーブルビット CREN がクリアされるまで連続受信を有効にする(CREN は SREN より優先される)
// 0 = 連続受信を禁止
RCSTAbits.CREN = 0; //用途によって変更する事
//ビット 3 ADDEN: アドレス検出イネーブルビット
//非同期モード 9 ビット(RX9 = 1):
// 1 = アドレス検出を有効にし、割り込みを有効にし、RSR<8>が設定されているときに受信バッファをロードする。
// 0 = アドレス検出を無効、全バイトを受信、9ビット目をパリティ・ビットとして使用可能
//非同期モード8ビット(RX9 = 0):
// 気にしない
RCSTAbits.ADDEN = 0; //用途によって変更する事
//ボーレート・ジェネレーター(BRG)
// SPBRGH:SPBRGL x = (Fosc/Desired Baud Rate)/64) - 1;
// 32MHz 19.2K の場合 25.04166
// SPBRGL = 25;
// SPBRGL = 12; //38.4k
// SPBRGL = 3; //57.6K (55.55K))
// SPBRGL = 1; //250000
SPBRGL = 1; //250000
SPBRGH = 0;
//ビット 7 CSRC: クロックソース選択ビット
//非同期モード:
//気にしない
//同期モード:
// 1 = マスター・モード(BRGから内部で生成されたクロック)
// 0 = スレーブモード (外部クロック)
TXSTAbits.CSRC = 0;
//ビット6 TX9:9ビット送信イネーブルビット
// 1 = 9ビット送信を選択
// 0 = 8ビット送信を選択
TXSTAbits.TX9 = 0;
//ビット5 TXEN:送信イネーブルビット(1)
// 1 = 送信イネーブル
// 0 = 送信無効
TXSTAbits.TXEN = 0;
//注1:同期モードではSREN/CRENがTXENより優先される
//ビット4 SYNC: EUSARTモード選択ビット
// 1 = 同期モード
// 0 = 非同期モード
TXSTAbits.SYNC = 0;
//ビット2 BRGH:高ボーレート選択ビット
//非同期モード:
// 1 = 高速
// 0 = 低速
//同期モード:
// このモードでは未使用
TXSTAbits.BRGH = 0;
//bit 7 RXDTSEL: Pin Selection bit
//0 = RX/DT function is on RB1
//1 = RX/DT function is on RB2
APFCON0bits.RXDTSEL = 1;
//bit 0 TXCKSEL: Pin Selection bit
//0 = TX/CK function is on RB2
//1 = TX/CK function is on RB5
APFCON1bits.TXCKSEL = 1;
}
void EUSART_Enable(void)
{
RCSTAbits.SPEN = 1;
}
void EUSART_TransmitEnable(void)
{
TXSTAbits.TXEN = 1;
}
bool EUSART_IsTxReady(void)
{
//TXIFビットは読み出し専用で、ソフトウェアで設定または解除することはできません。
return (bool)(PIR1bits.TXIF && TXSTAbits.TXEN);
}
void EUSART_Write(uint8_t txData)
{
TXREG = txData;
}
//HSSend.h
#define HSSync while (EUSART_IsTxReady() == false){} EUSART_Write(0x02); while (EUSART_IsTxReady() == false){} EUSART_Write(0xD5);
下図は検証用に使用した回路です。
PIC 11ピン(RB5)がEUSARTの送信用出力ピンです。
RB5(TX)から送信されたデータは下図の通りです。
下図は送信データをPCで受け、EUSART_Write(0x01); EUSART_Write(rand()%255);で送信されたものを一組の2Byteデータとして扱い、グラフ化したものです。ランダムな変化を確認しています。