Assembly AVR组件纯软件PWM不提供恒定频率
有人能发现为什么这个代码不能输出恒定的脉冲吗?至少我的侥幸不能在高脉冲下触发,似乎它来去有点随机 这是我的第一个asm程序,所以请记住,代码中可能存在幼稚的bugAssembly AVR组件纯软件PWM不提供恒定频率,assembly,frequency,avr,pwm,Assembly,Frequency,Avr,Pwm,有人能发现为什么这个代码不能输出恒定的脉冲吗?至少我的侥幸不能在高脉冲下触发,似乎它来去有点随机 这是我的第一个asm程序,所以请记住,代码中可能存在幼稚的bug ;INITIAL .include "tn10def.inc" ; Include file for Attiny10 .org $0000 rjmp RESET ; ISR reset vector (also start of prog) .org $0008 rjmp WDT
;INITIAL
.include "tn10def.inc" ; Include file for Attiny10
.org $0000
rjmp RESET ; ISR reset vector (also start of prog)
.org $0008
rjmp WDT ; Watchdog reset vector
.def t = r16 ; temp register
.def PWM_c1 = r24 ; PWM counter register 1
.def PWM_c2 = r25 ; PWM counter register 2
.def PWM_c3 = r17 ; PWM counter register 3
RESET:
;INIT_STACK:
ldi t, low(RAMEND) ; init high and low bytes for stack pointer
out spl, t
ldi t, high(RAMEND)
out sph, t
;INIT_SLEEP:
ldi t, (0<<SM2)|(1<<SM1)|(0<<SM0)|(1<<SE)
out SMCR, t ; set power down mode at sleep command
;INIT_ISR
sei ; enable global interrupts
;INIT_POWERSAVER
ldi t, (1<<ADC1D)|(1<<ADC0D)
out DIDR0, t
;INIT_CLOCK
ldi t, 0xD8 ; write signature
out CCP, t
ldi t, (1<<CLKPS3)|(0<<CLKPS2)|(0<<CLKPS1)|(0<<CLKPS0)
out CLKPSR, t ; prescale by 256
MAIN_LOOP:
rcall PWM_INIT
rcall POWER_DOWN ; WDT power down
rjmp MAIN_LOOP
PWM_INIT:
ldi PWM_c3, 255 ; total number of pulses
PWM_START:
sbi PORTB, led ; set out high
ldi PWM_c1, 0
ldi PWM_c2, 0
PWM_LOOP:
inc PWM_c1
cpi PWM_c1, 16 ; target count (PWM high)
breq PWM_OUT_LOW
cpi PWM_c1, 208
brne PWM_LOOP ; first loop counts to 208
inc PWM_c2
cpi PWM_c2, 5
brne PWM_LOOP ; second loop counts to 5
dec PWM_c3
brne PWM_START ; counts down number of pulses
ret
PWM_OUT_LOW:
cbi PORTB, led
rjmp PWM_LOOP
;首字母
。包括“tn10def.inc”;包含Attiny10的文件
.org$0000
rjmp复位;ISR重置向量(也是程序的开始)
.org$0008
rjmp-WDT;看门狗复位向量
.def t=r16;温度寄存器
.def PWM_c1=r24;PWM计数器寄存器1
.def PWM_c2=r25;PWM计数器寄存器2
.def PWM_c3=r17;PWM计数器寄存器3
重置:
;初始化堆栈:
本地设计院(ldi)t,低(拉芒);堆栈指针的初始化高字节和低字节
输出spl,t
本地设计院(ldi)t,高(拉芒)
外太空站
;初始睡眠:
本地设计院,(0好的,处理器的运行不是完全恒定的,即使对于这样的简单代码也是如此。您可能希望使用芯片上的定时器,并在溢出中断时更改信号。处理器上的定时器非常一致。好的,处理器的运行不是完全恒定的,即使对于这样的简单代码也是如此。您可能希望使用芯片上的计时器,并在溢出中断时更改信号。板上的计时器非常一致。WDT代码被省略,因为这很有效。请尝试将此问题发布到什么是目标处理器?上面的代码缺少通过DDRB
注册表输出的PortB设置r、 没有它,它只是切换内部上拉电阻器,高阻抗负载可能看不到。WDT的代码被忽略,因为这很好。请尝试将此问题发布到目标处理器上?上面的代码缺少通过DDRB
寄存器输出的PortB设置。没有它,它只是切换intern铝上拉电阻器,高阻抗负载可能看不到。