数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1523|回复: 44
打印 上一主题 下一主题

斗地主技巧怎么记牌官网: [AVR] 对ATMEGA16L进行高压并行熔丝位恢复(附源代码)

  [复制链接]
跳转到指定楼层
1#
发表于 6 天前 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,认识更多玩家好友,查阅更多资源,享有更多功能

您需要 登录 才可以下载或查看,没有帐号?立即注册 微信登录

x
很多使用AVR单片机的童鞋最怕的就是烧错熔丝位,很不幸的我,锁死了好几片。原因是和坛友一起折腾时,不断的乱试。。。。后来干脆用一块UNO对锁死的片子高压并行编程对熔丝复位,效果超好。这是一块入门级芯片,拿它来做小百鼠吧


先看手册,有中文的,关心的有以下几点引脚


并行编程用到的引脚及功能





这部分定义
  1. <font size="3">#define  RDY      12   //来自目标芯片的RDY/!BSY信号 对应目标PD1
  2. #define  OE       11      // 对应目标PD2
  3. #define  WR       10      // 对应目标PD3
  4. #define  BS1      9       // 对应目标PD4
  5. #define  XA0      13      // 对应目标PD5
  6. #define  XA1      18      // 对应目标PD6
  7. #define  PAGEL    19      // 对应目标PD7
  8. #define  BS2      16      // 对应目标PA0
  9. #define  DATA     PORTD  // D端口
  10. #define  DATAD  DDRD   // D端口方向寄存器</font>
复制代码


进入编程必须的条件


会用到的





如何进入并行编程模式


  1. <font size="3">  digitalWrite(VCC, HIGH);  //目标芯片加电+5V
  2.   digitalWrite(WR, HIGH);
  3.   digitalWrite(OE, HIGH);
  4.   delay(1);                //目标加电、!RESET为"0"、XATAL1六个脉冲
  5.     for (int x=0; x<7; x++) {
  6.       digitalWrite(XTAL1, HIGH);
  7.       delayMicroseconds(300);
  8.       digitalWrite(XTAL1, LOW);
  9.      delayMicroseconds(300);
  10.     }
  11.   //delay(1);
  12.   digitalWrite(RST, LOW);   // 输出为低,+12V供电
  13. </font>
复制代码


写熔丝高低位


  1. <font size="3">  digitalWrite(XA1, HIGH);  // XA1、XA2值为10
  2.   digitalWrite(XA0, LOW);
  3.   delayMicroseconds(100);  //
  4.   digitalWrite(BS1, LOW);
  5.   DATA = B01000000;  // 此为写熔丝命令 0x40
  6.   digitalWrite(XTAL1, HIGH);  //向目标芯片发送命令
  7.   delay(10);
  8.   digitalWrite(XTAL1, LOW);

  9.   DATA = fuse;  // 传送熔丝值
  10.   digitalWrite(XTAL1, HIGH);
  11.   delay(10);
  12.   digitalWrite(XTAL1, LOW);
  13.   digitalWrite(BS1, HIGH);  
  14.   digitalWrite(WR, LOW);     // 写入对应的熔丝值
  15.   delay(1);
  16.   digitalWrite(WR, HIGH);
  17. </font>
复制代码




与高位比,就是BS1不一样。

手册上的时序有点错误


这时实践后的时序


其实就看传送命令、传送熔丝值、写熔丝值三个关键点就可以了。

命令:XA1高
数据:XA0高
写入:WR低


熔丝值定义




ATMEGA16L的默认值为:低位为E1,高位为99,使用内部RC振荡。

  1. <font size="3">#define  HFUSE  0x99    // ATmega16的默认值,使用内部振荡
  2. #define  LFUSE  0xE1</font>
复制代码




明白的原理,开始做电路。
这个图是芯片对芯片的,实际使用UNO或NANO都可以。


我是用的自己DIY的UNO


先把小白薯放好,简单标一下


连线


连线


连线


连线


没有上按键,用根线代替,短路到地,LED灭下,好了


又试下禁用SPI


一样可以恢复
下面是恢复ATMEGA328的电路路


程序中默认熔丝值要修改
  1. <font size="3">define  HFUSE  0xD9    // ATmega328的默认值,使用内部振荡
  2. define  LFUSE  0x62</font>
复制代码


next

打赏

参与人数 22M币 +436 收起 理由
农村小伙 + 20 謝謝分享
newnet1234 + 20 原創內容
ch104517745 + 20
10655188 + 16 謝謝分享
巴闭 + 20
zzy_85569381 + 20 謝謝分享
hongo + 20 優秀文章
aacyxjz + 20 優秀文章,牙膏
kyhwhb + 20 優秀文章
潜隆 + 20 謝謝分享

查看全部打赏

2#
 楼主| 发表于 6 天前 | 只看该作者
本层开源

ATMEGA16L手册:
ATmega16_cn.PDF (2.78 MB, 下载次数: 5, 售价: 3 M币)

电路图:
027_328P FUSE_Sheet_16L_20191102190628.pdf (56.24 KB, 下载次数: 8, 售价: 3 M币)

源文件如下:
  1. /*

  2. *********************************************************************************************************  
  3. 高压并行编程 — 对ATmega16L使用高电压并行编程模式设置熔丝值。
  4. 使用NANO板对目标芯片16L编程,程序来源于网上,数码之家jf201006修改。
  5. 若给别的芯片写熔丝,请查阅对应的手册。
  6. 程序已经给出详细的注解,可以根据实际使用情况进行修改。
  7. 接线请参照程序设置。
  8. 接上12V电源,指示灯常亮,按下运行按键,指示灯灭一下后点亮,熔丝值设置完成。
  9. 请在转载时保留以上信息。

  10. 2019年7月29日

  11. *********************************************************************************************************
  12. */
  13. // 设置要写入的熔丝值
  14. // #define HFUSE  0x99  // ATmega16的熔丝高位值
  15. // #define LFUSE  0xE1  // ATmega16的熔丝低位值
  16. #define  HFUSE  0x99    // ATmega16的默认值,使用内部振荡
  17. #define  LFUSE  0xE1

  18. // 上位机NANO各引脚的定义。模拟引脚作为数字引脚使用,引脚为14-19
  19. #define  DATA    PORTD // D端口
  20. #define  DATAD   DDRD  // D端口方向寄存器
  21. #define  VCC     8      //目标芯片供电
  22. #define  RDY     12     //来自目标芯片的RDY/!BSY信号 对应目标PD1
  23. #define  OE      11     // 对应目标PD2
  24. #define  WR      10     // 对应目标PD3
  25. #define  BS1     9      // 对应目标PD4
  26. #define  XA0     13     // 对应目标PD5
  27. #define  XA1     18     // 对应目标PD6
  28. #define  PAGEL   19     // 对应目标PD7
  29. #define  BS2     16     // 对应目标PA0
  30. #define  RST     14     //此引脚给目标芯片的!RESET加+12V电压
  31. #define  XTAL1   17  //时钟脉冲
  32. #define  BUTTON  15     // 启动按键

  33. /*
  34. *********************************************************************************************************
  35. ** 函数名称 :setup()
  36. ** 函数功能 :系统初始化各引脚。
  37. ** 入口参数 :无
  38. ** 出口参数 :无
  39. *********************************************************************************************************
  40. */
  41. void setup()
  42. {
  43.   // 设置上位机各引脚方向
  44.   DATA = 0x00;
  45.   DATAD = 0xFF;          // D端口8个引脚为输出
  46.   pinMode(VCC, OUTPUT);
  47.   pinMode(RDY, INPUT);   // 输入,等待RDY变高
  48.   pinMode(OE, OUTPUT);
  49.   pinMode(WR, OUTPUT);
  50.   pinMode(BS1, OUTPUT); // BS1、BS0为熔丝高低位设置
  51.   pinMode(XA0, OUTPUT);
  52.   pinMode(XA1, OUTPUT);
  53.   pinMode(PAGEL, OUTPUT);
  54.   pinMode(RST, OUTPUT);  // 启动+12V供电
  55.   pinMode(BS2, OUTPUT);
  56.   pinMode(XTAL1, OUTPUT);
  57.   pinMode(BUTTON, INPUT);

  58.   // 初始化关键引脚
  59.   digitalWrite(BUTTON, HIGH);  // 高为高,等待按下
  60.   digitalWrite(RST, HIGH);  //高为高,关闭+12V
  61.   digitalWrite(VCC, LOW);  //目标芯片1280不上电
  62. }
  63. /*
  64. *********************************************************************************************************
  65. ** 函数名称 :loop()
  66. ** 函数功能 :主函数
  67. ** 入口参数 :无
  68. ** 出口参数 :无
  69. *********************************************************************************************************
  70. */
  71. void loop()  
  72. {
  73.   while(digitalRead(BUTTON) == HIGH) {  // 等待按键按下
  74.   }
  75.   // 按下后执行以下程序
  76.   digitalWrite(PAGEL, LOW); //进入编程各引脚初始值
  77.   digitalWrite(XA1, LOW);
  78.   digitalWrite(XA0, LOW);
  79.   digitalWrite(BS1, LOW);
  80.   digitalWrite(BS2, LOW);
  81.   digitalWrite(XTAL1, LOW);
  82.   
  83.   digitalWrite(VCC, HIGH);  //目标芯片加电+5V
  84.   digitalWrite(WR, HIGH);
  85.   digitalWrite(OE, HIGH);
  86.   delay(1);                //目标加电、!RESET为"0"、XATAL1六个脉冲
  87.     for (int x=0; x<7; x++) {
  88.       digitalWrite(XTAL1, HIGH);
  89.       delayMicroseconds(300);
  90.       digitalWrite(XTAL1, LOW);
  91.      delayMicroseconds(300);
  92.     }
  93.   //delay(1);
  94.   digitalWrite(RST, LOW);   // 输出为低,+12V供电
  95.   delay(10);
  96.   //进入并行编程模式  
  97.   
  98.   // 对目标芯片写入高位熔丝值
  99.   sendcmd(B01000000);  // 发送写熔丝命令
  100.   writefuse(HFUSE, true);
  101.   delay(10);
  102.   
  103.   //对目标芯片写入低位熔丝值
  104.   sendcmd(B01000000);
  105.   writefuse(LFUSE, false);

  106.   delay(1000);  // 延时

  107.   //退出并行编程模式
  108.   digitalWrite(RST, HIGH);// 关闭目标芯片的!RESET上+12V电压

  109.   // 关闭所有输出
  110.   DATA = 0x00;
  111.   digitalWrite(BS2, LOW);
  112.   digitalWrite(OE, LOW);
  113.   digitalWrite(PAGEL, LOW);
  114.   digitalWrite(XA1, LOW);
  115.   digitalWrite(XA0, LOW);
  116.   digitalWrite(BS1, LOW);
  117.   
  118.   digitalWrite(WR, LOW);  
  119.   digitalWrite(VCC, LOW);  //关闭目标芯片供电
  120. }
  121. /*
  122. *********************************************************************************************************
  123. ** 函数名称 :sendcmd()
  124. ** 函数功能 :传送命令
  125. ** 入口参数 :命令字节值
  126. ** 出口参数 :无
  127. *********************************************************************************************************
  128. */
  129. void sendcmd(byte command)  // 向目标芯片发送命令模块
  130. {
  131.   // 加载命令
  132.   digitalWrite(XA1, HIGH);  // XA1、XA2值为10
  133.   digitalWrite(XA0, LOW);
  134.   delayMicroseconds(100);  //
  135.   digitalWrite(BS1, LOW);
  136.   //DATA = B01000000;  // 此为写熔丝命令 0x40
  137.   DATA = command;
  138.   digitalWrite(XTAL1, HIGH);  //向目标芯片发送命令
  139.   delay(10);
  140.   digitalWrite(XTAL1, LOW);
  141.   //delay(1);
  142. }
  143. /*
  144. *********************************************************************************************************
  145. ** 函数名称 :writefuse()
  146. ** 函数功能 :写熔丝
  147. ** 入口参数 :熔丝值,高低位标志
  148. ** 出口参数 :无
  149. *********************************************************************************************************
  150. */
  151. void writefuse(byte fuse, boolean highbyte)  // 向目标芯片写熔丝模块
  152. {
  153.   // 若highbyte=true则写入高位熔丝值, 否则写入低位熔丝值。
  154.   
  155.   // 进入写熔丝模式
  156.   digitalWrite(XA1, LOW);
  157.   digitalWrite(XA0, HIGH);
  158.   delay(1);
  159.   // 写入
  160.   DATA = fuse;  // 传送熔丝值
  161.   digitalWrite(XTAL1, HIGH);
  162.   delay(10);
  163.   digitalWrite(XTAL1, LOW);
  164.   if(highbyte == true)      // 根据参数设置高低位
  165.     digitalWrite(BS1, HIGH);  
  166.   else
  167.     digitalWrite(BS1, LOW);
  168.   digitalWrite(WR, LOW);     // 写入对应的熔丝值
  169.   delay(1);
  170.   digitalWrite(WR, HIGH);
  171.   delay(100);
  172. }

