Logo Studenta

Microcontroladores PIC

¡Este material tiene más páginas!

Vista previa del material en texto

CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 1 
 
MICROCONTROLADORES PIC (PERIPHERICAL INTERFACE 
CONTROLLER) 
Los Pic´s son una familia de microcontroladores tipo RISC (Reduced Instruction 
Set Computer) fabricados por Microchip Technology Inc. y derivados del PIC1650 
originalmente desarrollado por la división de microelectrónica de General 
Instruments. 
CISC (Complex Instruction Set Computer). -Procesadores con un juego de 
instrucciones complejo. 
RISC (Reduced Instruction Set Computer). -Procesadores con un repertorio 
reducido de instrucciones. 
SISC (Specific Instruction Set Computer). -Procesadores con un juego de 
instrucciones específico para cada aplicación. 
El nombre actual no es un acrónimo, en realidad el nombre completo es PICmicro, 
aunque generalmente se utiliza Peripheral Interface Controller (Controlador de 
Interfaz Periférico). 
El PIC original se diseñó para ser usado con la nueva CPU de 16 bits CP16000. 
Siendo en general una buena CPU, ésta tenía malas prestaciones de E/S, el PIC 
de 8 bits se desarrolló en 1975 para mejorar el rendimiento del sistema quitando 
peso de E/S a la CPU. El PIC utilizaba micro-código simple almacenado en ROM 
para realizar estas tareas; y aunque el término no se usaba por aquel entonces, se 
trata de un diseño RISC que ejecuta una instrucción cada 4 ciclos. 
En 1985 la división de microelectrónica de General Instruments se separa como 
compañía independiente que es incorporada como filial y el nuevo propietario 
cancelo la mayoría de los desarrollos, que para ese entonces ya eran obsoletos. 
El PIC sin embargo se mejoró con EPROM para conseguir un controlador de canal 
programable. Actualmente los PIC´s contienen varios periféricos y memorias 
programables de 512 a 32000 palabras (Una palabra corresponde a una 
instrucción en lenguaje ensamblador y puede ser 12, 14 o 16 bits dependiendo del 
tipo de PIC). 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 2 
 
CARACTERÍSTICAS ELÉCTRICAS DEL PIC 18F4550 
Los microcontroladores PIC 18F4550 tienen características de operación que 
debemos conocer, para tomar las precauciones necesarias en su manejo, para 
evitar causarle algún daño al dispositivo. 
A continuación, citamos las características más importantes de los 
microcontroladores PIC 18F4550: 
 F = Memoria Flash habilitada para trabajar de 4.2 a 5.5 Volts 
 LF = Bajo voltaje de 2.0 a 5.5 Volts. 
 Rango de temperatura de sesgo -40°C a 85°C 
 Temperatura mantenida -65°C a 150°C 
 Voltaje en VDD con respecto a VSS -0.3 a 7.0Volts 
 Corriente Máxima en VDD = 300mA 
 Corriente Máxima en VSS = 250mA 
 Corriente Máxima en cualquier pin = 25mA 
 Corriente Máxima en todos los puertos = 200 mA. 
 
ENCAPSULADO DEL PIC 18F4550. 
 En la siguiente figura se muestra la estructura interna del microcontrolador PIC 
18F4550, esta nos será de gran utilidad debido a que físicamente corresponde al 
encapsulado, y por lo tanto será la base del alambrado de todo circuito de control 
desarrollado con este microcontrolador. 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 3 
 
PERIFÉRICOS. 
Los periféricos son todos aquellos dispositivos externos que se conectan al 
microcontrolador, tienen como objeto acondicionar las señales externas para 
poder ser ingresadas al dispositivo, así como para acoplar las señales de salida 
del microcontrolador hacia la etapa de potencia. 
Sabemos que cada pin de Entrada/Salida (E/S) del microcontrolador soporta 
cargas máximas de 25mA, y voltajes tipo TTL (5 volts), esto nos permite ver que 
solo podemos conectar a estos elementos, dispositivos de baja potencia como el 
LED o algún tipo de transistor similar. 
Para activar elementos de mayor potencia es necesario usar configuraciones 
especiales que nos permitan generar etapas escalonadas de potencia, realizando 
la función de transductores, como es el caso de los arreglos Darlington con 
transistores, o a través de optoacopladores y optotriacs. 
Existen arreglos encapsulados en circuitos integrados, como es el caso del 
ULN2003 que cuenta con 7 arreglos de transistores tipo Darlington, los cuales se 
pueden alimentar en su entrada a 5 volts de corriente directa y consume corrientes 
menores a 20mA, en su salida funcionan como inversores, soportan corrientes de 
hasta 500mA y voltajes que van de 5 hasta 36 volts de corriente directa, lo que los 
convierte en un sistema de acoplamiento efectivo entre las etapas de control, y 
potencia. 
A continuación, mostramos algunos elementos empleados para el acoplamiento 
entre etapas. 
 
 
TRANSISTOR BD135 
CORRIENTE DE COLECTOR MÁXIMA 1.5 A 
VOLTAJE DE COLECTOR MÁXIMO 45 
BETA (β) 40 / 250 
 
 
 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 4 
 
MODELO Ic max Vcc max BETA (β ) 
2N22 600 mA 40 V 100/300 
BC107 100 mA 45 V 100/450 
BD135 1.5 A 45 V 40/250 
TIP122 5A 100 V 1000 
 
CARACTERÍSTICAS ELÉCTRICAS DE RELEVADORES MODELO SUN HOLD. 
VOLTAJE AL QUE 
OPERAN 
RESISTENCIA DE LA 
BOBINA 
CORRIENTE DE 
ENERGIZACIÓN 
5 VOLTS. 69 Ω 72 mA. 
6 VOLTS. 100 Ω 60 mA. 
9 VOLTS. 225 Ω 40 mA. 
12 VOLTS. 400 Ω 30 mA. 
18 VOLTS. 900 Ω 20 mA. 
 
Los microcontroladores PIC 18F4550 son dispositivos empleados en el diseño de 
sistemas automatizados, su programación es a través del lenguaje ensamblador, ó 
por medio de un compilador (Un software cuya función es convertir un código en 
lenguaje de alto nivel a código máquina). 
Nosotros utilizaremos el compilador “PIC C Compiler”, posteriormente lo 
grabaremos al microcontrolador con la ayuda de un software conocido como PIC 
Kit 2, y un programador. 
Debido a que el compilador es un convertidor de código es necesario que 
conozcamos el lenguaje de alto nivel que emplearemos (en este caso se trata del 
lenguaje c), las librerías, tipos de variables, funciones, arreglos etc. 
 
USO DE LOS PUERTOS COMO ENTRADAS-SALIDAS DIGITALES. 
 
Los microcontroladores en general están constituidos por grupos funcionales que 
reciben el nombre de puertos, cada uno contiene un conjunto de pines, según su 
uso realizaran una con función en especial. 
El primer caso es el manejo de pines como líneas de entrada-salida. 
Empezaremos por establecer que cada puerto corresponde a un byte (8bits) de 
información, ahora bien, un bit físicamente corresponde a un pin del dispositivo en 
específico, sin embargo, esto no quiere decir que un puerto cuente con 8 pines 
físicamente (tal vez solo tenga dos pines). A pesar de esto en la configuración 
inicial del programa consideraremos la existencia de los 8 bits. 
Cada pin podrá ser utilizado como una línea de entrada o salida, al emplearse 
como entrada, en la configuración se le declarará el número 1, de lo contrario (si 
se usa el pin como salida) se declara el número 0. 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 5 
 
Ahora veamos el primer ejemplo de la programación para un PIC 18F4550, el cual 
realizará el arranque y paro de un motor (primero manejaremos el ciclo repetitivo 
DO-While). 
 
 
 
 
#include “arranque.h” //Archivo generado por el usuario 
void main() //Inicio del programa 
{ 
 setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b0000011); // Configuración del Puerto E/S los pines a0 y a1 sedefinen como entradas, los demás como salidas 
do //Inicio del ciclo repetitivo do-while 
{ 
if(input(pin_a0)) //Condicional si hay señal en la entrada a0 
{ 
output_high(pin_a7); // Activación de la salida a7 
} 
if(input(pin_a1)) //Condicional si hay señal en la entrada a1 
{ 
output_low(pin_a7); // Desactivación de la salida a7 
} 
} 
while (true); //Fin del ciclo repetitivo do-ba7); 
} 
if(input(pin_a1)) 
{ 
output_low(pin_a7); 
} 
} 
} 
 
Como podemos ver en los dos casos la secuencia realiza la misma función, 
aunque con la única variación del uso de diferentes estructuras repetitivas. 
A continuación, mostramos una serie de ejercicios en los que se emplean ambas 
estructuras (for y do-while), bajo diferentes condiciones. 
 
 
 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 6 
 
El siguiente ejercicio corresponde a una prensa que troquela un producto, para 
que el cilindro realice la acción se considera que el operador debe cerrar una 
guarda de seguridad y presionar el botón de inicio. 
Solamente se inicia el proceso si se cumplen las dos condiciones. 
 
 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 7 
 
PRENSA 
#include “arranque.h” 
void main() 
{ 
setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b00000111); 
do 
{ 
if(input(pin_a0) && input(pin_a1)) 
{ 
output_high(pin_a3); 
} 
if(input(pin_a2)) 
{ 
output_low(pin_a3); 
} 
} 
while (true); 
} 
 
PRENSA 
#include “arranque.h” 
void main() 
{ setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b00000111); 
for(;;) 
{ 
if(input(pin_a0) && input(pin_a1)) 
{ 
output_high(pin_a4); 
} 
if(input(pin_a2)) 
{ 
output_low(pin_a4); 
} 
} 
 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 8 
 
Ahora veremos el ejemplo en el cual un motor eléctrico se puede arrancar desde 
dos puntos diferentes, además la marcha también podrá detenerse desde dos 
lugares diferentes como se ve a continuación. 
 
ARRANQUE Y PARO DESDE DOS PUNTOS DIFERENTES 
#include “arranque.h” 
void main() 
{ Setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b00001111); 
do 
{ 
if(input(pin_a0) || input(pin_a1)) 
{ 
output_high(pin_a4); 
} 
if(input(pin_a2)||input(pin_a3)) 
{ 
output_low(pin_a4); 
} 
} 
while (true); 
} 
 
ARRANQUE Y PARO DESDE DOS PUNTOS DIFERENTES 
#include “arranque.h” 
void main() 
{ Setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b00001111); 
for(;;) 
{ 
if(input(pin_a0) || input(pin_a1)) 
{ 
output_high(pin_a4); 
} 
if(input(pin_a2)||input(pin_a3)) 
{ 
output_low(pin_a4); 
} 
} 
} 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 9 
 
Ahora veremos la utilidad del uso de variables en el desarrollo de sistemas, en los 
cuales se lleva a cabo una acción (o no) dependiendo del estado anterior del 
sistema. 
El caso más simple es el que se presenta a continuación, en este caso se 
pretende que al presionar un botón arranque un motor eléctrico en sentido horario, 
al presionar un segundo botón deberá iniciar su marcha en sentido anti-horario, un 
tercer botón servirá para detener la marcha del motor independientemente del 
sentido al que se encuentre girando, la condición primordial de este sistema es 
que si el motor está en marcha hacia uno de los sentidos, la máquina no pueda 
ser activada en sentido contrario. 
ARRANQUE, PARO Y REVERSA DE UN MOTOR TRIFÁSICO. 
#include “arranque.h” 
Int A,R; 
void main() 
{ setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b00000111); 
doh 
{ 
if(input(pin_a0) && R==0 &&!input(pin_a2)) 
{ 
output_high(pin_a3); 
A=1; 
} 
if(input(pin_a1)&&A==0&& !input(pin_a2)) 
{ 
output high(pin_a4); 
R=1; 
} 
If(input(pin_a2)) 
{ 
output low(pin_a3); 
output low(pin_a4); 
A=0; 
R=0; 
} 
} 
while (true); 
} 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 10 
 
ARRANQUE, PARO Y REVERSA DE UN MOTOR TRIFÁSICO. 
#include “arranqueyreversa.h” 
Int A,R; 
void main() 
{ setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b00000111); 
for(;;) 
{ 
if(input(pin_a0) && B==0 &&!input(pin_a2)) 
{ 
output_high(pin_a3); 
A=1; 
} 
if(input(pin_a1)&&A==0&& !input(pin_a2)) 
{ 
output high(pin_a4); 
R=1; 
} 
If(input(pin_a2) 
{ 
output low(pin_a3); 
output low(pin_a4); 
A=0; 
R=0; 
} 
} 
} 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 11 
 
Como podemos ver en el caso anterior las variables nos han servido como 
seguros para evitar que se active la máquina en el sentido opuesto. 
 
Ahora veamos un ejemplo con una selladora automática que al presionar el botón 
de inicio es desplazado el objeto a sellar, posteriormente se activa el cilindro que 
realiza el sellado, finalmente un tercer cilindro desplaza la pieza ya sellada. 
 
SELLADORA 
#include “arranque.h” 
Int A,B; 
void main() 
{ setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b00011111); 
for(;;) 
{ 
if(input(pin_a1) &&! input(pin_a0) &&A==0 && B==0 ) 
{ 
output_high(pin_a5); 
} 
If(input(pin_a2)) 
{output low(pin_a5); 
output high(pin_a6); 
A=1; 
B=0; 
} 
If (input(pin_a3)) 
{ 
output low(pin_a6); 
output high(pin_a7); 
A=0; 
B=1; 
} 
If (input(pin_a4)) 
{ 
output low(pin_a7); 
A=0; 
B=1; 
} 
} 
} 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 12 
 
SELLADORA 
#include “arranque.h” 
Int A,B; 
void main() 
{ setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b00011111); 
do 
{ 
if(input(pin_a1) &&! input(pin_a0) &&A==0 && B==0 ) 
{ 
output_high(pin_a5); 
} 
If(input(pin_a2)) 
{output low(pin_a5); 
output high(pin_a6); 
A=1; 
B=0; 
} 
If (input(pin_a3)) 
{ 
output low(pin_a6); 
output high(pin_a7); 
A=0; 
B=1; 
} 
If (input(pin_a4)) 
{ 
output low(pin_a7); 
A=0; 
B=1; 
} 
} 
while (true); 
} 
 
Como podemos ver en este caso las variables se han utilizado para establecer si 
una acción se ha llevado a cabo e iniciar la nueva etapa. 
 
Otra aplicación de las variables es cuando deseamos llevar a cabo el conteo de 
eventos, que nos permitirá iniciar un proceso o detenerlo basándonos en el 
resultado de dicha acción. 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 13 
 
Ejemplo: 
La puerta de un auditorio se encuentra abierta, y así se mantendrá hasta que un 
sensor detecte que han ingresado 20 persona, después de esto se cerrara la 
puerta por 10 segundos para después abrirse nuevamente e iniciar el conteo una 
vez más a partir de cero. 
 
Nota: El cierre y la apertura de la puerta se realiza a través de un cilindro de doble 
efecto, controlado por una electroválvula 4/2 monoestable. 
 
 
#include "contador1.h" 
void main() 
{ 
int A=0; 
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); 
set_tris_a(0b11111111); 
set_tris_b(0b00000000); 
for(;;) 
{ 
if (input(pin_a0)) 
{A=A++; 
delay_ms(500); 
} 
if(A==20) 
{ 
output_high(pin_b0); 
delay_ms(10000); 
output_low(pin_b0);A=0; 
} 
} 
} 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 14 
 
Ejemplo: 
Ahora veremos el caso de una habitación en la cual solo pueden entrar 20 
personas, se tiene una puerta de entrada y una de salida, cuando la habitación 
tiene el cupo máximo, la puerta de acceso se cierra, en el momento en que la 
habitación libera uno o más espacios la puerta de acceso se abre. 
Nota: Se cuenta con dos sensores uno a la entrada y otro a la salida para realizar 
el conteo. El cierre y la apertura de la puerta se realiza a través de un cilindro de 
doble efecto, controlado por una electroválvula 4/2 biestable. 
 
#include "contador2.h" 
void main() 
{ 
int A=0; 
 
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); 
set_tris_a(0b11111111); 
set_tris_b(0b00000000); 
 
for(;;) 
{ 
if (input(pin_a0)) 
{ 
A=A++; 
delay_ms(500); 
} 
if(input(pin_a1)) 
{ 
A=A--; 
delay_ms(500); 
} 
if(A==0) 
{ 
output_high(pin_b0); 
output_low(pin_b1); 
} 
if(A==20) 
{ 
output_low(pin_b0); 
output_high(pin_b1); 
} 
} 
} 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 15 
 
SECUENCIAS TEMPORIZADAS 
 
En muchos procesos automáticos se llevan a cabo acciones que deben ejecutarse 
después de que se ha pulsado un botón, arrancado un dispositivo, detectado una 
actividad, etc. 
El compilador CCS contiene en su librería principal una serie de instrucciones que 
nos sirven para establecer retardos de tiempo entre dos ó más acciones, las 
cuáles deben seguir una sintaxis, que mostramos en la siguiente tabla. 
 
 
Sintáxis Tipo de retardo 
delay_cicles ( ) Retardo de tiempo en ciclos 
delay_us ( ) Retardo de tiempo en micro-segundos 
delay_ms ( ) Retardo de tiempo en mili-segundos 
 
 
 
Para visualizar un poco la aplicación de los retardos de tiempo tomaremos como 
ejemplo un generador de pulsos, basado en el circuito integrado 555 en su 
configuración astable (Como veremos, este generador de pulsos es más sencillo 
en su forma física con el PIC 18F4550 que de la forma tradicional). 
 
 
555 astable 
#include “parpadeo” 
#define DEL 2000 
void main () 
{ 
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); 
set_tris_a(0b00000000); 
 
do 
{ 
output_low(pin_a2); 
delay_ms(DEL); 
output_high(pin_a2); 
delay_ms (DEL); 
} 
while (true); 
} 
 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 16 
 
Ahora tomaremos el ejemplo en el cual al presionar el botón de arranque inicia la 
marcha un primer motor, después de un tiempo que en este caso son 3 segundos 
se activa el segundo motor, al presionar el botón paro el último motor en arrancar 
deberá detener primero la marcha, y el primero en arrancar se detendrá tres 
segundos después. 
SECUENCIA DE MOTORES 
#include “sec.h” 
#define DEL 3000 
void main() 
{setup………….. 
set_tris_a(0b00000011); 
set_tris_b(0b00000000); 
 
do 
{ 
if(input(pin_a0)) 
{ 
output_high(pin_b0); 
delay_ms(DEL); 
output_high(pin_b1); 
 
} 
if(input(pin_a1)) 
{ 
output_low(pin_b1); 
delay_ms(DEL); 
output_low(pin_b0); 
 
} 
} 
while (true); 
} 
 
 
Ahora realizamos un ejercicio para construir una expendedora de refrescos. 
Según sea la elección del usuario se activará una salida que será acorde al 
producto deseado. 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 17 
 
EXPENDEDORA DE REFRESCOS 
#include “refresco.h” 
Int A; 
void main() 
{ setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b11111111); 
set_tris_b(0b00000000); 
do 
{ 
if(input(pin_a0)) 
{A=1;} 
If(input(pin_a1)) 
{A=2;} 
If (input(pin_a2)) 
{A=3;} 
If (input(pin_a3)) 
{A=4;} 
switch(A) 
{ 
case 1: 
{output high(pin_b0); 
delay_ms(5000); 
output low(pin_b0); 
break; 
} 
case 2: 
{output high(pin_b1); 
delay_ms(5000); 
output low(pin_b1); 
break; 
} 
case 3: 
{output high(pin_b2); 
delay_ms(5000); 
output low(pin_b2); 
break; 
} 
case 4: 
{output high(pin_b3); 
delay_ms(5000); 
output low(pin_b3); 
break; 
} 
} 
while (true);} 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 18 
 
Nota: En este último ejemplo utilizamos le estructura de selección múltiple switch 
(aunque también se pudo haber empleado la condicional if ó if-else), por lo que 
podemos concluir que según los recursos o imaginación del programador se 
pueden emplear diferentes elementos de la programación en C. 
 
PANTALLA LCD 
 
En un sistema de control, es importante visualizar el estado del proceso, esta 
función la realiza un dispositivo conocido como “display”. 
El primer display que se construyo está conformado por siete LED´s conectados 
en un punto común (ánodo o cátodo), por lo que se le conoce como display de 
siete segmentos. Al tener que alimentar siete LED´s para formar un número, este 
tipo de dispositivos requiere una gran cantidad de salidas, lo que implica un mayor 
uso de recursos (pines) por parte del PIC´s sin embargo en la actualidad se cuenta 
con dispositivos más eficientes conocidos como LCD (Display de Cristal Líquido). 
Estos dispositivos cuentan con elementos que nos permiten manejar números y 
caracteres al mismo tiempo utilizando 8 pines del microcontrolador, la 
configuración del LCD con relación al Microcontrolador PIC 18F4550 se presenta 
en la siguiente tabla. 
 
PIN DEL LCD PIN DEL MICROCONTROLADOR 
ENABLE D0 
RS D1 
RW D2 
DATO 4 D4 
DATO 5 D5 
DATO 6 D6 
DATO 7 D7 
 
Además de conocer la configuración de la pantalla LCD con el Microcontrolador 
PIC 18F4550, es necesario que conozcamos la función de algunos comandos 
empleados en la programación de la pantalla. 
La siguiente tabla muestra el comando y la función de cada uno. 
#include “lcd.c” Le indica al programa que se va a utilizar la biblioteca de la 
LCD 
lcd_init(); Inicializa la biblioteca de la LCD 
lcd_gotoxy(x,y); Indica la posición de acceso al LCD 
lcd_putc(char s); 
\f 
\n 
\b 
 
Limpia el LCD. 
El cursor se va a la posición (1,2) 
El cursor retrocede una posición 
 
Para visualizar la aplicación de los elementos antes mencionados realicemos el 
siguiente ejercicio. 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 19 
 
La pantalla desplegará la palabra buenos días, un segundo después en el 
segundo renglón aparecerá la palabra bienvenido, un segundo más tarde se borra 
el mensaje y aparece la palabra prueba, finalmente un segundo después aparece 
la palabra hasta luego, repitiéndose en forma cíclica. 
 
#include "pantalla.h" 
#include "lcd.c" 
void main() 
{ 
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); 
lcd_init(); 
for(;;) 
{ 
lcd_putc("\f"); 
lcd_gotoxy(2,1); 
lcd_putc("Buenos Dias"); 
delay_ms(1000); 
lcd_gotoxy(4,2); 
lcd_putc("Bienvenido"); 
delay_ms(1000); 
lcd_putc("\f"); 
lcd_gotoxy(1,1); 
lcd_putc("PRUEBA"); 
delay_ms(1000); 
lcd_putc("\f"); 
lcd_gotoxy(1,1); 
lcd_putc("Hasta Luego"); 
delay_ms(1000); 
} 
} 
 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 20 
 
#include "pantalla.h" 
#include "lcd.c" 
 
void main() 
{ 
setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); 
lcd_init(); 
set_tris_a(0b00000000); 
set_tris_b(0b11111111);lcd_putc("\f"); 
delay_ms(1000); 
lcd_gotoxy(4,1); 
lcd_putc("Bienvenido"); 
 
for(;;) 
{ 
If (input(pin_a0)) 
{ 
output_high(pin_b0); 
lcd_putc("\f"); 
lcd_gotoxy(4,1); 
lcd_putc("MOTOR EN"); 
delay_ms(1000); 
lcd_gotoxy(5,2); 
lcd_putc("MARCHA"); 
} 
If (input(pin_a1)) 
{ 
output_low(pin_b0); 
lcd_putc("\f"); 
lcd_gotoxy(5,1); 
lcd_putc("MOTOR"); 
delay_ms(1000); 
lcd_gotoxy(4,2); 
lcd_putc("DETENIDO"); 
} 
} 
} 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 21 
 
CONVERTIDORES ANALÓGICOS 
 
Un convertidor Analógico-Digital (CAD), es un circuito electrónico integrado, cuya 
salida es una palabra digital resultado de convertir la señal analógica de entrada; 
esta conversión se realiza en dos fases: cuantificación y codificación. 
Durante la cuantificación se muestrea la entrada y a cada valor analógico obtenido 
se le asigna un estado, que depende del número de bits del CAD, el resultado se 
codifica en binario, es decir, en una palabra, digital cuyo número de bits está 
condicionado por el número de líneas de salida del convertidor. 
Para manejar los convertidores analógico-digitales el compilador CCS utiliza las 
siguientes funciones: 
 
 
Función 
 
Características 
setup_adc(modo) 
 
Modo.-Para la configuración del módulo conversor A/D 
correspondiente a los bits. 
 
setup_adc_ports(valor) 
 
Valor.-Definición de las entradas analógicas a emplear. 
 
set_adc_channel(canal) 
Selección del canal analógico correspondiente a los 
bits. 
Canal 0(AN0) 
 
Canal 1(AN1) Canal 2(AN2) 
Canal 3(AN3) Canal 4(AN4) Canal 6(AN6) 
Valor=read_adc(); 
Lectura del resultado donde valor es un entero de 16 
bits 
 
