我想生成一个具有可变频率和固定占空比(50%)的 PWM 信号。频率应在 0-25KHz 之间变化。这是针对 ATMEGA32U4 微控制器的,我使用 Atmel Studio 用 C 语言编写它。我确实阅读了数据表,但我无法理解如何进行计算以及应该使用哪种模式。在浏览了不同的教程后,我发现最好使用 CTC 模式。
由于频率是变量,如何选择应使用哪个预分频器?我需要使用中断吗?对于如何设置这些定时器寄存器的任何帮助,我们将不胜感激。
我注意到 AVR 的 gcc 落后于 gcc 的主要开发流程。例如,AVR8 的 gcc 在 Atmel Studio 7 和 Arduino 中为 4.9.2,AVR32 在 Atmel Studio 中为 4.4.7。同时,gcc 4.9.4 是当前的 4.9 版本,开发正在推动多个分支 5.x、6.x 和 7.x ( https://gcc.gnu.org/develop.html )。
更新(2019 年 11 月): Atmel Studio 和 Arduino 工具链现已升级至 gcc 5.4,但仍仅完全实现 C++11。
我担心的是,通过将 C++ 语言最近添加的功能与较旧的编译器一起使用,我可能会遇到早期实现问题。此外,gcc 中 AVR 支持的开发过程尚不清楚。
我正在从 ATMEGA644 向 Linux 机器发送消息,CRC32 例程在两台机器上给出不同的结果。CRC算法来自MIT。
ATMEGA版本使用avr-gcc编译,Linux版本使用cc编译。Linux 编译会产生两个有关测试工具中 printf 参数大小的警告,但即使消除这些警告,结果也是相同的。
这是 crc32 例程,以及显示问题的 main() 测试工具:
#include <stdint.h>
#include <stddef.h>
#include <stdio.h>
#include <string.h>
static const uint32_t crc32_tab[] = {
0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
0xf3b97148, 0x84be41de, 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b, 0x35b5a8fa, 0x42b2986c,
0xdbbbc9d6, 0xacbcf940, 0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
0x26d930ac, …Run Code Online (Sandbox Code Playgroud) 我用汇编语言为 avr atmega328P 编写了这段代码。它使用按钮打开和关闭 LED,但在 proteus 中我收到此错误:
PC=0x002A 处的无效操作码 0xFFFF
这是我的代码:
.INCLUDE "M328Pdef.inc"
ldi r16,HIGH(RAMEND)
out SPH, R16
ldi r16,LOW(RAMEND)
out SPL, R16
start:
ldi r16,0xFF
out DDRB,r16
ldi r17,0x00
out DDRD,r17
ldi r21,0x00
ldi r23,0x01
Forever:
in r20,PIND
cp r20,r21
BREQ ledon
cp r20,r23
BREQ ledoff
rjmp Forever
ledon:
ldi r22,0x01
out PORTB,r22
ret
ledoff:
ldi r24,0x00
out PORTB,r24
ret
Run Code Online (Sandbox Code Playgroud)
有人有解决办法吗?
我正在尝试学习 AVR C,并且正在修补 atmega328p 微控制器。我正在 Linux Mint 上使用 avr-gcc 工具链来编译我的代码并将其烧写到 Arduino 板上。
所以我尝试使用函数调用使两个 LED 灯闪烁。我制作了两个函数 - 一个用于连接到 Arduino 板的引脚 7 的闪烁 LED,另一个用于连接到 Arduino 板的引脚 13 的闪烁 LED。
这些功能正在运行,但是当我修改代码时,我注意到一个奇怪的行为。这些函数按照它们定义的顺序在 main() 之外被调用和执行;而不是按照它们从 内部调用的顺序int main()。
这是我的代码
#include <avr/io.h>
#include <util/delay.h>
void blinkPin13() {
while(1) {
DDRB = DDRB | (1 << DDB5);
PORTB = PORTB | (1 << PORTB5);
_delay_ms(5000);
PORTB = PORTB & ~(1 << PORTB5);
_delay_ms(500);
}
}
void blinkPin7() {
while(1) {
DDRD = DDRD | (1 << …Run Code Online (Sandbox Code Playgroud) 我想写MIPS汇编代码.atmel avr微控制器是否支持MIPS(就像PIC微控制器一样)或者我必须使用avr汇编.
我想在ATMEGA32中进行串行通信,我有一个问题:
在异步串行通信中,两者UBRRH和UCSRC寄存器具有相同的位置 我不知道该位置将作为UBRRH哪个条件以及哪些条件,它将充当UCSRC.根据分配给这些寄存器的工作,我需要为每个寄存器提供不同的值
在数据表中,他们已经提到在URSEL两个寄存器之间使用位进行选择,但不知怎的,我没有得到它.
如果我们在PIC单片机中定义一个变量"整数",那么当我在Atmel微控制器中定义相同的"int"变量时,它的大小是否相同?或者它会有不同的尺寸?
这个问题是在嵌入式系统的采访中,答案应该是什么?
我有点困惑!
它取决于微控制器还是编程语言?在所有不同的编程语言中,相同的变量类型如整数是否相同?
这不是同一个问题,因为嵌入式控制器有点不同.
我在网上的一些教程中读到,中断的分支地址已经硬连线.他们为什么需要在引导程序中创建IVT?
我想在AVR Studio中使用Adafruit_CC3000 arduino库.我已按照此说明使用Adafruit arduino lib和AVR studio,所以我也可以使用其他AVR功能.但是当我编译代码时,我得到了相同的错误50次.
错误5 reinterpret_cast从类型'const char*'到类型'__FlashStringHelper*'抛出限定符E:\ arduino-1.0.1\libraries\Adafruit_CC3000\Adafruit_CC3000.cpp 183 3 ATmega32_WSClient_CC3K
我在网上搜索过这种错误.但我没理解这个问题.我请求让我明白这段代码中的哪一项是genratig这个错误?