共4条
1/1 1 跳转至页
求助,关于模拟串口的C程序问题

问
/******************************************************************
器件:Atmega8
编译器:ICCAVR6.26A
文件:模拟串口接收
******************************************************************/
/*说明:串行信号发送到(INT1)PD3,利用INT1外部中断和一个定时器timer1来达到接收信号的目的.有下降沿信号在INT1触发中断后,启动T1定时器,同时关闭此INT1外部中断,根据模拟串口的波特率,不断扫描INT1的电平,每位扫描3次,取2次相同的电平,得到该位的值,识别启动位数据位,奇偶校验位.取出八位数据位整合为一个字节,存入模拟串口接收寄存器,并启动模拟接收标志位Rx_m_flag,在其它定时器里处理*/
void int1_isr(void)
{
if((MCSR&(1<<WFST))!=0&&((PIND&0x08)==0)) //(1)
{
CLTBIT(GICR,INT1);
SETBIT(TIMSK,TOIE1);
SETBIT(TIFR,TOV1);
}
}
//注(1):MCSR 为一个uchar, 用作在通讯时的状态指示,WFST是Wait_for_Start指示
void rx_isr(void)
{
if((PIND&0x08)==0)
CTL++;
else
CTH++;
if(CTH+CTL>MAXDETECT-1) //MAXDETECT 为三次
{
Bit[CTB]=CTH>CTL?1:0;
CTH=0;
CTL=0;
if(CTB==0&&Bit[0]!=0)//启始位错误
{
CTB=9;
}
else if(CTB==9) //偶校验
{
if(!((XOFF%2==0&&Bit[CTB]==0)||
(XOFF%2!=0&&Bit[CTB]!=0)))
{ //错误
//错误处理
}
else
{
Rx_m_data=Bit[1]+Bit[2]<<1+Bit[3]<<2+Bit[4]<<3
+Bit[5]<<4+Bit[6]<<5+Bit[7]<<6+Bit[8]<<7;
RX_M_BUFF[RX_M_HEAD]=Rx_m_data
RX_M_HEAD++;
Rx_m_flag=1;
}
XOFF=0;
}
else if(Bit[CTB]>0)
XOFF++; //偶校验记数
if(++CTB>9)
{
CTB=0;
CLTBIT(TIMSK,TOIE1);
SETBIT(GICR,INT1);
CLTBIT(MCSR,WFST);
}
}
}
void timer1_init(void)
{
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1=336; //波特率 为 7182(非标)
}
void timer1_ovf_isr(void)
{
TCNT1=336;
CLI();
rx_isr();
SEI();
}
请各位高手看一下到底是什么问题,我头都痛了,谢谢大家 答 1: 另外,喂狗在另一个定时器里
器件:Atmega8
编译器:ICCAVR6.26A
文件:模拟串口接收
******************************************************************/
/*说明:串行信号发送到(INT1)PD3,利用INT1外部中断和一个定时器timer1来达到接收信号的目的.有下降沿信号在INT1触发中断后,启动T1定时器,同时关闭此INT1外部中断,根据模拟串口的波特率,不断扫描INT1的电平,每位扫描3次,取2次相同的电平,得到该位的值,识别启动位数据位,奇偶校验位.取出八位数据位整合为一个字节,存入模拟串口接收寄存器,并启动模拟接收标志位Rx_m_flag,在其它定时器里处理*/
void int1_isr(void)
{
if((MCSR&(1<<WFST))!=0&&((PIND&0x08)==0)) //(1)
{
CLTBIT(GICR,INT1);
SETBIT(TIMSK,TOIE1);
SETBIT(TIFR,TOV1);
}
}
//注(1):MCSR 为一个uchar, 用作在通讯时的状态指示,WFST是Wait_for_Start指示
void rx_isr(void)
{
if((PIND&0x08)==0)
CTL++;
else
CTH++;
if(CTH+CTL>MAXDETECT-1) //MAXDETECT 为三次
{
Bit[CTB]=CTH>CTL?1:0;
CTH=0;
CTL=0;
if(CTB==0&&Bit[0]!=0)//启始位错误
{
CTB=9;
}
else if(CTB==9) //偶校验
{
if(!((XOFF%2==0&&Bit[CTB]==0)||
(XOFF%2!=0&&Bit[CTB]!=0)))
{ //错误
//错误处理
}
else
{
Rx_m_data=Bit[1]+Bit[2]<<1+Bit[3]<<2+Bit[4]<<3
+Bit[5]<<4+Bit[6]<<5+Bit[7]<<6+Bit[8]<<7;
RX_M_BUFF[RX_M_HEAD]=Rx_m_data
RX_M_HEAD++;
Rx_m_flag=1;
}
XOFF=0;
}
else if(Bit[CTB]>0)
XOFF++; //偶校验记数
if(++CTB>9)
{
CTB=0;
CLTBIT(TIMSK,TOIE1);
SETBIT(GICR,INT1);
CLTBIT(MCSR,WFST);
}
}
}
void timer1_init(void)
{
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1=336; //波特率 为 7182(非标)
}
void timer1_ovf_isr(void)
{
TCNT1=336;
CLI();
rx_isr();
SEI();
}
请各位高手看一下到底是什么问题,我头都痛了,谢谢大家 答 1: 另外,喂狗在另一个定时器里
共4条
1/1 1 跳转至页
回复
打赏帖 | |
---|---|
汽车+汽车地线之间连接处理被打赏20分 | |
【Zephyr】使用Zephyr外设初始化过程解析被打赏30分 | |
【S32K146】S32DS watchdog 配置使用被打赏20分 | |
【Zephyr】使用 IAR 调试 Zephyr 镜像被打赏20分 | |
赚取电动螺丝刀+电源电路理论知识分享1被打赏5分 | |
我想要一部加热台+分享常见运算放大器电路的应用被打赏5分 | |
【Zephyr】MCXN947 Zephyr 开发入门适配shell被打赏20分 | |
我想要一部加热台+常见的MOS管驱动电路被打赏5分 | |
【我要开发板】6.联合MATLAB记录数据被打赏50分 | |
【换取手持数字示波器】MicrochipMPLABHarmony框架下串口调试printf输出记录被打赏29分 |