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