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