标签: avr

AVR asm标签*2

您好,我是 avr asm 编程的新手,在下面的示例中,我有几个问题:

1)标签是8位还是16位长?

2)为什么需要2的乘法标签?

3) 指令 LPM 将其结果放入寄存器 R0 中?如果是的话,这和Z有什么关系?

4)您能否解释一下所提供链接中引用的文字:

“如果地址没有乘以 2 并且标签位于字节地址 0x60(字地址 0x30),Z 将指向存储在那里的代码。我希望这能澄清寻址问题。其他版本是”

ldi ZL, low(2*label)
ldi ZH, high(2*label)

label:
.db "Hello world", 0
lpm
Run Code Online (Sandbox Code Playgroud)

谢谢。

assembly avr avr-gcc

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

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

ATMEGA USART 处理方向键

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

c assembly avr atmega

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

什么是 AVR 的 __brkval,它在哪里定义?

freeMemoryhttps://playground.arduino.cc/Code/AvailableMemory看到了这个函数,它似乎使用了一个叫做__brkval. 但是,我根本找不到这个宏或变量的定义位置:

$ grep -ri brkval /c/arduino-1.8.8/ --include='*.c' --include='*.h'
/c/arduino-1.8.8/libraries/Robot_Control/src/Fat16util.h:  extern int* __brkval;
/c/arduino-1.8.8/libraries/Robot_Control/src/Fat16util.h:  if (reinterpret_cast<int>(__brkval) == 0) {
/c/arduino-1.8.8/libraries/Robot_Control/src/Fat16util.h:                  - reinterpret_cast<int>(__brkval);
/c/arduino-1.8.8/libraries/SD/src/utility/SdFatUtil.h:  extern int* __brkval;
/c/arduino-1.8.8/libraries/SD/src/utility/SdFatUtil.h:  if (reinterpret_cast<int>(__brkval) == 0) {
/c/arduino-1.8.8/libraries/SD/src/utility/SdFatUtil.h:                  - reinterpret_cast<int>(__brkval);

$ grep -ri brkval /c/avr-gcc-8.2.0-x64-mingw/ --include='*.c' --include='*.h'
# nothing

$ grep -ri brkval /c/Program\ Files\ \(x86\)/Atmel/Studio/ --include='*.c' --include='*.h'
# nothing

$ grep -ri brkval /c/cvavr/ --include='*.c'
# nothing
Run Code Online (Sandbox Code Playgroud)

也就是说,只有 Arduino IDE 对它有一些引用,但仅作为extern int*参考,它没有定义。

我最接近某种详细解释的是https://github.com/greiman/SdFat/blob/master/src/FreeStack.h

/** …
Run Code Online (Sandbox Code Playgroud)

c avr

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

为什么GCC生成的代码带有一堆无用的JMP指令?

我目前正在Atmel Studio中为Atmega328P(Arduino UNO)开发一个引导加载程序,从反汇编中我发现了以下代码(我的引导加载程序从0x3800开始):

--- ../../../../crt1/gcrt1.S ---------------------------------------------------
00003800  JMP 0x00003834        Jump 
00003802  JMP 0x00003979        Jump 
00003804  JMP 0x00003979        Jump 
00003806  JMP 0x00003979        Jump 
00003808  JMP 0x00003979        Jump 
0000380A  JMP 0x00003979        Jump 
0000380C  JMP 0x00003979        Jump 
0000380E  JMP 0x00003979        Jump 
--- ../../../../crt1/gcrt1.S ---------------------------------------------------
00003810  JMP 0x00003979        Jump 
00003812  JMP 0x00003979        Jump 
00003814  JMP 0x00003979        Jump 
00003816  JMP 0x00003979        Jump 
00003818  JMP 0x00003979        Jump 
0000381A  JMP 0x00003979        Jump 
0000381C  JMP 0x00003979        Jump 
0000381E  JMP 0x00003979        Jump 
00003820  JMP 0x00003979        Jump 
00003822  JMP 0x00003979 …
Run Code Online (Sandbox Code Playgroud)

assembly avr avr-gcc

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

如何计算 ADC 读数的平均值?

目的是将最新的 10 个 ADC 读数存储在数组中,然后计算它们的平均值以供其他地方使用。每次更新时都会删除最旧的。

关于 LED 时序,如果 ADC 读数在如下所示的范围内,则必须将时序从 1s 切换到 0.25s,如何正确实现?我知道我的方法有效,但可以做得更好。至于 LED,如果按下开关,它们必须改变模式,如您所见,它们确实这样做,但我再次确信可以用另一种更简单的方式来完成!

下面是我的代码,我也确信有很多错误和足够的优化空间,我会很乐意接受这一切!

#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>

#include <avr/io.h>
#include <avr/interrupt.h>
unsigned int timecount0;


unsigned int adc_reading;

volatile uint32_t timing = 1;
volatile uint32_t accumulator = 0;
volatile uint16_t average = 0;
volatile uint16_t samples = 0;


#define LED_RED PORTB = ((PORTB & ~0b00001110)|(0b00000010 & 0b00001110))
#define LED_GREEN PORTB = ((PORTB & ~0b00001110)|(0b00001000 & 0b00001110))
#define LED_BLUE PORTB = ((PORTB & ~0b00001110)|(0b00000100 & 0b00001110))
#define …
Run Code Online (Sandbox Code Playgroud)

c avr arduino interrupt atmega32

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

将参数从指针传递到非封闭地址空间时出错

我使用的是 ATMEGA16M1 微控制器和 MPLAB IDE。

我有以下函数可以写入端口。

void Lcd8_Write_String(char *a)
{
    int i;
    for(i=0;a[i]!='\0';i++)
    Lcd8_Write_Char(a[i]);
}

void Lcd8_Write_Char(char a)
{
    pinChange(RS,1);             // => RS = 1
    Lcd8_Port(a);                //Data transfer
    pinChange(EN,1);             // => E = 1
    _delay_ms(1);
    pinChange(EN,0);             // => E = 04
    _delay_ms(1);
}
Run Code Online (Sandbox Code Playgroud)

我用 调用该函数Lcd8_Write_String("Hello World");

我得到:

错误:将“Lcd8_Write_String”的参数 1 从指针传递到非封闭地址空间。

我该如何解决这个错误?

c microcontroller pointers avr mplab

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

嵌入式C程序中的高效位检查

我正在使用atmega328的AVR控制器。我需要检查两位的状态。我有两种方法,但不确定哪种方法最有效。在下面的代码的第一种情况下,我将使用PIND命令读取端口两次(两次进行PIND访问)。所以这是一个问题,还是我不得不考虑第二个if语句?

#define SW1 2
#define SW2 5
//check if both are high
if((PIND&(1<<SW1))&&(PIND&(1<<SW2))) 
//Or
if((PIND&((1<<SW1)|(1<<SW2)))==((1<<SW1)|(1<<SW2))) 
Run Code Online (Sandbox Code Playgroud)

embedded avr

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

抽象针脚和端口 - 使用指针

我正在研究一个嵌入式项目,试图了解嵌入式电路板编程的一些细节.正如人们可能已经猜到的那样,这涉及到用C编写代码.我没有太多的麻烦来掌握正确的设置(在端口/引脚/等方面......)但是我想要抽象我的一些代码使它更具可读性.

例如,以下代码打开板上的绿色LED:

// Required CPU Speed Define
#define F_CPU 16000000

// Include the necissary library header files
#include <avr/io.h>

int main() {
     DDRD |= (1 << DDD5);
     PORTD |= (1 << PD5);

     PORTD ^= (1 << PD5);

     for(;;) { }    
}
Run Code Online (Sandbox Code Playgroud)

另一方面,我可以#define使用端口的名称,因此它们更清晰,但这似乎不是理想的解决方案(不幸的是,我正在使用的方法).

我想抽象一些启用板载LED的设置/功能(我最终希望扩展到其他概念,如定时器/中断等等).

如何使用Struct/Pointers正确抽象?

我目前正在尝试以下方法,但它正在下降,并且LED无法打开:

OnBoardLED.h

typedef struct {
    unsigned int dataDirectionRegister;
    unsigned int portNumber;
    unsigned int pinNumber;
} OnBoardLED;

void setDataDirectionRegister(OnBoardLED* led, unsigned int DDR);
void setPortNumber(OnBoardLED* led, unsigned int port);
void setPinNumber(OnBoardLED* led, unsigned int pin); …
Run Code Online (Sandbox Code Playgroud)

c embedded pointers avr

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

如何计算汇编中两个8位值的8位平均值?

使用Arduino,我必须在Atmel AVR Assembly中为我的计算机科学类编写一个函数,用于计算汇编中两个8位值的8位平均值.我不允许使用任何分支指令(但跳过很好).

这是我到目前为止:

.global average
average:
  add r24, r22
  asr r24
  ret
Run Code Online (Sandbox Code Playgroud)

对于我的程序中我必须计算69和60的平均值的部分,它返回-64而不是64.有谁知道我将如何使这个功能工作?任何帮助将非常感激.

assembly signed avr average arduino

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