Pesquisar neste blog

15/12/2021

Catraca eletrônica no PicSimLab

Trabalho 1 – Unidade II 2021/1 - MICROCONTROLADORES: construir uma fechadura eletrônica com o PICSimLab e programa de gerenciamento.

Descrição do funcionamento. 

O Usuário: Ao digitar uma senha correta de quatro dígitos os sistema apresentará uma mensagem de boas-vindas no LCD, ligará um LED e aciona um Relé simulando a abertura da catraca ou porta. Se a senha não for uma senha cadastrada o sistema apresenta uma mensagem informando para o usuário procurar a secretaria para resolver a pendência, acende outro LED e não aciona o relé. O 

Administrador: Ao digitar a senha de administrador o sistema apresenta um menu no LCD para que o mesmo possa dar manutenção no sistema. A manutenção consiste de poder incluir, deletar e buscar um cadastro de usuário. Também deve ser possível enviar e receber e receber para um programa, o banco com todos os cadastros de usuários. No programa deve ser possível fazer a manutenção do banco. Recomenda-se usar o “banco de dados” SqLite. Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores

Obs:. sistema é totalmente controlado pelo microcontrolador 16F877A e desenvolvido para o PicSimLab. A senha é armazenada no EPROM, 24C04, presente na placa. Segue o Link de um projeto desenvolvido por alunos de turmas anteriores
























O Vídeo do projeto: https://youtu.be/s_2AreNMFAM


Resolução:


Clique aqui para fazer o download do projeto

Créditos para: Afonso e Daniel

13/12/2021

Controlador PID de Temperatura — PICSimLab

Trabalho 3 – Unidade II 2021/2 - MICROCONTROLADORES : construir um sistema de controle de temperatura em malha fechada com o módulo de temperatura do PICSimLab.
Descrição do funcionamento. O sinal de entrada deve ser ajustado no PICSimLab no potenciômetro P1. O PIC recebe o sinal de entrada e a temperatura via AD, calcula o erro entre o valor da temperatura de referência (entrada) e a saída da planta (temperatura lida pelo sensor na planta – LM35), processa com modelo do controlador e gera um sinal de controle (ton do PWM) que deve ser aplicado no atuador(resistor). Um sinal de distúrbio também poderá ser aplicado a planta via potenciômetro P2. Os sinais de entrada, saída, distúrbio, controle (ton) e o erro devem ser enviado ao Processing (ou outra interface desenvolvido pelo aluno) onde são apresentado na forma de gráficos de linha:


















Funções
    1. O operador
Poderá modificar o sinal de referência ou temperatura desejada via potenciômetro P1.
Poderá inserir um distúrbio no sistema através do mini ventilador (cooler). Esse distúrbio também deve ter a intensidade controlada via potenciômetro P2.
Características gerais

1. O conversor AD deve ser configurado em 10bits para aumentar a precisão.
2. Devem ser utilizados PWM para acionamento do resistor (atuador) e do cooler (distúrbio).
3. Deve ser utilizado o LM32 (sensor de temperatura) da placa para obter a temperatura de saída
4. Os gráficos devem ter indicações nos eixos.
5. Deve ser realizado o experimento em malha aberta para determinar os parâmetros P, I e D do controlador PID. Usar a metodologia de Ziegler-Nichols apresentada em sala de aula.
6. A comunicação entre o PICSimLab e o Processing deve ser via porta serial virtual.


Resolução:



























Clique aqui para fazer o download do projeto

Créditos para: Afonso

12/12/2021

Controle de temperatura em malha fechada

Trabalho 3 – Unidade II 2021/2 - MICROCONTROLADORES : construir um sistema de controle de temperatura em malha fechada com o módulo de temperatura do PICSimLab.
Descrição do funcionamento. O sinal de entrada deve ser ajustado no PICSimLab no potenciômetro P1. O PIC recebe o sinal de entrada e a temperatura via AD, calcula o erro entre o valor da temperatura de referência (entrada) e a saída da planta (temperatura lida pelo sensor na planta – LM35), processa com modelo do controlador e gera um sinal de controle (ton do PWM) que deve ser aplicado no atuador(resistor). Um sinal de distúrbio também poderá ser aplicado a planta via potenciômetro P2. Os sinais de entrada, saída, distúrbio, controle (ton) e o erro devem ser enviado ao Processing (ou outra interface desenvolvido pelo aluno) onde são apresentado na forma de gráficos de linha:




















Funções
    1. O operador
Poderá modificar o sinal de referência ou temperatura desejada via potenciômetro P1.
Poderá inserir um distúrbio no sistema através do mini ventilador (cooler). Esse distúrbio também deve ter a intensidade controlada via potenciômetro P2.
Características gerais

1. O conversor AD deve ser configurado em 10bits para aumentar a precisão.
2. Devem ser utilizados PWM para acionamento do resistor (atuador) e do cooler (distúrbio).
3. Deve ser utilizado o LM32 (sensor de temperatura) da placa para obter a temperatura de saída
4. Os gráficos devem ter indicações nos eixos.
5. Deve ser realizado o experimento em malha aberta para determinar os parâmetros P, I e D do controlador PID. Usar a metodologia de Ziegler-Nichols apresentada em sala de aula.
6. A comunicação entre o PICSimLab e o Processing deve ser via porta serial virtual.


Resolução:




























Clique aqui para fazer o download do arquivo completo

Créditos para: Igor

Palavras chave:

Closed loop temperature control
Temperaturkontroll med sluten slinga
Temperaturkontroll i lukket sløyfe
Kontrola temperatury w pętli zamkniętej
Kontrola temperature zatvorenog kruga
Suljetun piirin lämpötilan säätö
Регулювання температури в замкнутому циклі
בקרת טמפרטורה בלולאה סגורה

11/12/2021

Controle de Temperatura no PicSimlab


Trabalho 3 – Unidade II 2021/2 - MICROCONTROLADORES : construir um sistema de controle de temperatura em malha fechada com o módulo de temperatura do PICSimLab.
Descrição do funcionamento. O sinal de entrada deve ser ajustado no PICSimLab no potenciômetro P1. O PIC recebe o sinal de entrada e a temperatura via AD, calcula o erro entre o valor da temperatura de referência (entrada) e a saída da planta (temperatura lida pelo sensor na planta – LM35), processa com modelo do controlador e gera um sinal de controle (ton do PWM) que deve ser aplicado no atuador(resistor). Um sinal de distúrbio também poderá ser aplicado a planta via potenciômetro P2. Os sinais de entrada, saída, distúrbio, controle (ton) e o erro devem ser enviado ao Processing (ou outra interface desenvolvido pelo aluno) onde são apresentado na forma de gráficos de linha:
















Funções
    1. O operador
Poderá modificar o sinal de referência ou temperatura desejada via potenciômetro P1.
Poderá inserir um distúrbio no sistema através do mini ventilador (cooler). Esse distúrbio também deve ter a intensidade controlada via potenciômetro P2.
Características gerais

1. O conversor AD deve ser configurado em 10bits para aumentar a precisão.
2. Devem ser utilizados PWM para acionamento do resistor (atuador) e do cooler (distúrbio).
3. Deve ser utilizado o LM32 (sensor de temperatura) da placa para obter a temperatura de saída
4. Os gráficos devem ter indicações nos eixos.
5. Deve ser realizado o experimento em malha aberta para determinar os parâmetros P, I e D do controlador PID. Usar a metodologia de Ziegler-Nichols apresentada em sala de aula.
6. A comunicação entre o PICSimLab e o Processing deve ser via porta serial virtual.

Resolução:

Código feito em CCS C Compiler

Arquivo temp.c


#include <temp.h>
#include "biblioteca\mod_lcd.c"


char grau = 223;                           //  Pega o simbolo "º", grau

float temperatura_Atual = 0.0,
      temperatura_Antiga = 0.0,
      Disturbio = 0;
      
double ref,                                // Referencia desejada
       error,                              // Diferenca entre temperatura desejada e temperatura atual
       kP = 70,
       kI = 2,
       kD = 0,
       P, I, D,
       pid;
      
       
       
       
