Vous êtes sur la page 1sur 7

Tas Laurindo Pereira

12/0042223

Relatrio 3 LEDs e Chaves

Questo 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 (mximo)


;-------------------------------------------------------------------------------
; 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 sada
call #T500ms ;chama a subrotina

T500ms: xor.b #0x01,&P1OUT ; alterna o LED (on/off) - toggle


mov.w #DELAY,R15 ; define o tempo on/off

delayloop: sub.w #1,R15 ; decrementa o registrador


jnz delayloop ; repete a operao enquanto no 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 operao enquanto no 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 sada

;LED2 (P4.7)
bic.b #BIT7 ,& P4OUT ;bic - LED desligado
bis.b #BIT7 ,& P4DIR ;LED2 como segunda sada

;Chave S1 (P2.1)
bic.b #BIT1, &P2DIR ;habilita a chave como entrada
bis.b #BIT1, &P2REN ;habilita o resistor
bis.b #BIT1, &P2OUT ;resistor de pull up

;Chave S2 (P1.1)
bic.b #BIT1, &P1DIR ;habilita a chave como entrada
bis.b #BIT1, &P1REN ;habilita o resistor
bis.b #BIT1, &P1OUT ;resistor de pull up

Chaves: nop
;mov #0h,#0h
bit.b #BIT1 ,&P2IN ;testa a chave S1 (bit test)
jnz S1floating ;verifica o estado do boto S1
S1pressed: nop
;mov #0h,#0h ;Boto S1 pressionado
bis.b #BIT0 ,& P1OUT ;liga o LED
jmp testeS2 ;testa o boto S2
S1floating: nop
;mov #0h,#0h ;caso S1 no esteja pressionado
bic.b #BIT0 ,& P1OUT ;desliga o LED2

testeS2: bit.b #BIT1 ,&P1IN ;testa a chave S2


jnz S2floating ;verifica o estado
S2pressed: nop
;mov #0h,#0h ;Boto S1 pressionado
bis.b #BIT7 ,& P4OUT ;liga o LED1
jmp Chaves ;volta para o loop
S2floating: nop
;mov #0h,#0h ;boto S2 no pressionado
bic.b #BIT7 ,& P4OUT ;desliga o LED2
jmp Chaves ;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 ;led desligado
bis.b #LED1 ,& P1DIR ;configura o LED como sada

;LED2 (P4.7)
bic.b #LED2 ,& P4OUT ;led desligado
bis.b #LED2 ,& P4DIR ;configura o LED como sada

;chave S2 (P1.1)
bic.b #BIT1, &P1DIR ;define a chave como entrada (0)
bis.b #BIT1, &P1REN ;habilita o resistor
bis.b #BIT1, &P1OUT ;resistor de pull up

zero: call #debounceFA ;espera o botao deixar de ser


pressionado (checa o estado anterior)
bic.b #LED1, &P1OUT ;desliga os dois LEDs
bic.b #LED2, &P4OUT
call #debounceAF ;espera o boto ser pressionado para
pular para o outro estado

one: call #debounceFA ;espera o boto deixar de ser


pressionado (checa o estado anterior)
bic.b #LED1, &P1OUT ;LED1 desligado, LED2 ligado
bis.b #LED2, &P4OUT
call #debounceAF ;espera o boto ser pressionado para
pular para o outro estado

two: call #debounceFA ;espera o boto deixar de ser


pressionado (checa o estado anterior)
bis.b #LED1, &P1OUT ;LED1 ligado, LED 2 desligado
bic.b #LED2, &P4OUT
call #debounceAF ;espera o boto ser pressionado para
pular para o outro estado

three: call #debounceFA ;espera o boto deixar de ser


pressionado (checa o estado anterior)
bis.b #LED1, &P1OUT ;liga os dois LEDs
bis.b #LED2, &P4OUT
call #debounceAF ;espera o boto ser pressionado para
pular para o outro estado
jmp zero

debounceAF: bit.b #BIT1, &P1IN ;verifica o boto


jnz debounceAF ;repete at que ele seja pressionado
call #delay ;chama a subrotina de atraso
bit.b #BIT1, &P1IN ;se o boto estiver pressionado, continua a
execuo
jnz debounceAF ;se no estiver, fica travado nessa
label
ret
;mov @SP+,PC

debounceFA: bit.b #BIT1, &P1IN ;verifica o boto


jz debounceFA ;repete at que ele deixe de ser
pressionado
call #delay ;chama a subrotina de atraso
bit.b #BIT1, &P1IN ;se o boto deixar de ser pressionado,
continuamos a execuo
jz debounceFA ;caso ainda esteja pressionado, fica
travado nessa label
ret
;mov @SP+,PC

delay: push R4
mov #0, R4 ;limpa
loop: inc R4
;add #1,dst
;incrementa R4
cmp #DELAYLENGTH, R4 ;pelo tempo do atraso
jnz loop ;enquanto no 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, endereos de memria 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 ;LED1 desligado
bis.b #BIT0 ,& P1DIR ;configura como sada

;LED2 (P4.7)
bic.b #BIT7 ,& P4OUT ;LED2 desligado
bis.b #BIT7 ,& P4DIR ;configura como sada

;Chave S1 (P2.1)
bic.b #BIT1, &P2DIR ;chave S1 como entrada
bis.b #BIT1, &P2REN ;habilita o resistor
bis.b #BIT1, &P2OUT ;pull up

;Chave S2 (P1.1)
bic.b #BIT1, &P1DIR ;chave S2 como entrada
bis.b #BIT1, &P1REN ;habilita o resistor
bis.b #BIT1, &P1OUT ;pull up

clr R5
;mov 0,dst

wait4either: bit.b #BIT1, &P2IN ;verifica se o boto 1 foi pressionado


jz decideS1S2 ;se S1 ou S2 foram pressionados, troca de
rotina
bit.b #BIT1, &P1IN ;verifica se o boto 1 foi pressinado
jnz wait4either ;caso nenhum tenha sido, contina nesse loop
jmp decideS1S2 ;se S1 ou S2 foram pressionados, troca de
rotina

decideS1S2: bit.b #BIT1, &P2IN ;se S1 foi pressionado, verificar se foi somente
ele ou S2 tambm
jz S1orBoth
bit.b #BIT1, &P1IN ;se S2 foi pressionado, pula para a rotina de S2
jz S2

S1orBoth: bit.b #BIT1, &P1IN ;Checa sem ambos foram pressionados


jz S1S2

S1: xor.b #LED1 ,&P1OUT ;toggle do LED


xor.b #BIT0, R5 ;toggle BIT0 no R5
S1loop: bit.b #BIT1, &P1IN ;checa o outro boto e se ele foi pressionado, vai
para
jz S1S2 ;S1S2 e ambos os LEDs so ligados
bit.b #BIT1, &P2IN ;checa o boto
jz S1loop
call #dlayDekick ;Esperamos o rebote da chave
bit.b #BIT1, &P2IN ;Se o boto deixar de ser pressionado, continuamos
no programa
jz S1loop ;Caso o boto ainda esteja pressionado (do
ultimo estado), continuamos travados
jmp wait4either

S2: xor.b #LED2, &P4OUT ;anlogo a S1


xor.b #BIT1, R5
S2loop: bit.b #BIT1, &P2IN
jz S1S2
bit.b #BIT1, &P1IN
jz S2loop
call #dlayDekick
bit.b #BIT1, &P1IN
jz S2loop
jmp wait4either

S1S2: bic.b #LED1, &P1OUT ;acende o LED2/apaga o LED1


bis.b #LED2, &P4OUT
call #dlayPisca ;rotina que define a oscilao
bic.b #LED2, &P4OUT ;acende o LED1/apaga o LED2
bis.b #LED1, &P1OUT
call #dlayPisca

bit.b #BIT1, &P2IN ;verifica S1


jnz voltaState ;se for solta, vai para a rotina que deixa
os LEDs no estado anterior
bit.b #BIT1, &P1IN ;verifica S1
jz S1S2 ;se ambas esto pressionadas, os LEDs
continuam a piscar
jmp voltaState ;se for solta, vai para a rotina que deixa
os LEDs no estado anterior

voltaState: rra.b R5 ;estado do LED1 vai para o carry


jc LigaLed1 ;C = 1,ligar o LED1
bic.b #LED1, &P1OUT ;C = 0, desligar o LED1
bic.b #BIT1, R5 ;coloca esse estado em R5

teste2: rra.b R5 ;anlogo ao voltaState


jc LigaLed2
bic.b #LED2, &P4OUT
bic.b #BIT1, R5
continue: nop
;mov #0h,#0h
jmp wait4either

LigaLed1: bis.b #LED1, &P1OUT ;rotinas para ligar os LEDs e salvar os


estados no R5
bis.b #BIT1, R5
jmp teste2
LigaLed2: bis.b #LED2, &P4OUT
bis.b #BIT1, R5
jmp continue

dlayDekick: push R4 ;rotina para debouncing da chave


mov #0, R4
loop1: inc R4
;add #1,dst
cmp #DELAYDECKICK, R4
jnz loop1
pop R4
;mov @SP+,dst
ret
;mov @SP+,PC

dlayPisca: mov #2, &CONT1 ;rotina que pisca os LEDs


loop2: mov #DELAYPISCA, &CONT2
loop3: dec &CONT2
;sub #1,dst
jnz loop3
dec &CONT1
;sub #1,dst
jnz loop2
ret
;mov @SP+,PC

Questo 2
Verificar cdigos acima.

Questo 3
dlayDekick: push R4 ;salva o estado no registrador
mov #0, R4
loop1: inc R4
cmp #DELAYDECKICK, R4
jnz loop1
pop R4 ;retorna este estado
ret

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 no tiver o mesmo
valor, executado o loop. Quando atingir o valor de DELAYDECKICK, o estado mostrado.
Questo 4
O atraso que deve ser considerado, assim como a necessidade de processamento para mais um registrador.

Questo 5
As duas diretivas definem uma constante a um smbolo. Logo, no h diferena e podem ser usadas sem
distino.

Vous aimerez peut-être aussi