最近我们利用ATMEGA32的芯片完成了一个项目,进入生产。完成PCB焊接,进行程序烧写时,有一些板子有“进入编程式失败”的情况。这个比例在5.4%(我烧写了130块左右,有7块出现这样的情况。不过这7块中有一块很奇怪,烧写程序顺利,拿到车间测试,上电正常,但是突然间插头脱落,重新上电居然没任何反应了^^)
在了解了相关的知识。我就尝试在XTAL1引脚加载外部频率信号来解决问题。在看到网站马超老师专栏,有具体提到使用1MHZ左右有源信号的方法。但是我手头并没有有源晶体,囧。
尝试使用好的板子产生一个这样的信号。因为使用的是16M无缘晶振。那我使用ATMEGA32的T/C0定时器计数器,让它工作在CTC波形产生模式,比较匹配输出模式为OC0取反,当然预分频选择1啦。
TCCR0控制字为0X19。
TCNT0初始值0X00;
TOP值(OCR0)0X07;
这里OCR0寄存器的top值不是8噢。
我把程序贴下来,希望大家指教
#include<iccioavr.h>
void main()
{
PORTB=0x00;
DDRB=0x0C; //开启OC0
TCCR0=0x19; //设置波形产生模式为CTC,预分频1,比较匹配输出模式:OC0取反
TCNT0=0x00; //T/C0初始值
OCR0=0x07; //TOP值
while(1);
}
这个程序我编译后烧写到目标PCB板子上,使用示波器观察,信号的频率很准确1MHZ。
我将信号加到提示有“进入编程模式失败”的ATMEGA32 XTAL1引脚上,能够读取该芯片的信息了。辛苦了一阵子了(初学者,不过是自己摸索的,很欣慰)
不过,我在读取这些有问题的芯片的熔丝设置值时,发现不是我预设进去的值?这个我不解,当然也有我失误操作造成的可能。
还有,我使用的是外部无源晶振,熔丝设置:D9FF(高位在前,低位在后)扩展熔丝FF。这样我本身就有外部晶振,应该不会出现“进入编程模式失败的情况”?(因为提供有外部晶振)。
利用上面的方法,我解决了4块板子,还有3块问题板子依旧,难道是芯片真的DEATH掉了。新的啊
大家怎么看。还有说下,我觉得,我以前的操作方法也有问题。我以前是在“芯片选择”先读一下,然后在“熔丝位”这里读取一下,将他设置成我需要的值,最后再烧写程序(使用AVR_fighter for USBASP)。现在,我觉得应该先烧写程序,在设置熔丝。大家参谋一下。
|
|
|
|