a7778066 发表于 2009-8-3 19:35:05

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);
}


这个是高压并行编程的程序,只写了擦除芯片和熔丝位。
有不妥之处请不吝赐教!
还有,帮我解答我的设置外部熔丝位的问题,谢谢!

trueboy 发表于 2009-8-3 20:55:13

好的。OCDEN打钩

weibingji 发表于 2009-8-3 21:57:39

好的,顶一下.

a7778066 发表于 2009-8-10 20:13:53

得过一次又不得了啊?怎么回事?

snowyghost 发表于 2009-8-10 20:22:49

DDDDDDDD

a7778066 发表于 2009-8-10 21:05:24

有没有告诉一下我怎么设外部晶振啊?

xiaopang 发表于 2009-8-12 17:14:31

好,顶一下

QZDZ 发表于 2009-8-12 19:23:24

哪天改成M48的,把手头两片M48也解决一下

luozyou 发表于 2009-8-23 11:55:22

支持 我有两片M16看样子像是锁了 但没办法用你的方法 偶刚学看不懂

hjonline 发表于 2012-7-21 11:21:18

希望有试过的同学来介绍一下经验。

biyabc 发表于 2012-7-25 14:50:54

a7778066 发表于 2009-8-10 20:13 static/image/common/back.gif
得过一次又不得了啊?怎么回事?

请问像你这种高压并行恢复熔丝位,有些单片机(attiny2313)端口是有两个功能,请问这个应该怎样操作啊?

adsl8139 发表于 2012-11-5 16:33:29

路过。看不明白。

jz701209李 发表于 2013-4-7 14:48:08

学习一下....
页: [1]
查看完整版本: AVR芯片DIY高压编程(解熔丝位新方法,不求人!)