AVR大会没有按照我的意图去做

时间:2014-09-28 17:15:35

标签: assembly arduino avr led

我有一个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设置。

我知道这些都是noob问题,但我是AVR程序集的新手,并且非常喜欢它。我不会这样做,但我们学校的CS部门认为我们有必要理解这一点。

谢谢!

1 个答案:

答案 0 :(得分: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
  • 使用Arduino例程(如pinMode(),digitalWrite(),delay()
  • 继续使用C语言

2)C和汇编程序

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