atmega8的特点 怎么通过片上Boot程序实现系统内编程

◆ATmega168中文数据手册◆-ATmega168:具有8kB系统内可编程Flash的8位AVR微控制器
&|&&|&&|&&|&&|&
您现在的位置:&&>>&&>>&&>>&手册信息
ATmega168.pdf - 8-bit&AVR&Microcontroller&with&8K&Bytes&Programmable&Flash
型 && 号:&ATmega168
中文描述:&具有8kB系统内可编程Flash的8位AVR微控制器
::下载ATmega168中文数据手册 Ver:A::
手册大小:&3101&K
手册格式:&PDF
推荐等级:&★★★
下载次数:&本日: &总计:
开 发 商:&Atmel
相关链接:&
::ATmega168中文简介::
ATmega168是基于AVR增强型RISC结构的低功耗8位CMOS微控制器。由于其先进的指令集以及单时钟周期指令执行时间, ATmega168的数据吞吐率高达1MIPS/MHz,从而可以缓减系统在功耗和处理速度之间的矛盾。
::ATmega168特性::
•&高性能、低功耗的8&位AVR&&微处理器•&先进的RISC&结构C&131&条指令C&大多数指令的执行时间为单个时钟周期C&32&x&8&通用工作寄存器C&全静态操作C&工作于16&MHz&时性能高达16&MIPSC&只需两个时钟周期的硬件乘法器•&非易失性的程序和数据存储器C&4/8/16K&字节的系统内可编程Flash&(ATmega48/88/168)擦写寿命:&10,000&次C&具有独立锁定位的可选Boot&代码区通过片上Boot&程序实现系统内编程真正的同时读写操作C&256/512/512&字节的EEPROM&(ATmega48/88/168)擦写寿命:&100,000&次C&512/1K/1K&字节的片内SRAM&(ATmega48/88/168)C&可以对锁定位进行编程以实现用户程序的加密&.....
::ATmega168应用领域::
::ATmega168定货信息(仅供参考)::
ATmega168V-2AI&ATmega168V-2PI&ATmega168V-2MIATmega168V-2AJ&ATmega168V-2PJ&ATmega168V-2MJATmega168-16AI&ATmega168-16PI&ATmega168-16MIATmega168-16AJ&ATmega168-16PJ&ATmega168-16MJ
::与ATmega168相关中文资料::
::ATmega168 Related keyword::
ATmega168 DataSheet
ATmega168中文资料
ATmega168中文DataSheet
ATmega168中文数据手册
ATmega168 pdf
ATmega168 Data Sheet
ATmega168中文手册
ATmega168芯片手册
ATmega168 Application
ATmega168 Notes
::下载说明::
*&为了达到最快的下载速度,推荐使用网际快车下载本站手册。
*&如果您发现该手册不能下载,请通知或点击【】,谢谢!
*&未经本站明确许可,任何网站不得非法盗链及抄袭本站资源;如引用页面,请注明来自本站,谢谢您的支持!
热 门 下 载
推 荐 下 载查看: 13919|回复: 18
注册时间最后登录阅读权限30积分293精华1帖子
中级会员, 积分 293, 距离下一级还需 207 积分
我做了一个DIY 的基于Atmega8L的arduino的板子,参考了阿古(宫微宏老师)的博客介绍。我外接了8Mhz的晶振,因为Atmega8L手册上说,只允许最大加到8Mhz.
用avr编程器写入的bootloader,一个系列是由optiboot编译而来,这个版本做了一些优化,得到的bootloder跑不起来。思路回到arduino 自带源代码的Atmega8版本的bootloader , 就是在[D:\arduino\arduinosoftware\]arduino-1.0-windows\arduino-1.0\hardware\arduino\bootloaders\atmega8文件夹内,
08:11 上传
可以看到Makefile自动编译配置文件,一个生成的bootloader文件AtmegaBOOT.hex ,还有AtMegaBOOT.c,这个目录就是我们编译所需要的源代码目录。
下面开始配置编译的环境,编译器是arduino自带的avr-gcc(avr-g++)编译器,这一套编译器组件的目录类似[D:\arduino\arduinosoftware\]arduino-1.0-windows\arduino-1.0\hardware\tools\avr,实际上是winavr(读作whenever :-))的版本,更多的版本在sourceforge上有,从的第一版到最新的都有,请goole一下。这里我们就不麻烦了,直接用arduino 的。为了方便命令行运行make命令,可以在path 中加入这个编译器的两个可执行文件目录,一个是[D:\arduino\arduinosoftware\]arduino-1.0-windows\arduino-1.0\hardware\tools\avr\utils\bin,这个目录就包含了一些工具软件,例如make.exe就在这里头。还有一个可执行文件目录[D:\arduino\arduinosoftware\]arduino-1.0-windows\arduino-1.0\hardware\tools\avr\bin,这里头是编译器的各个环节的工具,比如avr-gcc.exe等。下面说说怎么加path,我使用的是winxp,其它的类似。
1、先右击桌面“我的电脑”图标,点击属性
08:31 上传
2、选择“高级”标签页,点击下方的环境变量
08:35 上传
3、选择当前用户的PATH 变量选项,并点击编辑
08:39 上传
4、在变量值内,我们可以看到系统原有的一些目录的路径,各个路径之间用分号隔开,所以,我们在最后增加一个分号,然后再在后面加上我们的两个目录,[D:\arduino\arduinosoftware\]arduino-1.0-windows\arduino-1.0\hardware\tools\avr\utils\[D:\arduino\arduinosoftware\]arduino-1.0-windows\arduino-1.0\hardware\tools\avr\注意,方括号内的内容改成你自己的arduino 目录。加好后,点击确定。这样环境变量就改好了。
10:56 上传
接下来测试编译环境是否正常,点击开始——》运行,输入&cmd.exe&,打开命令行窗口。输入命令&make --version&和“avr-gcc&&--version&,注意后面的参数之间用空格隔开。可以看到下面的图。
08:55 上传
好了,编译环境设置好了,下面回到刚才的源代码目录。
介绍一下这次编译的目标,使bootloader的运行的晶振频率从默认的16Mzh更改为8Mhz,波特率保持官方的19200不变。这个需要修改Makefile 文件了。
需要做3个地方的改动:
1、修改变量DIRAVR, 只需要加入这一行就可以:&DIRAVR = D://arduino/arduinosoftware/arduino-1.0-windows/arduino-1.0/hardware/tools/avr 。 说明:这是编译器组件所在的目录,我们使用的是arduino-1.0-windows所自带的winavr版本,因为avr-gcc 的工具链来自gun平台,目录的斜杆尊重unix的传统,是&/&,而不是windows 和dos 的传统&\&。
2、修改晶振频率,找到DEFS& && & = -DF_CPU= -DBAUD_RATE=19200这一行,
修改为DEFS& && & = -DF_CPU=8000000 -DBAUD_RATE=19200 。说明:这里设置频率为8Mhz,波特率为19200,没有更改。
3、修改优化参数,这是最重要的一步,也是整篇文章最关键的地方。winavr从版到现在的最新的版,gcc的内核版本,从原来的gcc-3.4.2,发展到了现在的gcc-4.3.2版本。而这个Atmega8BOOT.c 编写于2003年,Makefile的最新版本是2004年,年代太久远了。所以需要修改优化参数。如果不修改,生成的中间代码太大了,然后链接不成最后的hex文件。找到
OPTIMIZE& &= -Os , 修改为OPTIMIZE& &= -Os -fno-inline-small-functions -fno-split-wide-types -mshort-calls 。说明:-fno-inline-small-functions 这个优化选项是最重要的,意思是告诉gcc编译器,不要把一些短函数,变成inline的处理.inline 处理的原理是,把一些短小的函数,不是编译成rjmp,rcall之类的汇编指令,而是把这个短函数的代码,变成了不用回调的顺序执行码,安放到汇编代码所调用的位置。gcc 是想把速度提高起来,因为回调用到堆栈操作啊啥的,比较慢,可是代码却臃肿了,到处都是重复的代码。所以,加上了这个优化选项,等于是告诉gcc编译器,我不要速度了,我要的是魔鬼身材:-)。编译后得到的hex的代码有2718字节的大小,大约3K。
修改后的Makefile的内容如下:
# Makefile for ATmegaBOOT
# E.Lins,
# program name should not be changed...
PROGRAM& & = ATmegaBOOT
PRODUCT=atmega8
# enter the parameters for the UISP isp tool
ISPPARAMS&&= -dprog=stk500 -dserial=$(SERIAL) -dspeed=115200
#DIRAVR = /usr/local/avr
DIRAVR = D://arduino/arduinosoftware/arduino-1.0-windows/arduino-1.0/hardware/tools/avr
DIRAVRBIN = $(DIRAVR)/bin
DIRAVRUTILS = $(DIRAVR)/utils/bin
DIRINC = $(DIRAVR)/include
DIRLIB = $(DIRAVR)/avr/lib
MCU_TARGET = atmega8
LDSECTION&&= --section-start=.text=0x1c00
FUSE_L& &&&= 0xdf
FUSE_H& &&&= 0xca
ISPFUSES& &= $(DIRAVRBIN)/uisp -dpart=ATmega8 $(ISPPARAMS) --wr_fuse_l=$(FUSE_L) --wr_fuse_h=$(FUSE_H)
ISPFLASH& &= $(DIRAVRBIN)/uisp -dpart=ATmega8 $(ISPPARAMS) --erase --upload if=$(PROGRAM).hex -v
OBJ& && &&&= $(PROGRAM).o
#OPTIMIZE& &= -Os& &;old version ,this trig for optimize,will lead to a too big bin file ,which will get out the region of .text ,we need to optimize more.the reason is this Make file is too old ,and should compiled under the winavr toolchain. but now we use the winavr toolchain.
OPTIMIZE& &= -Os -fno-inline-small-functions -fno-split-wide-types -mshort-calls
#DEFS& && & = -DF_CPU= -DBAUD_RATE=19200& &; old version , the next is new ,which turn the crystal frequency from 16Mhz to 8 Mhz
DEFS& && & = -DF_CPU=8000000 -DBAUD_RATE=19200& &
LIBS& && & =
CC& && && &= $(DIRAVRBIN)/avr-gcc
# Override is only needed by avr-lib build system.
override CFLAGS& && &&&= -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) -D$(PRODUCT) $(DEFS) -I$(DIRINC)
override LDFLAGS& && & = -Wl,-Map,$(PROGRAM).map,$(LDSECTION)
OBJCOPY& && &&&= $(DIRAVRBIN)/avr-objcopy
OBJDUMP& && &&&= $(DIRAVRBIN)/avr-objdump
SIZE& && && &&&= $(DIRAVRBIN)/avr-size
all: $(PROGRAM).elf lst text asm size
isp: $(PROGRAM).hex
& & & & $(ISPFUSES)
& & & & $(ISPFLASH)
$(PROGRAM).elf: $(OBJ)
& & & & $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)
clean:
& & & & rm -rf *.s
& & & & rm -rf *.o *.elf
& & & & rm -rf *.lst *.map
asm: $(PROGRAM).s
%.s: %.c
& & & & $(CC) -S $(CFLAGS) -g1 $^
lst:&&$(PROGRAM).lst
%.lst: %.elf
& & & & $(OBJDUMP) -h -S $& & $@
size: $(PROGRAM).hex
& & & & $(SIZE) $^
# Rules for building the .text rom images
text: hex bin srec
hex:&&$(PROGRAM).hex
bin:&&$(PROGRAM).bin
srec: $(PROGRAM).srec
%.hex: %.elf
& & & & $(OBJCOPY) -j .text -j .data -O ihex $& $@
%.srec: %.elf
& & & & $(OBJCOPY) -j .text -j .data -O srec $& $@
%.bin: %.elf
& & & & $(OBJCOPY) -j .text -j .data -O binary $& $@
复制代码准备了这么多,就是见证奇迹的时刻了:)
接下来,就是进行编译的过程了。
1、在打开命令行窗口,修改当前目录到所在的盘。介绍一下Dos 命令,默认打开的命令行窗口是C盘,我们要切换到保持源文件的盘,比如我的是D:盘,在命令行中输入&D:& ,按回车键。更改目录 ,输入& cd&&[\arduino\arduinosoftware\]arduino-1.0-windows\arduino-1.0\hardware\arduino\bootloaders\atmega8& 。方括号内请你自己改成自己的目录。
10:00 上传
2、在atmega8目录下输入命令&make clean& ,这是把以前编译过程的中间代码,结果代码等.o .a .hex 扩展名文件全部清空,为新的编译清理空间。
10:04 上传
make clean
3、输入命令&make” ,是不是太容易了:)刷刷,编译过程一下子过了,最后生成AtmegaBOOT.hex文件等等,是不是特兴奋?
10:11 上传
final files
打开Atmega8目录,可以看到我们自己搞出来的hex了吧,呵呵。
之后的事情,我想大家各显神通,用编程器把这个hex烧到Atmega8L芯片里头吧。
这个芯片写好了我们自制的bootloader,已经是arduino 的家族成员了。
下面还有一个工作要做,就是把我们的信息加到arduino 的board的参数选项中。打开D:\arduino\arduinosoftware\arduino-1.0-windows\arduino-1.0\hardware\arduino文件夹的boards.txt 文件,进行修改,修改的模板用ATmega8的直接复制修改。参考看下面的代码:##############################################################
atmega8.name=catnull modified w/ ATmega8L
atmega8.upload.protocol=arduino
atmega8.upload.maximum_size=7168
atmega8.upload.speed=19200
atmega8.bootloader.low_fuses=0xdf
atmega8.bootloader.high_fuses=0xca
atmega8.bootloader.path=atmega8
atmega8.bootloader.file=ATmegaBOOT.hex
atmega8.bootloader.unlock_bits=0x3F
atmega8.bootloader.lock_bits=0x0F
atmega8.build.mcu=atmega8
atmega8.build.f_cpu=8000000L
atmega8.build.core=arduino
atmega8.build.variant=standard复制代码说明:其实就把L改成8000000L。
之后的事情,arduino 人都知道了。
思考题:1、编译过程中出现了一个警告,你打算如何把这个警告消除呢?是不是遵从GPL2.0的标准,改一下AtmegaBOOT.c的代码?
2、烧写bootloader时,avr芯片的熔丝位Hfuse 和Lfuse的数值在哪里可以找到?
最终生成的bootloader,在arduino1.0版测试通过,在arduino-0200版本测试通过,在1.0.1最新版测试通不过:(
经过一个下午的努力,在RXD 和TXD(2、3)脚和VCC之间接1K OM的电阻后,在1.0.1版本测试也正常了:)
(30.23 KB, 下载次数: 145)
21:18 上传
点击文件名下载附件
适合arduino1.0版测试通过
(172.89 KB, 下载次数: 122)
10:06 上传
点击文件名下载附件
总评分:&威望 + 3&
注册时间最后登录阅读权限150积分9693精华10帖子
好贴。。。强烈加精。。。
注册时间最后登录阅读权限90积分4717精华11帖子
论坛元老, 积分 4717, 距离下一级还需 9995282 积分
真的不错,写的狠详细,希望楼主继续努力!
深圳市博励教育,专注于高速PCB设计培训,需要请联系:QQ:
注册时间最后登录阅读权限30积分293精华1帖子
中级会员, 积分 293, 距离下一级还需 207 积分
本帖最后由 catnull 于
18:30 编辑
自制的板,很多原理不是很清楚。我的设计是,把max232的电平转换小板单独出来,这样板子可以整洁一点,也便于仪器的重复利用:)。但是参考原来的原理图,以及Arduino NG的USB转串口的原理图,USB转串口芯片和M8的2、3脚RXD,TXD 之间的220OM 的电阻,以为是用来保护的。后面发现,我的数据板一掉电,arduino 的启动就不正常,如果数据板一上电,arduino启动就正常了。
这个非常诡异,以为我费了老大劲搞出来的Atmega8L的bootloader跑飞了。
后面冷静一想,靠,这不是硬件问题吗?
一定是数据口的问题。我看一般指示灯都可以用LED串470OM电阻,接在RXD 和VCC之间,起到指示灯作用,我不用LED,我用1KOM的电阻,把RXD 和TXD两个脚上拉到VCC好了。
结果一测试,正的是这个上拉的电阻在搞怪。
记得以前读过一个嵌入式的文章,里面作者就谈到了一个上拉电阻让程序通信失灵的故事。这次我用上了。
只能说, Atmel 真的很小气,在数据口集成一个上拉电阻,要费老大的劲吗?
希望愿意自己DIY的朋友们可以成功。附上我的NG图,
18:19 上传
还有一个Free NG图,后面这个是搞了max232芯片的。真的很方便自己DIY.
18:19 上传
上面的带232芯片的,有一个自动复位的电路,就是232的8、9j脚组合的电路,真的很给力,
这是修改的上拉电阻的部分
18:26 上传
上拉电阻示意图
注册时间最后登录阅读权限20积分63精华0帖子
注册会员, 积分 63, 距离下一级还需 137 积分
这贴 非常有质量 有营养!
关于自动复位电路那里 有点疑问
就是串口线的DTR为什么不是像官方直接
& && & DTR-&104电容-&RST
而是 DTR-&R2IN-&R2OUT-&104电容-&RST
注册时间最后登录阅读权限30积分293精华1帖子
中级会员, 积分 293, 距离下一级还需 207 积分
ysit1990 发表于
这贴 非常有质量 有营养!
关于自动复位电路那里 有点疑问
就是串口线的DTR为什么不是像官方直接
应该是利用232电平转换的功能吧。直接接的话不好,电脑的串口的电平标准不一样。
注册时间最后登录阅读权限50积分541精华1帖子
高级会员, 积分 541, 距离下一级还需 459 积分
非常感谢,很有含金量的帖子.
注册时间最后登录阅读权限150积分4763精华2帖子
注册时间最后登录阅读权限70积分1160精华0帖子
金牌会员, 积分 1160, 距离下一级还需 1840 积分
好东西啊,哪天改改试试看
注册时间最后登录阅读权限50积分883精华0帖子
高级会员, 积分 883, 距离下一级还需 117 积分
还是没怎么看懂~~~~~~~~~~~~·
Powered byATMEGA48与DS1302组成的定时控制系统
ATMEGA48与DS1302组成的定时控制系统
Atmel公司的ATMEGA48是一款高性能、低功耗的8 位AVR微处理器,使用先进的RISC 结构,大多数指令的执行时间为单个时钟周期,所以运算速度更快。两个具有独立预分频器和比较器功能的8 位定时器/ 计数器;一个具有预分频器、比较功能和捕捉功能的16 位定时器/ 计数器;具有独立振荡器的实时计数器RTC;六通道PWM;8路10 位ADC(TQFP 与MLF 封装)[ 6路10 位ADC( PDIP 封装)];可编程的串行USART 接口;可工作于主机/ 从机模式的SPI 串行接口;面向字节的两线串行接口;具有独立片内振荡器的可编程看门狗定时器;片内模拟比较器;引脚电平变化可引发中断及唤醒MCU等。
  其具有的下面特点无论从编程、自编程和加密等方面都给用户提供了很大的方便。4K字节的系统内可擦写10,000 次的可编程Flash;具有独立锁定位的可选Boot 代码区,通过片上Boot程序实现系统内编程;256字节的擦写100,000 次的EEPROM;512字节的片内SRAM,可以对锁定位进行编程以实现用户程序的加密。Maxim公司的8脚串行实时时钟日历芯片DS1302,体积小、与单片机接口简单、工作电压范围宽(2.5~5.5V)、功耗低、接口容易、占用CPU I/O口线少、可对时钟芯片备份电池进行涓流充电等特点。所以应用方便,被很多设计者所青睐。
  图1& ATMEGA48与DS1302的电路连接
  笔者利用这两种芯片,设计了实时时钟,实时数据采集和定时控制系统。现就DS1302与ATMEGA48的应用介绍给大家。
  由于ATMEGA48有可选的内部振荡器,所以只需接通电源即可;DS1302需要一个32768Hz的晶振,和一个备用电池。可以看出结构很简单(由于本文只介绍ATMEGA48和DS1302的应用,所以其余的显示电路和数据采集电路均省略。)。
  ATMEGA48与DS1302的通讯程序(ASM)
  图2& DS1302的时序
  图3& DS1302充电原理图
DS1302的时序如图2。根据时序图,给出下面的读/写程序:读出数据子程序如下:& ;sbi portd,7 ;假设调用子程序以前已经保持rst为高RDS:& clr r17&& ;将取到的数据保存到R17中& ldi r24,8& sbi portd,6& ;sclkRDS1: cbi portd,6& ;sclk 下降沿读取数据& nop& IN R16,pind&&&&& ;从CPU I/O读取数据& nop& sbi portd,6& ;sclk& BST R16,5& ;复制PIND.5到T& LSR R17& BLD R17,7& ;复制T到R17.7& dec r24& CPI R24,0& BRNE& RDS1& RET
  注: ATMEGA48 I/O口有三个寄存器分别是:数据寄存器- PORTx、数据方向寄存器- DDRx 和端口输入引脚- PINx。I/O作为数据输入使用时,读取数据命令应为 IN Rd,PINx,如果使用IN Rd,PORTx则读取到的是I/O口的状态,尽管将DDRx设置成数据输入。特别注意的是,读取软件赋予引脚电平和执行读取指令in 之间至少有一个时钟周期的间隔,文中用nop间隔。
写入数据(命令/地址)子程序如下:& ;ldi R17,假设要写入的数据已经存放到R17中& ;sbi portd,7 ;假设调用子程序以前已经保持rst为高WDS:& ldi r24,8WDS1: cbi portd,6& ;sclk& in r16,portd& ;读入D口状态& BST R17,0& ;将R17.0复制到T& BLD R16,5& ;将T复制到R16.5& nop& out portd,r16 ;写数据到portd(R16.5-&portd.5)& sbi portd,6& ;sclk& lsr r17&& dec r24& CPI R24,0& BRNE WDS1& & RET
  关于命令字节的说明。DS1302命令字节由8位组成,BIT 0 为1时,读取数据,为0时写入数据。BIT 1-5 为地址。BIT 6 为1时指向31个RAM,为0 时指向时钟寄存器。BIT 7 必须为1,为0时将使DS1302停止。DS1302的控制寄存器的第七位是写保护位,所以在写入数据前应该将其关闭,并在写数据完毕后将其使能。下面是一段完整的设置分的程序。......ldi r19,0x43& ;假设当前时间为43分,DS1302时间寄存器保存的数据为10进制数十六进制存储。ldi r18,0x82& ;写分 命令ldi r27,0x00& ;x Hldi r26,19& ;x L&&& 在这里使用间接寻址,所以只需改变R19的数据即可。......WRITE_DS1302:& cbi portd,7& cbi portd,6& sbi portd,7 & ldi r17,0x8e&&&&&&& ;控制寄存器en_WRITE& rCALL& WDS&& & ldi r17,0&&& ;写操作前WP=0& rCALL& WDS& & mov r17,r18&&&&&&&&& ;写秒 分 时 日 月 星期 年 地址&&&&&&& rCALL& WDS& ld r17,x&&&&& ;写秒 分 时 日 月 星期 年(R19中的数据)&&&&&&& rCALL& WDS & cbi portd,7& cbi portd,6& sbi portd,7& ldi r17,0x8e&&&&&&& ;控制寄存器un_en_WRITE& rCALL& WDS & ldi r17,0x80&& ;写操作前WP=1& rCALL& WDS& & cbi portd,7&&& & RET同样,下面给出了一个完整的读取分的程序ldi r18,0x83& ;读分 命令ldi r27,0x00& ;x Hldi r26,19& ;x L&&& 将取到的数据存储到R19中。READ_DS1302:& cbi portd,7& cbi portd,6& sbi portd,7& mov r17,r18&&&&&&&& ;写秒 分 时 日 月 星期 年 地址&&&& rCALL& WDS &&&& rCALL& RDS& st x,r17& ; 保存数据到R19& cbi portd,7& RET
  整合写和读分的程序,改变R18的内容就可以实现“秒、分、时、日、月、星期、年”的读写,写操作时只需改变R19的内容就可以将新的数据写入,读操作时直接读取R19的内容即可。也可以通过此程序直接来对31个RAM进行数据读取。
DS1302的充电功能
  DS1302的涓流充电功能也是非常方便的,同时又是其非常重要的一个功能,所以简单介绍一下其使用。其原理框图如图3。
  DS1302 有一个单独的寄存器控制涓流充电。BIT7:BIT4是涓流充电功能的选择器,只有当它们被设置成1010才能够将其使能。使用DS(BIT3和 BIT2)可以在一个和两个二极管之间选择;使用RS(BIT1和BIT0)可以选择两个电源(Vcc1和Vcc2)之间的电阻,这两个选择器共同使用来帮助您得到所需要的电流。
  通过这一实践,表明应用DS1302在测控系统中的数据记录,其软硬件设计简单,时间记录准确。同时由于ATMEGA48的高速度,大数据吞吐,给实际应用带来了很大方便。由于笔者水平有限,仅将应用笔记供大家参考。(转自中国电子制作网站)
发表评论:
TA的推荐TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&1、将程序上传到板子时Arduino IDE提示&avrdude: stk500_getsync(): not in sync: resp=0x00&
网上查遇到这个问题的人比较多,有说驱动问题的,有说IDE设置问题的。具体到我遇到的这个情况,原因是板子上插了RF24无线传输模块(也许线还没有插对),拔掉以后再上传程序就正常了。
2、nRF24L01+无线透传使用问题
Arduino官网上似乎推荐,遇到一个问题,接收端运行几分钟后停止响应;试了另外一个,遇到传输不稳定的问题,一时没有解决,还是回到Mirf了,之前的停止响应问题没有再出现。
关于无线透传的讨论不少,虽然用arduino的不多。
Mirf的地址问题:Mirf的address是有长度要求的,例如可以用&serv1&、&clie1&作为地址,长度过短会导致无法传输,例如用&cl2&作为地址。试了好多次才发现这个问题。
nRF24L01模块(使用Mirf库时)的自动应答问题:项目里使用一个nRF24L01(服务端)接收多个nRF24L01(客户端)的消息,发现客户端之间互相收到本应发到服务端的消息,经过多次试验,发现应该与nRF24L01的自动应答机制有关。在Mirf.cpp的setTADDR方法里可以看到,目标地址被同时写到RX_ADDR_P0和TX_ADDR这两个寄存器里,前者是接收自动应答使用的(一个nRF24L01可以有6个接收地址同时工作),导致peer发到服务端的消息也被当作自动应答了。为避免这种干扰,我实验下来的方法是:每个客户端在发送数据之前先setTADDR到一个无效且唯一的地址,在send之前那一刻再使用setTADDR将地址设置到服务端的地址,发送完成后马上setTADDR到那个无效地址。
3、Arduino与Android通过usb通讯
利用这个开源项目。注意,两侧的baudrate要设置一致;android端读取到的数据可能是不完整数据,需要多读几次以便补齐。
&The nature of hardware device interfaces like these is that there is typically no guarantee your data will arrive in a single read().&If you expect 16 bytes of data, you need to read(), successively, until you have received all 16. &If you want to read until there is a newline, you will need to scan all characters until you find a newline -- and then save anything received after it for later.&
4、关于arduino设备的唯一ID
最后决定使用的方案是:写一个专门的小程序(量产程序),对每个arduino运行一次,在EEPROM里写入唯一的id号。正式程序运行时只需读取,不做修改。
注意:EEPROM的擦写次数是有限制的,一般标称为10万次,但有人声称实验结果只有100次左右。还好,比较靠谱的实验测试结果是超过100万次,总之写入EEPROM时慎重。
5、温湿度传感器DHT11
3.3v/5v通用,接数字信号口,使用这个库获得数据。DHT11精度不高,若要求高可使用DHT22(也叫AM2302)。
6、同一段代码在两块板子上运行效果不同
两块板子都是uno+sensor shield+nrf24l01,其中一块运行完全正常,另一块无法接收到消息(可以发送消息)。交换sensor shield(连同上面的nrf)无效,交换usb线无效,接外接12v电源无效。最后发现如果在代码的loop()里加delay(100)则基本能接收到消息,但还有部分丢包。两块板子是从不同卖家处购买的,看来还是有区别啊。
7、Arduino nano v3.0接nrf24l01模块不工作问题
nano直接连nrf24l01模块无法收发数据;但用nano先接传感器扩展板(sensor shield,像),再把nrf24l01接到扩展板上,则工作正常。仔细检查过连线没有问题,且分别替换过nano和nrf模块usb线等,都没有效果。最后发现nano板子上的3.3v针脚电压不对,几乎是零,联系卖家检查后说是nano上少一根线,要把usb口背后的两个电容(C1和C7)靠近芯片的引脚短接,照此方法问题解决。而扩展板上的3.3v针脚是用asm从5v降压得来,所以没有这个问题。
nano的说只有用usb供电时3.3v针脚才有电压,但经实验,我手上的这一版(电容短接后)不论用usb供电还是通过vin供电,3.3v针脚都有3.3v电压。
8、无法上传程序到arduino pro mini
使用ft232rl连接arduino pro mini,上传程序时提示:
stk500_getsync(): not in sync: resp=0x00
上传时按reset按钮不起作用,DTR线也已经连接。经过反复实验,发现两个问题导致这个现象:1)arduino上的RX应该接ft232rl的TX,TX接RX,我一开始接反了;2)一开始用的FTDI的驱动是最新的2.0.8.30,在的提示下,降级到后问题解决。PS.最好搜索并下载CDM20824_Setup.exe文件以便强制降级。
又测试了一下DTR线的作用,如果连接了DTR线,直接上传程序就可以成功;如果不连接DTR线,在提示Uploading时立刻按一下arduino的reset按钮,也可以上传成功,不按按钮则上传失败。
Update : 不知道什么原因,ft232rl又无法上传程序到arduino pro mini了。这个帖子里有人提到在DTR线上加一个100nF的电容是关键的一步,但我手边没有这个电容,而且即使我不连接DTR线采用手动reset的方式仍然不行。后来使用PL2303模块的下载线(只有四个脚,与ft232rl相比少了DTR脚)配合手动reset方式可以正常上传程序到arduino。
9、Arduino的数据类型
Arduino的长整型是32位的,而Java里是64位,互传数据时别搞错了。关于arduino里的
10、电池供电方案
我花了不少时间在研究各种供电方案上,要平衡电池容量和带来的体积增加,还要考虑电池成本因素:
方案1: 5号/7号干电池供电,为达到至少3.3v的电压以便驱动arduino pro mini+nrf24l01,需要至少三节电池,体积太大放弃;
方案2:CR2032纽扣电池供电,同样电压不足(标称3V),实测3.2V但后来会有电压下降,在3V左右arduino能启动但无线模块不正常;
方案3:3.7V锂电池供电,这是目前采用的方案,目标是让一块250mAh的锂聚合物电池能维持设备运行2个月以上。为节约成本和体积,锂电池充电模块将采用外置的方式。
可以检测当前VCC脚的电压(仅支持328和168),有助于实现提示电池电量不足,我在pro mini 5v上实测可用。
11、减小工作电流
目前采用arduino pro mini 5v/16MHz版本,这个版本在tb上的售价为13元人民币左右,而3.3v/8MHz的版本要17元左右,实测5v版本用3.3v电源(输入VCC)仍然可用,只是这时核心频率可能会低于16MHz,影响不大。
为减小工作电流以获得尽可能长的工作时间,设备绝大多数时间进入睡眠模式(使用库),利用watchdog周期性醒来发送数据,然后立刻回到睡眠模式。
nrf24l01模块也需要同时睡眠和醒来,使用Mirf库里的powerDown()命令。
实测电流:pro mini 5v版本,3.7v锂电池供电,HT7533稳压,LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF)同时Mirf.powerDown(),电流1.48mA。
传感器供电:如果直接将传感器接在5v或3v3上,传感器会一直消耗电流。为了节电,可以将对电流要求不高的传感器接在digital输出上,当arduino需要使用传感器时再对它通电。、
12、TP4056充电板的充电电流问题
tb上买的TP4056芯片的锂电池充电板,要更改的Rprog是在电路板下方中部(电路板上文字方向为正)的一个小贴片电阻,出厂时阻值是1.2k。我需要90mA的充电电流,按照说明,替换成15k左右的电阻。
测试充电电流时遇到一点问题:发现充电电流比预想的要低,77mA左右,而且几乎一开始就缓慢下降,并不是恒流的。查了一些资料后发现,我是把万用表串接到BAT+口上的,而万用表对这个电流造成了影响,因为使用不同的档位测出来的电流值不同,高档位显示的电流比较高。实际应该串接到In+口,或者测量Rprog电阻的电压然后(V/Rprog)*1200得到充电电流。
13、analogRead(0)与analogRead(A0)的区别?
如果所说属实,在Arduino IDE 0022以上这两个命令没有区别,A0的值为14,而analogRead(0)等价于analogRead(14)。补充:又找到说的比较详细。
14、搭建最小系统的问题
a) 我在tb上买的usbasp,vcc脚居然与gnd脚短接(!),vcc脚旁边的那个看不清字的脚有5v电压;后来仔细一看,是文字距离对应的针脚太远,以致于串行了。
b) 我使用Atmega168pa作为核心搭建最小arduino系统,在arduino ide 1.5.5里选择board -& arduino ng or older,用usbasp烧录bootloader时会提示下面的错误:
&avrdude:&Expected signature for ATMEGA168 is 1E 94 06
原因是atmel168pa与atmel168这两个芯片的签名不一样,arduino自带的avrdude无法识别。按照的方法可以解决,不过可能是arduino ide版本不同的原因,原帖里的内容需要略作修改,按照ide的错误提示来改即可。,虽然我没实际试验,但也值得一看。
c) 顺便提醒一下用&面包板专用电源&的,要注意电源插针的极性&&电源插在面包板两端时正负极刚好是反过来的。
d) 可能是面包板不太牢靠,在面包板上搭的最小系统很不稳定,后来焊到洞洞板上就没有问题。
e) 如果使用programmer(例如usbasp)刷sketches到最小系统,注意每刷一次EEPROM都会被清除,解决的办法是将EESAVE熔丝位设置为1(见)。
f) 为了方便调试,以及解决programmer刷sketches导致EEPROM被清除的问题,我决定还是用ttl(pl2303)上传程序。连接好Vcc, Gnd, Tx, Rx后发现upload会失败,reset不起作用,在网上找到提到boards.txt里upload.protocal的设置问题,打开boards.txt将原来的pro.upload.tool=avrdude改为pro.upload.tool=stk500,再刷一遍bootloader,使用ttl就正常了。
补充:后来使用ttl上传时又提示missing "upload.params.quiet"错误,将pro.upload.tool改回为avrdude解决,比较奇怪。
15、最小系统在5v下工作但在3.3v下不工作
还是atmega168pa芯片,配合8MHz外部晶振,搭好的最小系统上传blink程序,在5v输入下led闪烁,但换成3.3v输入led不亮。测量pin13的电压输出为0.5v左右且保持不变,说明blink程序没有正常执行。后来发现原因是3.3v输入只接到vcc而没有接到avcc脚上。进一步测试,如果3.3v只接avcc,led也会闪烁但比较暗,pin13输出电压为2.2v左右。说明vcc与avcc需要都接到3.3v供电才可以。
在atmega的datasheet里有这样的说明:&AVCC AVCC is the supply voltage pin for Port A and the A/D converter. It should be externally connected to VCC, even if the ADC is not used. If the ADC is used, it should be connected to VCC through a low-pass filter. &
16、使用Eagle制作电路板
为了进一步缩小成品尺寸,我决定设计自己的电路板,然后再tb上找工厂打样生产。一开始考虑使用protel做这件事,后来发现eagle更合适,首先后者是可以免费使用的不需要破解,其次eagle的官网上就有很多元件库可以下载,与arduino有关的库也比较丰富。eagle上手也不难,推荐看一下Sparkfun上的两篇教程(,)基本就可以开始干活儿了。
下图我设计的第一个PCB板(已送去打样),尺寸为25mmx42mm,电路板上主要集成了基于atmega328p的arduino最小系统和nrf24l01接口,用来实现传感器数据的无线上传,低功耗设计使用250mAh的锂电池供电2个月左右。完全手工布线,虽然过程磕磕绊绊,但还是挺有成就感的。
上图是第一版设计,打样回来发现几个问题:1)丝印有重叠,原因是虽然在eagle里隐藏了一些层,但gerbers文件里这些层仍然可见;解决办法是在pcb设计图里smash元件,然后删除掉与丝印重叠的name和value;2)有三条线没有连通(见上图中的三条细黄线),设计时原本以为地线都靠覆铜连通的就没有管,其实覆铜不是哪里都能覆盖到的,所以打样前要保证所有飞线都route过(点击ratsnest工具提示nothing to do就表示所有飞线都route好了)。
第二版的设计里改正了第一版中的问题,并对一些元件进行了重新布局。
第三版的改动比较大:里把配对按钮的下拉(pull-down)改为上拉(pull-up)以便与习惯一致,另外修改了电源接口和传感器接口,atmega328芯片采用45度角布局方便走线,led从0603改为0805方便焊接,aref与3v3断开但保留一个跳线,将晶振改为贴片封装,nrf24l01模块设计在电路板背面以便在焊接后仍然能修改(拆)正面的元件。
16.1 常用单位换算
Eagle里的钻孔尺寸单位是英寸inch,乘以39.4就是毫米,例如0.02inch=0.508mm。打样前要注意厂家对最小钻孔的要求,一般不能低于0.4mm,因为钻孔越小使用的钻头越小,价格也越贵。
1mil = 1/1000英寸 = 0.0254毫米
1英寸 = 25.4毫米
1毫米 = 39.4mil = 0.0394英寸
16.2 PCB板覆铜
在PCB板上覆铜对走线很有帮助,双面板一般有一面的覆铜用于地线,上面提到的Sparkfun的里有覆铜的使用方法。
但是要注意,有些地方由于被其他走线包围,会导致覆铜无法到达,这些地方通常会有遗留的连线(例如上图中两个10uF电容之间)需要手工route,如果不route这些线在成品线路板上就只能飞线补救了。
17、从Eagle导出gerbers文件
为了打样,需要给工厂提供设计文件,但不是每家工厂都接受eagle的源文件,同时提供源文件也容易被别人复制自己的设计。因此需要将eagle格式的设计文件导出为gerbers文件,这个绝大多数工厂都接受的文件格式。我在网上找到了一个简易教程《Eagle PCB 生成Gerber文件步骤》,作者孙民强,按照教程所说的步骤打样&基本&成功。
这次打样比较明显的一个问题是,虽然在eagle里隐藏了tNames层,但导出gerbers以后这个层依然存在,导致元件自带的Name与tPlace层的文字同时出现产生重叠。解决方法是先smash带有Name的元件,然后就可以移动或删除Name,从而只保留tPlace层。也许在导出gerbers过程中也可以做一些设置达到相同目的吧,暂时没有研究。
使用免费版可以查看gerbers文件。
18、电路板焊接注意
焊接atmega芯片前,先确保芯片已经刷好bootloader,用arduino ide刷时要注意选择正确的board类型(例如arduino pro or pro mini);处理器类型最好也选一下(例如atmega328(3.3v 8MHz)).
贴片LED极性:有彩色线的一端是负极,&|&&指向的一端是负极。
焊接很小的贴片元件时这样比较容易:先在其中一边焊盘上挂上锡,然后用镊子夹住元件贴紧这个焊盘,用烙铁将锡熔化的同时稍微用力将元件推进去,这一边就固定好了,这时可以轻松将另一边焊好。
19、最小系统无法工作原因
a)万用表检查电源与地线是否短路 b)检查atmega芯片方向是否正确 c)加电检查3v3电压是否正确 d)atmega芯片是否已烧入正确的bootloader
阅读(...) 评论()}

我要回帖

更多关于 atmega8的特点 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信