标签: atmega

ATMEGA USART 处理方向键

我有一个问题,我必须通过按下计算机上的按键来控制 ATMEGA 1280 的 PWM。我可以使用 ASCII 键并控制 PWM 来控制它。问题是他们要求使用箭头键,现在问题是箭头键没有 ASCII 值,而且我现在没有 ATMEGA 1280 可供使用。我不知道与从箭头键接收到的值相比什么值。有人有主意吗?

c assembly avr atmega

3
推荐指数
1
解决办法
1852
查看次数

如何在芯片保留地址和魔术位上找到官方信息?

我如何从芯片制造商那里找到几个芯片的魔术地址列表?对它所支持的价值观的体面解释?

我甚至无法弄清楚要调用/搜索它的术语.

刚开始嵌入式编程.我需要设置各种各样的魔法.

通常我会遇到一些事情:

MOV BLKMGC 0x01
Run Code Online (Sandbox Code Playgroud)

要么

REO034 = 0x80; // stops all onboard leds, boot freebsd, makes coffee, do laundy.
               // use 0x81 if you have more white clothes than color ones.
Run Code Online (Sandbox Code Playgroud)

有时会有评论解释他们在做什么.我主要记录了我在示例代码中找到的所有内容.用于msp430启动板的那些通常是由很多冗长的评论人写的,我甚至可以在芯片系列笔记上找到一些地址图,但几乎不是一个易于理解的列表.在试图完全理解这一点时,Arduinos上的芯片更常见.(授予,我仍然不确定如何搜索它:)

