Códigos em C - experimento MSP430

Share Embed Donate


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

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF