Entrada digital

El otro día nos iniciamos en la programación en C de un PIC, para ser concretos en la salida digital de datos, haciendo rotar y parpadear un bit en el puerto B.

Hoy os voy a enseñar a darle juego a vuestro PIC controlando las entradas. Utilizaremos el PIC16F84A (con ésto ya tendremos entre un 30% y un 50% de las utilidades de éste pequeño, no da más de sí) y el puerto A como entrada de datos digitales, asignando a TRISA el valor 0xFF, es decir, 8 bytes en estado alto binario, aunque éste dispositivo sólo tiene 5 pines. El siguiente paso será comprobar si el pin que nos interesa está en 1 o 0 mediante un if y entonces, realizar la acción que nos interesa. Éste programa en concreto enciende el puerto B cuando detecte el pin A0 en estado alto y después bajo y lo apagará cuando vuelva a ocurrir.

Allá va el programa:

#include <16f84A.h>
#FUSES NOWDT,RC,NOPROTECT // *1
#use delay(clock=13300)
#byte trisa=getenv("SFR:TRISA") //asignamos bytes de puertos a sus nombres
#byte trisb=getenv("SFR:TRISB")
#byte porta=0x05
#byte portb=0x06
#bit b0=0x06.0 //Le ponemos nombre a unos cuantos pines
#bit b1=0x06.1
#bit b2=0x06.2
#bit a0=0x05.0 //Éste será el de entrada en el puerto A
int led; //Utilizaré ésta variable como indicador de estado
void main(){
 trisa=0xff; //configuramos el puerto A como entrada
 trisb=0; //y el puerto B como salida
 porta=0; //limpiamos los puertos
 portb=0;
 led=0; //inicializamos la variable a 0
 while(1){
 if(a0==1){ //Si el PIC detecta que el pin está en estado alto
 while(a0==1) delay_ms(5); // *2
 if(led==0){ //Si la variable indicadora es 0
 portb=0xff; //enciende el puerto B
 led=1; //Pone la variable a 1
 }
 else if(led==1){ // PERO si la variable está en 1
 portb=0x00; //apaga el puerto B
 led=0; //Pone la variable a 0
 } //Vuelve a esperar a que el pin esté en estado alto
 }
 }
}
// *1: Como he utilizado el programa para probar el programador de PIC
// he utilizado RC (oscilador resistencia-condensador) y NOPROTECT para poder
// borrar el código de la memoria y probar más programas
//
// 2*: Ésto es un truco que se usa cuando puede haber un pequeño "rebote" que
// haga parecer que han habido 2 pulsos cuando solo hemos dado 1. Cuando pulsamos
// un botón, tardamos algo en soltarlo, lo que haría al programa dar vueltas y 
// descontrolarse
//
// Como veis simplemente se basa en testear en qué estado está el pin y entonces
// llevar a cabo la acción. También podríamos usar las otras entradas para
// copiar 4 bits y llevarlos al puerto B, como un buffer

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *