简单全能的AVR单片机高压解锁器(制作方法,以MEGA16为例,附电路与C源程序,注:不是高压编程器)AVR高压解锁
概述:
利用常用的AVR单片机ATmega16制作的高压解锁器,可以解开所有芯片锁死的情况(除非芯片损坏、烧毁)。制作作品经实验验证,解开了山东大学物理学院AVR单片机实验室所有近40片锁死的单片机以及许多同学锁死的单片机。制作方法简单,保证你一小时之内做完。
所需元件极少(如电路图所示):仅一只三极管、一片7805,三支电阻、一只LED、三个小电容,一片可用的单片机,一个12V电源。
程序与电路连接可方便的移植到其它型号单片机上(凡支持高压编程的,都可以)。
希望能对初学单片机的同学有所帮助,特别是我们学校暑假参加电子设计比赛的同学。
制作背景(常见芯片锁死情况与高压解锁介绍):
AVR单片机是我们学校同学经常使用的单片机,尤其是中高档单片机ATMEGA16。
单片机在使用的时候,经常出现由于配置熔丝位的失误或电路的失误而造成单片机锁死的情况,锁死之后,便无法再对单片机进行编程。
常见的锁死的情况以及常用的解决办法:
1, 时钟选择错误(可通过有源晶振配合ISP或JTAG下载器、高压编程器进行解锁)
2, ISP被禁(可通过JTAG下载器、高压编程器进行解锁)
3, JTAG被禁(可通过ISP下载器、高压编程器进行解锁)
4, 锁定位加密(可通过单片机设定允许的方式进行单片机擦除)
5, 以上情况的组合:
1+2(可通过有源晶振配合JTAG、高压编程器进行解锁)
1+3(可通过有源晶振配合ISP、高压编程器进行解锁)
1+4(可通过有源晶振配合单片机设定允许的方式进行单片机擦除)
2+3(只能通过高压编程器进行解锁)
2+4(可通过JTAG下载器、高压编程器进行单片机擦除)
3+4(可通过ISP下载器、高压编程器进行单片机擦除)
1+2+3(只能通过高压编程器进行解锁)
1+2+4(可通过有源晶振配合JTAG下载器、高压编程器进行单片机擦除)
1+3+4(可通过有源晶振配合ISP下载器、高压编程器进行单片机擦除)
2+3+4(只能通过高压编程器进行单片机擦除)
1+2+3+4(只能通过高压编程器进行单片机擦除)
6, 其他锁死情况(可通过某些方法或高压编程器进行解锁)
可以看出,高压编程器是解锁功能最强的、不需要有源晶振配合的解锁工具。但是,与目前常用的编程下载器相比,高压编程器有许多缺点:
A,编程速度慢
并行编程脉冲宽度需要大于250ns,如果是高压并行编程器,则烧写速度不会超过4Mbit/s,如果是高压串行编程器,则速度更慢。
B, 占用引脚多。
无论高压并行编程器还是高压串行编程器,需要占用的目标单片机的引脚数都在16以上。
C, 需要12V的DC电压,而且电压范围窄(RESET:11.5~12.5V,VCC:4.5~5.5V)
因此,现在很少有人用高压编程器对单片机进行编程,多数都用ISP或JTAG编程方式。因而专门的高压编程器价格也不低,简易的高压编程器价格在100以内,但是只能适用于某一种或两种单片机型号,而且需要专门的程序下载软件及驱动。
但是因为它在对单片机进行解锁方面的功能,使的高压编程器并未完全被淘汰。
因而使用高压编程器时便会感觉很矛盾:
1, 编程器的主要功能是给单片机编程,但是现在ISP或JTAG方式编程速度高、占用引脚少,而且相应的软件也非常完善,单就对单片机编程而言,完全不会使用高压编程的方式来对单片机编程。
2, 不使用高压编程器,很多时候单片机锁死后很难解开。但是仅为给单片机解锁而专门买个高压编程器,而且还要配合专门的软件使用,既不值又麻烦。
通过查阅数据手册中高压编程的内容,利用常用的ATMEGA16单片机,可以设计制作一个不需要PC端软件、不附带编程功能、专门对单片机解锁的AVR高压解锁器。
制作方法:
下面以对锁死的MEGA16单片机进行解锁为例,与大家分享制作方法与源程序。对于其它型号的单片机,只要具有高压编程接口,只需要查阅数据手册,将对应引脚接好即可。
这些引脚都是用于高压编程的:DATA;RDY_BSY;_OE;_WR;BS1;XA0;XA1;PAGEL;BS2;RST;XTAL1;VCC
电路图:
注:出于某些考虑,线路直接以连线连接,未使用任何NetLabel 。图中的电容也可省略,一般没问题。
源程序:
//主单片机AVCC接VCC,利用AREF引脚控制锁死的单片机的VCC(5V电源电压能达到4.9V);
//主单片机的I/0寄存器ADMUX 控制AREF与AVCC的开关;
//三级管(9014)B极电阻100K,C极电阻1K,E极接GND(12.2V电源电压,能达到11.9V)
//锁死的单片机的RESET与VCC必须几乎同时加电压,不能有明显时间差;
//主单片机的熔丝位:禁用JTAG(因使用PORTC);1M内部时钟;
//Chip: ATmega16
//char is unsigned: Yes
//CodeVision AVR
#include
#include
//引脚定义
#define DATA PORTA //锁死芯片的PORTB
#define RDY_BSY PINC.4 //锁死芯片的PD1
#define _OE PORTC.3 //锁死芯片的PD2始终为1
#define _WR PORTC.2 //锁死芯片的PD3
#define BS1 PORTC.1 //锁死芯片的PD4
#define XA0 PORTC.0 //锁死芯片的PD5
#define XA1 PORTD.7 //锁死芯片的PD6
#define PAGEL PORTD.6 //锁死芯片的PD7
#define BS2 PORTB.0 //锁死芯片的PA0
#define RST PORTD.2 //9014的B极电阻
#define XTAL1 PORTC.6 //XTAL1
#define LED PORTB.1 //LED
#define DDR_LED DDRB.1 //
#define VCC_ON ADMUX=0x40 //锁死芯片的VCC
#define VCC_OFF ADMUX=0x00
//进入编程状态
#define PROG_ENABLE BS1=0;XA0=0;XA1=0;PAGEL=0;
//初始化
void initial(void)
{
DDRB=0xFF;
DDRC=0xFF;DDRC.4=0;PORTC.4=1;
DDRD=0xFF;
DDRA=0xFF;
_OE=1;
_WR=1;
XA0=1;
XA1=1;
PAGEL=0;
BS2=0;
BS1=0;
RST=1;
XTAL1=0;
LED=0;
VCC_OFF;
DATA=0x00;
}
//芯片擦除
void chip_erase(void)
{
XA1=1;XA0=0;
BS1=0;
DATA=0x80;
XTAL1=1;XTAL1=0;
_WR=0;_WR=1;
while(RDY_BSY==0);
}
//重写熔丝位
void write_fuse(char LB,char HB)
{
XA1=1;XA0=0;
BS1=0;
DATA=0x40;
XTAL1=1;XTAL1=0;
XA1=0;XA0=1;
DATA=LB; //熔丝低位
XTAL1=1;XTAL1=0;
BS1=0;BS2=0;
_WR=0;_WR=1;
while(RDY_BSY==0);
XA1=1;XA0=0;
BS1=0;
DATA=0x40;
XTAL1=1;XTAL1=0;
XA1=0;XA0=1;
DATA=HB; //熔丝高位
XTAL1=1;XTAL1=0;
BS1=1;BS2=0;
_WR=0;_WR=1;
while(RDY_BSY==0);
}
//高压恢复
void recover_fuse(void)
{
PROG_ENABLE;
RST=0,VCC_ON; //最关键的时序问题
chip_erase(); //擦除
write_fuse(0xE1,0x19); //恢复熔丝为默认(也可自己设定为其他值)
}
//结束状态
void finish(void)
{
DDRB=0x00;PORTB=0x00;
DDRC=0x00;PORTC=0x00;
DDRD=0x00;PORTD=0x00;
DDRA=0x00;PORTA=0x00;
DDR_LED=1;LED=1;
VCC_OFF;
}
void main(void)
{
initial();
delay_ms(200);
recover_fuse();
finish();
}
功能与使用方法:
功能:
将单片机锁定位与存储器擦除,并且将所有熔丝们都恢复为出厂默认(也可以改为自己想要的值)。
使用方法:
按下按键1秒钟以上时间,若看到LED指示灯亮,说明解锁成功。若尝试数次仍不见LED指示灯亮,说明芯片非锁死,而是损坏了。
特点:
1, 不需要PC端软件,完全脱离电脑工作
2, 专门用来恢复熔丝,解锁单片机,不附加累赘功能
3, 使用方便,整个过程不到1秒时间
4, 可通过预留插针,将高压编程所需引脚引出,对其它型号单片机只要把对应引脚相连,即可解锁;
5, 制作简单,成本低廉。
PS:尽管市面上的高压编程器是用比ATMEGA16低档的ATMEGA8作为主单片机,但是我们根本不需要专门的单片机作为主单片机,只要保留程序和电路板,就可以用任一块未锁的单片机来解锁别的单片机。并且现在ATMEGA8的价格与ATMEGA16的价格已经相差不多。
平时一般不用这个东西,可以放到一边去,当芯片被锁时才拿出来使用,百试百灵。
上一篇:AVR单片机(学习ing)—(九)、ATMEGA16的模数转换器—01
下一篇:AVR-GCC:关于ISR()不能更新变量
推荐阅读最新更新时间:2024-03-16 15:46