INTRODUCCION
El presente texto tiene como objetivo ser una herramienta de ayuda en el
aprendizaje de la programación de microcontroladores PIC en el entorno del
lenguaje C, para que el estudiante se encuentre capacitado para poder resolver
todo tipo de proyectos de manera sencilla y práctica usando lenguajes de alto
nivel.
Brindaremos una secuencia de temas que se ha visto conveniente para una
aprendizaje rápido y sencillo, con ejercicios y ejemplos que serán desarrollados
en clase y una guía de practica como algunos ejercicios que el estudiante deberá
resolver para mejorar su aprendizaje y afianzar sus conocimientos adquiridos, así
como la entrega de ejemplos por parte del docente para poder desarrollar
diferentes trabajos.
1. ¿QUE ES UN MICROCONTROLADOR?
Un microcontrolador es un circuito integrado programable que contiene todos los
componentes necesarios para controlar el funcionamiento de una tarea
determinada, como el control de una lavadora, un teclado de ordenar, un sistema
de alarma, un robot.
Para esto, el microcontrolador debe disponer de una memoria donde se almacena
el programa que gobierne el funcionamiento del mismo que, una vez programado
y configurado, solo sirve para realizar la tarea asignada.
La utilización de un microcontrolador en un circuito reduce notablemente el
tamaño y número de componentes y, en consecuencia, disminuye el número de
averías y el volumen y el peso de los equipos, entre otras ventajas.
El microcontrolador es uno de los inventos más notables del siglo XX. En el
mercado hay gran cantidad de ellos, con multitud de posibilidades y
características. Cada tipo de microcontrolador sirve para una serie de casos y es el
diseñador del sistema quien debe decidir cuál es el microcontrolador más idóneo
para cada uso.
En los últimos años han tenido un gran auge los microcontroladores PIC
fabricados por Microchip Technology Inc. Los PIC (Peripheral Interface Controller)
son una familia de microcontroladores que ha tenido gran aceptación y desarrollo
en los últimos años gracias a que sus buenas características, bajo precio, reducido
consumo, pequeño tamaño, gran calidad, fiabilidad y abundancia de información,
lo convierten en muy fácil, como y rápido de utilizar.
1.1 DIFERENCIA ENTRE MICROPROCESADOR Y MICROCONTROLADOR
El microprocesador es un circuito integrado que contiene la Unidad Central
de Proceso (UCP), también llamado procesador, de un computador. La UCP
está formada por la Unidad de Control, que interpreta las instrucciones, y
el Camino de Datos, que las ejecuta.
Las patitas del microprocesador sacan al exterior las líneas de sus buses
de direcciones, datos y control, para permitir conectarle con la Memoria y
los Módulos E/S y configurar un computador implementado por varios
circuitos integrados. Se dice que un microprocesador es un sistema
abierto porque su configuración es variable de acuerdo con la aplicación a
la que se destine.
Un microprocesador es un sistema abierto, con el que puede construirse
un computador las características que se desee, acoplándole módulos
necesarios.
Un microcontrolador es un sistema cerrado que contiene un
computador completo y de prestaciones limitadas que no se pueden
modificar.
1.2 ARQUITECTURA INTERNA
Un microcontrolador posee todos los componentes de un computador, pero
con unas características fijas que no pueden alterarse.
Las partes principales de un microcontrolador son:
1.2.1 Procesador
1.2.2 Memoria no volátil para contener el programa.
1.2.3 Memoria de lectura y escritura para guardar datos
1.2.4 Lineas de E/S para los controles periféricos:
a) Comunicación en serie
b) Comunicación en paralelo
c) Diversas puertas de comunicación
1.2.5 Recursos auxiliares:
a) Circuito de reloj, encargado de generar los impulsos que
sincronizan el funcionamiento de todo el sistema.
b) Temporizadores, orientados a controlar tiempo.
c) Perro guardián (<<Watchdog>>), destinado a provocar una
reinicializacion cuando el programa queda bloqueado.
d) Conversores AD y DA, para poder recibir y enviar señales
analógicas.
e) Comparadores analógicos, para verificar el valor de una entrada
analógica.
f) Proteccion ante fallos de la alimentación
g) Estado de reposo o de bajo consumo, en el que el sistema queda
<<congelado>> y el consumo de energía se reduce al minimo.
1.3 FAMILIA DE LOS MICROCONTROLADORES
Uno de los labores más importantes del ingeniero en el diseño es la elección
del microcontrolador que mejor satisfaga las necesidades del proyecto con el
mínimo presupuesto.
1.3.1 Gama baja o básica: PIC 16C5X con instrucciones de 12 bits
Se trata de una serie de PIC de recursos limitados, pero con una de las mejores
relaciones coste/prestaciones. Sus versiones están encapsuladas con 18 y 28
patitas y pueden alimentarse a partir de una tensión de 2.5 V, lo que les hace
ideales en las aplicaciones que funcionan con pilas.
1.3.2 Gama media: PIC 16FXXXX con isntrucciones de 14 bits
Es la gama mas variada y completa de los PIC. Abarca modelos desde 18 a 68
patitas, cubriendo varias opciones que integran abudantes periféricos. Dentro
de ellos se encuentra el famoso <<16f628a>>, disponen de interrupciones y
una Pila de 8 niveles que permite el anidamiento de subrutinas.
1.3.3 Gama mejorada: PIC 18FXXX con instrucciones de 16 bits
Microchip presento la gama mejorada de los microcontroladores PIC con la
finalidad de soportar las aplicaciones avanzadas en las aéreas de automoción,
comunicaciones, ofimática y control industrial. Sus modelos destacaron por su
alta velocidad (40 Mhz) y su gran rendimiento.
1.3.4 Los enanos de 8 patitas <<PIC AXES>>: PIC 12FXXX
Que ha acaparado la atención del mercado. Su característica principal es su
reducido tamaño, al disponer un encapsulado de 8 patitas. Se alimentan con
un voltaje de corriente continua comprendido entre 2,5 V y 5,5 V y consumen
menos de 2mA cuando trabajan a 5V y 4Mhz.
2. PIC 16F628A
El microcontrolador PIC16F628A de microchip pertenece a una gran familia de
microcontroladores de 8 bits (bus de datos) que tienen las siguientes
características generales que lo distinguen de otras familias:
Arquitectura Harvard
Tecnología RISC
Tecnología CMOS
Estas características se conjugan para lograr un dispositivo altamente eficiente en
el uso de la memoria de datos y programa, por lo tanto en la velocidad de
ejecución.
Los microcontroladores que produce Microchip cubren un amplio rango de
dispositivos cuyas características pueden variar como sigue:
Empaquetado (desde 8 a 68 patitas)
Tecnología de la memoria incluida (EEPROM,ROM,FLASH)
Voltaje de operación (desde 2.5 V hasta 6V)
Frecuencia de operación (hasta 20Mhz)
2.1 EMPAQUETADOS
Aunque cada empaquetado tiene variantes, especialmente en lo relativo a
las dimensiones del espesor del paquete, en general pueden encontrar
paquetes tipo PDIP (plastic dual in line package), PLCC (plastic leaded chip
carrier) y QFP (quad flat package)
2.2 NOMENCLATURA
En la siguiente tabla se especifican los rangos de voltaje estándar y extendido
manejados por los dispositivos.
Rango de voltaje EPROM ROM FLASH
Estándar C 4.5 a 6V CR 4.5 A 6V F 4.5 A 6V
extendido LC 2.5 A 6V LCR 2.5 A 6V LF 2 A 6V
2.3 OSCILADOR
Los PIC de rango medio permiten hasta 8 diferentes modos para el oscilador.
El usuario puede seleccionar alguno de estos 8 modos programando 3 bits de
configuración del dispositivo denominados: FOSC2, FOSC1 Y FOSC0. En
algunos de estos modos el usuario puede indicar que se genere o no una
salida del oscilador (CLKOUT) a través de una patita de Entrada/Salida. Los
modos de operación se muestran en la siguiente lista:
LP Baja frecuencia (bajo consumo de potencia)
XT Cristal (media frecuencia)
HS Alta velocidad Cristal
RC Resistencia/capacitor externos
EXTRC Resistencia/capacitor externos
EXTRC Resistencia/capacitor externos con CLCKOUT
INTRC Resistencia/capacitor internos para 4Mhz
INTRC Resistencia/capacitor internos para 4Mhz con CLKOUT
Los 3 modos LP, XT Y HS usan un cristal, la diferencia sin embargo es la ganancia
de los drivers internos, lo cual se ve reflejado en el rango de frecuencia admitido y
la potencia consumida.
2.4 DIAGRAMA DE BLOQUES DEL PIC 16F628A
En la siguiente figura se muestra una manera de bloques de organización
interna del PIC 16F628a. Se muestra también junto a este diagrama, su
diagrama de patitas, para tener una visión conjunta del interior y exterior del
Chip.
3. LENGUAJES DE PROGRAMACION PARA MICROCONTROLADORES PIC
3.1 MAQUINA
Lenguaje de maquina es el sistema de códigos directamente interpretable por
un circuito micro programable, como el microprocesador de una computadora
o el microcontrolador de una autómata. El lenguaje está compuesto por un
conjunto de instrucciones que determinan acciones a ser tomadas por la
máquina.
1111100110011
W W +68
3.2 ASSEMBLER
El lenguaje maquina es difícil de utilizar por el hombre ya que se aleja de su
forma natural de expresarse, por esto se utiliza el lenguaje assembler, que es
la forma de expresar las instrucciones de una forma más natural al hombre y
que sin embargo es muy cercana al microcontrolador por que cada uno de sus
instrucciones se corresponde con otra en código maquina que el
microcontrolador es capaz de entender.
Instrucción:
Si el dato del tmr1 es 15 ejecutar tarea uno, si no lo es ejecutar tarea 2
Movlw .15
Xorwf. Tmr1,w
Btfss status,z
Goto tarea2; F
Goto tarea1; V
3.3 LENGUAJES DE ALTO NIVEL
3.3.1 LENGUAJE C
COMPILADORES
a) CCS COMPILER
b) C18 MICROCHIP
c) PIC HIGH TECH
d) MIKRO C
3.3.2 LENGUAJE BASIC
COMPILADORES
a) PIC BASIC
b) PIC BASIC PRO
c) MIKRO BASIC
3.3.3 PASCAL
COMPILADORES
a) MIKRO PASCAL
4. COMPILADOR CCS
El compilador C de CCS ha sido desarrollado específicamente para PIC MCU,
obtenido la máxima optimización del compilador con estos dispositivos. Dispone
de una amplia librería de funciones predefinidas, comandos pre procesados y
ejemplos. Además, suministra los controladores (drivers) para diversos
dispositivos como el LCD, convertidores AD, relojes en tiempo real, EEPROM serie,
etc.
Un compilador convierte el lenguaje de alto nivel a instrucciones en código
maquina; un cross-compiler es un compilador que funciona en un procesador
(normalmente PC) diferente al procesador objeto. El compilador CCS es un cross-
compiler. Los programas son editados y compilados a instrucciones maquina en el
entorno de trabajo del PC, el código maquina puede ser cargado del PC al sistema
PIC mediante ICD2, y puede ser depurado desde el entorno de trabajo del PC.
4.1 ESTRUCTURA DEL PROGRAMA
Para escribir en un programa en C con el CCS C se debe tener en cuenta una
serie de elementos básicos de su estructura.
DIRECTIVAS DE PROCESADO, controlan la conversión del programa o
código maquina por parte del compilador.
PROGRAMAS O FUNCIONES, conjunto de instrucciones. Puede haber uno
o varios; en cualquier caso siempre debe haber uno definido como
principal mediante la instrucción <<main();>>.
INSTRUCCIONES, indican como se debe conectar el PIC en todo
momento.
COMENTARIOS, permiten describir lo que significa cada línea del
programa.
5. VARIABLES Y DATOS
5.1 TIPO DE DATOS
CCS acepta los siguientes tipos de variables
TIPO TAMAÑO RANGO DESCRIPCION
INT1
SHORT
1 BIT 0 A 1 ENTERO DE 1 BIT
INT
INT8
8 BIT 0 A 255 ENTERO
INT16
LONG
16 BIT 0 A 65,535 ENTERO DE 16 BIT
FLOAT 32 BIT
COMA FLOTANTE
CHAR 8 BIT 0 A 255 CARÁCTER
VOID - - SIN VALOR
SIGNED INT8 8 BIT -128 a 127 ENTERO CON
SIGNO
SIGNED INT16 16 BIT -32768 a 32767 ENTERO LARGO
CON SIGNO
5.2 LAS CONSTANTES
123 Decimal
01234 Octal (0)
0x123 Hexadecimal (0x)
0b010010 Binario (0b)
‘x’ Carácter
‘\012’ Carácter octal
‘\xA6’ Carácter hexadecimal
5.3 DECLARACION DE VARIABLES
Las variables se utilizan para nombrar posiciones de memoria RAM; se debe
declarar obligatoriamente, antes de utilizarlas; para ello se debe indicar el
nombre y el tipo de dato que se manejará. Se definen de la siguiente forma:
TIPO NOMBRE = [=VALOR INICIAL];
int dato1 = 0;
int dato1;
Las variables definidas pueden ser de tipo LOCAL o GLOBAL. Las varialbes
locales se utilizan solo en la función donde se encuentran declaradas mientras
que las variables globales se pueden usar en todo las funciones del programa.
Antes deben declararse antes de toda función y fuera de ellas.
int i = 240; //variable global
void main (void)
{
Int x = 9;// variable local
}
5.4 OPERADORES
5.4.1 DE ASIGNACION
+= Asignacion de suma (x=x+y)
-= Asignacion de resta (x=x-y)
*= Asignacion de multiplicacion (x=x*y)
/= Asignacion de division (x=x/y)
%= Asignacion de resto de la division (x=x%y)
<<= Asignacion desplazamiento a la izquierda (x=x<<y)
>>= Asignacion desplazamiento a la derecha (x=x>>y)
&= Asignacion AND en bits (x=x&y)
|= Asignacion OR en bits (x=x|y)
^= Asignacion XOR en bits (x=x^y)
5.4.2 ARITMETICOS
+ SUMA
- RESTA
* MULTIPLICACION
/ DIVISION
% RESTO DE LA DIVISION
++ INCREMENTO
-- DECREMENTO
a = 3;
b = 5*a++; //b=5 y a = 4
5.4.3 DE RELACION
< Menor que
> Mayor que
<= Menor igual que
>= Mayor igual que
== Igual que
¡= Diferente que
5.4.4 LOGICOS
¡ NOT
&& AND
|| OR
5.4.5 DE BITS
~ Complemento a 1
& AND
^ OR EXCLUSIVA
| OR
<< Desplazamiento a izquierda
>> Desplazamiento a derecha
6. ESTRUCTURAS DE CONTROL
6.1 ESTRUCUTURA CONTROL “IF”
Con la ayuda de la estructura de control “IF” se pueden tomar decisiones.
If(expresión){
Sentencia_1;
}
Ejemplo:
if(input(PIN_A0)==1)
{
output_low(PIN_B0);
}
6.2 ESTRUCTURA DE CONTROL IF- ELSE
Con la ayuda de la estructura de control “IF- ELSE” se pueden tomar 2 acciones
diferentes tomando en cuenta la condición inicial.
If (expresión)
{
Sentencia1;
}
Else
{
Sentencia2;
}
6.3 ESTRUCTURA DE CONTROL SWITCH
Switch es un caso particular de decisión multiple, evalua la expresión y en
orden la constante adecuada realiza las sentencias asociadas.
Switch (expresión)
{
Case constante 1:
Sentencias;
Break;
Case constante 2:
Sentencias;
Break;
…
[default:
Sentecias;]
}
6.4 ESTRUCTURA DE CONTROL WHILE
WHILE se utilize para repetir sentencias, la expresión se evalua y la sentencia
se ejecuta mientras la expresión es verdadera, cuando es falsa se sale del
WHILE.
While(expresión)
{
Sentencias;
}
6.5 ESTRUCTURA DE CONTROL DO-WHILE
Do while se diferencia del WHILE y del FOR en la condición de finalización, la
cual se evalua el final del bucle, por lo que las sentencias se ejecutan
Do
{
Sentencias;
}
While(expresión);
6.6 ESTRUCTURA DE CONTROL FOR
Se usa para repetir sentencias, en las expresiones FOR la inicialización es una
variable a la cual se le asigna un valor inicial con el que se controla el bucle.
for (inicialización; condición de finalización; incremento)
{
Sentencias;
}
* COMENTARIOS
Los comentarios en el programa facilitan la compresión de las distintas
expresiones tanto para el programador como para quien tiene que interpretar
dicho programa. No afectan a la complicación por lo que pueden ser tan extensos
como el programador quiera. Se pueden colocar en cualquier parte del programa
y con dos formatos.
Utilizando “//” al colocar estos signos se comienza el comentario y finaliza
en el final de la línea.
//esto es un comentario.
Utilizando /* y */ se debe utilizar al inicio y al final del comentario, pero no
puede repetirse dentro del mismo comentario.
/* Esto es un comentario*/
7. DIRECTIVAS DEL COMPILADOR
7.1 #Include
Agrega archivos de inclusión, librerías o archivos de cabecera.
#include<archivo>
Ejemplos
#include<16f628a.h>
#include<cceaviet_lcd.c>
7.2 #Fuses
Asigna valores a la palabra de configuración, lo cual permite programar un pic,
no todos los PIC tiene las mismas fuses.
#fuses config1, config2 ….
Ejemplos
#fuses HS, NOLVP, NOWDT, NOMCLR
7.3 #Use
Se utiliza para configurar algunas funciones especiales como la configuración
del clock.
#use delay(clock=fosc)
Ejemplos
#use delay (clock = 4M);
7.4 #Byte
Define a un registro como variable
#byte nombre = dirección RAM
Ejemplos
#byte timer0 = 1 Guardado en dirección 1
7.5 #ASM y #ENDASM
Permiten utilizar código ensamblador en el programa C, se utilizan al inicio y al
final del bloque ensamblador.
Ejemplo
#asm
Bsf status,rp0
Movlw 0x8
Movwf portb
Bcf status,rp0
#endasm
8. FUNCIONES DE ENTRADA Y SALIDA (E/S)
El compilador ofrece funciones predefinidas para trabajar con los puertos.
Estas funciones son:
8.1 SET_TRIS_X
Set_tris_x asigna un valor a los registros trisx, el cual se indicará que pines
están distribuidos como entrada o salida.
Set_tris_x(valor)
X= a,b,c,d,e…
Ejemplo
Configurar el puerto B del pin 3 a 0 (RB 3-0) entrada y el del pin 4 a 7 como
salida.
Set_tris_b(0b00001111);
Set_tris_b(15);
8.2 ENTRADA
8.2.1 INPUT()
La function INPUT lee el valor de un solo pin
=input(pin);
Ejemplo
Int x;
Set_tris_a(255);
X=input(pin_a3);//se asigna la variable x para la entrada del pin del puerto a3
8.2.2 INPUT_X
La función INPUT_X lee el valor de todo el registro del puerto x.
=input_x();
Ejemplo
Int m;
Set_tris_b(255);
m= input_b();
Se asigna la variable m para registrar la informacion del todo el Puerto b, que
fue asignado como entrada.
8.2.3 INPUT_STATE()
Lee el valor del pin sin cambiar el sentido del terminal.
=input_state(pin);
8.3 SALIDA
8.3.1 OUTPUT_LOW
Escribe el valor de ‘0’ en el pin asignado
=output_low(pin);
Ejemplo
Set_tris_b(0);
Output_low(pin_b4);
Lo que indica que por el Puerto 4 saldra el valor de ‘0’.
8.3.2 OUTPUT_HIGH
Escribe el valor de ‘1’ en el pin asignado
=output_high(pin);
Ejemplo
Set_tris_b(0)
Output_high(pin_b3);
Lo que indica que por el puerto 4 saldra el valor de ‘1’.
8.3.3 OUPUT_TOGGLE
Esta función complementa la salida del valor del pin.
=output_toggle(pin);
8.3.4 OUTPUT_X
Escribe un valor en el registros de portx.
=output_x(valor);
Ejemplo
Set_tris_b(0);
Output_b(255);
Aplicando este ejemplo por el Puerto sacaremos el dato 255, que en binario es
11111111.
8.4 #USES
8.4.1 #USE STANDARD_IO(X)
Con esta directiva las funciones de entrada y salida configuran como entrada
(o salida); antes de leer lo escriben como salida en pin o en puerto.
=#use standard_io(x)
EJEMPLO
#INCLUDE<16F877a.h>
#FUSES hs,nolvp,nowdt
#USE DELAY(CLOCK = 20M)
#USE standard_io(a)
8.4.2 #USE FAST_IO(X)
Con esta directiva las funciones de entrada solo leen el valor del pin o el
puerto y las funciones de salida, solo intentan escribir sobre el bit con el pin
del puerto.
#use fast_io(x)
EJEMPLO
#INCLUDE<16F877a.h>
#FUSES hs,nolvp,nowdt
#USE DELAY(CLOCK = 20M)
#USE fast_io(a)
#USE fast_io(b)
9. FUNCIONES DE RETARDO
9.1 DELAY_MS
La function delay_ms genera retardos en milisegundos
Delay_ms(t)
Donde 0<t<63535
9.2 DELAY_US
La función delay_us genera retardos en microsegundos
Delay_us(t)
Donde 0<t<63535
9.3 DELAY_CYCLE
La función delay_cycle genera retardos a manera de ciclo su aplicación es cuando
se trabaja con punteros.
Delay_cycle(t)
10. FUNCIONES
Una función es un conjunto de instrucciones que realiza una tarea
determinada para entregar un valor, tomando en cuenta valores de entrada.
10.1 Función principal
Void main (void)
{
Algoritmo principal
}
Ejemplo
Void main (void)
{
Int a=3,b=15,c,d;
C= a+b;
D=a-b;
}
10.2 Funcion
Function(); //invocada en funcion main
Tipo nombre_funcion (tipo nombre;tipo_nombre2…)
{
Instrucción
}
OBS. VOID VACIO
Ejemplo
Int promedio (int x, int y)
{
Int temp;
Temp=(x+y)/2;
Return(temp);
}
11. LED Y APLICACIONES CON LEDS
Un led es un diodo semiconductor que emite luz. Se usan como indicadores de
muchos dispositivos, y cada vez con mucho más frecuencia, en iluminación, los
primeros leds emitían luz roja de baja intensidad, pero con los dispositivos
actuales emiten luz en el espectro infrarrojo, visible y ultravioleta.
APLICACIÓN 1
“Encender un led por 1 segundo y apagarlo por 1 segundo”
Antes de comenzar a trabajar con los proyectos y teniendo en cuenta el
entorno de trabajo del ccs, pues tengamos estas recomendaciones pendientes
para el trabajo.
Indicar que microcontrolador usaremos.
Indicar la frecuencia de trabajo.
Indicar si la frecuencia se hará con fuente externa o interna.
Y por ultimo indicar e identificar los pines que se utilizaran
Para esta aplicación las cosas que tendremos en cuenta serán, tener un
diagrama de flujo para el trabajo que haremos, y escribir las directivas
correspondientes comenzemos.
Utilizaremos el pin B0, con una frecuencia de 4MHZ y con reloj interno de
nuestro pic 16F628A.
//PRENDER UN LED POR 1 SEGUNDO Y LUEGO APAGARLO POR 1 SEGUNDO
#INCLUDE<16F628A.h>
#FUSES intrc,NOLVP,NOWDT,NOMCLR
#USE DELAY(CLOCK = 4M)
void main (void)
{
while(true)
{
output_high(PIN_B0);
delay_ms(1000);
output_low(PIN_B0);
delay_ms(1000);
}
}
Como se observa primero se utilizo la función #include<> donde
especificamos el microcontrolador que estamos aplicando, seguido de la
función #fuses que nos indica las condiciones de configuración como el reloj
interno y otros.
Se utilizo la función #use_delay(4M) con el fin de tener una frecuencia de
trabajo de 4Mhz, y una función principal void main(void) donde dentro de esta
función se aplico un bucle cerrado e infinito con la estructura while.
Y el trabajo para poder prender y apagar el led se usaron las directivas de
salida output_high y output_low sobre el pin RB0. Con lo que resulta una
buena aplicación para comenzar en el mundo de la programación de
microcontroladores PIC.
Ahora te reto a poder realizar estos 2 ejercicios.
Se tiene 2 leds, conectados en los pines rb0 y rb1, cuando se prende el
primer led, el otro esta apagado y viceversa, aplicando un retaro de 3
segundos.
Nota: para esta aplicación peudes usar las salidas output_high y
output_low, además del delay_ms(3000).
Con todo el puerto b, generar la serie de luces del 0 al 255, con un
retardo de 1 segundo.
Nota: recordar que el valor de 0 en binario es 00000000 y el de
255 es de 11111111, lo puedes trabajar con una función FOR y
la función output_b().
Generar la siguiente serie: 128, 64, 32, 16, 8, 4, 2, 1 Aplicando el
puerto b con un retardo de 1 segundo, y cuando llegue a 1 que vuelva a
comenzar de 128.
Nota: cambia los valores decimales a binarios para que te
puedan ayudar a reconocer el orden de la salida de los leds.
12. APLICACIONES CON INTERRUPTORES Y BOTONES
Los botones e interruptores nos ayudan a tener una acceso de que se puede
activar con ellos, y no solo pueden ser estos se pueden tomar como entrada
todo tipo de sensores ultrasonidos, de luz, etc, el fin principal es que nos den
una señal ‘0’ o ‘1’ a la entrada del PIC, para poder aplicar lo trabajado.
Aplicación 1
“Encendiendo un led con un interruptor”
#INCLUDE<16F628a.h>
#FUSES intrc,nolvp,nowdt
#USE DELAY(CLOCK = 4M)
#USE fast_io(a)
#USE fast_io(b)
void main(void)
{
port_b_pullups(true);
set_tris_a(255);
set_tris_b(0);
output_b(0);
while(true)
{
if(input(PIN_A0)==1)
{
output_low(PIN_B0);
}
else
{
output_high(PIN_B0);
}
}
}
Como se observa la entrada donde se ubica el interruptor es el puerto a1, y la
salida es el puerto b0, donde se observa que hay un bucle cerrado while, además
de la condición if-else que siempre pregunta por el estado de A1, con el fin de
activar o no la salida B0.
Aplicación 2
“Secuencia de luces con botón activador”
#INCLUDE<16F877a.h>
#FUSES hs,nolvp,nowdt
#USE DELAY(CLOCK = 20M)
#USE fast_io(a)
#USE fast_io(b)
void main(void)
{
port_b_pullups(true);
set_tris_a(255);
set_tris_b(0);
output_b(0);
int i = 0;
while(true)
{
bucle:if (input(PIN_A0)==0)
{
delay_ms(30);
if(input(PIN_A0)==0) goto bucle;
if(i<=255)
{
i++;
output_b(i);
}
else
{
output_b(0);
}
}
}
}
Como se observa en este caso cada vez que se presione el botón ubicado en el
pin a0, se activara el contador que indicara la nueva secuencia de leds que esta
dada de 0 a 255, con la condición final de que cuando llegue a 255 y se vuelva a
presionar el led, se volveré a 0 la cuenta.
Qué pasaría si en vez de un botón en este ejemplo se usa un
interruptor.
Generar esta secuencia de leds 1,2,4,8,16,32,64,128 con la condición
que cambien siempre que se presione el botón del puerto a0.
13. APLICACIONES CON DISPLAYS DE 7 SEGMENTOS
Los displays son muy utilizados para visualizar datos. Por lo que su aplicación
es importante en el campo de las mediciones, sus aplicaciones son varias, en
balanzas, calculadoras básicas, etc, el display de 7 segmentos es un arreglo de
leds con los cuales se puede al trabajarse en conjunto se visualiza el dato que
se quiere.
*ARREGLOS
La aplicación de arreglos es importante en el trabajo con displays de 7
segmentos y de matrices de leds.
Tipo [const] nombre [n] = {datos}
Const constante
n cantidades
Ejemplo
Int const hola [4];
Hola[0];
Hola[1];
Hola[2];
Hola[3];
En total 4 elementos de ese arreglo de elementos.
A continuación con los ejemplos quitaremos dudas de esta aplicación.
Aplicación 1
“Contador de 0 – 9 con un display de 7 segmentos”
#INCLUDE<16F628a.h>
#FUSES mclr,intrc,nolvp,nowdt
#USE DELAY(CLOCK = 4M)
#USE FAST_IO(A)
#USE FAST_IO(B)
void main (void)
{
set_tris_b(0);
set_tris_a(0);
int i;
int const conteo[10]={63,6,91,79,102,109,125,7,127,111};
output_high(pin_a0);
output_b(0);
do
{
for(i=0;i<=9;i++)
{
output_b(conteo[i]);
delay_ms(1000);
}
}
while(true);
}
DIAGRAMA PARA CONTADOR DE 7 SEGMENTOS CON INTEGRADOS TTL 7447
Aplicacion 2
“Contador de 0 a 99 con 2 display de 7 segmentos en simultaneo”
#INCLUDE<16F628a.h>
#FUSES intrc,nolvp,nowdt,mclr
#USE DELAY(CLOCK = 4M)
#USE FAST_IO(A)
#USE FAST_IO(B)
void main(void)
{
port_b_pullups(true);
int uni,dec,i;
int const conteo[10]={63,6,91,79,102,109,125,7,127,111};
set_tris_a(0);
set_tris_b(0);
while(true)
{
for(dec=0;dec<=9;dec++)
{
for(uni=0;uni<=9;uni++)
{
for(i=1;i<=40;i++)
{
output_a(1);
output_b(conteo[uni]);
delay_ms(5);
output_a(2);
output_b(conteo[dec]);
delay_ms(5);
}
}
}
}
}
CIRCUITO PARA CONTADOR DE 0 A 99 CON DISPLAY DE 7 SEGMENTOS
14. APLICACIONES CON MATRIZ DE LED 7 X 5
Estos displays son bastante utilizados hoy en dia para mostrar todo tipo de
mensajes de una manera mas expresiva, se utiliza en la mayoría de negocios,
bancos, tiendas hasta en autobuses donde trabajando con estos matrices de leds
se pueden tener varias aplicaciones, existen de varios tipos esta de 7x5 es una
básica donde se explicara el fundamento para poder trabajar con estas matrices.
Aplicación 1
“Generar un hombrecito en movimiento con la matriz de 7 segmentos”
#include <16f877a.h>
#fuses xt,nolvp,nowdt
#use delay(clock = 4M)
void main(void)
{
int i,j;
set_tris_b(0);
set_tris_c(0);
output_b(0);
output_c(0);
int const columna[5]={1,2,4,8,16};//puede ser tambien{1,2,4,8,16}
int const dibujo1[5]={111,88,7,88,111};//
int const dibujo2[5]={95,88,7,88,95};
int const dibujo3[5]={63,88,7,88,63};
while(true)
{
for(j=1;j<=10;j++)
{
for(i=0;i<=4;i++)
{
output_b(columna[i]);
output_c(dibujo1[i]);
delay_ms(4);
}
}
for(j=1;j<=10;j++)
{
for(i=0;i<=4;i++)
{
output_b(columna[i]);
output_c(dibujo2[i]);
delay_ms(4);
}
}
for(j=1;j<=10;j++)
{
for(i=0;i<=4;i++)
{
output_b(columna[i]);
output_c(dibujo3[i]);
delay_ms(4);
}
}
for(j=1;j<=10;j++)
{
for(i=0;i<=4;i++)
{
output_b(columna[i]);
output_c(dibujo2[i]);
delay_ms(4);
}
}
}
}
Diagrama de armado para la matriz de leds de 7 x 5
15. LCD
Los módulos LCD son utilizados, para mostrar mensajes que indican al
operario el estado de la maquina, o dar instrucciones, mostrar valores y datos,
etc. El LCD permite una comunicación entre maquina y persona este puede
mostrar cualquier formato ascii, según el modelo que se tenga, el modelo mas
usado es el LCD de 16 x 2 hitachi.
15.1 CONFIGURACION
#define use_portx_lcd_true
#include <lcd.c> . librería principal
*obs. Para el entrenador del centro cultural se utilizara la librería
#include<cceavet_lcd.c>
15.2 FUNCIONES
LCD_INIT();
Esta función inicializa el LCD.
LCD_PUTC();
Esta función permite ingresar un dato
Lcd_putc(n);//el valor de n
Lcd_putc(“hola”)//ingresa la cadena hola
\f; Borra la pantalla
\n; Pasa a al siguiente línea
\b; retrocede 1 espacio.
Printf; es la función de impresión para datos en cadena.
Printf(lcd_putc,”\fhola”);
Long x = 9741;
Printf(lcd_putc,x_values%l,x)
APLICACIÓN 1
“mostrar por el LCD la letra a, y despues de un tiempo mostrar la frase ‘hola
muchachos’”
#INCLUDE <16f628a.h>
#FUSES intrc,nolvp,mclr,nowdt
#USE delay(clock = 4M)
#DEFINE use_portb_lcd_true
#INCLUDE <lcd.c>
// rs ------ RB1
// rw ------ RB2
// e ------ RB0
// d4 ------ rb4
// d5 ------ rb5
// d6 ------ rb6
// d7 ------ rb7
void main (void)
{
int i = 10;
lcd_init();
lcd_putc(i);
delay_ms(1000);
lcd_putc("a");
delay_ms(1000);
lcd_putc("\fhola");
delay_ms(1000);
lcd_putc("\fhola\nmuchachos");
}
16. TECLADO MATRICIAL
Los teclados matriciales son bastante útiles para ingresar datos, un ejemplo de
ellos es el teclado del computador, el teclado de una alarma nos permite armar
y desarmar un sistema de seguridad de una caja fuerte o una cerradura
eléctrica, para introducirnos en el manejo de un teclado, se hará un proyecto
para poder observar su modo de trabajo brindando ideas varios proyectos.
16.1 CONFIGURACION
Para la configuración del teclado se tiene que invocar la siguiente librería.
#include<teclado.c>
16.2 FUNCIONES
La función para usar el teclado es solo esta de aca:
=teclado();
La cual espera que la tecla sea presionada y la envía como dato ascii.
APLICACIÓN 1
“presionar un tecla y mostrar el valor por el LCD”
#include <16f877a.h>
#fuses xt,nolvp,nowdt
#use delay (clock = 4M)
#define use_portd_lcd_true
#include <lcd.c>
#include <teclado.c>
void main(void)
{
int x,i=0;
lcd_init();
while(true)
{
x = teclado();
write_eeprom(i,x);//grabando en la eeprom
lcd_putc(x);
i++;
}
}
DIAGRAMA DE TECLADO MATRICIAL CON LCD