Понедельник, Сентябрь 21, 2020

RS-232 с использованием USART

#include<16f628a.H>
#use    delay(clock=4000000)
#fuses  INTRC_IO,NOWDT,NOMCLR,NOPROTECT,NOCPD,NOBROWNOUT
#use    fast_io(A)
#use    rs232(BAUD=9600,parity=N,XMIT=PIN_B2,RCV=PIN_B1)
#define USART_RX_BUFFER_SIZE 16
#define USART_RX_BUFFER_MASK (USART_RX_BUFFER_SIZE-1)
#define USART_TX_BUFFER_SIZE 32
#define USART_TX_BUFFER_MASK (USART_TX_BUFFER_SIZE-1)
#byte   RCREG=0x1A
#byte   TXREG=0x19
int8    USART_RxBuf[USART_RX_BUFFER_SIZE];
int8    USART_TxBuf[USART_TX_BUFFER_SIZE];
int8    USART_TxHead,USART_TxTail,USART_RxHead,USART_RxTail;
int8    recvchar(void);
int8    sendchar(int8 data);
int8    CharInQueue(void);

void main()
{
    setup_comparator(NC_NC_NC_NC);
   
    USART_TxHead=0x00;
    USART_TxTail=0x00;
    USART_RxHead=0x00;
    USART_RxTail=0x00;
    int8 x;
    for(x=0;x<USART_RX_BUFFER_SIZE;++x)
        USART_RxBuf[x]='R';
    for(x=0;x<USART_TX_BUFFER_SIZE;++x)
        USART_TxBuf[x]='T';
    enable_interrupts(INT_RDA);
    enable_interrupts(global);
    printf("test\r");
    while(TRUE){
        while(!(CharInQueue()));
        sendchar(recvchar());
        
    }
}

#int_RDA
void USART_RX_interrupt(void)
{
    int8 data;
    int8 tmphead;
    data=RCREG;
    tmphead=(USART_RxHead+1)&USART_RX_BUFFER_MASK;
    USART_RxHead=tmphead;
    if(tmphead==USART_RxTail){
    
    }    
    USART_RxBuf[tmphead]=data;
}
#int_TBE
void USART_TX_interrupt(void)
{
    int8 tmptail;
    if(USART_TxHead!=USART_TxTail)
    {
        tmptail=(USART_TxTail+1)&USART_TX_BUFFER_MASK;
        USART_TxTail=tmptail;
        TXREG=USART_TxBuf[tmptail];
    }
    else
    {    
        disable_interrupts(INT_TBE);
    }
}
int8    recvchar(void)
{
    int8 tmptail;
    while(USART_RxHead==USART_RxTail);
    tmptail=(USART_RxTail+1)&USART_RX_BUFFER_MASK;
    USART_RxTail=tmptail;
    return USART_RxBuf[tmptail];
}
int8    sendchar(int8 data)
{
    int8 tmphead;
    tmphead=(USART_TxHead+1)&USART_TX_BUFFER_MASK;
    while(tmphead==USART_TxTail);
    USART_TxBuf[tmphead]=(int8)data;
    USART_TxHead=tmphead;
    enable_interrupts(INT_TBE);
    return data;
}    
int8    CharInQueue(void)
{
    if(USART_RxHead==USART_RxTail)
        return 0;
    else
        return 1;
}



НАЗАД                                                                                                                                         ДАЛЕЕ


Back to Top