【问题标题】:AVR Assembly not doing what I intend it to DoAVR 大会没有做我打算做的事
【发布时间】:2014-09-28 17:15:34
【问题描述】:

我有一个 Arduino Uno Rev3,我正在从 C 中的主代码调用以下汇编函数。

#
# Global data (val1)
#
.extern delay
.data

.comm val1,1
.global val1

#
# Program code (compute function)
#
.text
.global compute
compute:  
    lds r22, val1  ;value of input 
    ldi r23, 0x00  ;0 value
    ldi r24, 0x0D  ;value to flash led

flash:
    # flash LED
    call SDelay    ;Short Delay
    out  0x04, r24  ;LED On
    out  0x05, r24
    call SDelay    ;Delay
    out  0x04, r23  ;LED Off
    out  0x05, r23
    dec  r22
    brne flash;
finish:
    rjmp finish    ;keep looping once finished

SDelay:
    # Push registers onto stack
    push r22 
    push r23 
    push r24 
    push r25 
    #Delay
    ldi r22, 0xa0
    ldi r23, 0x00
    ldi r24, 0x00 
    ldi r25, 0x00
    call delay
    #Pop registers on stack
    pop r25
    pop r24
    pop r23
    pop r22 
    ret

这应该使 LED 闪烁(我不确定我在这里闪烁的是哪一个)输入的次数。此次数应存储在 val1 中(以 C 计算)。但是,我不知道我做错了什么。

有人能快速解释一下如何让 arduino 板上的特定 LED 闪烁吗?我知道我必须将一个引脚设置为高电平或低电平,但我不知道哪个引脚会为特定的 LED 做到这一点。

我知道这些都是菜鸟问题,但我是 AVR 组装的新手,而且真的很烂。我不会这样做,但我们学校的计算机系认为我们有必要了解这一点。

谢谢!

【问题讨论】:

    标签: assembly arduino avr led


    【解决方案1】:

    1) 哪个 LED 闪烁

    根据 Arduino Uno R3 板的schematic,您可以通过代码控制 2 个 LED,连接到 PD4 和 PD5(用作串行 RX 和 TX 的双重用途);将这些引脚配置为输出并向它们写入 0 将点亮它们。

    锻炼

    • 一个 ASM 例程,首先单独闪烁这些 LED 中的一个(闪烁 = 0.5 秒亮,0.5 秒灭)
    • 一个 ASM 例程,对“x”次执行相同的重复操作......“x”存储在 R24 中(请参阅下面的 R24 原因)
    • 并尽可能使用符号表示法

    或者你可能想要

    • 连接一个额外的 LED
    • 留在 C 语言中,使用 Arduino 例程,如 pinMode()、digitalWrite()、delay()

    2) C 和汇编程序

    您正在从 C 调用 ASM 例程...这需要一些额外的想法,特别是当您将参数从 C 移交给 ASM 时...本质上参数是从 R25 向下传递的 - 每个参数 2 个字节,所以单个字符作为 R25 (MSB) 和 R24 (LSB) 移交...通读this

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-01
      • 1970-01-01
      • 2015-11-13
      • 1970-01-01
      • 2020-11-26
      相关资源
      最近更新 更多