共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 跳转至页
回复
打赏帖 | |
---|---|
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏10分 | |
【我踩过的那些坑】DRC使用位置错误导致的问题被打赏100分 | |
我踩过的那些坑之混合OTL功放与落地音箱被打赏50分 | |
汽车电子中巡航控制系统的使用被打赏10分 | |
【我踩过的那些坑】工作那些年踩过的记忆深刻的坑被打赏100分 | |
分享汽车电子中巡航控制系统知识被打赏10分 | |
分享安全气囊系统的检修注意事项被打赏10分 | |
分享电子控制安全气囊计算机知识点被打赏10分 | |
【分享开发笔记,赚取电动螺丝刀】【OZONE】使用方法总结被打赏20分 | |
【分享开发笔记,赚取电动螺丝刀】【S32K314】芯片启动流程分析被打赏40分 |