共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 跳转至页
回复
有奖活动 | |
---|---|
【EEPW电子工程师创研计划】技术变现通道已开启~ | |
发原创文章 【每月瓜分千元赏金 凭实力攒钱买好礼~】 | |
【EEPW在线】E起听工程师的声音! | |
“我踩过的那些坑”主题活动——第001期 | |
高校联络员开始招募啦!有惊喜!! | |
【工程师专属福利】每天30秒,积分轻松拿!EEPW宠粉打卡计划启动! | |
送您一块开发板,2025年“我要开发板活动”又开始了! | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
【我踩过的那些坑】结构堵孔导致的喇叭无声问题被打赏50分 | |
电流检测模块MAX4080S被打赏10分 | |
【我踩过的那些坑】calloc和malloc错误使用导致跑飞问题排查被打赏50分 | |
多组DCTODC电源方案被打赏50分 | |
【我踩过的那些坑】STM32cubeMX软件的使用过程中的“坑”被打赏50分 | |
新手必看!C语言精华知识:表驱动法被打赏50分 | |
【我踩过的那些坑】杜绑线问题被打赏50分 | |
【我踩过的那些坑】STM32的硬件通讯调试过程的“坑”被打赏50分 | |
【我踩过的那些坑】晶振使用的问题被打赏100分 | |
【我踩过的那些坑】电感选型错误导致的处理器连接不上被打赏50分 |