Mostrar mensagens com a etiqueta Mips. Mostrar todas as mensagens
Mostrar mensagens com a etiqueta Mips. Mostrar todas as mensagens

MIPS - Segundos


MIPS - Seconds


org 0h ;power-on reset

JMP Main

org 0bh ;timer 0 interrupt

JMP TC0int


org 100h ;mainline code

main:


SETB P3.0

MOV R1, #00h

MOV R3, #00h
MOV DPTR, #TABLE

LOOP: MOV A,R1
MOVC A, @A+DPTR
MOV R3,A
CJNE R3, #0 ,NEXT
JMP final
NEXT:
MOV P1,A
INC R1

CALL Init ;initialize RTC
CALL TC0int
CJNE R1, #8, LOOP
jmp final



org 0020h
TABLE: DB 11111110b
DB 11111101b
DB 11111011b
DB 11110111b
DB 11101111b
DB 11011111b
DB 10111111b
DB 01111111b
DB 00000000b

;;;;;;;




;R0 acts as a decrementing variable counter
;TH0 and TL0 are the counter generating an interrupt when it
;reaches 0000h

Init: MOV R0, #20h ;this gives R0 * 33ms delay = 1sec

MOV R2, #00h

MOV TH0, #80h

MOV TL0, #00h ;timer 0 gives 33msecs between
; interrupts

MOV TMOD, #01 ;C/T=0, mode 1 (16bit counter)

MOV TCON, #10h ;start timer 0 running

MOV IE, #82h ;enable all interrupt control bit

;enable interrupt for timer 0
RET

;Timer Counter Zero Interrupt Service Routine

TC0int:
DEC R0 ;decrement counter variable

MOV B, R0 ;move into accumulator

JNZ TC0Exit ;if not zero then return from interrupt

MOV R0, #20h ;re-load initial values in R0

INC R2 ;seconds = seconds + 1

MOV B, R2 ;get seconds variable

;SUBB B, #60 ;if seconds >= 60

;JNZ TC0Exit
ret


TC0Exit:
MOV TH0, #80h

MOV TL0, #00h

CLR TF0

RET

final:
End



Read More... MIPS - Segundos

MIPS 3 - Calculator


MIPS - Calculator


org 0000h
JMP main ;Salta para a Label Main
org 0003h
JMP icalc ;Salta para a Label icalc

org 0030h
main: SETB EX0; ; pomos 1 no EX0 (External Interrupt)
SETB IT0; ; pomos 1 no IT0 (Internal Interrupt)
SETB EA; ;Re-habilita as Interrupções

CLR P3; ;Limpa o porto P3, metendo-o a zeros
SETB ie0 ; pomos o bit IE0 a 1;

loop: Mov A, P1 ;Movemos o valor de P1, para o acumulador (A)
JMP loop; ;Vamos para o procedimento loop


org 0100h
icalc: MOV A, P1 ; Movemos o valor do porto 1 (P1) para o acumulador (A)
SWAP A ;Troca os nibbles do acumulador (A) (equivale a 4 instruções RL A, ou seja, para efectuarmos a troca da parte baixa pela alta)
ANL A, #00001111b ;Efectuamos um AND ao acumulador (A), serve para filtrar a parte baixa do acumulador (R1)
MOV R1, A ;Movemos o valor do Acumulador (A), para o registo 1 (R1)
MOV A,P1 ;Movemos o valor do porto 1 (P1) para o acumulador (A)
ANL A, #00001111b ;Efectuamos um AND ao acumulador (A), serve para filtrar a parte baixa do acumulador (R1)
MOV R2,A ;Move o valor do acumulador (A) para o registo 2 (R2)
MOV a,P2 ;Move o valor do porto 2 (P2) para o acumulador (A)
ANL A, #00000011b ;Efectuamos um AND ao acumulador (A) para filtrar os 2 primeiros bits
CJNE A,#00h,Soma ;Compara e salta se o acumulador (A), não for igual com #00H e salta para Soma
MOV A,R2 ;Move o valor do registo 2 (R2) para o acumulador (A)
MOV B,r1 ;Move o valor do registo 1 (R1) para o registo b (B)
MUL AB ;Multiplica o valor de A com B;
JMP Resultado ;Salta para a Label Resultado

Soma: CJNE A,#01h,Subtracao ;Compara e salta se o acumulador (A), não for igual com #01H e salta para Subtracao
MOV A,R2 ;Move o valor do registo 2 (R2), para o acumulador (A)
ADD A,R1 ;Adiciona o valor do registo 1 (R1)com o valor do acumulador (A)
JMP Resultado ;Salta para a label Result

Subtracao: CJNE A,#02h,Divisao ;Compara e salta se o acumulador (A), não for igual com #02H e salta para Divisao
MOV A,R1 ;Move o valor do registo 1 (R1), para o acumulador (A)
SUBB A,R2 ;Subtrai o valor do registo 1 (R1) com o valor do acumulador (A)
JMP Resultado ;Salta para a label Resultado

Divisao CJNE A,#03h,Resultado ;Compara e salta se o acumulador(A), não for igual com#03h e salta para o resultado
MOV A,R1 ;Move o valor do registo 1 (R1) para o acumulador (A)
MOV B,R2 ;Move o valor do registo 2 (R2) para o acumulador (B)
DIV AB ;Divide o valor de A com B

Resultado: ADD A,#00h ; Somamos para activar a operação decimal
DA A ;Efectua o Decimal Adjustment de A
MOV P3, A ;Move o valor do acumulador (A) para o porto 3
RETI ;Retorno de sub-rotina de interrupção, ou seja, retorna ao local onde a interrupção foi chamada

Read More... MIPS 3 - Calculator

MIPS 2


Rodar motor passo no sentido do relogio


;
org 0h ;power-on reset
JMP Main
org 0bh ;timer 0 interrupt
JMP TC0int
org 100h ;mainline code

main:
MOV R3, #00h
CALL Init ;initialize RTC

lp1:
sjmp lp1 ;mainline task

;R0 acts as a decrementing variable counter
;TH0 and TL0 are the counter generating an interrupt when it
;reaches 0000h

Init:
MOV R0, #20h ;this gives R0 * 33ms delay = 1sec
MOV R2, #00h
MOV TH0, #80h
MOV TL0, #00h ;timer 0 gives 33mR2 between interrupts

MOV TMOD, #01 ;C/T=0, mode 1 (16bit counter)
MOV TCON, #10h ;start timer 0 running
MOV IE, #82h ;enable all interrupt control bit
;enable interrupt for timer 0
RET

TC0int:
;Timer Counter Zero Interrupt Service Routine
DEC R0 ;decrement counter variable
MOV A, R0 ;move into accumulator
JNZ TC0Exit ;if not zero then return from interrupt
MOV R0, #20h ;re-load initial values in R0

MOV DPTR, #Data
MOV A, R3
MOVC A, @A+DPTR
MOV P1, A
INC R3
CJNE r3,#04h,NEXT
MOV r3,#00h

NEXT:
TC0Exit:
MOV TH0, #80h
MOV TL0, #00h
CLR TF0
RETI

org 0020h
Data: DB 00001000b
DB 00000100b
DB 00000010b
DB 00000001b

Read More... MIPS 2

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

Read More... MIPS 1