Códigos em C - experimento MSP430
Short Description
Exemplos de códigos em C para o MSP430...
Description
Taís Laurindo Pereira 12/0042223
Relatório 3 – LEDs e Chaves
Questão 1 Programa 8 ;------------------------------------------------------------------------------; MSP430 Assembler Code Template for use with TI Code Composer Studio ; ; ;------------------------------------------------------------------------------.cdecls C,LIST,"msp430.h" ;------------------------------------------------------------------------------.def RESET ; ;------------------------------------------------------------------------------.text .retain .retainrefs
;------------------------------------------------------------------------------RESET mov.w #__STACK_END,SP ; Inicializa o stackpointer StopWDT mov.w #WDTPW|WDTHOLD,&WDTCTL ; para o watchdog timer DELAY .equ 65500 ; atraso (máximo) ;------------------------------------------------------------------------------; Main loop here ;------------------------------------------------------------------------------;-----------------------------------------------------------------------------.text ; ;-----------------------------------------------------------------------------start: mov.w #0x0280,SP ; init stack pointer mov.w #WDTPW|WDTHOLD,&WDTCTL ; para WDT bis.b #0x01,&P1DIR ; define P1.0 como saída call #T500ms ;chama a subrotina T500ms:
delayloop:
xor.b mov.w
#0x01,&P1OUT #DELAY,R15
; ;
alterna o LED (on/off) - toggle define o tempo on/off
sub.w #1,R15 ; decrementa o registrador jnz delayloop ; repete a operação enquanto não for zero jmp delayloop2 ; concatena com um outro atraso, de igual valor, atingindo o resultado pedido nop ;mov #0h,#0h delayloop2: sub.w #1,R15 ; decrementa o registrador jnz delayloop2 ; repete a operação enquanto não for zero jmp T500ms ; vai para a subrotina novamente nop ;mov #0h,#0h ;-------------------------------------------------------------------------------
; Stack Pointer definition ;------------------------------------------------------------------------------.global __STACK_END .sect .stack ;------------------------------------------------------------------------------; Interrupt Vectors ;------------------------------------------------------------------------------.sect ".reset" ; MSP430 RESET Vector .short RESET
Programa 9
;------------------------------------------------------------------------------; Main loop here ;------------------------------------------------------------------------------;LED1 (P1.0) bic.b #BIT0 ,& P1OUT ;bic - LED desligado bis.b #BIT0 ,& P1DIR ;LED1 como saída
Chaves:
S1pressed:
S1floating:
testeS2: S2pressed:
S2floating:
;LED2 (P4.7) bic.b #BIT7 ,& P4OUT bis.b #BIT7 ,& P4DIR
;bic - LED desligado ;LED2 como segunda saída
;Chave S1 (P2.1) bic.b #BIT1, &P2DIR bis.b #BIT1, &P2REN bis.b #BIT1, &P2OUT
;habilita a chave como entrada ;habilita o resistor ;resistor de pull up
;Chave S2 (P1.1) bic.b #BIT1, &P1DIR bis.b #BIT1, &P1REN bis.b #BIT1, &P1OUT
;habilita a chave como entrada ;habilita o resistor ;resistor de pull up
;mov #0h,#0h bit.b #BIT1 ,&P2IN jnz S1floating
;testa a chave S1 (bit test) ;verifica o estado do botão S1
;mov #0h,#0h bis.b #BIT0 ,& P1OUT jmp testeS2
;Botão S1 pressionado ;liga o LED ;testa o botão S2
;mov #0h,#0h bic.b #BIT0 ,& P1OUT
;caso S1 não esteja pressionado ;desliga o LED2
nop
nop
nop
bit.b #BIT1 ,&P1IN jnz S2floating nop ;mov #0h,#0h bis.b #BIT7 ,& P4OUT jmp Chaves nop ;mov #0h,#0h bic.b #BIT7 ,& P4OUT jmp Chaves
;testa a chave S2 ;verifica o estado ;Botão S1 pressionado ;liga o LED1 ;volta para o loop ;botão S2 não pressionado ;desliga o LED2 ;volta para o loop
Programa 10 ;------------------------------------------------------------------------------; Main loop here
;------------------------------------------------------------------------------;atribui os valores de atraso e define os bits de cada LED/chave DELAYLENGTH .equ 5000 LED1 .equ BIT0 LED2 .equ BIT7 S2 .equ BIT1 ;LED1 (P1.0) bic.b #LED1 ,& P1OUT bis.b #LED1 ,& P1DIR
;led desligado ;configura o LED como saída
;LED2 (P4.7) bic.b #LED2 ,& P4OUT bis.b #LED2 ,& P4DIR
;led desligado ;configura o LED como saída
;chave S2 (P1.1) bic.b #BIT1, &P1DIR bis.b #BIT1, &P1REN bis.b #BIT1, &P1OUT
;define a chave como entrada (0) ;habilita o resistor ;resistor de pull up
zero: call #debounceFA pressionado (checa o estado anterior) bic.b #LED1, &P1OUT bic.b #LED2, &P4OUT call #debounceAF pular para o outro estado
;espera o botaão deixar de ser
one: call #debounceFA pressionado (checa o estado anterior) bic.b #LED1, &P1OUT bis.b #LED2, &P4OUT call #debounceAF pular para o outro estado
;espera o botão deixar de ser
two: call #debounceFA pressionado (checa o estado anterior) bis.b #LED1, &P1OUT bic.b #LED2, &P4OUT call #debounceAF pular para o outro estado
;espera o botão deixar de ser
three: call #debounceFA pressionado (checa o estado anterior) bis.b #LED1, &P1OUT bis.b #LED2, &P4OUT call #debounceAF pular para o outro estado jmp zero
;espera o botão deixar de ser
debounceAF:
bit.b #BIT1, &P1IN jnz debounceAF call #delay bit.b #BIT1, &P1IN
;desliga os dois LEDs ;espera o botão ser pressionado para
;LED1 desligado, LED2 ligado ;espera o botão ser pressionado para
;LED1 ligado, LED 2 desligado ;espera o botão ser pressionado para
;liga os dois LEDs ;espera o botão ser pressionado para
;verifica o botão ;repete até que ele seja pressionado ;chama a subrotina de atraso ;se o botão estiver pressionado, continua a
execução jnz
debounceAF
;se não estiver, fica travado nessa
label ret ;mov @SP+,PC debounceFA:
bit.b #BIT1, &P1IN
;verifica o botão
jz
debounceFA
;repete até que ele deixe de ser
pressionado call #delay bit.b #BIT1, &P1IN continuamos a execução jz debounceFA travado nessa label ret ;mov @SP+,PC
delay: loop:
push R4 mov #0, R4 inc R4 ;add #1,dst cmp jnz
#DELAYLENGTH, R4 loop
;chama a subrotina de atraso ;se o botão deixar de ser pressionado, ;caso ainda esteja pressionado, fica
;limpa
;incrementa R4 ;pelo tempo do atraso ;enquanto não for zero,
continua no loop pop R4 ;mov @SP+,dst ;retorna o valor ret ;mov @SP+,PC
Programa 11 ;------------------------------------------------------------------------------; Main loop here ;------------------------------------------------------------------------------;define os valores, endereços de memória e os BITs para os LEDs DELAYDECKICK .equ 5000 DELAYPISCA .equ 60000 CONT1 .equ 0x2400 CONT2 .equ 0x2402 LED1 .equ BIT0 LED2 .equ BIT7
;LED1 (P1.0) bic.b #BIT0 ,& P1OUT bis.b #BIT0 ,& P1DIR
;LED1 desligado ;configura como saída
;LED2 (P4.7) bic.b #BIT7 ,& P4OUT bis.b #BIT7 ,& P4DIR
;LED2 desligado ;configura como saída
;Chave S1 (P2.1) bic.b #BIT1, &P2DIR bis.b #BIT1, &P2REN bis.b #BIT1, &P2OUT
;chave S1 como entrada ;habilita o resistor ;pull up
;Chave S2 (P1.1) bic.b #BIT1, &P1DIR bis.b #BIT1, &P1REN bis.b #BIT1, &P1OUT
;chave S2 como entrada ;habilita o resistor ;pull up
clr ;mov
R5 0,dst
wait4either: bit.b #BIT1, &P2IN
;verifica se o botão 1 foi pressionado
jz
decideS1S2
;se S1 ou S2 foram pressionados, troca de
rotina bit.b #BIT1, &P1IN jnz wait4either jmp decideS1S2
;verifica se o botão 1 foi pressinado ;caso nenhum tenha sido, contina nesse loop ;se S1 ou S2 foram pressionados, troca de
rotina
decideS1S2: bit.b ele ou S2 também jz bit.b jz
#BIT1, &P2IN
;se S1 foi pressionado, verificar se foi somente
S1orBoth #BIT1, &P1IN S2
;se S2 foi pressionado, pula para a rotina de S2
S1orBoth:
bit.b #BIT1, &P1IN jz S1S2
;Checa sem ambos foram pressionados
S1:
xor.b #LED1 ,&P1OUT xor.b #BIT0, R5 bit.b #BIT1, &P1IN
;toggle do LED ;toggle BIT0 no R5 ;checa o outro botão e se ele foi pressionado, vai
jz bit.b jz call bit.b
;S1S2 e ambos os LEDs são ligados ;checa o botão
S1loop: para
S1S2 #BIT1, &P2IN S1loop #dlayDekick #BIT1, &P2IN
;Esperamos o rebote da chave ;Se o botão deixar de ser pressionado, continuamos
no programa jz S1loop ultimo estado), continuamos travados jmp wait4either
;Caso o botão ainda esteja pressionado (do
S2: S2loop:
S1S2:
xor.b xor.b bit.b jz bit.b jz call bit.b jz jmp
#LED2, &P4OUT #BIT1, R5 #BIT1, &P2IN S1S2 #BIT1, &P1IN S2loop #dlayDekick #BIT1, &P1IN S2loop wait4either
;análogo a S1
bic.b bis.b call bic.b bis.b call
#LED1, &P1OUT #LED2, &P4OUT #dlayPisca #LED2, &P4OUT #LED1, &P1OUT #dlayPisca
;acende o LED2/apaga o LED1 ;rotina que define a oscilação ;acende o LED1/apaga o LED2
bit.b #BIT1, &P2IN jnz voltaState os LEDs no estado anterior bit.b #BIT1, &P1IN jz S1S2 continuam a piscar jmp voltaState os LEDs no estado anterior
;verifica S1 ;se for solta, vai para a rotina que deixa
voltaState:
rra.b jc bic.b bic.b
;estado do LED1 vai para o carry ;C = 1,ligar o LED1 ;C = 0, desligar o LED1 ;coloca esse estado em R5
teste2:
rra.b R5
R5 LigaLed1 #LED1, &P1OUT #BIT1, R5
;verifica S1 ;se ambas estão pressionadas, os LEDs ;se for solta, vai para a rotina que deixa
;análogo ao voltaState
continue:
jc LigaLed2 bic.b #LED2, &P4OUT bic.b #BIT1, R5 nop ;mov #0h,#0h jmp wait4either
LigaLed1: bis.b estados no R5 bis.b jmp LigaLed2: bis.b bis.b jmp
#LED1, &P1OUT #BIT1, R5 teste2 #LED2, &P4OUT #BIT1, R5 continue
dlayDekick: push R4 mov #0, R4 loop1: inc R4 ;add #1,dst cmp #DELAYDECKICK, R4 jnz loop1 pop R4 ;mov @SP+,dst ret ;mov @SP+,PC dlayPisca: loop2: loop3:
mov mov dec jnz dec ;sub jnz ret ;mov
;rotinas para ligar os LEDs e salvar os
#2, &CONT1 #DELAYPISCA, &CONT2 &CONT2 ;sub #1,dst loop3 &CONT1 #1,dst loop2
;rotina para debouncing da chave
;rotina que pisca os LEDs
@SP+,PC
Questão 2 Verificar códigos acima.
Questão 3 dlayDekick: push mov loop1: inc cmp jnz pop ret
R4 ;salva o estado no registrador #0, R4 R4 #DELAYDECKICK, R4 loop1 R4 ;retorna este estado
Nessa rotina, o estado da chave é alocado em R4, e é “limpo” com a segunda linha. Posteriormente, é realizado o incremento e comparado com o atraso definido para o rebote. Enquanto ele não tiver o mesmo valor, é executado o loop. Quando atingir o valor de DELAYDECKICK, o estado é mostrado.
Questão 4 O atraso que deve ser considerado, assim como a necessidade de processamento para mais um registrador.
Questão 5 As duas diretivas definem uma constante a um símbolo. Logo, não há diferença e podem ser usadas sem distinção.
View more...
Comments