ATMEGA328P使用内部8MRC振荡器(2015-07-05 19:50:49)

ATMEGA328P使用内部8MRC振荡器(2015-07-05 19:50:49),第1张

计划做个蓝牙的接收机,用来控制四轴的飞控板。

使用的是ATMEAGE328P,不想再自己实现PWM了,它自带了6通道的PWM。为了能轻一点,没有设计外置晶振,打算用内部的。

板已经打好了,回来一对蓝牙控制板就吐血了,脚画错了。

没办法,只能先试试程序了。为了能让Ardunio开发环境支持,参照这个网页,在Ardunio 1.0.4下测试成功

http://forum.arduino.cc/index.php?topic=124879.0

首先用文本编辑器打开arduino-1.0.4\hardware\arduino\bootloaders\optiboot下的Makefile文件,在标准的atmega328p这段后面,加入下面这段配置:

# Standard atmega328, only at 38,400 baud for closer clock accuracy AND using 8Mhz internal RC oscillator

#

atmega328_384_8: TARGET = atmega328

atmega328_384_8: MCU_TARGET = atmega328p

atmega328_384_8: CFLAGS += '-DLED_START_FLASHES=3' '-DBAUD_RATE=38400'

atmega328_384_8: AVR_FREQ = 8000000L

atmega328_384_8: LDSECTIONS= -Wl,--section-start=.text=0x7e00 -Wl,--section-start=.version=0x7ffe

atmega328_384_8: $(PROGRAM)_atmega328_384_8.hex

atmega328_384_8: $(PROGRAM)_atmega328_384_8.lst

atmega328_384_8_isp: atmega328

atmega328_384_8_isp: TARGET = atmega328

atmega328_384_8_isp: MCU_TARGET = atmega328p

# 512 byte boot, SPIEN

atmega328_384_8_isp: HFUSE = DE

# Int. RC Osc. 8MHz, slowly rising power-65ms

atmega328_384_8_isp: LFUSE = E2

# 2.7V brownout

atmega328_384_8_isp: EFUSE = 05

atmega328_384_8_isp: isp

然后打开windows的控制台程序,进入hardware\arduino\bootloaders\optiboot文件下

在控制台中输入并回车

omakeatmega328_384_8

这个atmega328_384_8参数指的就是上面定义的支持内部8M RC的HEX文件。

编译完成后,atmega328_384_8.hex就生成好了。

现在用文本编辑器打开arduino-1.0.4\hardware\arduino下的board.txt文件,并添加下面这段文字

##############################################################

atmega328_384_8.name=ATmega328 Optiboot @ 38,400baud w/ 8MHz Int. RC Osc.

atmega328_384_8.upload.protocol=arduino

atmega328_384_8.upload.maximum_size=30720

atmega328_384_8.upload.speed=38400

atmega328_384_8.bootloader.low_fuses=0xE2

atmega328_384_8.bootloader.high_fuses=0xDE

atmega328_384_8.bootloader.extended_fuses=0x05

atmega328_384_8.bootloader.path=optiboot

atmega328_384_8.bootloader.file=optiboot_atmega328_384_8.hex

atmega328_384_8.bootloader.unlock_bits=0x3F

atmega328_384_8.bootloader.lock_bits=0x0F

atmega328_384_8.build.mcu=atmega328p

atmega328_384_8.build.f_cpu=8000000L

atmega328_384_8.build.core=arduino

atmega328_384_8.build.variant=standard

这样就定好了一个新的板子了。关掉ardunio IDE,再打开,板子列表里面就多了ATmega328 Optiboot @ 38,400baud w/ 8MHz Int. RC Osc.这一项。

选中后测试下烧入bootloader完全没有问题。

至于自己设计的板子,又得重打样了。

要将蜂鸣器设置到所求频率,可以通过单片机控制输出的脉冲信号的频率和占空比来实现。以下是一种基本的方法:

1. 确定所求频率和占空比。比如,如果需要设置频率为1000Hz,占空比为50%的方波信号,则周期为1ms,高电平时间和低电平时间各为0.5ms。

2. 确定单片机的计时器,以及计时器的时钟源和分频系数。根据所需频率和计时器的时钟源、分频系数,可以计算出计时器的计数值。

3. 在单片机程序中初始化计时器,并设置计时器的计数值和工作模式。在输出脉冲信号时,使计时器开始计时,在计时器计满之前,输出高电平;计时器计满后,输出低电平。

4. 重复上述步骤,不断输出脉冲信号,直到需要停止输出。

需要注意的是,在具体实现中,还需要考虑单片机的硬件和软件资源限制,以及蜂鸣器的驱动能力和响应特性等因素。因此,具体实现方法可能会因情况而异。

为了恢复Arduino的功能,必须得重新给ATMega328P单片机里烧写bootloader(其实Arduino就是在AVR单片机中预置了一个bootloader程序,这样再配合Arduino开发环境就是所谓的Arduino了,但Arduino这个词本身只留给官方使用)。当然在淘宝上也能买到已经烧写好的AVR单片机,只是自己手上已经有了AVR单片机,就没必要去花那冤枉钱了。

于是马上打开万能的百度,输入关键字“Arduino bootloader”果然,一大堆乱七八糟相关的问题就出来了,经过一轮的筛选,发现许多说的也并不是很清晰,不过让我明白了个大概:一个普通的AVR单片机确实能烧写bootloader之后作为Arduino使用。那么问题来了,如何把bootloader烧录到AVR单片机中去了?这的确是个问题,反正对于不懂AVR开发的我来说是个问题。不过还好之前在淘宝上买了一个USBASP下载器,跟之前擦除bootloader一样,也要用到progisp软件(因为此时的ATMega328P只是一个普通的AVR单片机,用Arduino开发软件是烧写不进去的)。

既然要烧录bootloader,那么什么是bootloader呢?正如你所想,bootloader当然是一个程序,既然要烧录到单片机中去,应该是一个.HEX之类的文件。但是,bootloader文件从哪来呢?继续百度。。。找到了,在Arduino软件安装目录中的hardware\arduino中。此文件夹下的“boards.txt”文件很重要,是很重要,其他的或许都可以在百度上找到,但因为这个文件折腾了我大半个晚上,百度上也没有明确的说明。打开文件,找到自己对应的Arduino版本,因为我的是“Arduino Uno”,于是锁定“uno.name=Arduino Uno”区域的说明,因为看上去很乱,一定要仔细去看。找到“uno.bootloader.low_fuses=0xff"指编程熔丝低位为FF,”uno.bootloader.high_fuses=0xde“指编程熔丝高位为DE,”uno.bootloader.extended_fuses=0x05“指扩展位为05。这三个值非常重要,是决定你烧录bootloader成功的关键。至于这三个值具体是什么意思,我也不是很不清楚,但AVR单片机的烧录时需要设置熔丝位,而且不能乱设置,这也是AVR跟51单片机的不同之处。

用progisp软件把这三个熔丝位的值写入到AVR单片机中,然后继续浏览”boards.txt“文件往下看,找到”uno.bootloade旦长测短爻的诧痊超花r.path=optiboot“这就是说要烧录的bootloader文件在bootloaders\option文件夹中,“uno.bootloader.file=optiboot_atmega328.hex”文件名就是optiboot_atmega328.hex,这就是接下来需要烧录到AVR单片机中的程序。用progisp软件调入此文件,然后直接写入到AVR单片机中就行了,一个支持Arduino的AVR就做好了。。。

其实这个问题本身不难,但对于没接触过AVR的人来说,还是要花许多时间的,中间也会存在许许多多各种各样的问题。至于progisp的使用方法很简单,百度上的教程也很多,还有手上必须有一块可以烧录AVR单片机的下载器。我当时就是忽略了那三个熔丝位的值,所以反反复复也没有成功,百度上面也没有对”boards.txt“文件做详细的解释。没设置熔丝位程序是可以正常的烧录进去,但Arduino是不能用的,所以必须要按照官网给出的说明 *** 作。我当时大多数时间主要花在两个问题上,一个是.HEX文件具体位置,因为Arduino有不同的版本,所以.HEX文件也不同,还有一个就是熔丝位上。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11173652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存