Assembly 如何更改PWM MSP430G2553中的占空比(不允许使用C)?

Assembly 如何更改PWM MSP430G2553中的占空比(不允许使用C)?,assembly,msp430,pwm,Assembly,Msp430,Pwm,首先,我不能用C编写代码,它必须是唯一的程序集。第二,我几乎不懂汇编,所以你可能得帮我把它说哑。我目前正在研究的是改变PWM中的占空比(我相信这会改变亮度?)。我的假设正确吗?我想慢慢地将亮度增加到最大,然后慢慢地降低,持续不断。我的时间非常有限,因为我认为我已经解决了这个问题,但显然我没有。我的代码如下,如果有人能解释我做错了什么,我将非常感激 #include "msp430.h" ; #define controlled include file

首先,我不能用C编写代码,它必须是唯一的程序集。第二,我几乎不懂汇编,所以你可能得帮我把它说哑。我目前正在研究的是改变PWM中的占空比(我相信这会改变亮度?)。我的假设正确吗?我想慢慢地将亮度增加到最大,然后慢慢地降低,持续不断。我的时间非常有限,因为我认为我已经解决了这个问题,但显然我没有。我的代码如下,如果有人能解释我做错了什么,我将非常感激

#include "msp430.h"                     ; #define controlled include file

        NAME    main                    ; module name

        PUBLIC  main                    ; make the main label visible
                                        ; outside this module
        ORG     0FFFEh
        DC16    init                    ; set reset vector to 'init' label

        RSEG    CSTACK                  ; pre-declaration of segment
        RSEG    DATA16_HEAP
        RSEG    DATA16_N
X       DW      0d                      ; create X
Y       DW      1000-1d                 ; create Y
        RSEG    CODE                    ; place program in 'CODE' segment

init:   MOV     #SFE(CSTACK), SP        ; set up stack

main:   NOP                             ; main program
        MOV.W   #WDTPW+WDTHOLD,&WDTCTL  ; Stop watchdog timer
        bis.b   #01000000b, &P1DIR      ; Set P1.6 to output direction
        bis.b   #01000000b, &P1SEL      ; P1.6 to TA0.1
        mov.w   #1000-1, &CCR0          ; PWM Period
        mov.w   #OUTMOD_7, &CCTL1       ; CCR1 reset/set
        mov.w   #100, &CCR1              ; CCR1 PWM duty cycle
        MOV.W   #CCIE, &TACCTL0         ; TACCRO interrupt enabled
        mov.w   #TASSEL_2 + MC_1, &TACTL; SMCLK, up mode
        bis.w   #CPUOFF+GIE, SR         ; Low-power mode and 
                                        ; global interrupt enabled
        JMP $                           ; jump to current location '$'
                                        ; (endless loop)
TA0_ISR:
        CLRN
        CMP     #1000-1, X
        JN INCX                         ; if X less than period, increment
        CLRN
        CMP     #Y, 0d                  ; if y > 0, decrement
        JN DECY
        MOV.W   #1000-1, &Y             ; if neither, set y to period

DECY:    
        DEC.W   Y                       ; decrement y
        MOV.W   #Y, &CCR1               ; set y to duty cycle
        CLRN
        CMP     #Y, 0d                  ; if y is greater than 0, reti
        JN FIN
        MOV.W   #0, &X                  ; else, set x to 0

INCX: 
        INC.W   X                       ; increment x
        MOV.W   #X, &CCR1               ; set x to duty cycle

FIN:
        RETI                            ; Return from interrupt
; The following specifies the timer interrupt vector
        COMMON  INTVEC                  ; Interrupt Vectors
        ORG     TIMER0_A0_VECTOR        ; Timer_A0 Vector
        DW      TA0_ISR                 ; Define a word with value TA0_ISR
        END

如果您驾驶的是LED,那么是的,更改PWM占空比将有效地改变可见亮度(至少对人类而言)。好的,那么为什么我运行此代码时,它保持在最大亮度?是的,我使用LED 2作为输出。关于语法的一些细节。如果要引用内存中的变量,请使用
&y
。使用
#y
时,您使用的是y的地址。无需在
CMP
之前执行
CLRN
。另外,如果你想在RAM中初始化变量,你必须手动设置初始化代码中的值(或者使用编译器附带的C启动)。我只在其他微控制器上使用过PWM,从来没有在MSP430上使用过,所以我不能说,直到我有机会去挖掘我的MSP430并进行实验。:-)我倾向于一个坏的标志,或者对如何在这个平台上设置它有误解。布赖恩,如果你有什么想法,请告诉我@Lindydancer,你说“如果你想在RAM中初始化变量,你必须在你的初始化代码中手动设置值”是什么意思?