AVR芯片DIY高压编程(解熔丝位新方法,不求人!)
设置熔丝后芯片无法正常工作?如果是设成了外部晶振的话可以用有源晶振来解决,如果是其他的话,有源晶振就没法了,若用高压编程,买一个又太贵,自己跟据网上做一个又不方便,怎么办?有个方法,自己看芯片Datasheet编个程序,烧进一块能用的芯片,与被锁芯片连接上,找来个12V电源共地接上,模拟高压编程,OK!
我设置几片mega8和mega128为外部晶振是,设后总是不能工作,用了几次模拟高压编程解回来。
问个问题?为什么我设置的外部晶振不能用?http://cache.amobbs.com/bbs_upload782111/files_17/ourdev_466890.jpg
(原文件名:ourdev_466601.jpg)
我设置的就是这样。那个JTAGEN和103模式去掉过也不得。
我的模拟高压编程程序#include<iom128v.h>
#include<macros.h>
#include<iobit.h>
#define uint unsigned int
#define uchar unsigned char
#define fuse_l 0xe1
#define fuse_h 0xd9
#define fuse_ex 0xff
#define data_out DDRB=0Xff
#define data_in DDRB=0X00
#define data PORTB
#define reset_out DDRE0_1
#define reset0 PORTE0_0
#define reset1 PORTE0_1
#define xtal_out DDRE1_1
#define xtal0 PORTE1_0
#define xtal1 PORTE1_1
#define xa1_1 PORTD6_1
#define xa1_0 PORTD6_0
#define xa0_1 PORTD5_1
#define xa0_0 PORTD5_0
#define pagel_0 PORTD7_0
#define pagel_1 PORTD7_1
#define bs1_0 PORTD4_0
#define bs1_1 PORTD4_1
#define wr_0 PORTD3_0
#define wr_1 PORTD3_1
#define oe_0 PORTD2_0
#define oe_1 PORTD2_1
#define bs2_0 PORTD0_0
#define bs2_1 PORTD0_1
void delay(uint count)
{
for(;count>0;count--);
}
void device()
{
DDRC=0XFF;
PORTC=0X00;
DDRD1_0; //RDY_IN
PIND1_0;
PORTD1_1;
DDRD2_1; //OE WR BS1 XA0 XA1 PAGEL out
oe_1;
DDRD3_1;
wr_1;
DDRD4_1;
bs1_0;
DDRD5_1;
xa0_0;
DDRD6_1;
xa1_0;
DDRD7_1;
pagel_0;
reset_out; //reset引脚为输出
reset1;
DDRD0_1;
bs2_0;
xtal_out; //高电平加载信号
xtal0;
data_out;
data=0xff;
}
void in_pro()
{
uchar i;
delay(150); //延时100us以上
reset0;
for(i=0;i<10;i++)
{
xtal1;
xtal0;
}
xa0_0;
xa1_0;
bs1_0;
pagel_0;
delay(1);
reset1;
}
void remove()
{
uchar a=0;
xa1_1;
bs1_0;
data=0x80; //擦除芯片
xtal1;
delay(10);
xtal0;
wr_0;
delay(10);
wr_1;
do{
a=PIND;
}while(!(a&0x02));
xa1_0;
PORTC=0XFF;
}
void write_fuse()
{
uchar a;
xa1_1;
bs1_0;
data=0x40;
xtal1;
delay(10);
xtal0;
xa1_0;
data=fuse_l;
xtal1;
delay(10);
xtal0;
bs1_0;
bs2_0;
wr_0;
delay(10);
wr_1;
do{
a=PIND;
}while(!(a&0x02));
PORTC=0X01; //到此fuse_l
xa1_1;
bs1_0;
data=0x40;
xtal1;
delay(10);
xtal0;
xa1_0;
data=fuse_h;
xtal1;
delay(10);
xtal0;
bs1_1;
bs2_0;
wr_0;
delay(10);
wr_1;
do{
a=PIND;
}while(!(a&0x02));
bs1_0;
PORTC=0X02; //到此fuse_ex
xa1_1;
bs1_0;
data=0x40;
xtal1;
delay(10);
xtal0;
xa1_0;
data=fuse_ex;
xtal1;
delay(10);
xtal0;
bs1_0;
bs2_1;
wr_0;
delay(10);
wr_1;
do{
a=PIND;
}while(!(a&0x02));
bs2_0;
PORTC=0X03; //到此fuse_ex
}
void main()
{
device(); //端口驱动
in_pro(); //进入并行编程
remove(); //擦除芯片
write_fuse(); //写熔丝位
while(1);
}
这个是高压并行编程的程序,只写了擦除芯片和熔丝位。
有不妥之处请不吝赐教!
还有,帮我解答我的设置外部熔丝位的问题,谢谢! 好的。OCDEN打钩 好的,顶一下. 得过一次又不得了啊?怎么回事? DDDDDDDD 有没有告诉一下我怎么设外部晶振啊? 好,顶一下 哪天改成M48的,把手头两片M48也解决一下 支持 我有两片M16看样子像是锁了 但没办法用你的方法 偶刚学看不懂 希望有试过的同学来介绍一下经验。 a7778066 发表于 2009-8-10 20:13 static/image/common/back.gif
得过一次又不得了啊?怎么回事?
请问像你这种高压并行恢复熔丝位,有些单片机(attiny2313)端口是有两个功能,请问这个应该怎样操作啊? 路过。看不明白。 学习一下....
页:
[1]