double process(){
// Implementação PID
//Proporcional
P = error * kP;
//Integrador
I = I + (error * kI);
//Derivador
D = (temperatura_Antiga - temperatura_Atual) * kD;
temperatura_Antiga = temperatura_Atual;
// Soma tudo
pid = P + I + D;

return pid;
}

void main(){

   setup_adc(ADC_CLOCK_DIV_16);                       // ADC Module uses its internal oscillator
   setup_adc_ports(AN0_AN1_AN2_AN3_AN4);              // Configuracao de portas analogicas
   
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);

   setup_timer_2(T2_DIV_BY_16,255,1);      //819 us overflow, 819 us interrupt 255+1 = 256 *4 = 1024

   setup_ccp1(CCP_PWM);                    // Configura a porta CCP1 como PWM
   setup_ccp2(CCP_PWM);                    // Configura a porta CCP2 como PWM
      
   lcd_ini();        // Inicializa LCD
   delay_ms(10);

  
   while(TRUE) {

      set_adc_channel(0);                                    // Seleciona o canal ANA0
      delay_ms(10);                                          // Tempo para ativacao
      ref = read_adc() * 0.0489 + 20;                        // Pega a leitura do ANA0
      
      set_adc_channel(2);
      delay_ms(10);
      temperatura_Atual = ((read_adc() * 5)/1023.0)/0.010;
      if (temperatura_Atual >=1) {
      
      error = ref - temperatura_Atual;

      process();

      if(pid>1023) { pid=1023; } else if (pid<=0) { pid=0; }
      if (error >0) { set_pwm2_duty((int16)pid); }
      
      else if (error <=0) { set_pwm2_duty(0); }
           
      set_adc_channel(1);
      delay_ms(10);
      disturbio = read_adc();

      SET_PWM1_DUTY((int16) disturbio);    
                                                                            // Escreve na Tela
      printf (lcd_escreve,"\fTemp= %f %cC",temperatura_Atual, grau);        // Temperatura
      printf (lcd_escreve,"\n\rRef= %f %cC",ref, grau);                     // Referencia
      delay_ms(1000);
      
      
      }
   } // While

} // Main

_______________________//___________________

Arquivo mod_lcd.c

// As defininições es a seguir s�o utilizadas para acesso aos pinos do display
// caso o pino RW n�o seja utilizado, comente a defini��o lcd_rw
#ifndef lcd_enable
   #define lcd_enable       pin_e1      // pino enable do LCD
   #define lcd_rs         pin_e0      // pino rs do LCD
   //#define lcd_rw      pin_e2      // pino rw do LCD
   #define lcd_d4         pin_d4      // pino de dados d4 do LCD
   #define lcd_d5         pin_d5      // pino de dados d5 do LCD
   #define lcd_d6         pin_d6      // pino de dados d6 do LCD
   #define lcd_d7         pin_d7      // pino de dados d7 do LCD
#endif

#define lcd_type 2           // 0=5x7, 1=5x10, 2=2 linhas
#define lcd_seg_lin 0x40    // Endere�o da segunda linha na RAM do LCD

// a constante abaixo define a seq��ncia de inicializa��o do m�dulo LCD
byte CONST INI_LCD[4] = {0x20 | (lcd_type << 2), 0xf, 1, 6};

byte lcd_le_byte()
// l� um byte do LCD (somente com pino RW)
{
   byte dado;
   // configura os pinos de dados como entradas
   input(lcd_d4);
   input(lcd_d5);
   input(lcd_d6);
   input(lcd_d7);
   // se o pino rw for utilizado, coloca em 1
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_high(lcd_enable); // habilita display
   dado = 0;   // zera a vari�vel de leitura
   // l� os quatro bits mais significativos
   if (input(lcd_d7)) bit_set(dado,7);
   if (input(lcd_d6)) bit_set(dado,6);
   if (input(lcd_d5)) bit_set(dado,5);
   if (input(lcd_d4)) bit_set(dado,4);
   // d� um pulso na linha enable
   output_low(lcd_enable);
   output_high(lcd_enable);
   // l� os quatro bits menos significativos
   if (input(lcd_d7)) bit_set(dado,3);
   if (input(lcd_d6)) bit_set(dado,2);
   if (input(lcd_d5)) bit_set(dado,1);
   if (input(lcd_d4)) bit_set(dado,0);
   output_low(lcd_enable);   // desabilita o display
   return dado;   // retorna o byte lido
}

void lcd_envia_nibble( byte dado )
// envia um dado de quatro bits para o display
{
   // coloca os quatro bits nas saidas
   output_bit(lcd_d4,bit_test(dado,0));
   output_bit(lcd_d5,bit_test(dado,1));
   output_bit(lcd_d6,bit_test(dado,2));
   output_bit(lcd_d7,bit_test(dado,3));
   // d� um pulso na linha enable
   output_high(lcd_enable);
   output_low(lcd_enable);
}


void lcd_envia_byte( boolean endereco, byte dado )
{
   // coloca a linha rs em 0
   output_low(lcd_rs);
   // aguarda o display ficar desocupado
   //while ( bit_test(lcd_le_byte(),7) ) ;
   // configura a linha rs dependendo do modo selecionado
   output_bit(lcd_rs,endereco);
   delay_us(100);   // aguarda 100 us
   // caso a linha rw esteja definida, coloca em 0
   #ifdef lcd_rw
      output_low(lcd_rw);
   #endif
   // desativa linha enable
   output_low(lcd_enable);
   // envia a primeira parte do byte
   lcd_envia_nibble(dado >> 4);
   // envia a segunda parte do byte
   lcd_envia_nibble(dado & 0x0f);
}


void lcd_ini()
// rotina de inicializa��o do display
{
   byte conta;
   output_low(lcd_d4);
   output_low(lcd_d5);
   output_low(lcd_d6);
   output_low(lcd_d7);
   output_low(lcd_rs);
   #ifdef lcd_rw
      output_high(lcd_rw);
   #endif
   output_low(lcd_enable);
   delay_ms(15);
   // envia uma seq��ncia de 3 vezes 0x03
   // e depois 0x02 para configurar o m�dulo
   // para modo de 4 bits
   for(conta=1;conta<=3;++conta)
   {
      lcd_envia_nibble(3);
      delay_ms(5);
   }
   lcd_envia_nibble(2);
   // envia string de inicializa��o do display
   for(conta=0;conta<=3;++conta) lcd_envia_byte(0,INI_LCD[conta]);
}

void lcd_pos_xy( byte x, byte y)
{
   byte endereco;
   if(y!=1)
      endereco = lcd_seg_lin;
   else
      endereco = 0;
   endereco += x-1;
   lcd_envia_byte(0,0x80|endereco);
}

void lcd_escreve( char c)
// envia caractere para o display
{
   switch (c)
   {
     case '\f'    :   lcd_envia_byte(0,1);
              delay_ms(2);
            break;
     case '\n'   :
     case '\r'    :   lcd_pos_xy(1,2);
              break;
     case '\b'    :   lcd_envia_byte(0,0x10);
              break;
     default   :   lcd_envia_byte(1,c);
              break;
   }
}

char lcd_le( byte x, byte y)
// le caractere do display
{
   char valor;
   // seleciona a posi��o do caractere
   lcd_pos_xy(x,y);
   // ativa rs
   output_high(lcd_rs);
   // l� o caractere
   valor = lcd_le_byte();
   // desativa rs
   output_low(lcd_rs);
   // retorna o valor do caractere
   return valor;
}

Saída ggerada no PicSimlab

























Clique aqui para fazer o download o Projeto Completo

Créditos para: Fábio Pereira

16/11/2021

Pisca led PWM #3 com PIC 16F877A

Código feito em CCS C Compiler

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#device ADC=8                           // Set ADC resolution to 8-bit
#use delay(clock=8000000)
 
unsigned int8 i, j;
void main(){
  setup_adc(ADC_CLOCK_DIV_32);           // Set ADC conversion time to 32Tosc
  setup_adc_ports(AN0_AN1_AN3);          // Configure AN0,AN1 and AN3 as analog
  setup_ccp1(CCP_PWM);                   // Configure CCP1 as a PWM
  setup_ccp2(CCP_PWM);                   // Configure CCP2 as a PWM
  delay_ms(100);                         // Wait 100ms
  setup_timer_2(T2_DIV_BY_16, 255, 1);   // Set PWM frequency to 488Hz
  while(TRUE){
  
    set_adc_channel(0);                  // Select channel AN0
    delay_ms(1);                         // Wait 1ms
    i = read_adc();                      // Read from AN0 and store in i
    delay_ms(1);                         // Wait 1ms
    set_adc_channel(1);                  // Select channel AN1
    delay_ms(1);                         // Wait 1ms
    j = read_adc();                      // Read from AN1 and store in j
    set_pwm1_duty(i);
    set_pwm2_duty(j);
    delay_ms(1);                         // Wait 1ms
   }
}


Simulador Proteus versão 7.7

13/11/2021

Motor de passo #2 com PIC 16F877A

Simulador Proteus versão 7.7



















Código feito em CCS C Compiler

#include <16F877A.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP                       
#use delay(clock = 20MHz)
#use fast_io(B)  // habilita todas as portas B
#use fast_io(D)  // habilita todas as porras D
 
unsigned int8 speed_;
void main(){
   
  output_b(0);
  set_tris_b(0x03);
  port_b_pullups(TRUE);
  output_d(0);
  set_tris_d(0);
  setup_adc(ADC_CLOCK_DIV_32);      // Set ADC conversion time to 32Tosc
  setup_adc_ports(AN0);             // Configura AN0 em analógica  
  set_adc_channel(0);               // Select channel 0 input
  delay_ms(100);                    // Wait 100ms
  
  while(TRUE){
      output_d(0);
      
      while( ! input(PIN_B0)){
         speed_ = read_adc();
         
         if(speed_ < 2)
            speed_ = 2;
         output_d(0b00000011);
         delay_ms(speed_);
         output_d(0b00000110);
         delay_ms(speed_);
         output_d(0b00001100);
         delay_ms(speed_);
         output_d(0b00001001);
         delay_ms(speed_);
      }
      while( ! input(PIN_B1)){
         speed_ = read_adc();
         if(speed_ < 2)
            speed_ = 2;
         output_d(0b00001001);
         delay_ms(speed_);
         output_d(0b00001100);
         delay_ms(speed_);
         output_d(0b00000110);
         delay_ms(speed_);
         output_d(0b00000011);
         delay_ms(speed_);
      }
   }
}

Saída gerada






















Palavras chave:

Stepper motor with PIC 16F877A
Motor paso a paso con PIC 16F877A
Stappenmotor met PIC 16F877A
PIC 16F877A ସହିତ ଷ୍ଟେପର୍ ମୋଟର |
ʻO ka mīkini stepper me PIC 16F877A
מנוע צעד עם PIC 16F877A
Stepper motor na may PIC 16F877A
PIC16F877Aを搭載したステッピングモーター
Stegmotor med PIC 16F877A

11/11/2021

Verifica 2 vetores em C

Objetivo: Verificar se 2 são exatamente iguais em suas devidas posições.

Código feito em linguagem C

#include <stdio.h>
#define SIZE 3

int vetor[SIZE];

int vet[SIZE] = {2, 2, 9};
int var[SIZE] = {2, 9, 2};
int acertos = 0;

void verifica(int valor, int posicao){
    if(valor == vet[posicao]){
        printf("%d = %d\n",valor, vet[posicao]);
        acertos++;
    }else{
        printf("[%d] != [%d] Não é igual !\n",valor, vet[posicao]);
    }
}

int main(){
    
    for(int i = 0; i < SIZE; i++){
        verifica(var[i], i);
    }
    printf("Acertos = %d\n",acertos);
    return 0;
}

Saída gerada no www.https://www.onlinegdb.com/



10/11/2021

Fatorial #2 com MIPS Assembly

.data
prompt: .asciiz "Entre com num: "
factMsg: .asciiz "Fatorial = "
num: .word 0
.text

la $a0, prompt
li $v0, 4
syscall
li $v0, 5
syscall
sw $v0, num
move $a0, $v0
la $a0, factMsg
li $v0, 4
syscall
lw $a0, num
jal fact
move $a0, $v0
li $v0, 1
syscall
li $v0, 10
syscall

fact:
li $t0, 1
move $t1 $a0, 
loop:
beq $t1, $zero, exit
mul $t0, $t0, $t1
addi $t1, $t1, -1
j loop

exit:
move $v0, $t0
jr $ra

Simulador MARS 4.0


02/11/2021

Fatorial #1 com MIPS Assembly

.data
promptMessage: .asciiz "Entre com o número do fatorial: "
resultMessage: .asciiz "\nFatorial = "
theNumber: .word 0
theAnswer: .word 0
.text
.globl main
main:
#leia o número do usuário
li $v0, 4
la $a0, promptMessage
syscall
li $v0, 5
syscall
sw $v0, theNumber
#Chama a função fatorial
lw $a0, theNumber
jal findFactorial
sw $v0, theAnswer
#Exibi os resultados
li $v0, 4
la $a0, resultMessage
syscall
li $v0, 1
lw $a0, theAnswer
syscall
#Informa ao sistema que este é o fim do programa
li $v0, 10
syscall
#--------------------
# função findFactorial
.globl findFactorial
findFactorial:
subu $sp, $sp, 8
sw $ra, ($sp)
sw $s0, 4($sp)
#Base caso
li $v0, 1
beq $a0, 0, factorialDone
#findFactorial (o número -1)
move $s0, $a0
sub $a0, $a0, 1
jal findFactorial
#A mágia acontece aqui
mul $v0, $s0, $v0
factorialDone:
lw $ra, ($sp)
lw $s0, 4($sp)
addu $sp, $sp, 8
jr $ra

Saída gerada no MARS 4.5
























Palavras chave:

Factorial with MIPS Assembly
Factorial con ensamblaje MIPS
Faktoriell med MIPS-montering
פקטוריאלי עם MIPS Assembly
Silnia z zespołem MIPS
MIPS সমাবেশের সাথে ফ্যাক্টরিয়াল
Faktorial dengan Majelis MIPS
Факториал с MIPS монтаж
Factorial cu Asamblare MIPS

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);
 }
}



















22/09/2021

PWM #02 com PIC 16F628A

 Código feito no CCS C Compiler

#include <16F628A.h>
#FUSES NOWDT
#FUSES NOBROWNOUT
#FUSES NOLVP

#use delay(crystal = 4MHz)
int16 ton, toff;
unsigned int cont = 0;

void main(){
   while(true){
      if(++ton >= 1000) ton = 0;
      toff = 1000 - ton;
      
      for(cont =1; cont <= 10; cont++){//vai repetir 10 vezes o valor
         output_high(PIN_A0);
         delay_us(ton);
         toff = 1000 - ton;
         output_low(pin_A0);
         delay_us(toff);
      }

   }
}


Emulador: PIC SimLab










20/09/2021

PWM #01 com PIC 16F628A no PIC SimLab

Código feito no CCS C Compiler

#include <16F628A.h>
#FUSES NOWDT
#FUSES NOBROWNOUT
#FUSES NOLVP

#use delay(crystal = 4MHz)

int16 ton, toff;
unsigned int cont = 0;
signed int cd = 1;

void main(){
   while(true){
   
      ton = ton + cd;
      
      if(ton >= 1000) cd = -1;
      if(ton <= 0) cd = 1;
      
      toff = 1000 - ton;
      
      for(cont =1; cont <= 10; cont++){//vai repetir 10 vezes o valor
         output_high(PIN_A0);
         delay_us(ton);
         toff = 1000 - ton;
         output_low(pin_A0);
         delay_us(toff);
      }
      
      
      
   }
}












08/07/2021

Plugin #02 com jQuery em HTML

TEMPORIZADOR EM HTML USANDO jQuery

Arquivo: estilo.css
@font-face {
    font-family'Oswald';
    srcurl('../fonts/Oswald-Regular.ttf'format('truetype');
}

*{
    font-family'Oswald'sans-serif;
}

html {
    height100%;
}

body {
    margin0;
    background-color#0D262D;
    color#fff;
    height100%;
}

table {
    border-collapsecollapse;
}

tr {
    border-bottomsolid 1px white;
}

td {
    font-size1.6em;
    padding10px;
}

li {
    font-size1.6em;
}

.conteudo {
    displayflex;
    flex-directioncolumn;
    align-itemscenter;
    min-height100%;
}

.exercicio div {
    font-size1.8em;
    bordersolid 5px #fff;
    padding0px 40px;
    margin10px;
}

.exercicio div:nth-of-type(1) {
    background-colordarkgoldenrod;
}

.exercicio div:nth-of-type(2) {
    background-colorcrimson;
}

.exercicio div:nth-of-type(3) {
    background-colordarkcyan;
}

.exercicio div:nth-of-type(4) {
    background-colordarkorchid;
}

.exercicio div:nth-of-type(5) {
    background-colordodgerblue;
}

.exercicio div:nth-of-type(6) {
    background-colorsalmon;
}

.exercicio .destaque {
    bordersolid 10px greenyellow;
    colorgreenyellow;
    font-weightbold;
}

Arquivo: temporizador.js
(function ($) {
    $.fn.temporizador = function (opcoes) {
        const opcoesFinais = $.extend({
            mensagem: 'Em breve!',
            horario: '23:59:59'
        }, opcoes)

        const horaDezena = $('<span class="digito">').html('0')
        const horaUnidade = $('<span class="digito">').html('0')
        const minutoDezena = $('<span class="digito">').html('0')
        const minutoUnidade = $('<span class="digito">').html('0')
        const segundoDezena = $('<span class="digito">').html('0')
        const segundoUnidade = $('<span class="digito">').html('0')

        const separadorHora = $('<span class="separador">').html(':')
        const separadorMinuto = $('<span class="separador">').html(':')
        const mensagem = $('<div class="mensagem">').html(opcoesFinais.mensagem)

        $(this).addClass('temporizador')
        $(this).append(horaDezenahoraUnidadeseparadorHora,
            minutoDezenaminutoUnidadeseparadorMinuto,
            segundoDezenasegundoUnidademensagem)

        const regex = new RegExp(/(\d\d):(\d\d):(\d\d)/)
        const horarioAlvo = regex.exec(opcoesFinais.horario)
        // console.log(horarioAlvo)

        let temporizador = setInterval(() => {
            const agora = new Date()
            const alvo = new Date()
            alvo.setHours(horarioAlvo[1])
            alvo.setMinutes(horarioAlvo[2])
            alvo.setSeconds(horarioAlvo[3])

            const diferencaEmMili = alvo.getTime() - agora.getTime()
            if (diferencaEmMili >= 0) {
                const diferenca = regex.exec(new Date(diferencaEmMili).toISOString())
                console.log(diferenca)

                horaDezena.html(diferenca[1][0])
                horaUnidade.html(diferenca[1][1])
                minutoDezena.html(diferenca[2][0])
                minutoUnidade.html(diferenca[2][1])
                segundoDezena.html(diferenca[3][0])
                segundoUnidade.html(diferenca[3][1])
            } else {
                clearInterval(temporizador)
            }
        }, 1000)
        
        return this
    }
})(jQuery)

Arquivo: plugin2.html
<!DOCTYPE html>
<html>

<head>
    <meta charset='UTF-8'>
    <title>Plugin #02</title>
    <link rel='stylesheet' href='css/temporizador.css'>
    <script src='js/jquery.js'></script>
</head>

<body>
    <h1>Plugin #02 - Temporizador</h1>
    <div></div>
    <script src="js/temporizador.js"></script>
    <script>
        // ...
        $('div').temporizador({
            mensagem: 'Em breve um novo site para você',
            horario: '20:00:00'
        }).hide().fadeIn(3000)
    </script>
</body>

Arquivo: jquery.js CLIQUE AQUI para fazer o download do arquivo