Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "msp430.h"
- NAME main
- PUBLIC main
- ORG 0FFFEh
- DC16 init ; set reset vector to 'init' label
- RSEG DATA16_N
- ADC_Result:
- DS8 2 ;variable to store ADC value
- curLED:
- DS8 2 ;variable to store currentLED
- ;=============== Interrupt routine for ADC
- RSEG CODE
- ;=============== Declare the stack to the linker
- RSEG CSTACK
- ;=============== Main code block
- RSEG CODE
- init:
- MOV #SFE(CSTACK), SP ; set up stack
- main:
- MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
- ; Configure GPIO
- BIS.B #0x1, &P8DIR
- BIS.B #0x80, &P2DIR
- BIS.B #0x2, &P5DIR
- BIS.B #0x4, &P5DIR
- BIS.B #0x8, &P5DIR
- ;set curLED to 1
- MOV #2, &curLED
- BIS.W #ADCPCTL9, &SYSCFG2 ; Configure ADC A9 pin
- BIC.W #LOCKLPM5, &PM5CTL0 ; Disable the GPIO power-on default
- ; high-impedance mode to activate
- ; previously configured port settings
- ; Configure ADC10
- BIS.W #(ADCSHT_2 | ADCON), &ADCCTL0 ; ADCON, S&H=16 ADC clks
- BIS.W #ADCSHP, &ADCCTL1 ; ADCCLK = MODOSC; sampling timer
- BIS.W #ADCRES, &ADCCTL2 ; 10-bit conversion results
- BIS.W #ADCINCH_9, &ADCMCTL0 ; A9 ADC input select; Vref=AVCC
- BIS.W #ADCIE0, &ADCIE ; Enable ADC conv complete interrupt
- ;timer setup
- BIS.W #CCIE, &TA0CCTL0
- MOV.W #3277, &TA0CCR0
- MOV.W #(TASSEL__ACLK | MC__UP), &TA0CTL
- NOP
- BIS.W #GIE, SR
- JMP mainloop
- mainloop:
- BIS.W #0x3, &ADCCTL0 ; Start conversion ;
- NOP
- BIS.W #0x18, SR ;enter low power mode
- NOP
- CMP.W #520, &ADC_Result
- JGE clock_clockGo
- CMP.W #505, &ADC_Result
- JL anti_clockGo
- MOV.W #(TASSEL__ACLK | MC__STOP), &TA0CTL
- JMP mainloop
- clock_clockGo:
- ;normalise ADC value
- ;set value to CCR
- ; val1 = (varRes - MAX_RES/2);
- ADD.W #1, &ADC_Result
- MOV.W &ADC_Result, R15
- SUB.W #512, R15
- ; speed1 = 1/val1 *1677721.6; or 1677721.6/val
- ;MOV.W #0, R13 ; set counter
- ;JMP divLoop
- ; TA1CCR0 = speed1;
- RLA.W R15
- RLA.W R15
- RLA.W R15
- MOV.W R15, &TA0CCR0
- ;start reg counting up
- MOV.W #(TASSEL__ACLK | MC__UP), &TA0CTL
- NOP
- BIS.W #0x18, SR ;enter low power mode
- NOP
- JMP mainloop
- anti_clockGo:
- ; normalise ADC value
- ; set value to CCR
- ; val = -1*(varRes - MAX_RES/2);
- ADD.W #1, &ADC_Result
- MOV.W &ADC_Result, R15
- SUB.W #512, R15
- MOV.W R15, R14
- SUB.W R14, R15
- SUB.W R14, R15
- ; MOV.W #1667221, R14
- ; speed = 1/val *1677721.6; or 1677721.6/val
- ;MOV.W #0, R13 ; set counter
- ; JMP divLoop ;divide R14 by R15
- ; TA1CCR0 = speed;
- RLA.W R15
- RLA.W R15
- RLA.W R15
- MOV.W R15, &TA0CCR0
- ;start reg counting up
- MOV.W #(TASSEL__ACLK | MC__UP), &TA0CTL
- NOP
- BIS.W #0x18, SR ;enter low power mode
- NOP
- JMP mainloop
- ;for the clockwise loop, check if the value in curLED is 1, if it is, then
- ;update the LED shown and the curLED register
- ;If it is not, then check if it is 2, and so on.
- clockwise:
- CMP #1, &curLED
- JNE c_l2
- JMP LED5
- ret
- c_l2:
- CMP #2, &curLED
- JNE c_l3
- JMP LED1
- ret
- c_l3:
- CMP #3, &curLED
- JNE c_l4
- JMP LED2
- ret
- c_l4:
- CMP #4, &curLED
- JNE c_l5
- JMP LED3
- ret
- c_l5:
- CMP #5, &curLED
- JNE c_l6
- JMP LED6
- ret
- c_l6:
- CMP #6, &curLED
- JNE c_l7
- JMP LED7
- ret
- c_l7:
- CMP #7, &curLED
- JNE c_l8
- JMP LED8
- ret
- c_l8:
- JMP LED4
- ret
- anticlockwise:
- CMP #1, &curLED
- JNE a_l2
- JMP LED2
- ret
- a_l2:
- CMP #2, &curLED
- JNE a_l3
- JMP LED3
- ret
- a_l3:
- CMP #3, &curLED
- JNE a_l4
- JMP LED4
- ret
- a_l4:
- CMP #4, &curLED
- JNE a_l5
- JMP LED8
- ret
- a_l5:
- CMP #5, &curLED
- JNE a_l6
- JMP LED1
- ret
- a_l6:
- CMP #6, &curLED
- JNE a_l7
- JMP LED5
- ret
- a_l7:
- CMP #7, &curLED
- JNE a_l8
- JMP LED6
- ret
- a_l8:
- JMP LED7
- ret
- LED1:
- BIS.B #0x1, &P8OUT ; P8.0 high
- BIC.B #0x80, &P2OUT ; P2.7 low
- BIC.B #0x2, &P5OUT; ; P5.1 low
- BIC.B #0x4, &P5OUT; ; P5.2 low
- BIC.B #0x8, &P5OUT; ; P5.3 low
- MOV #1, &curLED
- JMP mainloop
- LED2:
- BIC.B #0x1, &P8OUT
- BIC.B #0x80, &P2OUT
- BIS.B #0x2, &P5OUT
- BIC.B #0x4, &P5OUT
- BIC.B #0x8, &P5OUT
- MOV #2, &curLED
- JMP mainloop
- LED3:
- BIC.B #0x1, &P8OUT
- BIC.B #0x80, &P2OUT
- BIC.B #0x2, &P5OUT;
- BIS.B #0x4, &P5OUT;
- BIC.B #0x8, &P5OUT
- MOV #3, &curLED
- JMP mainloop
- LED4:
- BIC.B #0x1, &P8OUT
- BIC.B #0x80, &P2OUT
- BIC.B #0x2, &P5OUT
- BIC.B #0x4, &P5OUT
- BIS.B #0x8, &P5OUT
- MOV #4, &curLED
- JMP mainloop
- LED5:
- BIC.B #0x1, &P8OUT
- BIS.B #0x80, &P2OUT
- BIS.B #0x2, &P5OUT
- BIS.B #0x4, &P5OUT
- BIS.B #0x8, &P5OUT
- MOV #5, &curLED
- JMP mainloop
- LED6:
- BIS.B #0x1, &P8OUT
- BIS.B #0x80, &P2OUT
- BIC.B #0x2, &P5OUT;
- BIS.B #0x4, &P5OUT;
- BIS.B #0x8, &P5OUT;
- MOV #6, &curLED
- JMP mainloop
- LED7:
- BIS.B #0x1, &P8OUT
- BIS.B #0x80, &P2OUT
- BIS.B #0x2, &P5OUT;
- BIC.B #0x4, &P5OUT;
- BIS.B #0x8, &P5OUT;
- MOV #7, &curLED
- JMP mainloop
- LED8:
- BIS.B #0x1, &P8OUT
- BIS.B #0x80, &P2OUT
- BIS.B #0x2, &P5OUT;
- BIS.B #0x4, &P5OUT;
- BIC.B #0x8, &P5OUT;
- MOV #8, &curLED
- JMP mainloop
- Int_ADC: ;Interrupt routine for ADC
- MOV.W &0x712, &ADC_Result ;Store ADC result
- BIC.W #0x10, 0x2(SP) ;__bic_SR_register_on_exit(LPM0_bits);
- RETI
- timer_interrupt: ;Interrupt routine for ADC
- CMP #520, &ADC_Result
- JGE clockwise
- CMP #505, &ADC_Result
- JL anticlockwise
- MOV.W #(TASSEL__ACLK | MC__STOP), &TA0CTL
- BIC.W #0x10, 0x2(SP) ;__bic_SR_register_on_exit(LPM0_bits);
- RETI
- ;=============== Interrupt vectors
- COMMON INTVEC
- ; Defaults to starting at 0
- ORG 0x60 ; Move origin to 0x60, the interrupt vector for ADC
- DC16 Int_ADC ; Point to the ADC interrupt routine
- ORG 0x70
- DC16 timer_interrupt ; Point to the timer interrupt
- END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement