MIPS 1


Utilização do motor de passo


; R0 = MULT -> multiplicador (n de vezes que o código da interrupção não é executado)
; R1 -> registo para onde é carregado o valor 00000001 de modo a sofrer rotações à esquerda do bit (1)
;
MULT equ 30 ; n de vezes que o código da interrupção não é executado
; alterar aqui para aumentar ou reduzir o tempo que os leds estão acesos
; 30 -> 30 * 33ms = 990ms (aproximadamente 1seg)

ORG 0h ; inicialização
MOV P0, #00h ; apaga leds ligados no porto P0
JMP main
ORG 0bh ; interrupção interna (Timer)
JMP ledSLeft ; rotina a exucutar quando há interrupção
ORG 100h ; main

main: CALL Init ; inicializa

mLoop: SJMP mLoop ; ciclo principal do programa

Init: MOV R0, #MULT ; R0 * 33ms (30 * 33 = 990ms)
MOV R1, #01 ; coloca 00000001 (bin) no registo R1
MOV TH0, #80h ; 256 - 128 = 128 ciclos
MOV TL0, #00h ; timer 0 demora 33ms entre interrupções
MOV TMOD, #01 ; TMOD = 1 (16 bits)
MOV TCON, #10h ; inicia o Timer0
MOV IE, #82h ; activa todos os bits de controlo da interrupção
; activa interrupções do timer 0

MOV P0, R1 ; coloca o valor de R1 no porto P0
RET

ledSLeft: ; rotina de serviço à interrupção
DEC R0 ; decrementa a variàvel
MOV A, R0 ; move R0 para o acomulador
JNZ ledSLeftExit ; compara a variável com 0(zero), se diferente continua na label indicada
MOV R0, #MULT ; R0 * 33ms (30 * 33 = 990ms)
MOV A, R1 ; coloca o valor de R1 no acomulador
RL A ; Roda à esquerda os bits do acomulador
MOV R1, A ; coloca de volta o valor alterado em R1
MOV P0, A ; coloca o conteúdo do acomulador no porto p0

ledSLeftExit: ; reinicia o contador do timer
MOV TH0, #80h ; 256 - 128 = 128 ciclos
MOV TL0, #00h ; timer 0 demora 33ms entre interrupções
RETI ; return da interrupção
END

0 comentários:

Enviar um comentário