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
Gracias amigo por su aporte. Soy aprendiz empírico de electrónica y si tiene algún librito sobre microcontrolares me lo hace saber.
ResponderEliminarGracias
Soy igual de empírico. Suerte.
EliminarGracias, justo lo que estaba buscando, me sirvio de mucho.
ResponderEliminarSe hace lo posible :-)
EliminarGracias .. una consulta sobre el oscilador ... estás usando oscilador interno verdad ... para tal caso pienso que la instrucción no Sería
ResponderEliminar#use delay (internal=4M) ?????
Y Gracias por el aporte
Me parece que es lo mismo, la verdad no estoy seguro.
Eliminar