复制代码



谢谢欣赏!!


打赏

参与人数 10M币 +194 收起 理由
zzy_85569381 + 20 謝謝分享
goodanytime + 20 優秀文章
10655188 + 20 謝謝分享
ljlun + 18 恭喜精华!看来不是最早那种真熔丝了.
mxlkf + 20
jsycwnw + 20 優秀文章
wska + 20
qrut + 20 優秀文章
锰子 + 20 謝謝分享
温力口 + 16 大婶玩的这样高端,我只能在旁边默默的看热.

查看全部打赏

3#
发表于 6 天前 | 只看该作者
大婶玩的这样高端,我只能在旁边默默的看热闹。。。。

点评

看看就会了  详情 回复 发表于 5 天前

打赏

参与人数 2M币 +12 收起 理由
锰子 + 10 歡迎探討
jf201006 + 2 謝謝分享

查看全部打赏

4#
发表于 6 天前 | 只看该作者
厉害了word哥,面包板插满了~

点评

还没有满,要是芯片对芯片就会满  详情 回复 发表于 5 天前

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

5#
发表于 6 天前 | 只看该作者
哈哈,正好我也想学这个,多指点啊

点评

一起折腾吧  详情 回复 发表于 5 天前

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 歡迎探討

查看全部打赏

6#
发表于 5 天前 | 只看该作者
一脸懵逼的进来,一脸懵逼的离开

