实战ArduinoUNO制作高压编程器恢复Atmega8熔丝
来源:互联网 发布:交管12123一直网络失败 编辑:程序博客网 时间:2024/06/09 21:03
下面说说制作过程,整个制作过程主要参考了以下相关资料
http://jingyan.baidu.com/article/22a299b53e2ab89e19376a05.html
http://mightyohm.com/blog/2008/09/arduino-based-avr-high-voltage-programmer/ (鸟文页面,好像上面百度那个也是翻译这里面的内容,需翻墙浏览,为啥??别问过,我也不知道为啥技术论坛也要翻墙)
制作材料如下:
1、合适大小洞洞板一块
2、1K 电容若干
3、2N3903或2N3904三极管一个
4、开关一个
5、led等一个
6、28脚芯片座一个
7、连接线若干
8、12V直流电供电设备一个(由于高压编程器需要外接12V直流电源,我是用淘宝上掏的一块升压模块接电池实现的)
首先对照下面的电路图把电子元件焊接到洞洞板上
图片中左边的芯片针脚对应arduino UNO,右边的针脚对应的事待恢复的芯片针脚(即28脚芯片座),具体的针脚顺序参照下图
电路接好后,将恢复代码刷写进arduino里,百度知识里面的那位哥们没有把代码文件分享出来,结果在那个鸟文网站找到了代码,为了方便没法翻墙的弟兄们,现将代码分享在这里,方便大家使用
/* HVFuse - Use High Voltage Programming Mode to Set Fuses on ATmega48/88/168 09/23/08 Jeff Keyzer http://mightyohm.com The HV programming routines are based on those described in the ATmega48/88/168 datasheet 2545M-AVR-09/07, pg. 290-297 This program should work for other members of the AVR family, but has only been verified to work with the ATmega168. If it works for you, please let me know! http://mightyohm.com/blog/contact/ */// Desired fuse configuration#define HFUSE 0xDF // Default for ATmega48/88/168, for others see#define LFUSE 0x62 // http://www.engbedded.com/cgi-bin/fc.cgi// Pin Assignments#define DATA PORTD // PORTD = Arduino Digital pins 0-7#define DATAD DDRD // Data direction register for DATA port#define VCC 8#define RDY 12 // RDY/!BSY signal from target#define OE 11#define WR 10#define BS1 9#define XA0 13#define XA1 18 // Analog inputs 0-5 can be addressed as#define PAGEL 19 // digital outputs 14-19#define RST 14 // Output to level shifter for !RESET#define BS2 16#define XTAL1 17#define BUTTON 15 // Run buttonvoid setup() // run once, when the sketch starts{ // Set up control lines for HV parallel programming DATA = 0x00; // Clear digital pins 0-7 DATAD = 0xFF; // set digital pins 0-7 as outputs pinMode(VCC, OUTPUT); pinMode(RDY, INPUT); pinMode(OE, OUTPUT); pinMode(WR, OUTPUT); pinMode(BS1, OUTPUT); pinMode(XA0, OUTPUT); pinMode(XA1, OUTPUT); pinMode(PAGEL, OUTPUT); pinMode(RST, OUTPUT); // signal to level shifter for +12V !RESET pinMode(BS2, OUTPUT); pinMode(XTAL1, OUTPUT); pinMode(BUTTON, INPUT); digitalWrite(BUTTON, HIGH); // turn on pullup resistor // Initialize output pins as needed digitalWrite(RST, HIGH); // Level shifter is inverting, this shuts off 12V}void loop() // run over and over again{ while(digitalRead(BUTTON) == HIGH) { // wait until button is pressed } // Initialize pins to enter programming mode digitalWrite(PAGEL, LOW); digitalWrite(XA1, LOW); digitalWrite(XA0, LOW); digitalWrite(BS1, LOW); digitalWrite(BS2, LOW); // Enter programming mode digitalWrite(VCC, HIGH); // Apply VCC to start programming process digitalWrite(WR, HIGH); // Now we can assert !OE and !WR digitalWrite(OE, HIGH); delay(1); digitalWrite(RST, LOW); // Apply 12V to !RESET thru level shifter delay(1); // Now we're in programming mode until RST is set HIGH again // First we program HFUSE sendcmd(B01000000); // Send command to enable fuse programming mode writefuse(HFUSE, true); // Now we program LFUSE sendcmd(B01000000); writefuse(LFUSE, false); delay(1000); // wait a while to allow button to be released // Exit programming mode digitalWrite(RST, HIGH); // Turn off all outputs DATA = 0x00; digitalWrite(OE, LOW); digitalWrite(WR, LOW); digitalWrite(PAGEL, LOW); digitalWrite(XA1, LOW); digitalWrite(XA0, LOW); digitalWrite(BS1, LOW); digitalWrite(BS2, LOW); digitalWrite(VCC, LOW);}void sendcmd(byte command) // Send command to target AVR{ // Set controls for command mode digitalWrite(XA1, HIGH); digitalWrite(XA0, LOW); digitalWrite(BS1, LOW); //DATA = B01000000; // Command to load fuse bits DATA = command; digitalWrite(XTAL1, HIGH); // pulse XTAL to send command to target delay(1); digitalWrite(XTAL1, LOW); //delay(1);}void writefuse(byte fuse, boolean highbyte) // write high or low fuse to AVR{ // if highbyte = true, then we program HFUSE, otherwise LFUSE // Enable data loading digitalWrite(XA1, LOW); digitalWrite(XA0, HIGH); delay(1); // Write fuse DATA = fuse; // set desired fuse value digitalWrite(XTAL1, HIGH); delay(1); digitalWrite(XTAL1, LOW); if(highbyte == true) digitalWrite(BS1, HIGH); // program HFUSE else digitalWrite(BS1, LOW); digitalWrite(WR, LOW); delay(1); digitalWrite(WR, HIGH); delay(100);}
代码需按照刷写芯片更改
#define HFUSE 0xDF // Default for ATmega48/88/168, for others see#define LFUSE 0x62 // http://www.engbedded.com/cgi-bin/fc.cgi以上两行位熔丝位,需根据恢复的芯片来修改,我的芯片是Atmega8A-PU,按照资料里面的修改发现不行,查看了手头上能正常使用的同型号芯片的熔丝位,改成下面的内容后,发现芯片修复正常。
#define HFUSE 0xDC
#define LFUSE 0xA4
刷完代码后,接上洞洞板和12V电源,UNO的L灯会亮,然后按洞洞板上的开关,UNO的灯会先灭再亮,这时芯片应该已经正常修复了,如果芯片还是修复不成功,在确保芯片不是烧毁的问题的情况下,检查熔丝位是否正确。注意,此设备只能起到恢复熔丝位的作用,无法修复烧毁芯片。最后提醒大家焊接洞洞板的时候对每个焊点都要确保焊接到位,不然到时出了问题都不知道是什么问题。
如有疑问可加群254267969,共同交流学习~
- 实战ArduinoUNO制作高压编程器恢复Atmega8熔丝
- 用两个atmega48(或atmega8)制作的通用编程器
- ATmega8实现的电视字幕叠加器
- 恢复实战
- AVR可重复编程(C、C++、VC)ATmega8系列教育机器人
- 高压互锁
- 高压互锁
- 数据库恢复实战
- 数据库恢复实战
- 制作Ghost恢复光盘
- 实战RPM包制作
- 实战RPM包制作
- 实战rman恢复(2)恢复到异机
- 编程实战
- ATmega8最小系统板
- atmega8 IO驱动能力
- atmega8 例程:PWM
- atmega8 例程:12864例程
- 更改默认pyyhon解释器
- 区间查询(树状数组之差点问线问题)
- php文件管理系统
- HTML中position的五种属性值
- ubuntu下安装JDK
- 实战ArduinoUNO制作高压编程器恢复Atmega8熔丝
- 日期之差
- 数据学习---数据结构1
- 语音识别工具箱之kaldi介绍
- Linux系统VNC配置实践总结
- android圆形的View控件
- from nova to ironic(4)
- First calibration example - Corner extraction, calibration, additional tools (三)
- ORACLE优化器RBO与CBO介绍总结