共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网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |