搜索
bottom↓
回复: 11

第2贴. 串口....

[复制链接]

出0入0汤圆

发表于 2012-4-21 11:12:06 | 显示全部楼层 |阅读模式
用网站的最新例子....  将Makefile 文件里的 头文件路径改成自己的 -I"D:/WinAVR-20100110/avr/include/avr" .
编译很顺利.

直接例子什么也不改, 什么数据也没有......
还好, 自己工作, 一直都是用一个外搭的串口芯片, 使用杜邦线连接...

数据出来了, 但是内部振荡器, 输出是乱码.....

改外部18.432MHz晶振, 增加了串口驱动里的 18.432 晶振支持. 改 115200bps

改了下串口发送中断程序:

/*
* @fn static void Smpl_DrvUART0_TXHandle(void)
*/
static void Smpl_DrvUART0_TXHandle(void)
{
        unsigned char txdata = Smpl_SendBuf0[Smpl_SendIndex0];
        if(txdata)
        {
                UDR0 = txdata;
                 //if(Smpl_SendIndex0 >= SMPL_SEND_NUM)
            //        DrvUSART_DisableInt(USART_INT_TXC);
            
            Smpl_SendBuf0[Smpl_SendIndex0] = 0;
                Smpl_SendIndex0++;
        }
        else
        {
                Smpl_SendIndex0 = 0;
        }
}

TXD 引脚外加了一个上拉.... 防止上电IO抖动. OK, 数据出来了.


-----------------------------------------
--- UART Test
--- Press any key for test
-----------------------------------------

=>LogicGreen ShenZhen

--------------------------------------------------------------------------

解决自带串口问题....

首先发现, 原理图是不是有点问题? 串口的 C4 电容是接 2 脚和地吧? 这里接 VCC了.

割线搭线....悲催的发现 VCC 与 地 短接了......

找了一会儿, 不知道哪问题, 干脆把板上芯片去掉了. 用杜邦线外接...





买了两块板子.....
一块绿色, 一块红色. 电路有些不一样....

绿色的就是上面一直在用的.


红色的, 一插电源. 直接 啪 一声.... 没反应了.
经确认是LED 471 怎么是短路的, LED挂了. 把 471 和 LED都换了.正常!!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2012-4-21 11:31:20 | 显示全部楼层
红板和绿板 唯一的区别是:红板串口是5V供电,绿板是两个二极管降压之后3.6V供电,其他完全一样。 C4是接2脚和电源,C5接6脚和地。

出0入0汤圆

发表于 2012-4-21 11:32:08 | 显示全部楼层
本帖最后由 logicgreen 于 2012-4-21 11:33 编辑

绿板和红板的区别是:
上面说的。颜色不同。。。

出0入0汤圆

发表于 2012-4-21 11:36:30 | 显示全部楼层
“数据出来了, 但是内部振荡器, 输出是乱码.....”

串口例程里有对RC进行校准的操作, “OSCCAL = 0xa;”
早期发出的芯片RC可能是没有校准的, 根据我们的经验, 可以试试OSCCAL = 0x6;

出0入0汤圆

 楼主| 发表于 2012-4-21 16:33:30 | 显示全部楼层
使用外部晶振, 18.432MHz. 115200bps. 简单测试了下收发稳定性.

PC每帧发送下面512个字节:
00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F 30 31 32 33 34 35 36 37 38 39 3A 3B 3C 3D 3E 3F 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F 60 61 62 63 64 65 66 67 68 69 6A 6B 6C 6D 6E 6F 70 71 72 73 74 75 76 77 78 79 7A 7B 7C 7D 7E 7F 80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7 E8 E9 EA EB EC ED EE EF F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF FF FE FD FC FB FA F9 F8 F7 F6 F5 F4 F3 F2 F1 F0 EF EE ED EC EB EA E9 E8 E7 E6 E5 E4 E3 E2 E1 E0 DF DE DD DC DB DA D9 D8 D7 D6 D5 D4 D3 D2 D1 D0 CF CE CD CC CB CA C9 C8 C7 C6 C5 C4 C3 C2 C1 C0 BF BE BD BC BB BA B9 B8 B7 B6 B5 B4 B3 B2 B1 B0 AF AE AD AC AB AA A9 A8 A7 A6 A5 A4 A3 A2 A1 A0 9F 9E 9D 9C 9B 9A 99 98 97 96 95 94 93 92 91 90 8F 8E 8D 8C 8B 8A 89 88 87 86 85 84 83 82 81 80 7F 7E 7D 7C 7B 7A 79 78 77 76 75 74 73 72 71 70 6F 6E 6D 6C 6B 6A 69 68 67 66 65 64 63 62 61 60 5F 5E 5D 5C 5B 5A 59 58 57 56 55 54 53 52 51 50 4F 4E 4D 4C 4B 4A 49 48 47 46 45 44 43 42 41 40 3F 3E 3D 3C 3B 3A 39 38 37 36 35 34 33 32 31 30 2F 2E 2D 2C 2B 2A 29 28 27 26 25 24 23 22 21 20 1F 1E 1D 1C 1B 1A 19 18 17 16 15 14 13 12 11 10 0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00

让计算机每50毫秒自动发送一次数据.

单片机端:
    每接收到一个字节, 立即就扔到发送寄存器.

串口发送接收数据的时间显然是相同的.

(计算机需要串口发送中断处理 + 时间片轮询进程间切换) , 单片机仅仅是中断响应(发送中断故意没关).

发送一个多小时数据, PC端将单片机发送过来的数据实时保存到文本文件中.

然后将上面每帧发送的数据, 用空白替换接收到的数据...

收发一个字节都没漏也没错. 表现很好.

不过单片机出现复位脚失效问题.


用内部16MHz振荡器, 校正为 0x6, 19200bps没有问题了. 但115200bps还是无法工作. 乱码....

出0入0汤圆

发表于 2012-4-21 17:23:44 | 显示全部楼层
gycsy963 发表于 2012-4-21 16:33
使用外部晶振, 18.432MHz. 115200bps. 简单测试了下收发稳定性.

PC每帧发送下面512个字节:

建议楼主根据手册里的公式矫正一下内部16MHz RC:
1) 测量16MHz晶振的输出时钟频率Fm,可通过测量PWM波形的频率来计算系统时钟的频率,默认设置下系统时钟为16MHz晶振输出时钟的二分频,并且晶振的可调参数OSCCAL = 0x0;
2) 比较Fm和目标时钟频率Ft(如16MHz),若相等则晶振参数不用调整即保持OSCCAL值不变,若Fm > Ft进入步骤3),若Fm < Ft进入步骤4);
3) 当Fm > Ft,取FLSB = 1% * Fm,Y = (Fm – Ft)/FLSB,Z = 64 – ROUND(Y);
4) 当Fm < Ft,取FLSB = 1% * Fm,Y = (Ft – Fm)/FLSB,Z = ROUND(Y);
5) 计算出的Z值即为晶振精调参数,把Z值写入OSCCAL即可。

楼主可以通过用I/O输出波形的方式验证RC的精度是否在1%以内。
根据我们测试的经验, 这一批芯片的RC校准值基本上分为0x5, 0x6, 0xA三种。

另外, 不是每一种频率都能产生特点的串行波特率, 16MHz主频产生115200bps的理论误差是3.5%, 在这么高的码率下, 的确是不安全的。
楼主可以试试主频8MHz时, 115200bps是否可行。

出0入0汤圆

 楼主| 发表于 2012-4-21 22:00:26 | 显示全部楼层
主要是对内部振荡不信任. 所以一定使用外部晶振, 设计时, 理论上不允许有偏差.

出0入0汤圆

发表于 2012-4-21 22:17:27 | 显示全部楼层
RC设计上能保证校准后1%以内的精度? 楼主是什么用途?

出0入0汤圆

 楼主| 发表于 2012-4-21 22:35:53 | 显示全部楼层
每半秒一次采样信号处理结果传输, 必须保证实时性, 24小时户外不间断工作. 应用场合安全稳定级别要求比较高. 所以一般直接就是外部晶振.

出0入0汤圆

发表于 2012-4-25 15:25:01 | 显示全部楼层
我演示板的串口 刚开始时也出现乱码,后来发现MAX232用的是5V供电,从DC口取电而不是3.3V

我就直接把MAX232 的供电飞线成3.3V还是出现乱码,但是字符串中有几个英文字符输出OK,有些乱码

于是到这个帖子上发现时钟没有校准,  在初始化前加上这一句:OSCCAL = 0x6;
就OK了!

出0入0汤圆

发表于 2012-4-25 15:34:37 | 显示全部楼层
官方的串口DEMO一直没有编译成功,悲催!

出0入0汤圆

发表于 2012-4-25 23:21:58 | 显示全部楼层
官方的要修改下
我上传下我修改好的:
串口 adc 输出

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-13 17:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表