;------------------------------------------------------------------------------- ; MSP430 Assembler Code Template for use with TI Code Composer Studio ; ; ;------------------------------------------------------------------------------- .cdecls C,LIST,"msp430.h" ; Include device header file ;------------------------------------------------------------------------------- .def RESET ; Export program entry-point to ; make it known to linker. ;------------------------------------------------------------------------------- .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 ;------------------------------------------------------------------------------- ; Zmienne ; R4 - wartosc licznika, R4 - pierwszwy rejestr ogolnego przeznaczenia ; R5 - wartosc licznika w Grayu ; R6 - rejestr do drgan stykow ; R7 - ograniczenie ; R8 - zrzut flag IF ; R9 - ; R10 - rejestr do drgan stykow 2 ;------------------------------------------------------------------------------- ;------------------------------------------------------------------------------- ; Stale ;------------------------------------------------------------------------------- CLEAR_BUT .set 0x20 DEC_BUT .set 0x10 ;przycisk DEB_VAL .set 0x08FF ;do odszumiania DEB2_VAL .set 0x0BFF ;------------------------------------------------------------------------------- ; Konfiguracja ;------------------------------------------------------------------------------- ;kierunki portow - FF wyjscie, 00 wejscie mov.b #0xFF, &P1DIR ;wyjscie mov.b #0xCF, &P2DIR ;wejscie i przerwania mov.b #0x00, &P3DIR ;wejscie ;przerwania bis.b #0x30, &P2IES ;jakim zboczem bis.b #0x30, &P2IE ;wlacza przerwanie xor.b P2IFG, P2IFG ; zeruj flagi przerwan ;inicjalizacja mov.b #0xFF, R4 ;"zeruje" licznik mov.b #0x80, R5 mov.b R5, P1OUT ;wyswietla mov.b #0x00, R8 xor.b R6, R6 xor.b R10, R10 jmp SLEEP ;bezwarunkowo do SLEEP ;------------------------------------------------------------------------------- ; Main loop here ;------------------------------------------------------------------------------- MAIN: bit.b #CLEAR_BUT, P2IN jz CLEAR bit.b #CLEAR_BUT, R8 jnz CLEAR bit.b #DEC_BUT, R8 jnz DECREMENT jmp SLEEP DECREMENT: and.b #0xEF, R8 mov.w #DEB_VAL, R6 mov.b #0x00, &P2IE ; zablokowanie przerwan mov.w #DEB2_VAL, R10 jmp DEC DEBOUNCE: mov.w #DEB_VAL, R6 bit.b #CLEAR_BUT, P2IN jz DEBOUNCE_CLEAR DEC: dec.w R10 jz IE_AND_GOTO_MAIN bit.b #DEC_BUT, P2IN ; jnz DEBOUNCE ;if(!0) reset dec.w R6 jnz DEC mov.b #0x30, &P2IE ; odblokowanie przerwan dec R4 ;dekrementacja mov.b P3IN, R7 cmp R7, R4 ;if R4>=R7 jge DEC_CONTINUE mov.b #0xFF, R4 ;"zeruje" licznik mov.b #0x80, R5 DEC_CONTINUE: call #CONVERT_TO_GRAY mov.b R5, P1OUT ;jmp MAIN SLEEP: ;wylacza zegary, wlacza przerwania,wchodzi w LMP4 bis #CPUOFF|SCG1|SCG0|OSCOFF|GIE, SR ; wylaczenie zegarow jmp MAIN CLEAR: and.b #0xDF, R8 mov.b #0x00, &P2IE ; zablokowanie przerwan mov.w #DEB2_VAL, R10 mov.w #DEB_VAL, R6 jmp CLR DEBOUNCE_CLEAR: mov.w #DEB_VAL, R6 CLR: ;zerowanie dec.w R10 jz IE_AND_GOTO_MAIN bit.b #CLEAR_BUT, P2IN jnz DEBOUNCE_CLEAR dec.w R6 jnz CLR mov.b #0x30, &P2IE ; odblokowanie przerwan mov.b #0xFF, R4 ;"zeruje" licznik mov.b #0x80, R5 mov.b R5, P1OUT ;bit.b #CLEAR_BUT, P2IN ;jz CLEAR jmp SLEEP CONVERT_TO_GRAY: mov.b R4, R5 rra.b R5 and.b #0x7F, R5 xor.b R4, R5 ret INTERRUPT: bic #CPUOFF|SCG1|SCG0|OSCOFF, 0(SP) ; wylacz sleep mov.b P2IFG, R8 xor.b P2IFG, P2IFG ; zeruj flagi przerwan RETI IE_AND_GOTO_MAIN: mov.b #0x30, &P2IE ; odblokowanie przerwan jmp MAIN ;koniec przerwania ----------------- ;------------------------------------------------------------------------------- ; Stack Pointer definition ;------------------------------------------------------------------------------- .global __STACK_END .sect .stack ;------------------------------------------------------------------------------- ; Interrupt Vectors ;------------------------------------------------------------------------------- .sect ".reset" ; MSP430 RESET Vector .short RESET .sect ".int01" .short INTERRUPT