Advertisement
Guest User

TM

a guest
May 26th, 2017
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;-------------------------------------------------------------------------------
  2. ; MSP430 Assembler Code Template for use with TI Code Composer Studio
  3. ; 8-bitów, ładowanie, zliczanie w dół - NKB
  4. ; LD - aktywne poziomem, CLK - zboczem
  5. ;-------------------------------------------------------------------------------
  6.           .cdecls C,LIST,"msp430.h"       ; Include device header file
  7.  
  8. ;-------------------------------------------------------------------------------
  9.           .def    RESET                   ; Export program entry-point to
  10.  
  11.  
  12.  
  13. ; Stałe związane z rejestrami
  14.  
  15.             .data
  16. BUTTON_DIR      .set    P1DIR   ; resetowany z PUC 0 - input, 1 - output
  17. BUTTON_IFG      .set    P1IFG
  18. BUTTON_IE       .set    P1IE
  19. BUTTON_IES      .set    P1IES   ; Interrupt Edge Select
  20. BUTTON_IN       .set    P1IN
  21.  
  22. SEG7_DIR        .set    P2DIR
  23. SEG7_OUT        .set    P2OUT
  24.  
  25. HEX_DIR         .set    P3DIR
  26. HEX_IN          .set    P3IN
  27.  
  28.  
  29. LOAD_BUTTON_ADDR    .set    0x01
  30. DEC_BUTTON_ADDR     .set    0x08
  31.  
  32. BUTTON_ADDRS        .set LOAD_BUTTON_ADDR|DEC_BUTTON_ADDR
  33.  
  34. ; Flagi rejestru stanów
  35.  
  36. LOAD_BUTTON_CHANGED_FLAG    .set 0x01
  37. DEC_BUTTON_CHANGED_FLAG     .set 0x02
  38. LOAD_BUTTON_PRESSED_FLAG    .set 0x04
  39.  
  40.  
  41. ; Parametry debouncingu
  42.  
  43. DEBOUNCING_LIMIT            .set    32 ; maks.
  44. DEBOUNCING_PASS             .set    25 ;25
  45. DEBOUNCING_TRIES            .set    32 ; 32 - aby byla 1ms
  46.  
  47. ; Przypisanie rejestrów
  48. ; R4 - aktualna wartość licznika
  49. ; R5 - flagi
  50. ;-------------------------------------------------------------------------------
  51.           .text                           ; Assemble into program memory.
  52.           .retain                         ; Override ELF conditional linking
  53.                                           ; and retain current section.
  54.           .retainrefs                     ; And retain any sections that have
  55.                                           ; references to current section.
  56.  
  57.  
  58.  
  59.  
  60. ;-------------------------------------------------------------------------------
  61. RESET       mov.w   #__STACK_END,SP         ; Initialize stackpointer
  62. StopWDT     mov.w   #WDTPW|WDTHOLD,&WDTCTL  ; Stop watchdog timer
  63.  
  64.  
  65.  
  66.             ; ustawiamy sobie wszystko kulturalnie
  67.             bic.b   #(LOAD_BUTTON_ADDR|DEC_BUTTON_ADDR), &BUTTON_DIR
  68.             clr.b   &HEX_DIR
  69.             mov.b   #-1, &SEG7_DIR
  70.  
  71.             bis.b   #BUTTON_ADDRS, &BUTTON_IES
  72.             bis.b   #BUTTON_ADDRS, &BUTTON_IE
  73.  
  74.             ; ustawiamy sobie również timer pod kątem debouncingu
  75.             bis.w   #TACLR,     &TA0CTL
  76.             bic.w   #MC0|MC1,   &TA0CTL
  77.             bis.w   #TASSEL_1,  &TA0CTL         ; liczymy na ACLK
  78.  
  79.             mov.b   #DEBOUNCING_TRIES,      &TA0CCR0 ;
  80.             bis.w   #TAIE,      &TA0CTL         ; Enable timer TA0 interrupts.
  81.             bis.w   #CCIE,      &TACCTL0
  82.             call    #LOAD_FROM_HEX
  83.  
  84.             clr.b r5
  85.             mov.b r4,   &SEG7_OUT
  86.             eint
  87.  
  88. ;-------------------------------------------------------------------------------
  89. ; Main loop here
  90. ;-------------------------------------------------------------------------------
  91.  
  92. MAIN_LOOP
  93.             dint
  94.  
  95. LOAD_CHECK
  96.             bit.b   #LOAD_BUTTON_CHANGED_FLAG, R5
  97.             jz DEC_CHECK
  98.             bic.b #LOAD_BUTTON_CHANGED_FLAG, R5
  99.  
  100.             mov.b   #LOAD_BUTTON_ADDR, r15
  101.             call #BUTTON_CHANGED
  102.  
  103.  
  104. DEC_CHECK
  105.             bit.b   #DEC_BUTTON_CHANGED_FLAG, R5
  106.             jz AFTER_CRIT_SECT
  107.             bic.b #DEC_BUTTON_CHANGED_FLAG, R5
  108.  
  109.             mov.b   #DEC_BUTTON_ADDR, r15
  110.             call #BUTTON_CHANGED
  111.  
  112. AFTER_CRIT_SECT
  113.             eint
  114.             bit.b #LOAD_BUTTON_PRESSED_FLAG, R5
  115.             jz GOOD_NIGHT
  116.             call #LOAD_FROM_HEX
  117.  
  118. GOOD_NIGHT
  119.             tst.b R5
  120.             jnz MAIN_LOOP           ; czy pozostały jeszcze jakieś przerwania do obsłużenia?
  121.             bis #CPUOFF|SCG1|SCG0|OSCOFF|GIE, SR
  122.             jmp MAIN_LOOP
  123.  
  124.  
  125.  
  126.  
  127. ; FUNKCJE
  128.  
  129. ;magiczna funkcja ładująca z nastawników
  130. LOAD_FROM_HEX
  131.             mov.b   &HEX_IN,                    R4
  132.             mov.b   r4,                         &SEG7_OUT
  133.        ;   bic.b   #LOAD_BUTTON_PRESSED_FLAG,  r5
  134.             ret
  135.  
  136. ;ISR dla przycisków
  137. BUTTON_ISR
  138.             bit.b   #LOAD_BUTTON_ADDR, &BUTTON_IFG
  139.             jz BISR_AFTER_LOAD
  140.  
  141.             bic.b #LOAD_BUTTON_ADDR, &BUTTON_IFG
  142.             bic.b #LOAD_BUTTON_ADDR, &BUTTON_IE
  143.             xor.b #LOAD_BUTTON_ADDR, &BUTTON_IES ;
  144.  
  145.             bis.b #LOAD_BUTTON_CHANGED_FLAG, R5 ;
  146.  
  147. BISR_AFTER_LOAD
  148.             bit.b   #DEC_BUTTON_ADDR, &BUTTON_IFG
  149.             jz BISR_AFTER_DEC
  150.  
  151.             bic.b #DEC_BUTTON_ADDR, &BUTTON_IFG
  152.             bic.b #DEC_BUTTON_ADDR, &BUTTON_IE
  153.             xor.b #DEC_BUTTON_ADDR, &BUTTON_IES
  154.  
  155.             bis.b #DEC_BUTTON_CHANGED_FLAG, R5
  156.  
  157. BISR_AFTER_DEC
  158.             bic #CPUOFF|SCG1|SCG0|OSCOFF, 0(SP)
  159.             reti
  160. ;ISR dla timera
  161. TA0_ISR
  162.             cmp.w   #TA0IV_TAIFG, &TA0IV
  163.             jeq TISR_END
  164.  
  165.             bit.b r15, BUTTON_IN
  166.             jnz TISR_BUTTON_NOT_PRESSED
  167.             inc r13
  168.  
  169. TISR_BUTTON_NOT_PRESSED
  170.             inc r12
  171.  
  172.             cmp.b #DEBOUNCING_LIMIT, r12
  173.             jne TISR_END
  174.             bic #CPUOFF|SCG1|SCG0|OSCOFF, 0(SP)
  175.             bic.w   #MC0, &TA0CTL
  176.            ; rozstrzygnięcie czy wciśnęliśmy w r13
  177.             cmp.b #DEBOUNCING_PASS, r13
  178.             jl TISR_FAILED
  179.             mov.b       #0, r13
  180.             jmp TISR_END
  181. TISR_FAILED
  182.             mov.b       #1, r13
  183. TISR_END
  184.             bic.w   #TAIFG, &TA0CTL
  185.             reti
  186.  
  187.  
  188. ; argumenty:
  189. ; r15 - adres przycisku(pin)
  190. ; r14 - flaga - zbędna...
  191. ;wewnętrzne
  192. ; r13 - zliczanie wciśnięć / efekt debouncingu
  193. ; r12 - zliczanie przebiegów timera
  194.  
  195. BUTTON_CHANGED
  196.             push.b &BUTTON_IE
  197.             bic.b #DEC_BUTTON_ADDR|LOAD_BUTTON_ADDR, &BUTTON_IE
  198.             eint
  199.  
  200.             clr.b   r13
  201.             clr.b   r12
  202.             bis.w   #MC0, &TA0CTL
  203.             bis #LPM3, SR ;
  204.            ; w tym miejscu akcja rozgrywa się głównie w TA0ISR
  205.             nop
  206.             dint
  207.  
  208.  
  209.             tst.b   r13
  210.             jnz BUTTON_NOT_PRESSED
  211.  
  212.             cmp.b #DEC_BUTTON_ADDR, r15
  213.             JEQ DEC_BUTTON_ACTION
  214.            ;a tutaj obsługujemy load
  215.             bis.b   #LOAD_BUTTON_PRESSED_FLAG,  r5
  216.             JMP BUTTON_CHANGED_EXIT
  217.  
  218.  
  219. DEC_BUTTON_ACTION
  220.             DEC r4
  221.  
  222.             bic.b #DEC_BUTTON_ADDR, &BUTTON_IFG ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===================== TO DODALISMY
  223.        ;   JNZ BUTTON_NOT_PRESSED
  224.        ;   call LOAD_FROM_HEX  ; jeżeli zero, to ładujemy z licznika
  225.             JN WE_ARE_BELOW_ZERO
  226.             JMP DEC_EXIT
  227.  
  228. WE_ARE_BELOW_ZERO
  229.             call LOAD_FROM_HEX
  230. DEC_EXIT
  231.             mov.b   r4, &SEG7_OUT
  232.             jmp BUTTON_CHANGED_EXIT
  233. BUTTON_NOT_PRESSED
  234.             cmp.b #DEC_BUTTON_ADDR, r15
  235.             JEQ BUTTON_CHANGED_EXIT
  236.             bic.b   #LOAD_BUTTON_PRESSED_FLAG,  r5
  237.  
  238. BUTTON_CHANGED_EXIT
  239.             pop.b &BUTTON_IE
  240.             bis.b   r15,    &BUTTON_IE
  241.             ret
  242. ;-------------------------------------------------------------------------------
  243. ; Stack Pointer definition
  244. ;-------------------------------------------------------------------------------
  245.           .global __STACK_END
  246.           .sect   .stack
  247.  
  248. ;-------------------------------------------------------------------------------
  249. ; Interrupt Vectors
  250. ;-------------------------------------------------------------------------------
  251.           .sect   ".reset"                ; MSP430 RESET Vector
  252.           .short  RESET
  253.            .sect   ".int04"
  254.            .short  BUTTON_ISR
  255.            .sect   ".int05"            ; Timer0_A5 Interrupt Service Routine /* 0xFFE8 Timer0_A5 CC1-4, TA */
  256.            .short  TA0_ISR ;
  257.            .sect   ".int06"            ; Timer0_A5 Interrupt Service Routine /* 0xFFE8 Timer0_A5 CC1-4, TA */
  258.            .short  TA0_ISR ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement