Manual de Microcontroladores en CCS Compiler
Manual de Microcontroladores en CCS Compiler
Manual de Microcontroladores en CCS Compiler
Asignatura MICROCONTROLADORES
Unidades de
Cuatrimestre HORAS
aprendizaje
CONTENIDO
Página
1. Objetivo de la Asignatura 3
2. Competencia 3
3. Objetivo de la Unidad 3
4. Marco teórico 4
5. Equipo, componentes y software. 7
5.1. Software. 7
5.1.1 CCS C 7
5.1.2 PROTEUS 10
5.2. Componentes Físicos. 11
6. Desarrollo de Prácticas. 27
Practica# 1. Configuración de Puertos digitales I / O. 28
Practica# 2. Declaración de Variables. 31
Practica# 3. Uso de Funciones. 34
Practica# 4. Uso de Array. 36
Practica# 5. Uso de ciclos condicionales. 38
Practica# 6. Uso de Interrupciones. 40
MANUAL DE PRÁCTICAS
1. Objetivo de la Asignatura
2. Competencia
3. Objetivo de la Unidad
4. Marco teórico
Es posible adquirir compiladores como el PICC, CCS, PIC Basic, entre otros. Este manual
de prácticas se centra en el compilador MikroC PRO, que es un compilador en lenguaje C
para microcontroladores PICMicro para las familias 12F, 16F, y 18F. La paquetería del
software de MikroC PRO tiene una amplia variedad de ayudas y herramientas que facilita la
creación de proyectos y aplicaciones para los microcontroladores PICMicro.
También es necesario que el alumnado (estudiante) cuente con los conocimientos básicos
de las materias de:
En esta sección se describen los equipos, materiales y softwares que se utilizaran para el
desarrollo de las practicas descritas en la sección 5.
5.1. Software.
Los dos softwares que se utilizarán para la programación, desarrollo y simulación de las
prácticas antes de la implementación físicas de las misma, se describen a continuación:
5.1.1 CCS C
Los compiladores IDE del CCS C (PCW, PCWH y PCWHD) tienen el exclusivo entorno de
desarrollo integrado C para compilar, analizar y depurar en tiempo real. Otras funciones y
herramientas integradas se pueden ver en el archivo de ayuda. En comparación con un
compilador de C más tradicional, PCB, PCM y PCH tienen algunas limitaciones.
PCB, PCM y PCH son compiladores independientes. PCB es para códigos de operación de
12 bits, PCM es para códigos de operación de 14 bits y PCH es para microcontroladores
PIC® de código de operación de 16 bits. Estos compiladores están diseñados
MANUAL DE PRÁCTICAS
específicamente para satisfacer las necesidades únicas del microcontrolador PIC®. Esto
permite a los desarrolladores diseñar rápidamente aplicaciones de software en un lenguaje
de alto nivel más legible.
La figura 4.1 muestra el icono del programa CCS C, que es el mismo para los diferentes
IDE de este programa, simplemente cambia el compilador interno para ejecutar la
instrucción programada.
MANUAL DE PRÁCTICAS
La estructura del programa en CCS C se muestra en la figura 4.2, está conformada por:
Para más información sobre la directivas, librerías e instrucciones del compilador CCS C
consultar su manual en: https://www.ccsinfo.com/downloads/ccs_c_manual.pdf
MANUAL DE PRÁCTICAS
5.1.2 PROTEUS
PROTEUS es considerado uno de los mejores y más completos programas para el diseño
de circuitos electrónicos en la actualidad, no solo por su capacidad de simulación y análisis,
sino también por el hecho de poder utilizar una gran cantidad de microcontroladores de
diferentes familias.
Las siglas VSM significan Virtual System Modelling, que en español podemos traducir como
sistema de modelado virtual, ya que Proteus VSM permite modelar de forma virtual en la
computadora prácticamente cualquier circuito. La figura 4.3 muestra el icono del programa
PROTEUS, que en este manual es la versión 8.9 y en la cual se estará trabajando en la
sección 5.
Para más información referente al uso de este software se recomienda consultar el libro:
PROTEUS VMS SIMULACIÓN DE CIRCUITOS ELECTRONICOS de Víctor Rossano.
MANUAL DE PRÁCTICAS
▪ Jumper.
La figura 4.4 muestra los cables jumper tipo hembra - macho, necesarios para la conexión
temporal de los circuitos digitales, así como los diferentes componentes físicos como: push
Boton, leds, compuertas, display 7 segmentos, etc.
▪ LED.
Un led (light-emitting diode, por sus siglas en inglés) es un diodo semiconductor que,
cuando recibe tensión, genera luz. Un diodo, a su vez, es una válvula de dos electrodos
que permite el paso de la corriente eléctrica en un único sentido. Cuando se le aplica
tensión a alguna de sus dos terminales, la recombinación de sus electrones provoca la
liberación de energía en forma de fotones, cuyo color está determinado por la banda de
energía que haya sido estimulada. La figura 4.5 muestra los diodos LED más comúnmente
ocupados.
La tensión de los LEDs se puede dividir en dos grupos: con tensión entre 3V y 3.8V como
por ejemplo los azules, los blancos y algunos tipos de leds verdes azulados y entre 1.8V y
MANUAL DE PRÁCTICAS
2.1V de los cuales encontramos los leds rojos, los amarillos, los naranjas y muchos tipos de
verde. Los LED por lo general consumen entre 10 a 20 mA independientemente del color
del led. Para conocer la polaridad de los LED basta con observar la patillas, las más corta
es la polaridad negativa, mientras que es la polaridad positiva.
▪ Push Boton.
Los pulsadores son dispositivos que tienen un defecto, el cual se llama rebote. Cuando se
presiona o se suelta el pulsador, se produce una fluctuación entre sus contactos internos,
esas fluctuaciones son también leídas y se produce un comportamiento inesperado en el
funcionamiento de nuestros proyectos. El antirrebote viene a solucionar este problema. Es
necesario poner un condensador de 10uF en el pulsador, véase figura 4.8.
▪ Resistores.
La figura 4.9 muestra los resistores de 5 bandas, mayor precisión, que se emplearan para
la elaboración de los circuitos físicos. En todos los resistores nos podemos encontrar tres
MANUAL DE PRÁCTICAS
Figura 4.9 Código de colores para resistores de alta precisión con 5 bandas.
▪ Display 7 segmentos.
Se le conoce como siete segmentos por que cuenta con siete diodos led principales y uno
extra para representar un punto. También cuenta con una carcasa para cubrirlos y diez
terminales: dos son de alimentación (dos de Vcd o dos de Gnd), uno es para visualizar un
punto y siete son para representar cada uno de los números según la combinación que se
le ponga, véase la figura 4.10, estos están representados por una letra del abecedario
desde la “A” hasta la letra “G”.
• Ánodo común
Se llama así porque todos los leds están unidos en su terminal positiva (ánodo), para
encenderlos tenemos que poner tierra en la terminal de la letra que se desee.
• Cátodo común
Este display es el opuesto del ánodo común ya que los leds están unidos en la
terminal negativa (cátodo). Para encender los leds tenemos que poner voltaje en las
terminales de las letras.
▪ LCD 16x2.
Las siglas LCD significan “Liquid Cristal Display” ó pantalla de cristal líquido. Es una
pantalla plana basada en el uso de una sustancia liquida atrapada entre dos placas de
MANUAL DE PRÁCTICAS
vidrio, haciendo pasar por este una corriente eléctrica a una zona específica, para que así
esta se vuelva opaca, y además cuenta (generalmente) con iluminación trasera.
Las pantallas LCD de color, cada pixel individual se divide en tres cédulas o sub pixeles
con los colores RGB (Rojo, Verde y Azul) respectivamente. Y así cada pixel puede
controlarse para producir una gran variedad de colores distintos.
Existen una gran variedad de proyectos en los que se incluye una LCD para interfaz con el
usuario, lo que modifica las necesidades, las cuales es importante atender más que nada
por los precios. Y la importancia de esta en el proyecto. Algunos factores básicos para
considerar en una LCD son:
b) Resolución: Esta se expresa con las dimensiones horizontal y vertical. las pantallas HD
tienen una resolución de 1920×1080 por ejemplo. Y esta puede alcanzar con esta
resolución una gran variedad de tamaño, pero si no se ocupa gran a gran detalle esta,
estarías desperdiciando calidad (por no utilizar algo que tienes disponible). En 5hz se
maneja, por ejemplo, la LCD gráfica 128×64 (negro sobre fondo verde). Que a pesar de
su tamaño la consideramos suficiente para las aplicaciones estudiantiles, y algunas
industriales donde se requiera tener algo claro y legible en un tamaño práctico.
Iluminación CCFL Esta iluminación básicamente consta poner detrás de la pantalla una
matriz de CCFL, o bien en las orillas o bordes de la pantalla. Sin embargo, es más
consumo que el led y tiene un menor tiempo de vida, por lo que poco a poco se ha ido
poniendo en segundo plano.
Iluminación LED Esta iluminación puede presentarse en dos maneras, en un solo color,
(generalmente blanco) o bien en RGB, los blancos suelen ser los más utilizados. Estos
al igual que la iluminación CCFL, pueden estar formando una matriz en la parte de
atrás, o bien pueden colocarse a los extremos del display.
e) Angulo de visión: es el ángulo máximo en el que el usuario puede visualizar lo que está
en la LCD sin que se pierda mucha calidad.
f) Número de caracteres. Hay diversos tamaños de LCD y con ello nos limitamos o nos
expandamos la posibilidad de mostrar en el display cierto número de caracteres, los
tamaños estándar que manejamos son: 16×2, 20×4, 8×2.
La figura 4.11 muestra las diversas pantallas LCD existentes en el mercado para
aplicaciones en electrónica digital.
▪ KEYPAD 4x4.
El Teclado matricial de botones plásticos formado por 4 filas y 4 columnas para un total de
16 teclas permite agregar una entrada de usuario a tus proyectos. El teclado es de tipo
membrana, por lo que entre sus ventajas se encuentra el poco espacio que requiere para
ser instalado. Posee una cubierta adhesiva y un cable flexible de conexión. Puede ser
conectado a cualquier microcontrolador o tarjetas de desarrollo como Arduino.
El teclado matricial 4x4 está formado por una matriz de pulsadores dispuestos en filas (L1,
L2, L3, L4) y columnas (C1, C2, C3, C4), véase figura 4.12, con la intención de reducir el
número de pines necesarios para su conexión. Las 16 teclas necesitan sólo 8 pines del
microcontrolador en lugar de los 16 pines que se requerirían para la conexión de 16 teclas
independientes. Para poder leer que tecla ha sido pulsada se debe de utilizar una técnica
de barrido y no solo leer un pin de microcontrolador.
La conexión del teclado matricial 4x4 con Arduino u otra plataforma de microcontroladores
es simple: se necesitan 8 pines digitales en total. Puede trabajar con microcontroladores de
3.3V o 5V sin problema. Es necesario colocar resistencias pull-up entre los pines de las
columnas y VCC o activar por software las resistencias Pull-up internas. En cuanto a la
programación, la lectura de las teclas se debe realizar mediante un "barrido" de las filas. Si
bien es posible realizar este procedimiento dentro del loop principal del programa, es una
MANUAL DE PRÁCTICAS
mejor práctica realizar el barrido utilizando interrupciones por TIMER y así asegurar la
lectura de las teclas en un intervalo conocido y exacto, además de dejar al loop libre para
realizar otras operaciones
▪ Microcontrolador PIC16F877a.
La figura 4.13, muestra al PIC16F877a, el cual tiene 5 puertos en total que son:
▪ Puerto A: Tiene 6 pines en total comenzando desde el Pin # 2 al Pin # 7. Los pines del
puerto A están etiquetados de RA0 a RA5 donde RA0 es la etiqueta del primer pin del
puerto A.
▪ Puerto B: Tiene 8 pines en total comenzando desde el pin # 33 al pin # 40. Los pines
del puerto B están etiquetados de RB0 a RB7 donde RB0 es la etiqueta del primer pin
del puerto B.
MANUAL DE PRÁCTICAS
▪ Puerto C: Tiene 8 pines en total. Sus pines no están alineados. Los primeros cuatro
pines del puerto C se encuentran en el pin n. ° 15 - pin n. ° 18, mientras que los últimos
cuatro se encuentran en el pin n. ° 23 - pin n. ° 26.
▪ Puerto D: Tiene 8 pines en total. Sus pines tampoco están alineados. Los primeros
cuatro pines del puerto D se encuentran en el pin # 19 - pin # 22, mientras que los
últimos cuatro se encuentran en el pin # 27 - pin # 30.
▪ Puerto E: Tiene 3 pines en total comenzando desde el pin # 8 al pin # 10. Los pines del
puerto E están etiquetados de RE0 a RE2 donde RE0 es la etiqueta del primer pin del
puerto E.
▪ Pin # 1: Este Pin se llama MCLR (Master Clear) y necesitamos proporcionar 5V a este
pin a través de una resistencia de 10k-ohmios.
▪ Pin # 11 y # 32: estos pines están etiquetados como Vdd, por lo que también debemos
proporcionarle + 5V.
▪ Pin # 12 y # 31: estos pines son Vss, por lo que hemos proporcionado GND (tierra).
MANUAL DE PRÁCTICAS
▪ Pin # 13 y 14: Estos pines se denominan OSC1 (oscilador 1) y OSC2 (oscilador 2).
▪ Pin # 25, RC6 del Puerto C puede ser usado como entrada/salida digital o como un
Transmisor (TX) para la comunicación serial.
▪ Pin # 26, RC7 del Puerto C puede ser usado como entrada/salida digital o como un
Receptor (RX) para la comunicación serial.
▪ Las entradas analógicas están en los pines #2 al #5 y de #7 al #10.
▪ Protoboard.
Normalmente estas placas son usadas para realizar pruebas experimentales. Si la prueba
resulta satisfactoria el circuito se construye de una forma más permanente para evitar el
riesgo de que algún componente pueda desconectarse. En caso de que la prueba no sea
satisfactoria, puede modificarse el circuito fácilmente.
MANUAL DE PRÁCTICAS
Las Protoboards tienen tres partes: el canal central, las pistas, y los buses. En el canal
central, ubicado en la parte media, se conectan los circuitos integrados para mantener
aislados los pines de ambos lados del circuito integrado. Los buses se encuentran en los
lados de la Protoboard, y generalmente se emplean para conectar la tierra del circuito y sus
voltajes de alimentación. La mayoría de las veces los buses están indicados con franjas
color negro o azul para indicar el bus de tierra, y con franjas color rojo para indicar el bus
de voltaje positivo. El resto de los orificios de la Protoboard pertenecen a las pistas. Como
se mencionó anteriormente, las pistas están separadas por filas. Las filas están indicadas
con números y las columnas están indicadas con letras, véase la figura 4.14.
Figura 4.14 Placa Protoboard, existen distintos tamaños y diversos modelos según el fabricante.
La corriente con la que puede operar una Protoboard varía entre 3 y 5 A, y esto depende
del fabricante. Suelen operar a bajas frecuencias, entre 10 – 20 MHz.
▪ Oscilador de cristal.
La frecuencia que el cristal es capaz de crear se utiliza comúnmente para controlar o tener
una noción del tiempo, con el fin de para proporcionar una señal de reloj estable para
circuitos integrados digitales y para estabilizar las frecuencias de los transmisores y
receptores de radio.
▪ Capacitores.
Existe diferentes formas y materiales de tener capacitores en los sistemas eléctricos, por lo
tanto, existen diversas formas o métodos para codificarlos, caso contario con los resistores.
La figura 4.16 muestra el sistema de codificación para capacitores entre 1pF y 1 µF, donde
el valor se encuentra indicado con un número de tres dígitos seguido por una letra.
MANUAL DE PRÁCTICAS
Figura 4.16 Codificación para los capacitores entre 1 pF y 1 µF, a excepción de los electrolíticos.
Los dos primeros dígitos indican el número inicial mientras que el tercer dígito representa la
cantidad de ceros que es necesario agregar al número inicial para obtener el valor final. El
resultado obtenido es necesario considerarlo en picofarad.
Ahora hablemos de la letra que se encuentra al final del número de tres dígitos. Es
simplemente la tolerancia del componente, es decir, cuanto puede ser diverso el valor real
respecto al valor indicado.
La figura 4.17 podemos observar que cada letra la tolerancia correspondiente, por ejemplo,
la "P", es decir, el componente puede tener una mayor capacidad respecto a la indicada
pero no una menor. Este tipo de tolerancia es usada con los capacitores de "filtro" donde
un posible valor mayor de lo indicado no perjudica mínimamente el funcionamiento del
circuito.
Por último, nos falta una información que en cierto caso podría ser útil, que es la tensión
máxima que el capacitor puede soportar sin que se rompa. La codificación numérica que
usan algunos fabricantes consiste en un número seguido por una letra.
MANUAL DE PRÁCTICAS
La tabla completa de los códigos EIA que indican la tensión máxima de trabajo de los
capacitores en tensión continua (VDC) se muestra en la figura 4.18.
▪ Fuentes de Alimentación.
Aquí, no hay mucho que comentar solo es necesario tener una fuente simétrica de
voltaje para alimentación de los amplificadores operacionales, por ejemplo, de ± 12 Vcc
@ 1 A.
▪ Sentencia If - else
Cuando el programa llega a una sentencia condicional del tipo If …Else, primero evalúa
una expresión; si se cumple (es cierta) se ejecuta un bloque de sentencias y si es falsa
se ejecuta otro bloque. En la figura 1.1 se muestra el funcionamiento del diagrama de
flujo de dicha sentencia, la cual al ser verdadera pasa directamente al bloque 1 y si
resulta ser falsa, pasará a un plan B que se pondrá en la estructura del else.
MANUAL DE PRÁCTICAS
▪ Bucle WHILE
Estos bucles se utilizan cuando queremos repetir la ejecución de unas sentencias un
número indefinido de veces, siempre que se cumpla una condición. Se más sencillo de
comprender que el bucle FOR, pues no incorpora en la misma línea la inicialización de
las variables su condición para seguir ejecutándose y su actualización. Sólo se indica,
como veremos a continuación, la condición que se tiene que cumplir para que se realice
una iteración.
MANUAL DE PRÁCTICAS
▪ Bucle do – while
Se utiliza generalmente cuando no sabemos cuántas veces se habrá de ejecutar el
bucle, igual que el bucle WHILE, con la diferencia de que sabemos seguro que el bucle
por lo menos se ejecutará una vez.
MANUAL DE PRÁCTICAS
Como se muestra en la imagen en su diagrama de flujo el bucle se ejecuta siempre una vez
y al final se evalúa la condición para decir si se ejecuta otra vez el bucle o se termina su
ejecución.
▪ Ciclo for:
El bucle for permite indicar estos tres elementos en un solo lugar, al principio del bucle,
facilitando así la obtención de un código compacto, pero legible. Se puede apreciar su
sintaxis y diagrama de flujo en la siguiente imagen viendo mas a detalle el
funcionamiento y es que el ciclo for actualizara el estado del programa hasta n veces
que el usuario introduzca.
MANUAL DE PRÁCTICAS
▪ Sentencia switch
El bucle for permite indicar estos tres elementos en un solo lugar, al principio del bucle,
facilitando así la obtención de un código compacto, pero legible. Se puede apreciar su
sintaxis y diagrama de flujo en la siguiente imagen viendo más a detalle el
funcionamiento y es que el ciclo for actualizara el estado del programa hasta n veces
que el usuario introduzca.
MANUAL DE PRÁCTICAS
MANUAL DE PRÁCTICAS
6 Desarrollo de Prácticas.
Para ello, a través de las clases impartidas por el o la docente, en alumno debe
implementar los conocimientos adquiridos en el aula, como son:
En este caso se dispone a encender y apagar un led en el puerto RB0 del puerto B del
pic16F877a, teniendo un tiempo de encendido de 500 ms y un tiempo de apagado de 300
ms.
Paso I. Realizar el código de programación en CCS C para los tres incisos A1, A2 y A3.
A1)
#include <16F877A.h>
#fuses hs,nowdt,noprotect
#use delay(clock=20M)
#define retardo delay_ms(500)
#define retardo1 delay_ms(300)
#define espera delay_ms(5000)
void main()
MANUAL DE PRÁCTICAS
{
set_tris_b(0x00);
output_b(0x00);
espera;
while(true)
{
output_b(0x01);
retardo;
output_b(0x00);
retardo1;
}
}
A2)
#include <16F877a.h>
#fuses HS, NOWDT,NOPUT,NOPROTECT,BROWNOUT, NOLVP, NOCPD
#USE DELAY(CLOCK=20 M)
#USE STANDARD_IO(B)
#DEFINE RETARDO DELAY_MS(500)
void main()
{
OUTPUT_B(0X00);
RETARDO ;
WHILE(TRUE)
{
OUTPUT_HIGH(PIN_B0);
RETARDO;
OUTPUT_LOW(PIN_B0);
MANUAL DE PRÁCTICAS
(PIN_B0);
RETARDO;
}
}
A3)
#include <16F877a.h>
#fuses HS, NOWDT,NOPUT,NOPROTECT,BROWNOUT, NOLVP, NOCPD
#use DELAY(CLOCK=20M)
#BYTE TRISB = 0X86
#BYTE PORTB = 0X06
#DEFINE RETARDO DELAY_MS(500)
void main()
{
TRISB=0X00;
PORTB=0X00;
RETARDO ;
WHILE(TRUE)
{
PORTB=0X01;
RETARDO;
PORTB=0X00;
RETARDO;
}
}
MANUAL DE PRÁCTICAS
Instrumento de evaluación
Cuestionario
3. ¿Por qué es necesario que el valor numérico en MHz para el cristal sea el mismo
valor numérico asignado en el código de programación?
Porque en el programa estamos indicando con que frecuencia de reloj va a trabajar
nuestro microcontrolador, de no ser así afectaría a nuestro código a la hora de
correrlo.
WHILE(TRUE)
{
OUTPUT_HIGH(PIN_B0);
OUTPUT_HIGH(PIN_B5);
RETARDO;
OUTPUT_LOW(PIN_B0);
OUTPUT_LOW(PIN_B5);
RETARDO;
}
MANUAL DE PRÁCTICAS
5. Si queremos que el Led en RB5 tenga un tiempo distinto de encendido de 300 ms,
conservando el mismo tiempo de apagado en ambos leds. ¿Cómo sería el código
para que esto suceda?
Definiríamos una nueva variable (#DEFINE RETARDO2 DELAY_MS(300)) y en
nuestro while (true) agregaríamos nuestra salida RB5 en estado alto ocupando
nuestra variable nueva (RETARDO2) y después la mandaríamos a estado bajo
ocupando la variable predeterminada de apagado (RETARDO).
6. Ahora bien, conectamos 4 leds en el puerto C, de RC4 a RC7, para encender y
apagar en 500 ms, ¿Qué instrucción debo cambiar en el código para ocupar el
registro TRIS y PORT?
Cambiaríamos los TRISB=0X86 y PORTB=0X06 por TRISC=0X87 y PORTC=0X07 y
en nuestro void main la letra B por C y por último en nuestro while pondríamos
PORTC=0XF0 para prender desde el RC4 al RC7.
int i;
void main()
{
trisD=(0x00);
portD=(0x00);
parpadeo;
while(true)
{
rojo;tiempo;
for(i=0;i<5;++i)
{
apagado;parpadeo;
rojo;parpadeo;
}
verde;tiempo;
for(i=0;i<5;++i)
{
apagado;parpadeo;
verde;parpadeo;
}
for(i=0;i<5;++i)
{
amarillo;parpadeo;
MANUAL DE PRÁCTICAS
apagado;parpadeo;
}
}
}
Paso II. Realizar la conexión de los componentes en el software PROTEUS.
Instrumento de evaluación
Cuestionario
1. Explique con sus propias palabras ¿para qué sirve la directiva #define?
Nos ayuda definir un nombre y el valor de macro para ser remplazado con un valor
de referencia a la hora de compilar el código.
2. Explique con sus propias palabras ¿para qué sirve el ciclo For y como es su
estructura?
Ejecuta repetitivamente un bloque de instrucciones conociendo previamente un valor
de inicio, de incremento y otro final para el ciclo.
6. Si se ocupan los registros TRIS y PORT para el puerto D, ¿Cuáles son los valores
hexadecimales debemos utilizar?
TRISD=0x88 y PORTD=0x08
Par ello, se retomará el programa realizado en la práctica número dos, la cual consta de
realizar un Semáforo utilizando el puerto D de PIC16F877A, conectados en los pines RD0,
RD1 Y RD2. En donde el funcionamiento será:
int i,c;
void main()
{
trisd=0;
portd=0;
tiempo2;
while(true)
{
rojo;tiempo;
portd=0x00;tiempo2;
parpadeo(0);
verde;tiempo;
portd=0x00;tiempo2;
parpadeo(2);
parpadeo(1);
}
}
Paso II. Realizar la conexión de los componentes en el software PROTEUS.
MANUAL DE PRÁCTICAS
Instrumento de evaluación
Cuestionario
1. Explique con sus propias palabras ¿para qué sirve declarar funciones definidas por el
usuario?
Nos sirve para acortar nuestro void principal donde se mandan a llamar todas las
funciones y retornar parámetros en los cuales esos métodos tendrán.
2. Explique con sus propias palabras ¿para qué sirve la palabra Void en el programa CCS
C?
Es vacío es decir que no va a retornar ningún valor.
3. Explique con sus propias palabras ¿para qué sirve la instrucción Bit_set(var,bit) y
Bit_clear(var,bit) en el programa CCS C?
Bit_set: va a poner en 1 el digito especificado en bit o la palabra en var.
Bit_clear: va a poner en 0 el digito especificado en bit o la palabra en var.
4. ¿Por qué fue necesario definir una variable en la función parpadeo y de qué tipo de
datos debió ser?
Para que tomara el valor de nuestra función principal y así inicializara el valor límite de
nuestro ciclo for para las terminales y así únicamente si están dentro del rango se van a
repetir de acuerdo con la condición de nuestro ciclo for. Debió ser de tipo entero.
Objetivo particular: El alumnado aprenderá a realizar arreglos tipo Array, que contenga
valores binarios y/o hexadecimal, con la finalidad de enviar estos datos hacia un display de
7 segmentos.
void main()
{
set_tris_d(0b00000000);
output_d(unid[0]);
while(true)
{
MANUAL DE PRÁCTICAS
for(i=0;i<10;i++)
{
output_d(unid[i]);
delay_ms(500);
}
}
}
Paso II. Realizar la conexión de los componentes en el software PROTEUS.
Instrumento de evaluación
Cuestionario
2. Explique con sus propias palabras ¿Cómo es la estructura de un arreglo tipo array en
CCS C?
int8 unid[10]={63,6,91,79,102,109,125,7,127,103}
VALOR NOMBRE
CANTIDAD DE DATOS
ENTERO DEL DATOS
ARREGLO
S
3. Explique con sus propias palabras ¿Por qué el ciclo For debe iniciara en la variable I=0?
El conteo del array empieza desde cero, si no empezara desde ahí se saltaría una
posición empezando desde el 1 y no mostraría el número 0.
4. Explique con sus propias palabras ¿Qué significan los valores hexadecimales escritos
en el Arreglos Dispaly?
Serian los numero que le darán el valor al display, es decir, para que muestre el cero
seria 3F.
VOID ASCENDENTE(){
I++;
IF(I>9)
I=0;
}
VOID DESCENDENTE(){
I--;
IF(I==-1)
I=9;
}
VOID MAIN(){
IF(INPUT(BOTON)==1)
I=10;
ELSE I=-1;
DO{
IF(INPUT(BOTON)==1)
DESCENDENTE();
ELSE ASCENDENTE();
PORTD=DISPLAY[I];
TIME;
} WHILE(TRUE);
MANUAL DE PRÁCTICAS
Instrumento de evaluación
Cuestionario
2. Explique con sus propias palabras ¿Para qué sirve la instrucción Input(pin) en CCS C?
Para asignar entradas a los pines.
Objetivo particular: El alumnado aprenderá a conocer los tipos de interrupciones con las
que cuenta el microcontrolador pic16f877a, en particular por interrupción externa (pin RB0).
Para ello, el alumnado realizará tres programas, los cuales se describen a continuación:
A1. programar de una secuencia de luces, utilizando el puerto D para su conexión física y
un botón que gobierne el sentido de la secuencia conectado en el pin RB4 del
PIC16F877A. Si el botón B está presionado la secuencia va de arriba hacia abajo, sino de
abajo hacia arriba.
▪ Cada vez que se presione el botón RB4 la cuenta será ascendente de uno en uno.
Ejemplo si está en el 5 pasa al 6.
▪ Cada vez que se presione el botón RB5 la cuenta será descendente de uno en uno.
Ejemplo si está en el 6 pasa al 5.
MANUAL DE PRÁCTICAS
A1)
#include <16f877a.h>
#fuses hs, nolvp, nowdt, noput, noprotect, brownout, nocpd
#use delay(clock=20MHz)
#byte trisd=0x88
#byte portd=0x08
#byte trisb=0x86
#byte portb=0x06
#define time delay_ms(500)
#define boton pin_b4
int sec[8]={0x01, 0x02, 0x04,0x08,0x10,0x20,0x40,0x80};
int i=4;
void ascendente()
{
i++;
if(i>7)
i=0;
}
void descendente()
MANUAL DE PRÁCTICAS
{
i--;
if(i==-1)
i=7;
}
#int_rb
void rb0()
{
do
{
descendente();
portd=sec[i];
time;
}while(input(boton)==1);
}
void main()
{
trisd=0x00; portd=0x00;
trisb=0x01; portb=0x00;
time;
enable_interrupts(int_RB);
ext_int_edge(l_to_h);
enable_interrupts(global);
do
{
ascendente();
MANUAL DE PRÁCTICAS
portd=sec[i];
time;
}while(input(boton)==0);
}
A2)
#include <16f877a.h>
#fuses hs, nolvp, nowdt
#use delay(clock=20MHz)
#use standard_io(b)
#byte trisd=0x88
#byte portd=0x08
#define time delay_ms(500)
#define arriba pin_b4
#define centro pin_b5
int sec1[15]={0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0, 0x60, 0x30, 0x18, 0x0c,
0x06};
int sec2[6]={0x18, 0x24, 0x42, 0x81, 0x42, 0x24};
int cont=-1;
void arriba_abajo()
{
cont++;
if(cont==12)
cont=0;
}
void centro_afuera()
{
cont++;
MANUAL DE PRÁCTICAS
if(cont==6)
cont=0;
}
#int_rb
void interruciones()
{
do{
arriba_abajo();
portd=sec1[cont];
time;
}while(input(arriba)==1 & input(centro)==0);
portd=0x00;
do{
centro_afuera();
portd=sec2[cont];
time;
}while(input(arriba)==0 & input(centro)==1);
portd=0x00;
}
void main()
{
trisd=0x00; portd=0x00;
time;
enable_interrupts(int_rb);
ext_int_edge(l_to_h);
enable_interrupts(global);
while(true)
MANUAL DE PRÁCTICAS
{
cont=0;
portd=0x00;
}
}
A3)
#include <16f877a.h>
#fuses hs, nowdt, nolvp, brownout, noput, nocpd
#use delay(clock=20Mhz)
#use standard_io(b)
#byte trisd=0x88
#byte portd=0x08
#define down pin_b5
#define up pin_b4
#define time delay_ms(200)
int display[10]={0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f};
int cont;
void ascendente()
{
cont++;
if(cont>9)
cont=0;
}
void descendente()
{
cont--;
if(cont==-1)
cont=9;
MANUAL DE PRÁCTICAS
#int_rb
void interruciones()
{
if (input(up)== 1 & input(down)== 0)
ascendente();
else if (input(up)==0 & input(down)==1)
descendente();
time;
}
void main()
{
trisd=0x00; portd=0x00;
time;
enable_interrupts(int_rb);
ext_int_edge(l_to_h);
enable_interrupts(global);
while(true)
{
portd=display[cont];
}
}
Instrumento de evaluación
Cuestionario
1. Explique con sus propias palabras ¿Cómo funciona la interrupción por señal externa en
el pic16f877a?
Sirven para detectar un estado lógico o un cambio de estado en alguna de las
terminales de entrada de un microcontrolador.
2. Explique con sus propias palabras ¿Para qué sirve la instrucción #int_RB0 en CCS C?
Es para una activar una interrupción externa en ese puerto.
3. Explique con sus propias palabras cuales son las instrucciones para activar las
interrupciones en un microcontrolador en CCS C.
Declarar la función que corresponde a la interrupción. La función comienza con # y la
interrupción correspondiente, por ejemplo, para la función de interrupción por RB0 se
digita #int_EXT
En el programa principal se habilitan las interrupciones en forma global, con la
instrucción: enable_interrupts (GLOBAL) y habilita la interrupción correspondiente, por
ejemplo, habilita la interrupción externa por RB0: enable_interrupts (INT_EXT);
Para ello, el alumnado realizará dos programas, los cuales se describen a continuación:
A1. Programar un contador ascendente decimal mediante el uso del Timer0 y la patilla RA4
con flancos descendentes, cada número decimal se imprimirá cada dos pulsos del botón
conectado en el pin RA4. No utilizar decodificador conectado al microcontrolador.
A2. Programar un minutero (60 segundos) mediante el uso del Timer0 como temporizador,
cada número decimal se imprimirá cada segundo en los display de 7 segmentos. No utilizar
decodificador conectado al microcontrolador.
VOID MAIN ( ){
SET_TRIS_B(0X00);
OUTPUT_B(0X00);
SETUP_TIMER_0(RTCC_INTERNAL|RTCC_DIV_256|RTCC_8_BIT);
SET_TIMER0(2);
ENABLE_INTERRUPTS(INT_TIMER0);
ENABLE_INTERRUPTS(GLOBAL);
WHILE(TRUE){
OUTPUT_LOW(PIN_B7); TIME;
OUTPUT_HIGH(PIN_B7); TIME;
}}
A2)
#include <16F877A.H>
#fuses HS, NOWDT, NOLVP
#use delay(clock=8M)
#use STANDARD_IO(A)
#use STANDARD_IO(B)
MANUAL DE PRÁCTICAS
#use STANDARD_IO(C)
INT16 CUENTA, RESULTADO;
#INT_TIMER0
VOID MAIN ( ){
SETUP_ADC_PORTS(NO_ANALOGS);
OUTPUT_A(0X00);
OUTPUT_B(0X00);
OUTPUT_C(0X00);
SETUP_TIMER_0(RTCC_EXT_L_TO_H|RTCC_DIV_1|RTCC_8_BIT);
SET_TIMER0(241);
ENABLE_INTERRUPTS(INT_TIMER0);
ENABLE_INTERRUPTS(GLOBAL);
WHILE(TRUE){
CUENTA=GET_TIMER0();
RESULTADO =15-(256-CUENTA);
OUTPUT_B(RESULTADO);
IF(RESULTADO<9) OUTPUT_LOW(PIN_C0);
ELSE OUTPUT_HIGH(PIN_C0);
}}
Instrumento de evaluación
Cuestionario
1. Explique con sus propias palabras ¿Cómo caracterizar el timer0 del pic16f877a como
temporizador?
Funciona como temporizador cuando cuenta lo pulsos internos del reloj.
2. Explique con sus propias palabras ¿Para qué sirve la instrucción #int_timer0 en CCS C?
Es la función de atención a la interrupción.
3. Explique con sus propias palabras ¿Cómo caracterizar el timer0 del pic16f877a como
contador?
Funciona como contador cuando cuenta los eventos externos que hay mediante el pin
RA4/SOCK1.
4. Menciona tus recomendaciones, comentarios y conclusiones:
Código:
/* CONDICIONES GENERALES DEL MICRO SELECCIONADO */
#include <16F877A.h>
#Fuses HS,NOWDT,NOPUT,NOLVP
#USE DELAY(CLOCK=20M)
/* DECLARACIÓN DE VARIABLES */
#DEFINE RETARDO DELAY_MS(10000)
#DEFINE RETARDO1 DELAY_MS(5000)
#DEFINE RETARDO2 DELAY_MS(10000)
VOID MAIN(){
SET_TRIS_D(0X00); // PUERTO D TRABAJA COMO SALIDAS
OUTPUT_D(0X00); // INICIALIZACIÓN DEL PUERTO D
WHILE(TRUE){
OUTPUT_D(0X01);
RETARDO;
OUTPUT_D(0X02);
RETARDO1;
OUTPUT_D(0X04);
RETARDO2;
}
}
MANUAL DE PRÁCTICAS
Código:
#include <16F877A.H>
#fuses HS, NOWDT, NOPUT, NOPROTECT BROWNOUT, NOLVP,NOCPD
#use delay(clock=20M)
MANUAL DE PRÁCTICAS
#byte TRISD=0x88
#byte PORTD=0x08
void main(){
int I;
TRISD=(0x00);
PORTD=(0x00);
PARPADEO;
while(TRUE){
ROJO; TIEMPO;
for (I=0;I<5;++I){
APAGADO; PARPADEO;
ROJO; PARPADEO;
}
VERDE; TIEMPO;
for(I=0;I<5;++I){
APAGADO; PARPADEO;
VERDE; PARPADEO;
}
MANUAL DE PRÁCTICAS
AMARILLO; TIEMPO;
for(I=0;I<5;++I){
APAGADO; PARPADEO;
AMARILLO; PARPADEO;
}
}
}
Tercer practica realizada en clase, la cual consiste en un conteo de leds que va de abajo
hacia arriba y viceversa utilizando el ciclo while el código fue realizado por cada alumno del
salón.
MANUAL DE PRÁCTICAS
Código:
/* CONDICIONES GENERALES DEL MICRO SELECCIONADO */
#include <16F877A.h>
#Fuses HS,NOWDT,NOPUT,NOLVP
#USE DELAY(CLOCK=20M)
/* DECLARACIÓN DE VARIABLES */
#DEFINE RETARDO DELAY_MS(1000)
VOID MAIN(){
SET_TRIS_C(0X00); // PUERTO D TRABAJA COMO SALIDAS
OUTPUT_C(0X00); // INICIALIZACIÓN DEL PUERTO D
WHILE(TRUE){
OUTPUT_C(0X01);
MANUAL DE PRÁCTICAS
RETARDO;
OUTPUT_C(0X02);
RETARDO;
OUTPUT_C(0X04);
RETARDO;
OUTPUT_C(0X08);
RETARDO;
OUTPUT_C(0X10);
RETARDO;
OUTPUT_C(0X20);
RETARDO;
OUTPUT_C(0X40);
RETARDO;
OUTPUT_C(0X80);
RETARDO;
OUTPUT_C(0X40);
RETARDO;
OUTPUT_C(0X20);
RETARDO;
OUTPUT_C(0X10);
RETARDO;
OUTPUT_C(0X08);
RETARDO;
OUTPUT_C(0X04);
RETARDO;
OUTPUT_C(0X02);
RETARDO;
}
}
MANUAL DE PRÁCTICAS
Cuarta practica realizada en clase, la cual consiste en escribir mediante una combinación
de interruptores un numero de manera binaria para que así muestre el numero de forma
decimal en una matriz de leds y un display de 7 segmentos, el código fue realizado por
cada alumno del salón.
MANUAL DE PRÁCTICAS
Código:
#include <leddisplayw.h>
VOID MAIN(){
WHILE(TRUE){
IF(INPUT(PIN_B0)==0 & INPUT(PIN_B1)==0 & INPUT(PIN_B2)==0)
OUTPUT_C(LED[0]);
OUTPUT_D(DISPLAY[4]);
}}
Código:
#include <16F877A.H>
#fuses HS, NOWDT, NOLVP
#use delay(clock=20M)
#use standard_IO(B)
#use standard_IO(D)
// DEFINIR VARIABLES
#DEFINE BOTON PIN_B0
#DEFINE LED PIN_B7
#DEFINE TIME DELAY_MS(500)
#DEFINE ESPERA DELAY_MS(2000)
INT DISPLAY[10] = {0X3F, 0X06, 0X5B, 0X4F, 0X66, 0X6D, 0X7D, 0X07, 0X7F, 0X6F};
INT I,CONT;
VOID MAIN ( ){
ESPERA;
ENABLE_INTERRUPTS(INT_EXT);
EXT_INT_EDGE(L_TO_H);
ENABLE_INTERRUPTS(GLOBAL);
WHILE(TRUE){
OUTPUT_D(DISPLAY [CONT]);
TIME;
IF (CONT !=9) CONT++;
ELSE CONT = 0;
}}
Sexta practica realizada en clase, la cual consiste en un contador en una matriz de leds
del 0 al 7, con interrupciones con un determinado tiempo que se ejecutan a través de 4
push botón, el código fue realizado por cada alumno del salón.
MANUAL DE PRÁCTICAS
Código:
#include <16F877A.H>
#fuses HS, NOWDT, NOLVP
#use delay(clock=20M)
#BYTE PORTB=0X06
#BYTE TRISB=0X086
#use standard_IO(D)
// DEFINIR VARIABLES
#DEFINE TIME DELAY_MS(500)
#DEFINE STOP DELAY_MS(2000)
INT DISPLAY[8] = {0X01, 0X03, 0X07, 0X0F, 0X1F, 0X3F, 0X7F, 0XFF};
INT I,C,CONT;
}
}
//INSTRUCCIONES
#INT_RB
VOID INTERRUPCIONES () {
IF (BIT_TEST(PORTB,4)==0) CICLO(1);
ELSE IF (BIT_TEST(PORTB,5)==0) CICLO(2);
ELSE IF (BIT_TEST(PORTB,6)==0) CICLO(3);
ELSE IF (BIT_TEST(PORTB,7)==0) CICLO(4);
ELSE PORTB=0X00;
}
VOID MAIN ( ){
TRISB=0XF0;
PORT_B_PULLUPS(TRUE);
STOP;
ENABLE_INTERRUPTS(INT_RB);
EXT_INT_EDGE(H_TO_L);
ENABLE_INTERRUPTS(GLOBAL);
WHILE(TRUE){
OUTPUT_D(DISPLAY [CONT]);
TIME;
IF (CONT !=7) CONT++;
ELSE CONT = 0;
}}
MANUAL DE PRÁCTICAS
Material Bibliográfico.
4. Custom Computer Services, Inc. (2019). CCS C Compiler Manual. Recuperado de:
https://www.ccsinfo.com/downloads/ccs_c_manual.pdf
6. Sixto Reinoso; Luis Mena; Marco Pilatasig y Jorge Sánchez. (2018). Programación de
microcontroladores PIC con Lenguaje C. Octubre 2018, de Comisión Editorial de la
Universidad de las Fuerzas Armadas ESPE Sitio web:
http://repositorio.espe.edu.ec/bitstream/21000/15406/1/Programaci%C3%B3n%20de%2
0microcontralores%20tomo%201.pdf
MANUAL DE PRÁCTICAS