Ahora veamos un ejemplo de aplicación del CAD en su forma más simple. 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 22 
 
Ejemplo: 
 
Tomemos como base una fuente de alimentación variable de 0 a 5 volts de 
corriente directa. 
Deseamos conocer la variación del voltaje en dicha fuente a través de un 
microcontrolador y una pantalla LCD. 
La estructura del programa será la siguiente: 
 
#include "voltmetro.h" 
#include “lcd.c” 
long volt_ent; 
void main() 
{ 
float voltaje; 
 lcd_init(); 
 
 setup_adc_ports(AN0|VSS_VDD); 
 setup_adc(ADC_CLOCK_DIV_4); 
 setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); 
 set_tris_b(0b00000000); 
 for(;;) 
 { setup_adc_ports (AN0|VSS_VDD); 
 set_adc_channel(0); 
 delay_us(10); 
 volt_ent=read_adc(); 
 voltaje=((5.0/1023.0)*volt_ent); 
 lcd_gotoxy(5,1); 
 lcd_putc("VOLTAJE:"); 
 delay_us(10); 
 lcd_gotoxy(3,2); 
 printf(lcd_putc,"%f volts",voltaje); 
 } 
} 
 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 23 
 
Ahora construiremos un sistema que controle la temperatura a través de un sensor 
de temperatura (LM35), que genera 10mv por cada grado centígrado y que es 
alimentado a 5 volts de corriente directa. 
Los niveles de temperatura son 24ºC para activar la calefacción y 30ºC para 
activar el aire acondicionado, manteniendo la temperatura de la habitación entre 
los 24ºC y 30ºC. 
 
#include "acondicionado.h" 
#include <lcd.c> 
long temp_ent; 
void main() 
{ 
float voltaje,temperatura; 
 lcd_init(); 
 
 setup_adc_ports(AN0|VSS_VDD); 
 setup_adc(ADC_CLOCK_DIV_4); 
 setup_oscillator(OSC_8MHZ|OSC_INTRC|OSC_31250|OSC_PLL_OFF); 
 
 set_tris_b(0b00000000); 
 for(;;) 
 { setup_adc_ports (AN0|VSS_VDD); 
 set_adc_channel(0); 
 delay_us(10); 
 temp_ent=read_adc(); 
 voltaje=((5.0/1023.0)*temp_ent); 
 temperatura=(voltaje*100); 
 lcd_gotoxy(2,1); 
 lcd_putc("Temperatura:"); 
 delay_us(10); 
 lcd_gotoxy(5,2); 
 printf(lcd_putc,"%f°C",temperatura); 
 if(temperatura<24) 
 { 
 output_high(pin_b1); 
 output_low(pin_b0); 
 } 
 if(temperatura>30) 
 { 
 output_low(pin_b1); 
 output_high(pin_b0); 
 } 
 } 
 
} 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 24 
 
#include “refresco.h” 
void main() 
{ setup_oscillator(OSC_8MHZ|OSC_NTRC|osc_31250|osc_pll_off); 
set_tris_a(0b11111111); 
set_tris_b(0b00000000); 
do 
{ 
if(input(pin_a0)) 
{output high(pin_b0); 
delay_ms(5000); 
output low(pin_b0); 
} 
If(input(pin_a1)) 
{ output high(pin_b1); 
delay_ms(5000); 
output low(pin_b1); 
} 
If (input(pin_a2)) 
{ output high(pin_b2); 
delay_ms(5000); 
output low(pin_b2); 
} 
If (input(pin_a3)) 
{ output high(pin_b3); 
delay_ms(5000); 
output low(pin_b3); 
} 
} 
while (true); 
} 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 25 
 
Configuración del Wizard PIC C 
A continuación, se dan los pasos a seguir para realizar y configurar un proyecto 
dentro de la herramienta PIC-C y de esta manera desarrollar una aplicación. Lo 
primero que hay que realizar es localizar un acceso directo en el escritorio 
 
 
O bien: 
 
 
Una vez que hayamos abierto la aplicación estaremos adentro de IDE, que será 
nuestro entorno de trabajo, localizamos el PIC Wizard dentro del menú o pestaña 
de Project. 
 
 
Cuando seleccionamos la opción Wizard nos aparecerá una ventana en la que 
daremos nombre al proyecto y la ubicación en la que queremos guardar los 
archivos que generará el Wizard. 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 26 
 
