Pesquisar neste blog

17/10/2021

Soma, subtração, divisão e multiplicação com MIPS Assembly

.data
#soma
num1: .asciiz "Digite o primeiro numero: "
num2: .asciiz "Digite o segundo numero: "
Resultado: .asciiz "Soma = "

#subtração
n1: .asciiz "\n\nDigite o 1° num: "
n2: .asciiz "Digite o 2° num: "
result: .asciiz "Subração = "

#divisão
x1: .asciiz "\n\nDigite o 1° número: "
x2: .asciiz "Digite o 2° número: "
Rdiv: .asciiz "Divisão = "

#multiplicação
k1: .asciiz "\n\nDigite o 1° número: "
k2: .asciiz "Digite o 2° número: "
Mult: .asciiz "Multiplicação = "
.text
li $v0, 4
la $a0, num1
syscall

li $v0, 5
syscall
move $t0, $v0

li $v0, 4
la $a0, num2
syscall

li $v0, 5
syscall
move $t1, $v0

#tendo os dois valores 
add $t2, $t0, $t1
li $v0, 4
la $a0, Resultado
syscall

li $v0, 1
move $a0, $t2
syscall

#subtração
li $v0, 4
la $a0, n1
syscall

li $v0, 5
syscall

move $t0, $v0 #move para o registrador

li $v0, 4
la $a0, n2
syscall

li $v0, 5
syscall

move $t1, $v0

sub $t2, $t0, $t1

li $v0, 4
la $a0, result
syscall

li $v0, 1
move $a0, $t2
syscall

#bloco da divisão
li $v0, 4
la $a0, x1
syscall

li $v0, 5
syscall

move $t0, $v0

li $v0, 4
la $a0, x2
syscall

li $v0, 5
syscall

move $t1, $v0
div $t0, $t1

mflo $s3 #pega o valor menor
li $v0, 4
la $a0, Rdiv
syscall

li $v0, 1
move $a0, $s3
syscall

#multiplicação
li $v0, 4
la $a0, k1
syscall

li $v0, 5
syscall

move $t0, $v0

li $v0, 4
la $a0, k2
syscall

li $v0, 5
syscall

move $t1, $v0

mult $t0, $t1

mflo $s3

li $v0, 4
la $a0, Mult
syscall

li $v0, 1
move $a0, $s3
syscall

Saída gerada




Loop de repetição com Mips MARS - Assembly

CÓDIGO FEITO NO MARS4

.data
pergunta: .asciiz "Digite a sua idade: "
msg1: .asciiz "Você é menor de idade\n"
msg2: .asciiz "Você é maior de idade\n"
.text
.globl prog #aponta para o programa principal

prog: # função principal
li $v0, 4 # imprimir uma string
la $a0, pergunta # a0 = pergunta
syscall # Executar
li $v0, 5 # Faz a leitura de um número inteiro
syscall # Executa
move $t1, $v0 # t1 = v0
beq $t1, $0, sair # Desvia para o bloco sair
blt $t1, 18, menor # Desvia para o bloco menor
bge $t1, 18, maior # Devia para o bloco maior
j prog # DESVIA PARA O BLOCO PROG

menor: 
li $v0, 4 # Imprimi uma string
la $a0, msg1 # a0 = msg1
syscall
j prog #DESVIA PARA O jprog

maior:
li $v0, 4 # IMPRIMI UMA STRING
la $a0, msg2 # a0 = msg2
syscall
j prog # DESVIA PARA O BLOCO PROG

sair:
li $v0, 10 # FINALIZAR
syscall # EXECUTAR

Saída gerada



15/10/2021

Motor de passo no PicSimlab

CÓDIGO FEITO NO CCS C Compiler

#include <16F877A.h>
#device adc=8
#FUSES NOWDT //No Watch Dog Timer
#FUSES HS //High speed Osc (> 4mhz for PCM/PCH) (>10mhz for PCD)
#FUSES PUT //Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#FUSES NODEBUG //No Debug mode for ICD
#FUSES BROWNOUT //Reset when brownout detected
#FUSES NOLVP //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#use delay(clock=20000000)
unsigned int8 posicao[4] = {3, 6, 12, 9}; // {1, 2, 4, 8};
 //3=0011 6=0110 12=1100 9=1001
signed int8 passo=0;
int1 dar_passo=0;
signed int8 sentido=-1;
unsigned int8 ref_passo=10,contador=0;
unsigned int16 ref_mcc=127;
//================== MOTOR PASSO =================================//
#int_RTCC

void RTCC_isr(void)
{
 if(++contador > ref_passo){
 passo = passo + sentido;
 if(passo>3)passo=0;
 if(passo<0)passo=3;
 OUTPUT_D(posicao[passo]);
 contador = 0;
 }
}
#int_TIMER1
void TIMER1_isr(void)
{
 //== Motor CC ======//
 set_adc_channel(0);
 delay_us( 50 );
 ref_mcc = read_adc();
 if(ref_mcc<1) ref_mcc =1;
 if(ref_mcc>254) ref_mcc =254;
 set_pwm1_duty(4*ref_mcc);

 //== Motor Passo ======//
 set_adc_channel(1);
 delay_us( 50 );
 ref_passo = read_adc();
 if(ref_passo<1) ref_passo =1;
 
 if(ref_passo>254) ref_passo =254;
}
//================== Interrupção externa B0 =====================//
#int_EXT
void EXT_isr(void)
{
sentido *= (-1);
}
//================== SERVOMOTOR =================================//
void Rotation0() //0 Degree
 {
 unsigned int i;
 for(i=0;i<50;i++)
 {
 output_high(PIN_C7);
 delay_us(800); // pulse of 800us
 output_low(PIN_C7);
 delay_us(19200);
 }
 }
void Rotation45() //0 Degree
{
 unsigned int i;
 for(i=0;i<50;i++)
 {
 output_high(PIN_C7);
 delay_us(1150); // pulse of 800us // 1400 - 180o
 output_low(PIN_C7); // x 45o
 delay_us(18850);
 }
 }
void Rotation90() //90 Degree
 {
 unsigned int i;
 for(i=0;i<50;i++)
 { // 180o 0o
 output_high(PIN_C7); // 2200 - 800 = 1400 90o = 700
 delay_us(1500); // pulse of 1500us
 output_low(PIN_C7);
 delay_us(18500);
 }
 }
void Rotation180() //180 Degree
 {
unsigned int i;
 for(i=0;i<50;i++)
 {
 output_high(PIN_C7);
 delay_us(2200); // pulse of 2200us
 output_low(PIN_C7);
 delay_us(17800);
 }
 }
 
 void main()
{
 setup_adc_ports(AN0_AN1_AN2_AN3_AN4);
 setup_adc(ADC_CLOCK_DIV_16);

 setup_psp(PSP_DISABLED);
 setup_spi(SPI_SS_DISABLED);
 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 setup_timer_1(T1_INTERNAL|T1_DIV_BY_8);
 setup_timer_2(T2_DIV_BY_16,255,1);
 setup_ccp1(CCP_PWM);
 set_pwm1_duty(512);

 setup_comparator(NC_NC_NC_NC);
 setup_vref(FALSE);
 enable_interrupts(INT_EXT);
 ext_int_edge( L_TO_H );

 enable_interrupts(INT_RTCC);
 enable_interrupts(INT_TIMER1);
 enable_interrupts(GLOBAL);
 set_adc_channel(1);
 delay_us( 50 );


 while(true){
 Rotation0(); // 0 graus
 delay_ms(4000);
 Rotation90(); // 90 graus
 delay_ms(4000);
 Rotation180(); // 180 graus
 delay_ms(4000);
 Rotation45(); // 45 graus
 delay_ms(6000);
 }
}