|
|
之前项目上不能使用的ATmega168(以下称168)为了对其测试,做了一个AVR并行熔丝恢复器 ,经过一系列的测试,原来是芯片的时钟有点问题了。
过程:
选用并行编程将熔丝位恢复为默认(Lfuse,Hfuse,Efuse:)62DFF9,这时ISP可以对其进行读写了,用的软件是progisp1.72版本。说明芯片没有完全坏掉。想写个测试程序测试下芯片工作情况,由于是使用内部1MHz的RC振荡作为时钟,没有对应的Bootloader,所以没法在ArduinoIDE里直接下载程序,但,可以用ArduinoIDE编译成HEX文件,用progisp写入到芯片FLASH里。测试程序是使用Arduino数字口0、1、11、13来做个分频的闪灯。
下图是好芯片在NANO板的运行结果,熔丝值为FFDDF8,外部16M晶振,以此为参考。
占空比都是50%,脉宽分别是:0口是125ms、1口是250ms、11口是500ms(0.5s)、13口是1s。以11口(第三行)脉宽0.5秒为参照。
下面进行坏芯片测试:
熔丝值:62DFF9,4 个LED规律、稳定闪烁。
测得第三行脉宽为8秒。8/0.5=16倍,时钟由标准的16M降为1M,默认熔丝设定也是内部1M的RC振荡。熔丝值:E2DFF9,只有数字13口的LED微亮,其它LED不亮。芯片应该没有工作起来。此为内部8MRC振荡。熔丝值:FFDFF9,使用外部晶体振荡,晶振为16M,与使用内部8M一样,芯片不工作。熔丝值:7FDFF9,使用外部晶体振荡,且设置8分频。
下面使用不同的晶振测试,先来4M,4 个LED规律、稳定闪烁。
第三行脉宽为16秒。16/0.5=32倍,时钟由标准的16M降为0.5M(16/32=0.5)。使用8M晶振,4 个LED规律、稳定闪烁。
第三行脉宽为8秒。8/0.5=16倍,实际时钟是1M。使用16M晶振,4 个LED规律、稳定闪烁。
第三行脉宽为5秒。4/0.5=8倍,实际时钟是2M。使用20M晶振,4 个LED规律、稳定闪烁。
第三行脉宽为3.2秒。3.2/0.5=6.4倍,实际时钟是2.5M。使用22M晶振,4 个LED规律、稳定闪烁。
第三行脉宽为2.89秒。2.89/0.5=5.78倍,实际时钟是2.768M。使用24M晶振,4 个LED规律、稳定闪烁。
第三行脉宽为2.667秒。2.667/0.5=5.334倍,实际时钟约为3M。如果这个规律成立,芯片工作在4M时,外接32M晶振就可以。手头没有。直接上个48M晶振,4 个LED规律、稳定闪烁。依规律计算,芯片应该工作在6M。然而,
第三行脉宽为4秒。4/0.5=8倍,实际时钟是2M。正如手册说明,当CKSEL3..1为111时,低功率晶体振荡器可用8.0 - 16.0M满振幅晶体振荡器可用0.4-25M。48M不在范围内。通过测试,可见芯片的时钟在3M以下时工作是正常的。 接下来就是重新编译一个适合这个芯片的Bootloader了。这里又要确定两个值:一个是串口的波特率;另一个是Bootloader的起始地址。因为这个芯片不能工作在较高的时钟下了,计划使用内部8M的RC振荡进行8分频,实际工作时钟就是1M,这样熔丝位也可以使用出厂的默认值。查了下Arduino各种板的串口波特率(每秒的位传输速度),大部分使用的是115200的波特率,这时的时钟为外置16M晶振,若使用1M时钟,是不是波特率也要降16倍,变为7200呢?根据AVR的波特率计算公式算出时钟为1M时,各种波特率的误差,从表中查到,误差小的可以使用4800,这样的速度是很慢的,9600的波特率也是可以接受的。
另外,1M的时钟,一个时钟周期是1us。当9600的波特率传输时,传输一位所用时间约是(1s/9600=)104us,完全可以的,所以取9600测试。Bootloader的起始地址需要配置相关的熔丝位,不要害怕,只要配置BOOTSZ和BOOTRST,168芯片是熔丝扩展位。
设<BOOTSZ=10>,这样Boot区的大小(256Words),Boot区起始地址(0x1F00)。设<BOOTRST=0>,将复位向量移至Boot区起始地址处。这里的地址是以“字”为单位的,若换算为“字节”要乘以2,Boot区起始地址以字计算是0x1F00,以字节计算是0x3E00。在Mekefile文件中加入如下内容:
简单说明下:
-DBAUD_RATE=9600是使用9600波特率--section-start=.text=0x3e00 是BOOT区起始地址--section-start=.version=0x3ffe 是BOOT区结束地址AVR_FREQ= 1000000L是时钟频率为1Matmega168_1MRC.hex是输出bootloader的文件名LFUSE= 62 HFUSE = DD EFUSE = 04熔丝值,使用内部RC振荡1M时钟;掉电检测是2.7V;512字节空间的BOOT区。运行omake atmega168_1MRC命令进行编译,产生atmega168_1MRC.HEX文件。
在boards文件中加入如下内容:
一看就懂,不多讲。打开ArduinoIDE,看看开发板是不是多了一个使用内部RC振荡1M时钟的选项
测试程序可以直接上传了,说明以上的串口波特率和Bootloader的设置都没有问题。
现在是使用内部1M时钟,测试程序上传完成后,数字口0、1、11、13接着的LED规律、稳定闪烁,
从图中可见,占空比都是50%,脉宽分别是:0口125ms、1口250ms、11口500ms(0.5s)、13口1s。11口(第三行)脉宽0.5秒,与第一幅图的标准对比不差。说明芯片可以在低时钟下工作,可能坏在低位熔丝的“CLKDIV8”位上了,不能进行有效的8分频。推测可以使用外置24M晶振,进行8分频后得3M,用于芯片时钟。这时的波特率可选14400,可想速度快点可以选择38400。然后更换相应的Makefile和boards文件即可。
测试中使用到的硬件及工具
楼下讲讲怎样在ArduinoIDE中加入一个新的开发板,伸出小手点个赞
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
本帖被以下淘专辑推荐:
- · 日常生活相关|主题: 260, 订阅: 111
- · MCU|主题: 24, 订阅: 19
|