Cuando hayamos guardado el proyecto aparecerá el Wizard para configurar las 
opciones que necesitemos según la aplicación que vayamos a realizar. Dentro 
delos ajustes que normalmente modificaremos serán los que aparecen en la parte 
izquierda del menú y son los siguientes. 
 
 General 
 Communications 
 Intr. Oscillator Config. 
 
En la parte General cambiamos lo siguiente: 
o El dispositivo en Device y seleccionamos el PIC18F4550. 
o Frecuencia del oscilador Frquency cambiamos a 8,000,000 (8MHz). 
 
Dentro del Bloque Fuses tenemos que hacer varias modificaciones: 
 
o Seleccionar Interna RC Osc, no CLKOUT. 
o Seleccionar Power Up Timer 
 
 
 
Si continuamos bajando dentro del menú Fuses encontraremos más opciones, de 
las cuales tenemos que dejar de la siguiente manera: 
o Quitar selección de Low Voltaje Programming on B3 (PIC16) o B5 
(PIC18F4550). 
o Quitar selección PORTB pins are configured as analog input channels on 
RE: 
o Quitar selección Master Clear pin enabled. 
o Dentro de Communications deseleccionamos o quitamos la selección de 
Use RS-232 ya que no usamos el puerto COM. 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 27 
 
 
 
En la parte Intr. Oscillator Config habilitamos la opción de Enable Internal 
Oscillator, ya que en nustro caso usamos el relij interno del PIC quedando de la 
siguiente manera: 
 
 
Cuando hayamos configurado los pasos anteriores sólo presionamos OK y nos 
mostrará de nuevo el IDE del PIC y nos aparecerá un archivo fuente *(nombre).c 
en el cual podemos empezar a insertar el código del programa o bien empezar a 
programar, y un archivo *(proyecto).h en donde se definen los fuses que 
necesitamos, de esta manera configuramos un proyecto en Wizard. 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS,ING. OSCAR MEDINA SÁNCHEZ 28 
 
 
Las opciones sombreadas no son necesarias y por lo tanto se pueden quitar. 
 
En caso de que la aplicación requiera del uso del Convertidor Analógico Digital 
podemos también hacer la modificación desde el Wizard. Dentro de las opciones 
en la parte izquierda del Wizard encontramos Analog que es donde escogemos 
cuáles serán los pines que utilizaremos como entrada analógica del PIC, para la 
práctica del CAD nuestra aplicación utilizará de los pines A0 a A3 como entradas 
analógicas y seleccionamos lo siguiente: 
o Analog Pins – A0, A1, A2, A3. 
o Range 0-Vdd. 
o Units: 0-1023. 
o Clock 2-6us. 
 
 
 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 29 
 
En caso de que vayamos a utilizar el Modulador de Ancho de Pulso, lo podemos 
configurar en la opción Other, seleccionando: 
o El módulo CCP1. 
o PWM. 
o Freq Range. 
o Duty cycle%. 
 
Con los valores deseados, aunque cabe mencionar que esto se puede realizar 
manualmente en el código del programa. 
 
 
Para la práctica de USB cambiamos la frecuencia del oscilador a 48MHz y dentro 
de los Fuses también cambiamos ciertas opciones: 
o Seleccionamos High Speed Crystal/resonador with PLL enabled en lugar de 
Interna RC Osc, no CLKOUT. 
 
 
o En el divisor de frecuencia seleccionamos Divide By 5(20MHz oscillator 
input), porque la tarjeta de desarrollo delPIC usa un cristal resonador de 20 
MHz. 
CECYT 9 JUAN DE DIOS BÁTIZ PAREDES IPN 
PROGRAMACIÓN DE MICROCONTROLADORES PIC 18F4550 
 
 
 
ING. OSCAR GARIBAY CASTELLANOS, ING. OSCAR MEDINA SÁNCHEZ 30 
 
o Siguiente opción es No System Clock Postcaler en lugar del System Clock 
by 4. 
 
Cabe mencionar que aquí no tiene relevancia las opciones de Intr. Oscillator 
Config ya que no utilizamos las opciones del reloj interno, por tanto, no hay 
necesidad de hacer los cambios que se mencionan para las demás prácticas.

Continuar navegando