Avr 如何为特定序列设置两个不同的led延迟?
我正在编写一个程序,该程序将在我的arduino板(atmega328p)上创建一个特定的闪烁序列。我试图创造的模式是, 打开1/2秒 关闭1/2秒 打开1/2秒 休息整整一秒钟 重复这个顺序 我通过创建两个不同的延迟来解决这个问题,一个延迟1/2秒,另一个延迟1秒,然后我调用它们 如果我只有一个延迟,灯光将与该模式一起工作,但一旦我将两个延迟放在循环中,灯光甚至不会遵循该模式。我很抱歉,如果这是一个简单的问题,我不知道我是否接近这个权利 这是我的密码:Avr 如何为特定序列设置两个不同的led延迟?,avr,avr-gcc,avrdude,Avr,Avr Gcc,Avrdude,我正在编写一个程序,该程序将在我的arduino板(atmega328p)上创建一个特定的闪烁序列。我试图创造的模式是, 打开1/2秒 关闭1/2秒 打开1/2秒 休息整整一秒钟 重复这个顺序 我通过创建两个不同的延迟来解决这个问题,一个延迟1/2秒,另一个延迟1秒,然后我调用它们 如果我只有一个延迟,灯光将与该模式一起工作,但一旦我将两个延迟放在循环中,灯光甚至不会遵循该模式。我很抱歉,如果这是一个简单的问题,我不知道我是否接近这个权利 这是我的密码: #include "config.h"
#include "config.h"
.section .data
dummy: .byte 0 ; dummy global variable
.section .text
.global main
.extern delay
.org 0x0000
main:
; clear the SREG register
eor r1, r1 ; cheap zero
out _(SREG), r1 ; clear flag register
; set up the stack
ldi r28, (RAMEND & 0x00ff)
ldi r29, (RAMEND >> 8)
out _(SPH), r29
out _(SPL), r28
; initialize the CPU clock to run at full speed
ldi r24, 0x80
sts CLKPR, r24 ; allow access to clock setup
sts CLKPR, r1 ; run at full speed
; set up the LED port
sbi LED_DIR, LED_PIN ; set LED pin to output
cbi LED_PORT, LED_PIN ; start with the LED off
; enter the blink loop
1: rcall toggle
rcall delay
rcall delay2
rjmp 1b
toggle:
in r24, LED_PORT ; get current bits
ldi r25, (1 << LED_PIN) ; LED is pin 5
eor r24, r25 ; flip the bit
out LED_PORT, r24 ; write the bits back
ret
delay: ; 1/2 sec delay loop
ldi r21, 41
ldi r22, 150
ldi r23, 127
1: dec r23
brne 1b
dec r22
brne 1b
dec r21
brne 1b
ret
delay2: ; 1 sec delay loop
ldi r18, 82
ldi r19, 43
ldi r20, 0
2: dec r20
brne 2b
dec r19
brne 2b
dec r18
brne 2b
ret
#包括“config.h”
.第节.数据
虚拟:。字节0;虚拟全局变量
.第节.正文
.全球主要
.外部延迟
.org 0x0000
主要内容:
; 清除SREG寄存器
提高采收率r1,r1;廉价零
out u2;(SREG),r1 ;;清除标志寄存器
; 设置堆栈
本地设计院r28(拉芒和0x00ff)
本地设计院r29(RAMEND>>8)
out(SPH),r29
输出(SPL),r28
; 初始化CPU时钟以全速运行
本地设计院r24,0x80
sts CLKPR,r24;允许访问时钟设置
sts-CLKPR,r1;全速奔跑
; 设置LED端口
sbi LED_方向,LED_引脚;将LED引脚设置为输出
cbi LED_端口,LED_引脚;从LED熄灭开始
; 进入闪烁循环
1:rcall切换
呼叫延迟
R呼叫延迟2
RJMP1B
切换:
在r24中,LED_端口;获取当前位
ldi r25,(1)您的代码中没有“call delay2”,很抱歉,我忘了添加它,但在我的虚拟机中正在使用的版本中,我确实在循环中使用了delay2,并且它不会以假设的方式运行延迟率。请将建议用于表示模式的整个代码放入其中。此代码只调用“toggle”然后是2次延迟,即每1.5秒切换一次led,没有“呼叫延迟2”在你的代码中,我很抱歉,我忘了添加它,但在我的虚拟机中正在使用的版本中,我确实在循环中使用了delay2,并且它不会以预期的延迟率运行。请将建议用于表示模式的整个代码放入其中。此代码只调用“切换”,然后两次延迟。即,它将每1.5秒切换一次led。