极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 36697|回复: 16

新手入门求助:如何用arduino给自制的板子下载程序?

[复制链接]
发表于 2012-6-28 13:55:22 | 显示全部楼层 |阅读模式
手头上有块自制的板子,折腾了几天都没能用arduino成功下载程序。
板子是没问题的,用ICC编译,MCUISP-08+progisp167可以成功下载程序。

电路板只是最小系统板(ATMEGA8A),无复位按钮,串口、下载接口均引出。
先用 MCUISP-08+progisp 将 c:\arduino-1.0.1\hardware\arduino\bootloaders\atmega8\ATmegaBOOT.hex
下载到板子上;
然后用串口线将电路板与PC相连;
接着打开 arduino ,打开 blink 全程,将 int led = 13;改为int led = 31; 执行verify 和 upload ,显示如下错误:
Binary sketch size: 890 bytes (of a 7,168 byte maximum)
avrdude: stk500_getsync(): not in sync: resp=0x00

-------------------------------------
这几天在网上看了一些教程,觉得 arduino 的程序分两部分:一,bootloader,通过ISP下载到芯片中;二,应用程序,与bootloader配合,通过串口下载到芯片中。
请问是这样吗?
回复

使用道具 举报

发表于 2012-6-28 18:40:08 | 显示全部楼层
自制板子,如果你下载程序,推荐用1.0.1的新功能,使用编程器下载。就不需要串口部分就能在IDE中给自制系统下载程序了。

如果你用usb to ttl下载,经过我测试,因为通信速度比较高,所以容易受外界干扰,只有古董级bootloader因为速度极慢,才有比较好的抗干扰状态。。。。

串口下载,还是设计比较好电磁兼容性的电路使用比较稳妥。

你用的8A,可以使用0022 IDE里面的NG(M8)的bootloader,这个bootloader老,启动慢,但是很方便手工复位通过串口下载程序。

如果你用新版ide中的bootloader,速度太快了,你得在0.X秒时间内复位,基本上我100次只能成功1,2次。=.=那得无敌神手才能手工搞定。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-28 19:39:00 | 显示全部楼层
弘毅 发表于 2012-6-28 18:40
自制板子,如果你下载程序,推荐用1.0.1的新功能,使用编程器下载。就不需要串口部分就能在IDE中给自制系统 ...


bootloader+串口下载 为什么要复位,因为bootloader开机时只会在一段时间内接收应用程序吗?
回复 支持 反对

使用道具 举报

发表于 2012-6-28 20:41:34 | 显示全部楼层
ygel33 发表于 2012-6-28 19:39
bootloader+串口下载 为什么要复位,因为bootloader开机时只会在一段时间内接收应用程序吗?

因为arduino的bootloader写的要求就是给下载信号后,复位后才能把程序下载进去。。具体为什么这样。。我也不是很懂了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-29 09:04:00 | 显示全部楼层
弘毅 发表于 2012-6-28 18:40
自制板子,如果你下载程序,推荐用1.0.1的新功能,使用编程器下载。就不需要串口部分就能在IDE中给自制系统 ...


"如果你下载程序,推荐用1.0.1的新功能,使用编程器下载"

刚刚用例程编译生成了 “Blink.cpp.hex” ,然后用 progisp 将该文件下载到 芯片中,但无法正确运行。arduino 无法识别 MCUISP-08,所以只能 progisp 下载了。请问我这样的下载方法有没有问题?
补充:芯片无 bootloader
回复 支持 反对

使用道具 举报

发表于 2012-6-29 09:08:12 | 显示全部楼层
ygel33 发表于 2012-6-29 09:04
"如果你下载程序,推荐用1.0.1的新功能,使用编程器下载"

刚刚用例程编译生成了 “Blink.cpp.hex”  ...

需要有bootloader的~你可以先下载bootloader,再刷程序。bootloader刷过一次后,就可以只用刷程序了。地址不同,不会覆盖。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-29 10:40:35 | 显示全部楼层
本帖最后由 ygel33 于 2012-6-29 10:43 编辑
弘毅 发表于 2012-6-29 09:08
需要有bootloader的~你可以先下载bootloader,再刷程序。bootloader刷过一次后,就可以只用刷程序了。地址 ...