到目前为止我找到的最好的地方是我正在使用的芯片的头文件...但即便如此,请举例:

 void main(void) {
    WDTCTL = WDTPW + WDTHOLD;                 // Stop Watch Dog Timer
    // how 99% of msp430 programs start.
Run Code Online (Sandbox Code Playgroud)

现在头文件:

#define WDTCTL_               0x0120    /* Watchdog Timer Control */
sfrw(WDTCTL, WDTCTL_);
/* The bit names have been prefixed with "WDT" */
#define WDTIS0              (0x0001) …
Run Code Online (Sandbox Code Playgroud)

c embedded assembly atmega msp430

2
推荐指数
1
解决办法
306
查看次数

如何使用atmega 32 pwm控制电机

我已经有一段时间了解如何使用我的atmega32以快速pwm模式控制电机(控制其速度).我需要使用8位Timer0,因为我对其他计数器有其他用途.我想我知道如何为此任务初始化计时器:

void initial_io (void){
    DDRC = 0xFF;
    DDRB = 0xFF;
    PORTA = (1<<PA4)|(1<<PA5);
    TCCR0 = (1<<WGM01)|(1<<WGM00); // PWM mode : Fast PWM.
    TCCR0 = (1<<CS02)|(1<<CS00); // PWM clock = CPU_Clock/1024
}
Run Code Online (Sandbox Code Playgroud)

但问题就来了.我根本不知道接下来该做什么,在我的主要做什么.

我的确切项目是用加速驾驶遥控车.因此,当我从汽车要求前进时,它必须从固定加速度的停止加速到最大速度.我不知道任何大会,所以如果你能帮助我,请在C中做.任何帮助将不胜感激.

c atmega atmel motordriver pwm

2
推荐指数
1
解决办法
8564
查看次数

atmega32 中 UBRRH 和 UBRRL 寄存器的作用是什么?

我在网上找到了这部分代码,关于如何在atmega32上初始化USART。它适用于我的应用程序,但我想更好地理解它。

void USART_initial (void){
#define BAUD 9600 // We set the desired baud rate( here we set it at 9600bps)
#include <util/setbaud.h>  // 
UBRRH = UBRRH_VALUE;
UBRRL = UBRRL_VALUE;
#if USE_2X
UCSRA |= (1 << U2X);
#else
UCSRA &= ~(1 << U2X);
#endif

UCSRB = (1<<RXEN)|(1<<TXEN); // Enable transmitter/receiver.
UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); // Character size : 8 bit
Run Code Online (Sandbox Code Playgroud)

我的问题是 UBRRH 和 UBRRL 寄存器的确切用途是什么,为什么我需要使用它们?

非常感谢您提前

atmega serial-port cpu-registers usart

2
推荐指数
1
解决办法
8916
查看次数

不懂ATmega32定时器延迟程序

我有以下程序......

"编写一个程序,以一定的延迟连续切换PORTB的所有位.使用Timer0,正常模式,没有预分频器选项."

#include….
    void T0Delay()
    int main ()
    DDRB= 0xFF;
    while (1) {
        PORTB=0x55;
        T0Delay();
        PORTB=0xAA;
        T0Delay();
    }

void T0Delay ()
    {
        TCNT0=0x20;
        TCCR0=0x01;
        while ((TIFR&01)==0);
        TCCR0=0;
        TIFR=0x01;
    }
Run Code Online (Sandbox Code Playgroud)

在"TODelay()"函数中,"while((TIFR&01)== 0)"的功能是什么?为什么这个循环设置TCCR0 = 0和TIFR = 0x01?有人可以解释这段代码吗?

c microcontroller avr atmega

2
推荐指数
1
解决办法
775
查看次数

I2C 从发送器 NACK(又名可变长度回复)

传输到主机时,I2C 从机是否允许 NACK?

从规范 (2.1) 看来,从机实际上无法在传输时向主机发送 NACK,即将数据从从机发送到主机。我已经在网上搜索过,但在这里找不到任何帮助。

为什么?我正在 AVR Atmega8 中实现一个 I2C 主设备。我想涵盖所有用例。我有一个用户注意到,当 I2C 从设备在 SLA+R 模式下发送 NACK 时,主设备会忽略它。

据我所知,发起 SLA+R 的主设备是唯一允许 NACK 数据包的一方。从设备必须继续在主时钟上发送数据包。但是,Arduino 线库中的一个片段暗示从设备可以向主设备发送 NACK。 https://github.com/arduino/Arduino/blob/master/libraries/Wire/utility/twi.c#L503

  1. 如果从站要发送 2 个数据包,但主站时钟为 3 个,会发生什么
  2. 从机可以在从机发送器模式下发送 NACK 吗?
  3. 有没有其他方法可以向主人表明没有更多数据?

atmega arduino i2c slave

2
推荐指数
1
解决办法
2770
查看次数

如何在 Arduino Uno (ATmega328p) 的闪存中存储数据

我有一个使用 Arduino Uno 的项目,我需要存储一个对于 EPROM 来说太大的字符**。

我目前正在尝试使用串口来完成此操作,但如果需要的话我也可以使用 AVRISP 程序员(不推荐)

到目前为止,我已经研究了 avr/boot.h API,但我不太确定如何正确使用它,或者它是否是正确的方法。

avr atmega arduino

2
推荐指数
1
解决办法
8244
查看次数

如何逆向工程/提取代码 ATmega32

我需要帮助从 ATmega32a 微控制器中提取代码。我有关于硬件、寄存器、汇编的知识,但我什至不是嵌入式系统的专家。尽管我知道逆向工程不适合初学者,但我仍然想至少学习我在网上找不到的基本概念。

如何与芯片通信、提取代码并反编译?为此有哪些硬件/软件要求?(假设代码不受保护。)

提前致谢。

microcontroller decompiling atmega reverse-engineering arduino

2
推荐指数
1
解决办法
5846
查看次数

AVR I/O 宏定义如何工作以允许访问寄存器?

我正在查看 ATmega2560 寄存器映射 ( iom2560.h) 的标头,其中包含寄存器的所有定义。例如:

#define PINA    _SFR_IO8(0X00)
//Macro definition:
#define _SFR_IO8(io_addr) ((io_addr) + 0X20)
Run Code Online (Sandbox Code Playgroud)

所以PINA是一个8位的十六进制值,对应于8位单片机寄存器的地址。当我编写代码时,我只需输入以下代码即可更改寄存器内的值:

PINA |= (1 << 3); // Setting the third bit.
Run Code Online (Sandbox Code Playgroud)

问题是:为什么我可以_SFR_IO8(0X00)通过将值赋给PINA来写入寄存器值(“由他的地址指向”)?这不是指向的寄存器的地址吗?编译器如何工作?

预先非常感谢

c atmega cpu-registers avr-gcc atmel

2
推荐指数
1
解决办法
841
查看次数

为什么函数按照定义的顺序执行,而不是按照 avr-c 中 int main() 调用的顺序执行?

我正在尝试学习 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)

c avr atmega avr-gcc

2
推荐指数
1
解决办法
195
查看次数