jueves, 27 de junio de 2013

Entrenador PIC 12F675

ENTRENADOR PARA EL PIC 12F675

El microcontrolador 12F675 de microchip es uno de los más económicos y fácil de encontrar en todo el mundo, inclusive en países vetados tecnológicamente por E.U. Este micro controlador tiene la ventaja de incluir oscilador interno de 4Mhz aproximadamente, entradas analógicas de 256 o 1024 bits de resolución.

En total se pueden contar con 5 pines de entrada/salida y uno de entrada (el mismo pin usado para el Master Clear del programador), así pues es bastante útil para aplicaciones muy sencillas. Tiene poca memoria RAM, ROM y EEPROM pero basta para la aplicación de ejemplo que le publico en esta ocasión.

Referencia Microchip del PIC 12F675: http://ww1.microchip.com/downloads/en/devicedoc/41190c.pdf

El presente diseño es un entrenador para el PIC 12F675, con dos push boton, tres leds y un buzzer como salida acústica.

El diagrama del Entrenador es el siguiente:


El conector CN1 es el conector propio del PicKit2 de Microchip, que cabe mencionar que existen diversos programadores que tienen los mismos pines en la misma o en diferente posición pero siempre tienen los mismos pines. Para este ejemplo estoy usando un clon del PicKit2, que se puede conseguir en Ebay fácilmente, o en su sitio oficial http://www.piccircuit.com búsquenlo como icp02 (es de color amarillo).


Aquí les pongo una foto de mi programador icp02-v1.0.



Construyendo el circuito en placa fenólica perforada queda el entrenador como en la siguiente foto.




La cinta adhesiva sostiene el buzzer que está por debajo, se pueden ver las terminales del buzzer en color rojo y negro, el pin MCL esta en naranja y junto a los leds se puede ver un switch definitivo, es decir que cuando se programa estas terminales desnudas deben separarse y cuando se pruebe deben estar juntas, esto no es obligatorio pero si recomendable ya que cuando se dejan separadas los pines PGD y PGC no tienen la carga de los leds.


CODIGO FUENTE


Para este ejemplo he usado el compilador CCS C Compiler que se puede obtener de la página oficial:

/*
Author: Oscar Sanchez V.
Date: 2016-06-21
Compiler: CCS C Compiler
*/

#include <12F675.h>

#fuses intrc_io,NOWDT,NOBROWNOUT,PUT,NOMCLR,CPD 
#use delay(clock=4M)
//#use standard_io(A)

#define PUSH_A PIN_A5
#define PUSH_B PIN_A3

#define LED_GREEN_PINOUT PIN_A0
#define LED_RED_PINOUT PIN_A1
#define LED_WHITE_PINOUT PIN_A4

#define SOUND_PINOUT PIN_A2

void music_tone(int16 m_period, int16 m_delay) {
   int16 i;
   for (i = m_delay ; i > 0 ; i--) {
      output_high(SOUND_PINOUT);
      delay_us(m_period);
      output_low(SOUND_PINOUT);
      delay_us(m_period);      
   }
}

void ring_bird() {
   int16 i;
   for (i = 50 ; i > 0 ; i--) {
      output_high(SOUND_PINOUT);
      delay_us(i+100);
      output_low(SOUND_PINOUT);
      delay_us(i+100);      
   }
   for (i = 0 ; i < 100 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(i+100);
      output_low(SOUND_PINOUT);
      delay_us(i+100);      
   }
   delay_ms(10);
}


void ring_up() {
   int16 i;
   
   for (i = 0 ; i < 50 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(1000);
      output_low(SOUND_PINOUT);
      delay_us(1000);      
   }
   delay_ms(20);
   for (i = 0 ; i < 60 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(600);
      output_low(SOUND_PINOUT);
      delay_us(600);      
   }
   delay_ms(20);
   for (i = 0 ; i < 70 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(350);
      output_low(SOUND_PINOUT);
      delay_us(350);      
   }

   delay_ms(10);
}


void ring_down() {
   int16 i;
   
   for (i = 0 ; i < 70 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(350);
      output_low(SOUND_PINOUT);
      delay_us(350);      
   }
   delay_ms(20);
   for (i = 0 ; i < 60 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(600);
      output_low(SOUND_PINOUT);
      delay_us(600);      
   }
   delay_ms(20);
   for (i = 0 ; i < 50 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(1000);
      output_low(SOUND_PINOUT);
      delay_us(1000);      
   }
   
   delay_ms(10);
}


void ring_alert() {
   int16 i;
   
   for (i = 0 ; i < 20 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(1000);
      output_low(SOUND_PINOUT);
      delay_us(1000);      
   }
   for (i = 0 ; i < 20 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(1500);
      output_low(SOUND_PINOUT);
      delay_us(1500);      
   }
   for (i = 0 ; i < 20 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(1000);
      output_low(SOUND_PINOUT);
      delay_us(1000);      
   }
   
   delay_ms(10);
}

void ring_beep() {
   int16 i;
   
   for (i = 0 ; i < 30 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(600);
      output_low(SOUND_PINOUT);
      delay_us(600);      
   }
   for (i = 0 ; i < 60 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(500);
      output_low(SOUND_PINOUT);
      delay_us(500);      
   }
   for (i = 0 ; i < 30 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(600);
      output_low(SOUND_PINOUT);
      delay_us(600);      
   }
   
   delay_ms(10);
}
void ring_click() {
   int16 i;
   
   for (i = 0 ; i < 10 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(300);
      output_low(SOUND_PINOUT);
      delay_us(300);      
   }
   for (i = 0 ; i < 20 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(200);
      output_low(SOUND_PINOUT);
      delay_us(200);      
   }
   for (i = 0 ; i < 10 ; i++) {
      output_high(SOUND_PINOUT);
      delay_us(250);
      output_low(SOUND_PINOUT);
      delay_us(250);      
   }
   
   delay_ms(10);
}



void q_push() {
   int16 cycles;
   int16 tick;
   int16 push_a_state;

   if (!input(PUSH_A)) {

      push_a_state = 0;
      cycles = 0;
      while(!input(PUSH_A)) {
         delay_ms(10);
         cycles++;
         
         if (cycles == 50) ring_bird();
         if (cycles == 200) ring_bird();
         if (cycles == 500) ring_bird();

         if (cycles > 600) {
            cycles = 0;
            ring_up();
            delay_ms(100);
            ring_down();
            delay_ms(1000);
         }
      }

      if (cycles>=50) {
         push_a_state = 1; // Open back door
      }
      if (cycles>=200) {
         push_a_state = 2; // Toggle Dome Light
      }
      if (cycles>=500) {
         push_a_state = 3; // Toggle Ads Bar
      }
         
      switch (push_a_state) {
         case (1) : 
         output_low(LED_GREEN_PINOUT);
         output_high(LED_GREEN_PINOUT);
         delay_ms(800);
         output_low(LED_GREEN_PINOUT);
         break;
         case (2) : 
         if (input_state(LED_WHITE_PINOUT)) {
            output_low(LED_WHITE_PINOUT);
            ring_down();
         } else {
            output_high(LED_WHITE_PINOUT);
            ring_up();
         }
         break;
         case (3) : 
         if (input_state(LED_RED_PINOUT)) {
            output_low(LED_RED_PINOUT);
            ring_down();
         } else {
            output_high(LED_RED_PINOUT);
            ring_up();
         }
         break;
      }  // switch
      delay_ms(50);

   }  // input(PUSH_A)
   
   if (!input(PUSH_B)) {
      if (input_state(LED_RED_PINOUT)) {
         output_low(LED_RED_PINOUT);
      } else {
         output_high(LED_RED_PINOUT);
      }
      ring_alert();
   }  // input(PUSH_B)
   
   delay_ms(50);
}  // q_push()


void main() {
   output_low(LED_GREEN_PINOUT);
   output_low(LED_RED_PINOUT);
   output_low(LED_WHITE_PINOUT);
   while(1) {
      q_push();
   }

}  // End main


Con pequeños cambios en el circuito se puede adaptar para conectar transistores y relays para aplicar a seguros de puertas de un automóvil, manteniendo presionada la PushBoton A se puede abrir la puerta trasera, manteniendolo presionado se prende la luz superior (plafon) y manteniendo un poco más se puede encender una luz de adorno trasera.

Se reciben quejas y sugerencias :-P

6 comentarios:

  1. Gracias amigo por su aporte. Soy aprendiz empírico de electrónica y si tiene algún librito sobre microcontrolares me lo hace saber.
    Gracias

    ResponderEliminar
  2. Gracias, justo lo que estaba buscando, me sirvio de mucho.

    ResponderEliminar
  3. Gracias .. una consulta sobre el oscilador ... estás usando oscilador interno verdad ... para tal caso pienso que la instrucción no Sería
    #use delay (internal=4M) ?????

    Y Gracias por el aporte

    ResponderEliminar