Hola, continuamos con estas pequeñas guías para saber como programar PIC's en C, ya sea usando MPLAB o PIC C Compiler. En anteriores entradas ya he escrito acerca de como usar estos programas y algo de teoría pero ya es hora de empezar a a aplicarla así que esta vez veremos cosas fáciles pero muy esenciales en ellas son; como el PIC puede identificar 1 o 0 lógico, prender leds, usar IF y algunos problemas al usar un botón.
Y recuerden si quieren ver las entradas anteriores pueden revisar en las etiquetas la llamada "PIC-C" y ahí podrán ver todas las relacionadas. Y bueno como siempre algo de teoría para estar relacionados:
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0 , 1 LÓGICO
Los rangos de voltaje para los niveles lógicos, en los dispositivos TTL, Vcc normalmente es de +5V. En los circuitos integrados CMOS, VDD puede varias desde +3V hasta + 18 V, aunque +5V es el volatje mas utilizado cuando se emplean circuitos integrados.
Un cero lógico es cualquier voltaje desde 0 hasta 0.8 V; un valor lógico 1 es cualquier voltaje desde 2 hasta 5 V. Los voltajes que no se encuentran en esos rangos son indeterminados y no deben emplearse como entradas ya que el uso de estos valores asegura la forma en que responda el circuito
Entradas sin conectar (entrada "flotante")
Una entrada flotante en TTL actúa como un nivel lógico 1(generalmente). Lo que nos dice que el circuito actúa como si la entrada tuviese conectado un nivel logico alto. Aunque el nivel de cd esta entre los 1.4 y 1.8 V esta en la región de indeterminación, por eso generalmente lo toma como un 1 logico.
La entrada flotante de un CMOS no tiene un valor espeficico de volatej, lo que hará es fluctuar de forma aleatoria, a medida que capta ruido.Lo anterior solo ocurre si quieren hacerlo en las pruebas practicas pero no en las simulaciones.
BOTONES
Un botón simplemente es un simple interruptor mecanismo para controlar algún aspecto de una máquina o un proceso.
Y en electrónica son muy utilizados, ya sea para iniciar cualquier sistema que se tenga. Y la imagen anterior se puede apreciar dos formas de conectar un botón de entregarnos un uno o un cero lógico a su salida por "pull-up" y "pull-down". El Pull-down es el del lado derecho y sin presionar el botón nos manda un 1 y cuando se presiona nos mando un 0. El Pull-up lado izquierdo es de manera contraria, sin presionar tenemos un 0 a la salida (por eso el led apagado) y cuando se presiona nos manda un 1 (y así se prenderá el led).
EL EFECTO REBOTE
En el momento de presionar un botón pulsador o cualquier conmutador electromecánico es inevitable que se produzca un pequeño arco eléctrico durante el breve instante en que las placas del contacto se aproximan o se alejan de sus puntos de conexión, ya que las distancias microscópicas entre los puntos a diferente potencial son suficientes para romper por un instante la resistividad del aire. Este fenómeno se conoce como rebote (bounce) y se ilustra en la siguiente figura
Duración del rebote.- La experiencia empírica indica que el periodo transitorio de un rebote depende entre otros factores, de la calidad de los switches y de la rapidez de su accionamiento, pero a lo más puede durar unos 20 milisegundos,
USANDO IF, IF ELSE
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <16F1938.h> //PIC A USAR
//Los fusibles que usará nuestro PIC, recuerden que cambian dependiendo del PIC a usar. Y si gustan pueden escribir los fusibles de la sig manera. #FUSES INTRC_IO, NOWDT, WST_SW,...
#FUSES INTRC_IO
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES WDT_SW
#FUSES NOBROWNOUT
#FUSES NOLVP
//Igualmente el cristal de cuarzo que usarán para trabajar depende de lo que necesiten
#use delay(clock=4000000)
///////////////////////////////////////
//----------NOMBRAR PRINES----------
#define LED0 pin_b0
#define LED1 pin_b1
#define LED2 pin_b2
#define LED3 pin_b3
#define LED4 pin_b4
#define LED5 pin_b5
#define LED6 pin_b6
#define LED7 pin_b7
//Esto es una forma de nombrar a los pines de cada puerto, resulta a menudo util nombrarlo segun lo requiramos
char valor2[8];
int16 hola;
////////////////////////////////////////////
//---------------LIBRERIAS EXTERNAS-----------
//#include <lcd.c> usar librerias
///////////////////////////////////////
//---------------SUB-RUTINAS--------------
void cargando() //Nombre de tu sub-rutina
{
/*
//HOLA SOY UNA SUB RUTINA
if(input(pin_c0)){ //En entradas posteriores veremos para que sirve las comandos input
while(TRUE) {
delay_ms(100);
if(!input(pin_c0)) break;
}
}
*/
}
//------------------------------------------
////////////////////////////////////////////
//-------PROGRAMA--------------
void main()
{
////////////////////////
//-----------------PUERTOS--------------
set_tris_a(0xff); //Todo puerto A como entradas
set_tris_b(0x00); //Todo puerto B como salidas
set_tris_c(0xC0); //Solo los primeros 4 pines son salidas
//1 - Entradas
//0 - Salidas//En este caso todos son entradas
/////////////////////////////////////////////
//-------LIMPIAR-PUERTOS--------------
output_c(0x00);
output_b(0x00);
output_a(0x00);
//
////////////////////////
while(true)
{
if (input(pin_a0)){//Si en a0 al un 1 entonces
output_high(LED0);
delay_ms(500);
output_high(LED1);
delay_ms(500);
output_high(LED2);
delay_ms(500);
output_high(LED3);
delay_ms(500);
output_high(LED4);
delay_ms(500);
output_high(LED5);
delay_ms(500);
output_high(LED6);
delay_ms(500);
output_high(LED7);
delay_ms(500);
//Como pueden apreciar solo está prendiendo un led cada 500 mseg de todo el puerto b
} //Ahora pongamos un ejemplo de un else if
if(input(pin_a0)){
//Si se sigue presionando el botón entonces también prenderá el puerto C, pero esto como segunda instrucción
output_c(0x0f);
delay_ms(500);
}
else if(!input(pin_a2)) { //Si es 0 entonces prenderá los leds un seg, solo lo hará si no el primer if
output_b(0x00);
output_high(pin_c0);
output_high(pin_c1);
output_high(pin_c2);
output_high(pin_c3);
delay_ms(1000);
}
else //Si no se cumplió las dos condiciones ejecutará esto
output_b(0x70);
output_c(0x07);
delay_ms(500);
output_b(0x00);
output_c(0x00);
delay_ms(500);
}
}
//////////////////////////////////
Como ya saben después de tener el codigo fuente, deben compilarlo y pueden probarlo en físico o en ISIS PROTEUS, puede tener la sig. forma pero depende de ustedes como quede y recuerden al compilarlo debió decir Build Succeeded y debió crear el .hex para que así lo puedan probar.
Si gustan pueden cambiar los tiempos para apreciar mejor lo que pasa con las instrucciones, o también modificarlas para ver lo que pasa. Eso es todo por el momento espero les sirva de algo.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PARTE 3:
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
PARTE 3:
Comentarios
Publicar un comentario