Práctica 3 Miuva Pro: Contador con diferentes velocidades

En esta práctica combinaremos las dos prácticas pasadas, utilizaremos el enmascaramiento para saber el estado de los pulsadores, con esto podremos modificar la velocidad a la que avanza un contador binario de 8 bits.

Lo primero que haremos será definir las 4 velocidades a las que puede aumentar el contador:

#define  vel0    0               //velocidad 0
#define  vel1    1               //velocidad 1
#define  vel2    2               //velocidad 2
#define  vel3    3               //velocidad 3

Declararemos dos variables, una llamada x que será nuestro contador, y otra llamada velocidad que almacenará la información de la velocidad actual.

unsigned int velocidad = vel0;             //se declara variable para almacenar la velocidad
unsigned int x = 0;

Cuando se presione el pulsador D1 aumentaremos la velocidad a la siguiente, por ejemplo si la velocidad es vel0, aumentará a vel1, y así sucesivamente.

if ((input_d() & 0x02) == 0x00){    //¿Se presionó D1?
    if (velocidad == 0){          //Si la velocidad es 0
      velocidad = vel1;             //Se pasa a la velocidad 1
   }
   else if (velocidad == 1){     //Si la velocidad es 1
      velocidad = vel2;             //Pasa a la velocidad 2
   }
   else if (velocidad == 2){     //Si la velocidad es 2
      velocidad = vel3;             //Pasa a la velocidad 3
   }
   else{                            //sino
      velocidad = vel0;             //La velocidad es 0
   }
}

Ahora verificaremos en que velocidad se encuentra para que de esta forma entre a un ciclo donde aumente el contador y espere el tiempo determinado, los tiempos serán de 100ms, 250ms, 500ms y 1s.

if (velocidad == vel0){
         output_j(x);                     //Se muestra el contador en los leds
         x++;                             //Aumenta el contador
         delay_ms(100);                   //Retardo de 100ms
      }  
      else if (velocidad == vel1){
         output_j(x);                     //Se muestra el contador en los leds
         x++;                             //Aumenta el contador
         delay_ms(250);                   //Retardo de 250ms
      }
      else if (velocidad == vel2){
         output_j(x);                     //Se muestra el contador en los leds
         x++;                             //Aumenta el contador
         delay_ms(500);                   //Retardo de 500ms
      }
      else{
         output_j(x);                     //Se muestra el contador en los leds
         x++;                             //Aumenta el contador
         delay_ms(1000);                  //Retardo de 1000ms = 1s
      }

Esto resultará en el siguiente código:

#include <18F87J50.h>
#fuses HSPLL, NOWDT, NOPROTECT, NODEBUG, PLL2
#use delay (clock=24M)           
#use standard_io(J)              //Predefine el puerto J
#use standard_io(D)              //Predefine el puerto D   
#define  vel0    0               //velocidad 0
#define  vel1    1               //velocidad 1
#define  vel2    2               //velocidad 2
#define  vel3    3               //velocidad 3

unsigned int velocidad = vel0;             //se declara variable para almacenar la velocidad
unsigned int x = 0;   

void main(){
   set_tris_j(0x00);                      //Puerto J como salida
   set_tris_d(0xFF);                      //Puerto D como entrada
   while(true){                           //Bucle infinito
      if ((input_d() & 0x02) == 0x00){    //¿Se presionó D1?
         if (velocidad == 0){          //Si la velocidad es 0
            velocidad = vel1;             //Se pasa a la velocidad 1
         }
         else if (velocidad == 1){     //Si la velocidad es 1
            velocidad = vel2;             //Pasa a la velocidad 2
         }
         else if (velocidad == 2){     //Si la velocidad es 2
            velocidad = vel3;             //Pasa a la velocidad 3
         }
         else{                            //sino
            velocidad = vel0;             //La velocidad es 0
         }
      }  
      
      if (velocidad == vel0){
         output_j(x);                     //Se muestra el contador en los leds
         x++;                             //Aumenta el contador
         delay_ms(100);                   //Retardo de 100ms
      }  
      else if (velocidad == vel1){
         output_j(x);                     //Se muestra el contador en los leds
         x++;                             //Aumenta el contador
         delay_ms(250);                   //Retardo de 250ms
      }
      else if (velocidad == vel2){
         output_j(x);                     //Se muestra el contador en los leds
         x++;                             //Aumenta el contador
         delay_ms(500);                   //Retardo de 500ms
      }
      else{
         output_j(x);                     //Se muestra el contador en los leds
         x++;                             //Aumenta el contador
         delay_ms(1000);                  //Retardo de 1000ms = 1s
      }
      
   }
}

 

Observa el video demostrativo

…PROXIMAMENTE…

Menú