Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;-------------------------------------------------------------------------------
- ; MSP430 Assembler Code Template for use with TI Code Composer Studio
- ; 8-bitów, ładowanie, zliczanie w dół - NKB
- ; LD - aktywne poziomem, CLK - zboczem
- ;-------------------------------------------------------------------------------
- .cdecls C,LIST,"msp430.h" ; Include device header file
- ;-------------------------------------------------------------------------------
- .def RESET ; Export program entry-point to
- ; Stałe związane z rejestrami
- .data
- BUTTON_DIR .set P1DIR ; resetowany z PUC 0 - input, 1 - output
- BUTTON_IFG .set P1IFG
- BUTTON_IE .set P1IE
- BUTTON_IES .set P1IES ; Interrupt Edge Select
- BUTTON_IN .set P1IN
- SEG7_DIR .set P2DIR
- SEG7_OUT .set P2OUT
- HEX_DIR .set P3DIR
- HEX_IN .set P3IN
- LOAD_BUTTON_ADDR .set 0x01
- DEC_BUTTON_ADDR .set 0x08
- BUTTON_ADDRS .set LOAD_BUTTON_ADDR|DEC_BUTTON_ADDR
- ; Flagi rejestru stanów
- LOAD_BUTTON_CHANGED_FLAG .set 0x01
- DEC_BUTTON_CHANGED_FLAG .set 0x02
- LOAD_BUTTON_PRESSED_FLAG .set 0x04
- ; Parametry debouncingu
- DEBOUNCING_LIMIT .set 32 ; maks.
- DEBOUNCING_PASS .set 25 ;25
- DEBOUNCING_TRIES .set 32 ; 32 - aby byla 1ms
- ; Przypisanie rejestrów
- ; R4 - aktualna wartość licznika
- ; R5 - flagi
- ;-------------------------------------------------------------------------------
- .text ; Assemble into program memory.
- .retain ; Override ELF conditional linking
- ; and retain current section.
- .retainrefs ; And retain any sections that have
- ; references to current section.
- ;-------------------------------------------------------------------------------
- RESET mov.w #__STACK_END,SP ; Initialize stackpointer
- StopWDT mov.w #WDTPW|WDTHOLD,&WDTCTL ; Stop watchdog timer
- ; ustawiamy sobie wszystko kulturalnie
- bic.b #(LOAD_BUTTON_ADDR|DEC_BUTTON_ADDR), &BUTTON_DIR
- clr.b &HEX_DIR
- mov.b #-1, &SEG7_DIR
- bis.b #BUTTON_ADDRS, &BUTTON_IES
- bis.b #BUTTON_ADDRS, &BUTTON_IE
- ; ustawiamy sobie również timer pod kątem debouncingu
- bis.w #TACLR, &TA0CTL
- bic.w #MC0|MC1, &TA0CTL
- bis.w #TASSEL_1, &TA0CTL ; liczymy na ACLK
- mov.b #DEBOUNCING_TRIES, &TA0CCR0 ;
- bis.w #TAIE, &TA0CTL ; Enable timer TA0 interrupts.
- bis.w #CCIE, &TACCTL0
- call #LOAD_FROM_HEX
- clr.b r5
- mov.b r4, &SEG7_OUT
- eint
- ;-------------------------------------------------------------------------------
- ; Main loop here
- ;-------------------------------------------------------------------------------
- MAIN_LOOP
- dint
- LOAD_CHECK
- bit.b #LOAD_BUTTON_CHANGED_FLAG, R5
- jz DEC_CHECK
- bic.b #LOAD_BUTTON_CHANGED_FLAG, R5
- mov.b #LOAD_BUTTON_ADDR, r15
- call #BUTTON_CHANGED
- DEC_CHECK
- bit.b #DEC_BUTTON_CHANGED_FLAG, R5
- jz AFTER_CRIT_SECT
- bic.b #DEC_BUTTON_CHANGED_FLAG, R5
- mov.b #DEC_BUTTON_ADDR, r15
- call #BUTTON_CHANGED
- AFTER_CRIT_SECT
- eint
- bit.b #LOAD_BUTTON_PRESSED_FLAG, R5
- jz GOOD_NIGHT
- call #LOAD_FROM_HEX
- GOOD_NIGHT
- tst.b R5
- jnz MAIN_LOOP ; czy pozostały jeszcze jakieś przerwania do obsłużenia?
- bis #CPUOFF|SCG1|SCG0|OSCOFF|GIE, SR
- jmp MAIN_LOOP
- ; FUNKCJE
- ;magiczna funkcja ładująca z nastawników
- LOAD_FROM_HEX
- mov.b &HEX_IN, R4
- mov.b r4, &SEG7_OUT
- ; bic.b #LOAD_BUTTON_PRESSED_FLAG, r5
- ret
- ;ISR dla przycisków
- BUTTON_ISR
- bit.b #LOAD_BUTTON_ADDR, &BUTTON_IFG
- jz BISR_AFTER_LOAD
- bic.b #LOAD_BUTTON_ADDR, &BUTTON_IFG
- bic.b #LOAD_BUTTON_ADDR, &BUTTON_IE
- xor.b #LOAD_BUTTON_ADDR, &BUTTON_IES ;//@TODO: czy tu nie powinno być warunku?
- bis.b #LOAD_BUTTON_CHANGED_FLAG, R5 ;//TODO: o tu
- BISR_AFTER_LOAD
- bit.b #DEC_BUTTON_ADDR, &BUTTON_IFG
- jz BISR_AFTER_DEC
- bic.b #DEC_BUTTON_ADDR, &BUTTON_IFG
- bic.b #DEC_BUTTON_ADDR, &BUTTON_IE
- xor.b #DEC_BUTTON_ADDR, &BUTTON_IES
- bis.b #DEC_BUTTON_CHANGED_FLAG, R5
- BISR_AFTER_DEC
- bic #CPUOFF|SCG1|SCG0|OSCOFF, 0(SP)
- reti
- ;ISR dla timera
- TA0_ISR
- cmp.w #TA0IV_TAIFG, &TA0IV
- jeq TISR_END
- bit.b r15, BUTTON_IN
- jnz TISR_BUTTON_NOT_PRESSED
- inc r13
- TISR_BUTTON_NOT_PRESSED
- inc r12
- cmp.b #DEBOUNCING_LIMIT, r12
- jne TISR_END
- bic #CPUOFF|SCG1|SCG0|OSCOFF, 0(SP)
- bic.w #MC0, &TA0CTL
- ; rozstrzygnięcie czy wciśnęliśmy w r13
- cmp.b #DEBOUNCING_PASS, r13
- jl TISR_FAILED
- mov.b #0, r13
- jmp TISR_END
- TISR_FAILED
- mov.b #1, r13
- TISR_END
- bic.w #TAIFG, &TA0CTL
- reti
- ; argumenty:
- ; r15 - adres przycisku(pin)
- ; r14 - flaga - zbędna...
- ;wewnętrzne
- ; r13 - zliczanie wciśnięć / efekt debouncingu
- ; r12 - zliczanie przebiegów timera
- BUTTON_CHANGED
- push.b &BUTTON_IE
- bic.b #DEC_BUTTON_ADDR|LOAD_BUTTON_ADDR, &BUTTON_IE
- eint
- clr.b r13
- clr.b r12
- bis.w #MC0, &TA0CTL
- bis #LPM3, SR ; LPM3 //TODO: więcej flag
- ; w tym miejscu akcja rozgrywa się głównie w TA0ISR
- nop
- dint
- tst.b r13
- jnz BUTTON_NOT_PRESSED
- cmp.b #DEC_BUTTON_ADDR, r15
- JEQ DEC_BUTTON_ACTION
- ;a tutaj obsługujemy load
- bis.b #LOAD_BUTTON_PRESSED_FLAG, r5
- JMP BUTTON_CHANGED_EXIT
- DEC_BUTTON_ACTION
- DEC r4
- bic.b #DEC_BUTTON_ADDR, &BUTTON_IFG ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<===================== TO DODALISMY
- ; JNZ BUTTON_NOT_PRESSED
- ; call LOAD_FROM_HEX ; jeżeli zero, to ładujemy z licznika
- JN WE_ARE_BELOW_ZERO
- JMP DEC_EXIT
- WE_ARE_BELOW_ZERO
- call LOAD_FROM_HEX
- DEC_EXIT
- mov.b r4, &SEG7_OUT
- jmp BUTTON_CHANGED_EXIT
- BUTTON_NOT_PRESSED
- cmp.b #DEC_BUTTON_ADDR, r15
- JEQ BUTTON_CHANGED_EXIT
- bic.b #LOAD_BUTTON_PRESSED_FLAG, r5
- BUTTON_CHANGED_EXIT
- pop.b &BUTTON_IE
- bis.b r15, &BUTTON_IE
- ret
- ;-------------------------------------------------------------------------------
- ; Stack Pointer definition
- ;-------------------------------------------------------------------------------
- .global __STACK_END
- .sect .stack
- ;-------------------------------------------------------------------------------
- ; Interrupt Vectors
- ;-------------------------------------------------------------------------------
- .sect ".reset" ; MSP430 RESET Vector
- .short RESET
- .sect ".int04"
- .short BUTTON_ISR
- .sect ".int05" ; Timer0_A5 Interrupt Service Routine /* 0xFFE8 Timer0_A5 CC1-4, TA */
- .short TA0_ISR ;
- .sect ".int06" ; Timer0_A5 Interrupt Service Routine /* 0xFFE8 Timer0_A5 CC1-4, TA */
- .short TA0_ISR ;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement