nobcha23の日記

PICマイコンやArduinoを使う電子回路遊びを紹介します

1827用UART関数

9600bps専用でできました。ポーリングで送信だけを使ってみましたので送信だけはデバッグ済。受信とか割り込みなどのチェックは後で。

注記
この関数を作ったのは「RTC-8564NBはMSSPを使いi2cでつながる」「SHT-11は独特TSシーケンスでBITBANG(ソフトでビット制御)でつながる」MSSPにデフォールトのIOを取られたので、EUSTATにはピン代替え割り当てコマンドAFPCON0,AFPCON1でTX,RXを別ぴンに持っていく。年月日時刻+RT+RHをアスキー9600ボーで出力したい。

//*******************************************
//   PIC16F1827 UART SUPPORT
//   Program Name :  uart.c
//   Programmer   :  nobcha
//   Program date :  Version 1.0  2014.05.18
//   History      :
//   Launguage    :  HI_TECH C Version 9.73
//*******************************************
//
#include <htc.h>
#define SIO_NORMAL 0
#define SIO_FAIL   1

//*****************************
//  Note for Initializing
//*****************************
// Set OSC (16MHz, IntOSC)
// OSCCON = 0b11111010;
// Set APFCON Register
//   APFCON0:RXDTSEL
//   APFCON1.TXCKSEL
//        APFCON0bits.RXDTSEL=1  ; RX ==> RB2
//        APFCON1bits.TXCKSEL=1  ; TX ==> RB5
//   APFCON0bits.RXDTSEL = 1;
//   APFCON0bits.TXCKSEL = 1;
//
// Initializing EUART
//	init_UART();

//*********************************************
//   Function  : init_UART
//   Title     : initializing EUSTAT
//   Input     : None
//   Output    : None
//   Note      : Fosc:16MHz, Baud Rate:9600BPS
//*********************************************
// TXSTA Register Setting  
//   b7 CSRC: 0 Don't care
//   b6 TX9:  0 Not 9bits
//   b5 TXEN: 1 Transmit ENable
//   b4 SYNC: 0 EUSART Asynchronous mode
//   b3 SENDB:0 No
//   b2 BRGH: 1 High Baud Rate Select
//   b1 TRMT: 0 TSR full
//   b0 TX9D: No Ninth bit 
// ********************************************
// RCSTA Register Setting  
//    b7 SPEN: 1 Serial Port ENable 
//    b6 RX9:  0 9-bit Receive Disable
//    b5 SREN: 0 Don't care
//    b4 CREN: 1 Continuous Receive ENable 
//    b3 ADDEN:0 Don't care
//    b2 FERR: 0 Framing Error bit (May be updated by reading RCREG register)
//    b1 OERR: 0 Overrun Error bit
//    b0 RX9D: Ninth bit of Received Data (Don't care)
// *********************************************
// BAUDCON Register Setting
//    b7 ABDOVF:0 Do'nt Auto-Baud Detect Overflow bit
//    b6 RCIDL: 0 If 1, Receive is Idle 
//    b5 Unimplemented: 0
//    b4 SCKP:  0 Transmit not inverted data
//    b3 BRG16: 1 16-bit Baud Rate Generator bit used (SPBRGH:SPBRG)
//    b2Unimplemented: 0
//    b1 WUE:   0 No Wake-up Enable bit
//    b0 ABDEN: Auto-Baud Detect Disable
// *********************************************
//  Setting BRG Register
//   BRG = 16000000(Hz)/4/9600(BPS)-1 ==> 416d ==> 0x1A0
// *********************************************
void init_UART(void){
    TXSTA = 0b00100100;
    RCSTA = 0b10010000;
    BAUDCON = 0b00001000;

    SPBRGH = 0x01;
    SPBRG  = 0xA0;
	APFCON0bits.RXDTSEL=1  ; 
	APFCON1bits.TXCKSEL=1  ; 
}

//**********************************************
//   Program       : get_UART
//   Title         : Recive from EUSTAT
//   Input         : RX data pointer
//   Output        : error flag
//**********************************************
char get_UART(unsigned char *rx_data){
   
// Waiting received by checking Flag
// Before checking Clear RCIF
    PIR1bits.RCIF = 0;

// Check RCIF
    while((PIR1bits.RCIF) == 0);
  
// Check error
   	if(RCSTAbits.FERR|RCSTAbits.OERR){ 	//RCSTA(FERR,OERR)  
        *rx_data = 0x00;
        return(SIO_FAIL);
    }

//  Return Recived Data
    *rx_data = RCREG;
    return(SIO_NORMAL);
}

//************************************************
//   Program       : put_UART
//   Title         : Sending data via EUSTAT
//   Input         : Transmitting data
//   Output        : Error flag
//************************************************
char put_UART(unsigned char tx_data){
//  Checking Send Flag
    while((TXSTA & 0x02) == 0x00); 	//0b00000010 TXSTA(TRMT)
 
//  Write data
 	TXREG = tx_data;
    return(SIO_NORMAL);
}

//*********************************************
//   Function : puts_UART
//   Title    : Send Data String via UART 
//   Input    : data pointer until 0x00
//   Output   : None
//*********************************************
void puts_UART(char *string){
    while(*string!=0x00){
       	put_UART(*string);
       	string++;
    }
}



この関数はPIC16F1829使用の「8−14−20DIP基板の試作と各種回路の試作その2」における温度湿度計に使いました。 

http://chitose6thplant.web.fc2.com/8_14_20p/8_14_20p_page_2.html