在arduino目录下找到两个 bootloader (optiboot_atmega8.hex 和 ATmegaBOOT.hex),试了一下都不行。
这两个bootloader不知道对不对:

arduino IDE 中选择的是 Arduino NG or older w/Atmega8

图片是 arduino 目录下所有 .hex 文件

本帖子中包含更多资源

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

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-29 10:50:17 | 显示全部楼层
本帖最后由 ygel33 于 2012-6-29 10:53 编辑

刚刚将片子程序读出来一看,发现只有应用程序了,下载时选了擦除芯片了,马上再重做一遍看看……

应用程序从0x0000开始,bootloader从高地址开始,是这样吗
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-29 11:18:49 | 显示全部楼层
弘毅 发表于 2012-6-29 09:08
需要有bootloader的~你可以先下载bootloader,再刷程序。bootloader刷过一次后,就可以只用刷程序了。地址 ...

又做了一遍还是不行,~哎, 煎熬啊
回复 支持 反对

使用道具 举报

发表于 2012-6-29 11:47:44 | 显示全部楼层
ygel33 发表于 2012-6-29 11:18
又做了一遍还是不行,~哎, 煎熬啊

囧。。我一直用usbtinyisp,不是用ide,就是用avrdude下载。。。。
下载bootloader可以参考这篇帖子
http://www.geek-workshop.com/thread-658-1-1.html
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-29 13:20:32 | 显示全部楼层
弘毅 发表于 2012-6-29 11:47
囧。。我一直用usbtinyisp,不是用ide,就是用avrdude下载。。。。
下载bootloader可以参考这篇帖子
ht ...

又重新做了一遍,用avrdude下载的bootloader重新读出后 与 MCUISP-08+progisp167 下载的内容一致。
但还是无法正确运行。打算重头再研究一遍,老这样问也不是个事。

最后还想请教个问题
arduino的程序分两部分:bootloader和应用程序;只要这两部分程序正确下载到芯片中就可正确运行,是这样吗? 有其他需要注意的事项吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-29 14:09:13 | 显示全部楼层
弘毅 发表于 2012-6-29 11:47
囧。。我一直用usbtinyisp,不是用ide,就是用avrdude下载。。。。
下载bootloader可以参考这篇帖子
ht ...

参照帖子做了一遍还是不行,受帖子影响,又将datasheet中bootloader部分详细重看了,并做了一些实践终于解决了。之前的问题是因为 arduino 自带的 bootloader 在我的 atmega8 上无法使用。
稍后将详细内容贴出。
在此也感谢您的指导。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-29 15:58:11 | 显示全部楼层
本帖最后由 ygel33 于 2012-6-29 16:31 编辑

新问题未解决
回复 支持 反对

使用道具 举报

发表于 2012-6-29 17:03:25 | 显示全部楼层
怎样弄,还不明白 现在还有一个nano好的,一个坏的,怎么写bootloader了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-6-30 09:09:15 | 显示全部楼层
laoyang 发表于 2012-6-29 17:03
怎样弄,还不明白 现在还有一个nano好的,一个坏的,怎么写bootloader了


bootloader 是一段位于 boot区的代码, boot区可以由熔丝位设置,我用的是 progisp ,向导方式很容易看明白怎么设置。 arduino 的代码包括两部分,一是 bootloader 另一个就是应用程序。 bootloader 负责更新应用程序,并转到应用程序开始执行,所以开机应先执行 bootloader ,所以要通过熔丝位设置复位向量,使得开机从boot区开始执行。烧写 bootloader 和烧写一般程序没多大区别。 用 progisp 打开编译好的 bootloader ,可以看到代码不是从 0x0000 地址开始的,我用的是 arduino 1.0.1 中 ATmegaBOOT.hex,打开发现该 bootloader 是从 0x1C00 开始的,与M8可以设置的BOOT的复位向量(0x0C00)不一致,所以我的程序没法运行。手动将 bootloader剪切到 0x0C00开始处,代码就正常了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-5-22 18:30 , Processed in 0.051014 second(s), 19 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表