点评

这个。。。。。。  详情 回复 发表于 5 天前

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

7#
发表于 5 天前 | 只看该作者
以前用周立功的商用烧录器,随便烧随便恢复熔丝

点评

商用的用不起 穷人只能用穷办法  详情 回复 发表于 5 天前

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

8#
 楼主| 发表于 5 天前 | 只看该作者
温力口 发表于 2019-11-4 19:04
大婶玩的这样高端,我只能在旁边默默的看热闹。。。。

看看就会了
9#
 楼主| 发表于 5 天前 | 只看该作者
qrut 发表于 2019-11-4 20:27
厉害了word哥,面包板插满了~

还没有满,要是芯片对芯片就会满
10#
 楼主| 发表于 5 天前 | 只看该作者
人艰不拆了 发表于 2019-11-4 21:53
哈哈,正好我也想学这个,多指点啊

一起折腾吧
11#
 楼主| 发表于 5 天前 | 只看该作者
solarshen666 发表于 2019-11-5 17:26
一脸懵逼的进来,一脸懵逼的离开

这个。。。。。。
12#
 楼主| 发表于 5 天前 | 只看该作者
qd0426 发表于 2019-11-5 17:28
以前用周立功的商用烧录器,随便烧随便恢复熔丝

商用的用不起
穷人只能用穷办法

点评

蹭公司的  详情 回复 发表于 5 天前
13#
发表于 5 天前 | 只看该作者
jf201006 发表于 2019-11-5 19:15
商用的用不起
穷人只能用穷办法

蹭公司的
14#
发表于 4 天前 | 只看该作者
恭喜精华!看来不是最早那种真熔丝了

点评

这个实际上是一个标志位  详情 回复 发表于 3 天前

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

15#
发表于 4 天前 | 只看该作者
曾经用过一段时间这类芯片的帮顶了!

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2

查看全部打赏

16#
发表于 4 天前 | 只看该作者
这个配置位也是flash的吧

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 歡迎探討 也可以这么理解。

查看全部打赏

17#
发表于 4 天前 | 只看该作者
谢谢分享,标记一下,说不定哪天就用上了!

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

18#
发表于 4 天前 | 只看该作者
直接搞个有源晶振,简单多了。

点评

在一次解328是,外时钟没有搞定,用了并行编程。  详情 回复 发表于 3 天前

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 歡迎探討 可以的。

查看全部打赏

19#
发表于 4 天前 | 只看该作者
一脸懵逼的进来,一脸懵逼的离开

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 歡迎探討

查看全部打赏

20#
发表于 4 天前 | 只看该作者
牛掰了,前来围观,哈哈,收藏先,等牙膏

打赏

参与人数 1M币 +2 收起 理由
jf201006 + 2 謝謝分享

查看全部打赏

您需要登录后才可以回帖 登录 | 立即注册 微信登录

本版积分规则

Archiver|手机版|小黑屋|关于我们|联系我们|网站条款|数码之家 ( 闽ICP备05031405号 )

GMT+8, 2019-11-10 04:14 , Processed in 0.202872 second(s), 19 queries , MemCache On.

Powered by Discuz!

© 2001-2019 Comsenz Inc.

快速回复 菲律宾申博游戏怎么登入 返回列表
申博在线官网开户 菲律宾太阳城申博娱乐开户 菲律宾申博在线开户优惠 太阳城申博官方网登入 菲律宾申博在线官网开户 申博太阳城登入
菲律宾太城申博 菲律宾申博太阳城娱乐登入 正规申博开户 申博正网合作登入 菲律宾申博在线支付宝充值登入 太阳成娱乐成总代理
菲律宾太阳娱乐 太阳百家娱乐开户 申博现金网开户登入 菲律宾申博官网注册 澳门申博网上娱乐登入 菲律宾太阳城申博娱乐代理
申博在线充值送%30 申博在线138管理登入 AG电子游戏激情777 菲律宾官方直营网 申博138游戏登入 贵州申博娱乐登入
百度