0 ATMEGA16模拟串口的问题 - 单片机论坛,单片机技术交流论坛 - 21ic电子技术开发论坛
打印
[AVR单片机]

ATMEGA16模拟串口的问题

[复制链接]
2044|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lbdyxk|  楼主 | 2013-3-4 11:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
由于片子的串口模块不够,需要GPIO模拟一个出来,系统使用16MHz晶振,波特率1200,但是尝试发送
数组元素0X0D,串口监控始终只能收到06的不断循环。不知道是因为延时问题还是什么原因造成的,请高手指点,非常感谢

这个是我的部分代码
#define WRDYN 2663 //写延时
/************************微秒级精确延时函数*************************
晶振16M,一个时钟周期0.0625us:      
Delay = 0.0625 * ((u*5-1)+10)微秒,用t表示时钟数,
其中4包括了每次减一循环包括的subi 1t,sbci 1t,nop 1t,brne 2t/1t,
brne指令在当判断条件不成立时是单周期
最后一次判断只有1个周期,需要减一;
10包括了调用方的 r16 赋值 1t,r17赋值1t,
rcall 3t,nop 1t,ret 4t,
简化计算 = 0.3125u + 0.5625 ,单位微秒
*******************************************************************************/
void exactdelay(uint u)
{
        asm("_d0:subi R16,1");//一个时钟周期1t
        asm("sbci R17,0");    //一个时钟周期1t
        _NOP();               //一个时钟周期1t
        asm("brne _d0");      //判断条件成立时两个周期2t,不成立时单周期1t
        _NOP();               //一个时钟周期1t
        asm("ret");           //4t
}
//往串口写一个字节
void putchar(uchar input)
{
        uchar i;
        CLI();
        PORTC &= ~(BIT(PC0)); //发送启始位
        exactdelay(WRDYN);//延时832.75us
        //发送8位数据位
        for(i = 0;i < 8;i ++)
        {
                input = (input >> 1);
                if(input & 0x01)
                        PORTC |= BIT(PC0);
                else
                        PORTC &= ~(BIT(PC0));       
                exactdelay(WRDYN);
        }
        //发送校验位(无)
       
        PORTC |= BIT(PC0); //发送结束位
        exactdelay(WRDYN);
        SEI();
}
/*******************************************************************************
                                                                主程序
*******************************************************************************/
void main(void)
{
        uchar j;
        SYS_Init();                                                                        //系统初始化
        while(1)
        {
                WDR();
                for(j = 0;j < 10;j ++)
                {       
                        putchar(MCU_TX_ARRAY[0][0]);       
                                                //这里为了查看发送是否成功,每次只发送同一字节       
                        exactdelay(WRDYN);
                }
                exactdelay(50000);  //随手写的
        }
}

相关帖子

沙发
fp123123| | 2013-3-4 11:39 | 只看该作者
在这个基础上改吧,都做得很完善的了,只需要把寄存器改改,就可以在M16上用,比自己从头开始好多了

http://arduiniana.org/libraries/newsoftserial/

使用特权

评论回复
评分
参与人数 1威望 +2 收起 理由
qin552011373 + 2 很给力!
板凳
lbdyxk|  楼主 | 2013-3-4 12:11 | 只看该作者
本帖最后由 lbdyxk 于 2013-3-4 12:12 编辑

这是我用串口监控收到的数据:(
[10:50:41 --- Rx] 06 06
[10:50:41  25 Rx] 06
[10:50:41  24 Rx] 06 06
[10:50:41  27 Rx] 06 06
[10:50:41  28 Rx] 06
[10:50:41  27 Rx] 06 06
[10:50:41  29 Rx] 06
[10:50:41  29 Rx] 06 06
[10:50:41  30 Rx] 06 06
[10:50:41  32 Rx] 06
[10:50:41  32 Rx] 06 06
[10:50:41  33 Rx] 06 06
[10:50:41  35 Rx] 86 F0
[10:50:42  35 Rx] 06 06

使用特权

评论回复
地板
lbdyxk|  楼主 | 2013-3-4 12:11 | 只看该作者
fp123123 发表于 2013-3-4 11:39
在这个基础上改吧,都做得很完善的了,只需要把寄存器改改,就可以在M16上用,比自己从头开始好多了

http: ...

正在研究可行性,感谢分享

使用特权

评论回复
5
lbdyxk|  楼主 | 2013-3-7 16:14 | 只看该作者
精确延时函数有局限性,特定操作才能实现设定的精确延时,还是用while循环方式延时解决了这个问题,归根到底就是个时序问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

5

主题

16

帖子

0

粉丝