Advertisement
Guest User

Untitled

a guest
Nov 21st, 2018
104
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.57 KB | None | 0 0
  1. #include "msp430.h"
  2. NAME main
  3. PUBLIC main
  4. ORG 0FFFEh
  5. DC16 init ; set reset vector to 'init' label
  6. RSEG DATA16_N
  7. ADC_Result:
  8. DS8 2 ;variable to store ADC value
  9. curLED:
  10. DS8 2 ;variable to store currentLED
  11.  
  12. ;=============== Interrupt routine for ADC
  13. RSEG CODE
  14.  
  15. ;=============== Declare the stack to the linker
  16. RSEG CSTACK
  17.  
  18. ;=============== Main code block
  19. RSEG CODE
  20. init:
  21. MOV #SFE(CSTACK), SP ; set up stack
  22. main:
  23. MOV.W #WDTPW+WDTHOLD,&WDTCTL ; Stop watchdog timer
  24. ; Configure GPIO
  25. BIS.B #0x1, &P8DIR
  26. BIS.B #0x80, &P2DIR
  27. BIS.B #0x2, &P5DIR
  28. BIS.B #0x4, &P5DIR
  29. BIS.B #0x8, &P5DIR
  30.  
  31. ;set curLED to 1
  32. MOV #2, &curLED
  33.  
  34. BIS.W #ADCPCTL9, &SYSCFG2 ; Configure ADC A9 pin
  35. BIC.W #LOCKLPM5, &PM5CTL0 ; Disable the GPIO power-on default
  36. ; high-impedance mode to activate
  37. ; previously configured port settings
  38. ; Configure ADC10
  39. BIS.W #(ADCSHT_2 | ADCON), &ADCCTL0 ; ADCON, S&H=16 ADC clks
  40. BIS.W #ADCSHP, &ADCCTL1 ; ADCCLK = MODOSC; sampling timer
  41. BIS.W #ADCRES, &ADCCTL2 ; 10-bit conversion results
  42. BIS.W #ADCINCH_9, &ADCMCTL0 ; A9 ADC input select; Vref=AVCC
  43. BIS.W #ADCIE0, &ADCIE ; Enable ADC conv complete interrupt
  44.  
  45. ;timer setup
  46. BIS.W #CCIE, &TA0CCTL0
  47. MOV.W #3277, &TA0CCR0
  48. MOV.W #(TASSEL__ACLK | MC__UP), &TA0CTL
  49.  
  50. NOP
  51. BIS.W #GIE, SR
  52. JMP mainloop
  53.  
  54. mainloop:
  55. BIS.W #0x3, &ADCCTL0 ; Start conversion ;
  56. NOP
  57. BIS.W #0x18, SR ;enter low power mode
  58. NOP
  59. CMP.W #520, &ADC_Result
  60. JGE clock_clockGo
  61. CMP.W #505, &ADC_Result
  62. JL anti_clockGo
  63. MOV.W #(TASSEL__ACLK | MC__STOP), &TA0CTL
  64. JMP mainloop
  65.  
  66. clock_clockGo:
  67. ;normalise ADC value
  68. ;set value to CCR
  69. ; val1 = (varRes - MAX_RES/2);
  70. ADD.W #1, &ADC_Result
  71. MOV.W &ADC_Result, R15
  72. SUB.W #512, R15
  73. ; speed1 = 1/val1 *1677721.6; or 1677721.6/val
  74. ;MOV.W #0, R13 ; set counter
  75. ;JMP divLoop
  76. ; TA1CCR0 = speed1;
  77. RLA.W R15
  78. RLA.W R15
  79. RLA.W R15
  80.  
  81.  
  82. MOV.W R15, &TA0CCR0
  83. ;start reg counting up
  84. MOV.W #(TASSEL__ACLK | MC__UP), &TA0CTL
  85. NOP
  86. BIS.W #0x18, SR ;enter low power mode
  87. NOP
  88. JMP mainloop
  89.  
  90. anti_clockGo:
  91. ; normalise ADC value
  92. ; set value to CCR
  93. ; val = -1*(varRes - MAX_RES/2);
  94. ADD.W #1, &ADC_Result
  95. MOV.W &ADC_Result, R15
  96. SUB.W #512, R15
  97. MOV.W R15, R14
  98. SUB.W R14, R15
  99. SUB.W R14, R15
  100. ; MOV.W #1667221, R14
  101. ; speed = 1/val *1677721.6; or 1677721.6/val
  102. ;MOV.W #0, R13 ; set counter
  103. ; JMP divLoop ;divide R14 by R15
  104. ; TA1CCR0 = speed;
  105. RLA.W R15
  106. RLA.W R15
  107. RLA.W R15
  108.  
  109. MOV.W R15, &TA0CCR0
  110. ;start reg counting up
  111. MOV.W #(TASSEL__ACLK | MC__UP), &TA0CTL
  112. NOP
  113. BIS.W #0x18, SR ;enter low power mode
  114. NOP
  115. JMP mainloop
  116.  
  117. ;for the clockwise loop, check if the value in curLED is 1, if it is, then
  118. ;update the LED shown and the curLED register
  119. ;If it is not, then check if it is 2, and so on.
  120. clockwise:
  121. CMP #1, &curLED
  122. JNE c_l2
  123. JMP LED5
  124. ret
  125. c_l2:
  126. CMP #2, &curLED
  127. JNE c_l3
  128. JMP LED1
  129. ret
  130. c_l3:
  131. CMP #3, &curLED
  132. JNE c_l4
  133. JMP LED2
  134. ret
  135. c_l4:
  136. CMP #4, &curLED
  137. JNE c_l5
  138. JMP LED3
  139. ret
  140. c_l5:
  141. CMP #5, &curLED
  142. JNE c_l6
  143. JMP LED6
  144. ret
  145. c_l6:
  146. CMP #6, &curLED
  147. JNE c_l7
  148. JMP LED7
  149. ret
  150. c_l7:
  151. CMP #7, &curLED
  152. JNE c_l8
  153. JMP LED8
  154. ret
  155. c_l8:
  156. JMP LED4
  157. ret
  158.  
  159. anticlockwise:
  160. CMP #1, &curLED
  161. JNE a_l2
  162. JMP LED2
  163. ret
  164. a_l2:
  165. CMP #2, &curLED
  166. JNE a_l3
  167. JMP LED3
  168. ret
  169. a_l3:
  170. CMP #3, &curLED
  171. JNE a_l4
  172. JMP LED4
  173. ret
  174. a_l4:
  175. CMP #4, &curLED
  176. JNE a_l5
  177. JMP LED8
  178. ret
  179. a_l5:
  180. CMP #5, &curLED
  181. JNE a_l6
  182. JMP LED1
  183. ret
  184. a_l6:
  185. CMP #6, &curLED
  186. JNE a_l7
  187. JMP LED5
  188. ret
  189. a_l7:
  190. CMP #7, &curLED
  191. JNE a_l8
  192. JMP LED6
  193. ret
  194. a_l8:
  195. JMP LED7
  196. ret
  197.  
  198. LED1:
  199. BIS.B #0x1, &P8OUT ; P8.0 high
  200. BIC.B #0x80, &P2OUT ; P2.7 low
  201. BIC.B #0x2, &P5OUT; ; P5.1 low
  202. BIC.B #0x4, &P5OUT; ; P5.2 low
  203. BIC.B #0x8, &P5OUT; ; P5.3 low
  204. MOV #1, &curLED
  205. JMP mainloop
  206.  
  207. LED2:
  208. BIC.B #0x1, &P8OUT
  209. BIC.B #0x80, &P2OUT
  210. BIS.B #0x2, &P5OUT
  211. BIC.B #0x4, &P5OUT
  212. BIC.B #0x8, &P5OUT
  213. MOV #2, &curLED
  214. JMP mainloop
  215.  
  216. LED3:
  217. BIC.B #0x1, &P8OUT
  218. BIC.B #0x80, &P2OUT
  219. BIC.B #0x2, &P5OUT;
  220. BIS.B #0x4, &P5OUT;
  221. BIC.B #0x8, &P5OUT
  222. MOV #3, &curLED
  223. JMP mainloop
  224.  
  225. LED4:
  226. BIC.B #0x1, &P8OUT
  227. BIC.B #0x80, &P2OUT
  228. BIC.B #0x2, &P5OUT
  229. BIC.B #0x4, &P5OUT
  230. BIS.B #0x8, &P5OUT
  231. MOV #4, &curLED
  232. JMP mainloop
  233.  
  234. LED5:
  235. BIC.B #0x1, &P8OUT
  236. BIS.B #0x80, &P2OUT
  237. BIS.B #0x2, &P5OUT
  238. BIS.B #0x4, &P5OUT
  239. BIS.B #0x8, &P5OUT
  240. MOV #5, &curLED
  241. JMP mainloop
  242.  
  243. LED6:
  244. BIS.B #0x1, &P8OUT
  245. BIS.B #0x80, &P2OUT
  246. BIC.B #0x2, &P5OUT;
  247. BIS.B #0x4, &P5OUT;
  248. BIS.B #0x8, &P5OUT;
  249. MOV #6, &curLED
  250. JMP mainloop
  251.  
  252. LED7:
  253. BIS.B #0x1, &P8OUT
  254. BIS.B #0x80, &P2OUT
  255. BIS.B #0x2, &P5OUT;
  256. BIC.B #0x4, &P5OUT;
  257. BIS.B #0x8, &P5OUT;
  258. MOV #7, &curLED
  259. JMP mainloop
  260.  
  261. LED8:
  262. BIS.B #0x1, &P8OUT
  263. BIS.B #0x80, &P2OUT
  264. BIS.B #0x2, &P5OUT;
  265. BIS.B #0x4, &P5OUT;
  266. BIC.B #0x8, &P5OUT;
  267. MOV #8, &curLED
  268. JMP mainloop
  269.  
  270. Int_ADC: ;Interrupt routine for ADC
  271. MOV.W &0x712, &ADC_Result ;Store ADC result
  272. BIC.W #0x10, 0x2(SP) ;__bic_SR_register_on_exit(LPM0_bits);
  273. RETI
  274.  
  275. timer_interrupt: ;Interrupt routine for ADC
  276. CMP #520, &ADC_Result
  277. JGE clockwise
  278. CMP #505, &ADC_Result
  279. JL anticlockwise
  280. MOV.W #(TASSEL__ACLK | MC__STOP), &TA0CTL
  281. BIC.W #0x10, 0x2(SP) ;__bic_SR_register_on_exit(LPM0_bits);
  282. RETI
  283.  
  284. ;=============== Interrupt vectors
  285. COMMON INTVEC
  286. ; Defaults to starting at 0
  287. ORG 0x60 ; Move origin to 0x60, the interrupt vector for ADC
  288. DC16 Int_ADC ; Point to the ADC interrupt routine
  289. ORG 0x70
  290. DC16 timer_interrupt ; Point to the timer interrupt
  291.  
  292. END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement