Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ionic-framework/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly AVR组件纯软件PWM不提供恒定频率_Assembly_Frequency_Avr_Pwm - Fatal编程技术网

Assembly AVR组件纯软件PWM不提供恒定频率

Assembly 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

有人能发现为什么这个代码不能输出恒定的脉冲吗?至少我的侥幸不能在高脉冲下触发,似乎它来去有点随机

这是我的第一个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               ; 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铝上拉电阻器,高阻抗负载可能看不到。