📄 uart._c
字号:
#include <iom88v.h>
#include <macros.h>
#include <uart.h>
#include <timer1.h>
void FlashRxBuf(void)
{
rx_error0 = 0;
rx_counter0 = 0;
rx_rd_index0 = 0;
FrameHead0 = 0;
}
//UART0 initialize
// desired baud rate: 9600
// actual: baud rate:9615 (0.2%)
// char size: 8 bit
// parity: Even
void uart0_init(void)
{
UCSR0B = 0x00; //disable while setting baud rate
UCSR0A = 0x00;
UCSR0C = 0x26;
UBRR0L = 0x33; //set baud rate lo
UBRR0H = 0x00; //set baud rate hi
UCSR0B = 0xD8;
FlashRxBuf();
}
char TestFrameHead(char data)
{
if(data == FRAMEFLAG1) //是否和设定的帧标志相等?有多种帧类型时,以或运算添加其他标志
return 1;
else
return 0;
}
// USART0 Receiver interrupt service routine
#pragma interrupt_handler uart0_rx_isr:iv_USART0_RXC
void uart0_rx_isr(void)
{
char status,data;
status=UCSR0A;
data=UDR0;
// putchar(251); //回传接收成功标志 debug
// putchar(251); //回传接收成功标志debug
// if(data == 0xFF) //DEBUG
// UDR0 = data; //DEBUG
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
if(FrameHead0 == 0 && rx_counter0 == 0) //判断是否帧头
{
if(TestFrameHead(data)) //数据有效才设置FrameHead
{
FrameHead0 = data;
}
}
else
{
rx_buffer0[rx_counter0]=data;
// putchar(251); //回传接收成功标志 debug
// putchar(251); //回传接收成功标志debug
if (++rx_counter0 == RX_BUFFER_SIZE0)
{
rx_counter0 = 0;
rx_error0 = 1;
}
}
}
else rx_error0 = 1 ;
}
// Get a character from the USART0 Receiver buffer
char getchar(void)
{
char data;
char IisOn = 1;
if((SREG & 0x80) == 0x00) //I之前是否置位
IisOn = 0;
while (rx_counter0==0);
data=rx_buffer0[rx_rd_index0];
if (++rx_rd_index0 == RX_BUFFER_SIZE0) rx_rd_index0=0;
CLI();
--rx_counter0;
if(IisOn)
SEI();
return data;
}
// USART0 Transmitter interrupt service routine
#pragma interrupt_handler uart0_tx_isr:iv_USART0_TXC
void uart0_tx_isr(void)
{
if (tx_counter0)
{
--tx_counter0;
UDR0=tx_buffer0[tx_rd_index0];
if (++tx_rd_index0 == TX_BUFFER_SIZE0) tx_rd_index0=0;
};
}
// Write a character to the USART0 Transmitter buffer
void putchar(char c)
{
char IisOn = 1;
if((SREG & 0x80) == 0x00) //I之前是否置位
IisOn = 0;
while (tx_counter0 == TX_BUFFER_SIZE0);
CLI();
if (tx_counter0 || ((UCSR0A & DATA_REGISTER_EMPTY)==0))
{
tx_buffer0[tx_wr_index0]=c;
if (++tx_wr_index0 == TX_BUFFER_SIZE0) tx_wr_index0=0;
++tx_counter0;
}
else
UDR0=c;
if(IisOn)
SEI();
}
void DisposeBufDatas(void)
{
//定义变量
unsigned char tPump1Cyc; //油泵1周期,单位ms
unsigned char tSpray1On; //喷射脉宽,单位0.1ms
//unsigned char tSpray1OnH;
unsigned int tSpray1Cyc; //喷射周期,单位ms
unsigned char tPump1On; //油泵1脉宽,单位0.1ms
char spray1NumL; //SprayNum低字节
char spray1NumH; //SprayNum高字节
unsigned char tPump2Cyc; //油泵2周期,单位ms
unsigned char tSpray2On; //喷射脉宽,单位0.1ms
unsigned int tSpray2Cyc; //喷射周期,单位ms
unsigned char tPump2On; //油泵2脉宽,单位0.1ms
char spray2NumL; //SprayNum低字节
char spray2NumH; //SprayNum高字节
char IisOn = 1;
if((SREG & 0x80) == 0x00) //I之前是否置位
IisOn = 0;
if(rx_error0) //接收错误
{
CLI();
putchar(SENDAGAIN);
putchar(SENDAGAIN);
if(IisOn)
SEI();
}
else
{
spray1NumL = getchar();
spray1NumH = getchar();
tSpray1On = getchar();
tSpray1Cyc = getchar();
tPump1Cyc = getchar();
tPump1On = getchar();
spray2NumL = getchar();
spray2NumH = getchar();
tSpray2On = getchar();
tSpray2Cyc = getchar();
tPump2Cyc = getchar();
tPump2On = getchar();
/************debug*****************/
//putchar(sprayNumL); //debug
//putchar(sprayNumH); //debug
// putchar(tPump1Cyc); //debug
//putchar(tSprayOn); //debug
//putchar(tSprayCyc); //debug
//putchar(tPivDelay); //debug
//**********************************/
//转换数据
Pump1Num = (int)spray1NumL + ((int)spray1NumH << 8);
PPump1Num = Pump1Num;
Spray1Num = Pump1Num ;
SSpray1Num = Spray1Num;
CPump1Cyc = tPump1Cyc * 1000-370;//修正0.37ms
CPump1CycH = (CPump1Cyc >> 8);
CSpray1On = (unsigned int)(tSpray1On * 100 );
CSpray1Cyc = (unsigned long )tSpray1Cyc * 1000 ;
CPump1On = tPump1On * 1000;
CPump1OnH = (CPump1On >> 8);
Spray2Num = (int)spray2NumL + ((int)spray2NumH << 8);
Pump2Num = Spray2Num;
PPump2Num = Pump2Num;
SSpray2Num = Spray2Num;
//Pump2Num = Pump1Num;
CPump2Cyc = tPump2Cyc * 1000 -350;
//CPump2Cyc = CPump1Cyc;
CPump2CycH = (CPump2Cyc >> 8);
//CPump2CycH =CPump1CycH ;
CSpray2On = (unsigned int)(tSpray2On * 100 );
CSpray2Cyc = (unsigned long )tSpray2Cyc * 1000 ;
CPump2On = tPump2On * 1000 -200;
//CPump2On = CPump1On;
CPump2OnH = (CPump2On >> 8);
//CPump2OnH = CPump1OnH;
HighByte1 = (unsigned char )(CSpray1Cyc >> 16);
HighByte2 = (unsigned char )(CSpray2Cyc >> 16);
CLI(); //禁止中断,保证以下发送的两字节连续
putchar(REVSUCCEED); //回传接收成功标志
putchar(REVSUCCEED); //回传接收成功标志
if(IisOn)
SEI();
}
FlashRxBuf();
}//DisposeBufDatas(void)结束
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -