UNIVERSIDAD NACIONAL AUTÓNOMA

. DE MÉXICO
FACULTAD DE INGENIERÍA

INTRODUCCION A MICROCONTROLADORES
PIC CON C



Diseñadores
Gerardo Ramos Vásquez
Juan Francisco Hernández Medina
Carlos Ignacio García Sánchez






Presentación.
Este curso tiene como propósito difundir el uso de las tecnologías asociadas a los micros
controladores para crear materiales de apoyo a los alumnos que les permita tener un mejor
desarrollo en sus clases y entender mejor el concepto desde un enfoque teórico práctico.
Con una herramienta “micro controladores” que es de uso cotidiano en dispositivos
electrónicos digitales actuales (hornos de microondas, relojes, alarmas de incendios, de
automóviles, cerraduras electrónicas, etc.).
Actividades.
El curso está formado en tres partes, la primera es una introducción en la que a los
asistentes se les motiva al estudio de la teoría básica necesaria para entender el
funcionamiento y programación de los micros controladores, así como las aplicaciones
actuales de estos dispositivos. La segunda parte consta de sesiones donde se exponen los
conceptos necesarios para poder emplear de manera correcta los micros controladores. En
la tercera y última parte se realizaran sesiones prácticas donde los asistentes ponen a
prueba los conocimientos adquiridos en el curso al programar micro controladores para
crear aplicaciones.
Evaluación.
A considerar para el instructor.

Materiales
Para el instructor:
• Proyector para computadora
• Manual
• Sala de computo
Se requiere por equipo o brigada:
• Una PC, con sistema operativo Windows donde se pueda instalar el software para la
programación de los micro controladores.
• Software y manuales necesarios para el curso.
• PIC16F877A
• Cable de conexión para puerto serial.
• Display tipo LCD de 16x2 caracteres.
• Sensor de temperatura LM35.
• 8 Resistencias de 680Ω a ¼ de watt.
• 8 Leds de colores de 5mm.
• 4 Push botton de dos terminales
• 4 Resistencias de 10 kΩ a ¼ de watt.
• Eliminador de baterías de 9V.
• Circuito Integrado L293D driver de motores.
• Una tableta tipo Protoboard de las grandes para armar los circuitos.
• Pinzas de punta y de corte para electrónica.






TEMA 1 MICROCONTROLADOR PIC16F877A
1. ¿Qué es un micro controlador?
1.1. Diferencia entre micro controladores y microprocesadores.
1.2. Conceptos importantes
1.3. Condigo fuente
1.4. Ensambladores
1.5. Interpretes
1.6. Compiladores
2. La familia de los PICs
2.1. Porque los PICs se han colocado en el mercado
2.2. Gama baja o básica
2.3. Gama media
2.4. Gama alta
2.5. Gama mejorada
2.6. Los de 8 pines
3. El PIC16f877
3.1. El micro controlador PIC 16F877A
3.2. Recursos
3.3. Diagrama de sus pines
3.4. Descripción de sus pines y puertos
3.5. Organización de la memoria
3.6. Bancos y registros
3.7. Palabra de configuración
3.8. Instrucciones orientadas a bits
3.9. Instrucciones orientadas a constantes y de control
3.10. Instrucciones básicas para el compilador CCS
3.11. Un poco de orden
3.12. El PWM (pulse wide modulation)




TEMA 2 PROGRAMACION EN “C” E IMPLEMENTACION DEL PIC16F877
1. El WinPIC800.
2. El bootloader.
3. Estructuras de control con el PIC.
4. Puerto serie para programar y comunicarse con el PIC.
5. Modulo LCD (cristal líquido).
6. Sensor de temperatura.
7. Construcción de un termómetro con el PIC.
8. Control de un motor de pasos con el PIC.
9. Control de un motor de DC (corriente continua con el PIC).
10. Utilización de un “encoder” (contador de pulsos) para mover un motor.
11. Simulación de un control remoto con un diodo infrarrojo a través del PIC.










TEMA 1 MICROCONTROLADOR PIC16F877
1¿Qué es un micro controlador?
Un microcontrolador es un tipo de computadora en miniatura que puedes encontrar en los
pequeños dispositivos electrónicos. Unos ejemplos comunes de aparatos que utilizamos a diario
y que en su interior tienen uno 0 varios micro controladores se muestran en la figura siguiente. Si
estos dispositivos solo tienen botones y displays, es muy probable que posean un cerebro
constituido por un microcontrolador programable.

Microcontrolador
Dispositivo electrónico que posee todas las características de una PC, claro que en pequeña
escala. Pues cuenta con puertos de entrada y salida de información, puertos de comunicación,
Unidad aritmética Lógica, memoria interna (RAM y ROM), Y una Unidad Central de Procesos.
Microprocesador
Este elemento en cambio, solo es un Unidad Central de Procesos, que de manera externa
(desde un punto de vista de una PC) hay que conectarle la memoria, puertos y unidades de
almacenamiento (por eso se monta en una tarjeta madre para poder utilizarlo), tiene la ventaja
de ser mas escalable que un microcontrolador.

Algo muy importante cuando se estudia cualquier microcontrolador, es el entender cuál
es la diferencia entre código fuente, código objeto, compilador y ensamblador.

Código Fuente
EI código fuente, es almacenado en el archivo fuente, este archivo está escrito con el
American Standar Code for Information Interchange (ASCII) y contiene las sentencias
del programa y comentarios (utilizados para que los humanos puedan entender lo que
el programa está ejecutando). EI archivo fuente es creado en un editor estándar (como
NotePad 0 WordPad) 0 puede ser construido en un editor IDE (ambientes de desarrollo
integrado) que posee múltiples aplicaciones que apoyan en el desarrollo de la
aplicación. EI archivo fuente es usado como entrada para los ensambladores,
interpretes 0 compiladores que producen las instrucciones necesarias para controlar un
dispositivo. En el caso de un ensamblador 0 compilador, el código fuente es convertido
en un archivo objeto o archivo hex, que finalmente será grabado dentro del
microcontrolador que controla el dispositivo. El intérprete es construido dentro del
microcontrolador del dispositivo y ejecuta el archivo fuente que es una serie de
instrucciones y comandos que determinan inmediatamente salidas a procesos
intermedios.
El archivo fuente puede incluir otros archivos que proveen que adiciones al código
fuente o prototipos para las librerías de funciones o datos requeridos por la aplicación.
Los archivos “include” para ensamblar lenguajes de programación generalmente
terminan con *.inc que es la extensión con la que terminan los archivos de sistema. Los
archivos “include” para el lenguaje de programación C tienen como extensión una *.h
los ensambladores y compiladores proveen de estos archivos “include” para hacer las
tareas del desarrollo de aplicaciones más sencillas, basándose en los requerimientos
de tu aplicación. Al finalizar las operaciones de ensamblar o compilar se produce en un
archivo objeto (usualmente terminado en *.obj) o un archivo hex. El archivo hex es la
aplicación completa, lista para programarse dentro de un microcontrolador.
El archivo objeto está conectado a otros archivos objeto para producir el archivo hex. El
más popular de los formatos para archivos hex es el formato Intel 8 bit conocido como
INHXM8. Otros ejemplo de un formato diferente utilizado por los microcontroladores y
programadores de microcontroladores de Motorola es el llamado *.S9 o *.S19.

Ensambladores

Al programar en un lenguaje ensamblador se producen los códigos más eficientes en
cuanto a tamaño, numero de instrucciones y manejo de recursos del microprocesador.
En mi opinión es un lenguaje diseñado por ingenieros electrónicos para ingenieros
electrónicos, las muchas críticas que recibe de los ingenieros en computación es el no
poder implementar estructuras de control avanzados de manera estructurada. En
defensa del ensamblador podemos decir que con dos o tres líneas podemos prender un
led, resultado que no alcanzara ningún lenguaje de alto nivel después de ser compilado.
Moraleja si el objeto es manejar en su totalidad y de manera eficiente un
microprocesador o microcontrolador programar en ensamblador. Si los recursos no son
limitados en cuanto a la memoria, pues se puede comprar el dispositivo que soporte las
necesidades del lenguaje de alto nivel y además se requiere realizar operaciones
aritméticas complejas la mejor opción es programar en un lenguaje de alto nivel. Hay
que decir que el lenguaje ensamblador es complicado. A pesar de esto, es el lenguaje
más utilizado en los robots prototipo.
Los pic tienen un juego reducido de 35 poderosas instrucciones (familia 16Fxxx). Cabe
decir que los diferentes tipos de microprocesadores tienen muchas instrucciones
parecidas que son muy similares, lo cual hace muy difícil el poder programar diferentes
microcontroladores sabiendo utilizar un lenguaje
Ensamblador de manera eficiente.
Simulador:
Cuando tu ya estás viendo fluir tu código en algún simulador, estas en el comienzo de
convertirte en un experto desarrollador de lenguaje ensamblador. "Myke Predko"
Los inconvenientes de programar en ensamblador son:
1.- EI código no es totalmente portable. (Un código para un micro puede no funcionar en
un micro diferente).
2.- Es muy difícil explicar la película que observamos en nuestra cabeza a otro
programador.
3.- Es difícil pasar de un lenguaje ensamblador a uno de alto nivel.
PRINCIPALMENTE a pesar de los comentarios negativos anteriores, el programar en
ensamblador es muy conveniente en los siguientes casos:
1.- Desarrollo de prototipos robóticos sencillos.
2.- Programación de interfaces dedicadas 0 especificas.
3.- Cuando nuestra aplicación tiene mucho contacto con el exterior y el procesamiento
no sea complejo.
Interpretes
Cuando las computadoras estuvieron disponibles, prácticamente en todos los
desarrollos en software se utilizo un intérprete (usualmente BASIC) que era
automáticamente cargado dentro de las computadoras cuando eran arrancadas par
primera vez. Si eres joven esta sentencia te sorprenderá, pues ya conoces la maravilla
del sistema operativo que controla tu computadora. Los intérpretes realizaban muchas
de las funciones básicas que se consideran normales para los sistemas operativos. La
IBM PC cambio esto con la introducción de un simple sistema operativo que podía
ejecutar aplicaciones binarias 0 ejecutar constructores con el interprete BASIC.
Un intérprete es un programa que corre dentro de la computadora y lee y ejecuta
otro programa que no necesita convertir a algún formato específico para la
computadora. Esto es solamente una simple interfaz dentro de la computadora.
Compiladores
Los compiladores trabajan bajo una serie de reglas lógicas simples para convertir
sentencias de lenguajes de alto nivel al lenguaje ensamblador. Los modernos
compiladores permiten simplificar el código ensamblador, dando como resultado
aplicaciones más pequeñas y más eficientes. Si estas· interesado en aprender un
lenguaje ensamblador para un procesador especifico, no debes de sorprenderte al
descubrir que el código que producen los modernos compiladores son unos excelentes
ejemplos para aprenderlo. Par ejemplo los programas en C son convertidos sentencia
par sentencia en instrucciones de lenguaje ensamblador (compilado) a partir de este
código ensamblador se obtiene el código objeto que finalmente es programado dentro
del procesador.

La familia de los PICS

En la corta vida de los PICs ya ocupan las posiciones de cabeza en el ranking mundial,
compartiendo codo a codo con gigantes como Intel y Motorola. En 1990 ocupaban el puesto
vigésimo y actualmente son más de 100 millones de PICs los que vende Microchip cada ario, 10
que ha alzado al segundo puesto del ranking mundial.

1.2.1 EI por que los PICS se han colocado en el mercado
Los PIC tienen una gran aceptación en la comunidad de técnicos y aficionados que trabajan
con microcontroladores. Las características que han provocado esta gran aceptación son:

• Sencillez de Manejo
• Buena Información
• Precio
• Buen promedio de parámetros: velocidad, consumo, tamaño, alimentación, código
compacto, etc.
• Herramientas de desarrollo fáciles y baratas
• Diseño rápido
• Disponibilidad inmediata
• Compatibilidad del software en todos los modelos de la misma gama
• Su coste es comparativamente inferior al de los competidores
• Poseen una elevada velocidad de funcionamiento
• Tienen un juego de instrucciones reducido
• Bajo consumo unido a un amplio rango de voltajes de alimentación.
•Muchas herramientas se pueden recoger gratuitamente por Internet
(www.microchip.com).
• Existen una gran variedad de herramientas que permiten grabar, depurar, borrar y
comprobar el comportamiento de los PICs.
• La gran variedad de modelos de PIC permite elegir el que mejor responde a los
requerimientos de la aplicación.

1.2.2 Gama baja 0 básica PIC16C5X
Se trata de una serie de PIC de recursos limitados, pero con una de las mejores relaciones
coste/presentación. Sus versiones están encapsuladas con 18 y 28 pins y pueden alimentarse
a partir de una tensión de 2.5 en el caso de los "LF", 10 que les hace ideales en las
aplicaciones que funcionan con pilas. Tienen un repertorio de 33 instrucciones cuyo formato de
12 bits. No admiten ningún tipo de interrupción y la pila s610 dispone de dos niveles.

1.2.3 Gama Media PIC16FXXX
Es la gama más variada y completa de los PICs. Abarca modelos con encapsulado desde 18
patitas hasta 68, cubriendo varias opciones que integran abundantes periféricos.


Dentro de esta gama se halla el PIC16F877A que es el microcontrolador que vamos a utilizar en
el robot. El repertorio de Instrucciones es de 35 a 14 bits cada una y compatible con el de la
gama baja. Sus distintos modelos contienen todos los recursos que se precisan en las
aplicaciones de los microcontroladores de 8 bits. También dispone de interrupciones y unas Pila
(stack) de 8 niveles que permite el anidamiento de subrutinas.

1.2.4 Gama Alta PIC17CXXX con instrucciones de 16 bits
Se alcanzan las 58 instrucciones de 16 bits en el repertorio y sus modelos disponen de un
sistema de gestión de interrupciones sectorizadas muy potente. También incluyen variados
controladores de periféricos, puertas de comunicación serie y paralelo con elementos externos y
un multiplicador hardware de gran velocidad.
Quizás la característica más destacable de los componentes de esta gama es su arquitectura
abierta, que consiste en la posibilidad de ampliación del microcontrolador con elementos
externos. Para este fin, las patitas sacan el exterior las líneas de los buses de datos, direcciones
y control, a las que se conectan las memorias o controladores de periféricos. Esta filosofía de
construcción del sistema es la que se emplea en los microprocesadores y no suele ser práctica
habitual cuando se emplean microcontroladores.

1.2.5 Gama Mejorada PIC18FXXX con instrucciones de 16 bits
En los inicios del tercer milenio Microchip presentó la gama mejorada de los microcontroladores
PIC con la finalidad de soportar las aplicaciones avanzadas en las áreas de automoción,
comunicaciones, Ofimática y control industrial. Sus modelos destacaron por su alta velocidad
(40 MHz) y su gran rendimiento.

1.2.6 Los de 8 pines PIC12(C) FXXX
Se trata de PICs que ha acaparado la atención del mercado. Su principal característica es su
reducido tamaño, al disponer un encapsulado de 8 patitas. Se alimenta con un voltaje de
corriente continua comprendido entre 2.5 V Y 5.5 V, Y consumen menos de 2 mA cuando trabaja
a 5 V Y 4 MHz El formato de sus instrucciones puede ser de 12 o 14 bits y su repertorio es de 33
o 35 instrucciones, según pertenezca a la gama baja o media respectivamente.


• • •































1.3. El PIC16F877 A
1.3.2 Recursos
Tiene una estructura de 4 bancos, seleccionables a través de con los bits RPO y RP1 del registro
STATUS. El número de puertos en los PIC16F876 y 873 es de 3 (28 pines) y el número de puertos
en los PIC16F877 y 874 es de 5 (40 pines).
1.3.1 El microcontrolador PIC16F8777 A
Este microcontrolador pertenece a la familia PIC 16F87x, son una combinación del PIC16F84 con la
inclusión de los recursos de los PIC16C73 y 74. Incorporan la memoria FLASH, con una capacidad
de 4k ó 8k (según el modelo), sin cambiar la estructura interna del procesador y conservando el
mismo repertorio de instrucciones.

Características:
1.- Poseen dos módulos CCP (captura, comparación y pwm).
2.- Comunicación Serie (rs232, 12C y SPI)
3.- Comunicación Paralelo
4.- Convertidor AD.


Diagrama de pines








Descripción de sus pines y puertos

Los microcontroladores PIC16F87X encapsulados con 28 pines disponen de tres puertos de E/S
(A, S Y C), mientras que los que tienen 40 pines poseen cinco (A, S, e, D y E). Todas las líneas
de estas puertas son multifuncionales, es decir, realizan diversas funciones según estén
programadas. Sin embargo, todas tienen la capacidad de trabajar como líneas de E/S digitales.

Puerto A

Sólo dispone de 6 líneas, denominadas RAO-RA5. El registro que las configura como entras o
salidas se llama TRISA. Si el bit O del registro TRISA se pone a 1, la línea O (RAO) de la puerta
A funciona como entrada. Si se pone a O funciona como salida.

Los pines RAO/ANO, RA1/AN1, además de funcionar como E/S digitales también pueden
actuar como canales de entrada al convertidor analógico digital (CAD). Los pines RA2/AN2Nref-
y RA3/AN3Nref+, pueden funcionar como E/S digitales, como canales AN2 y AN3 del CAD y
como entradas de voltaje de referencia para el CAD. El pin RA4/TOCKI actúa como E/S digital y
como entrada de la señal de conteo para el Timer 0.

Por último, la patita RA5/AN4/ SS tiene tres funciones E/S digital, canal 4 del CAD y selección
del modo esclavo cuando se trabaja con la comunicación serie síncrona.

Puerto B

Dispone de 8 líneas bidireccionales digitales cuya función se elige mediante la programación del
registro TRISS. Todos los pines del Puerto S poseen de una resistencia interna de pull-up al
positivo de la alimentación, que queda conectada cuando el bit RSPU (7) del registro OPTION,
tiene valor O.

Las líneas RS<7-4> ~y RSO/ INT pueden programarse para generar una interrupción externa
cuando alguna de ellas cambia de estado.

Puerto C

Consta de 8 líneas bidireccionales cuyo sentido se configura mediante el registro TRISC. Todas
las patitas de esta puerta tienen multiplexadas diferentes funciones.

RCOIT10S01T1CKI: Esta línea puede actuar como E/S digital, como salida del Timer1 o como
entrada de impulsos para el Timer1.

RC11T10SIICCP2: E/S digital, entrada del oscilador del Timer1, entrada del módulo de
captura2, salida del comparador 2, salida del PWM2.

RC2/CCP1: E/S digital, entrada del modulo de de captura1, salida del comparador, 1 salida del
PWM1. .

RC3/SCK/SCL: E/S digital, señal de reloj en modo SPI, señal de reloj en modo 12C.

RC4/SDI/SDA: E/S digital, entrada de datos en modo SPI, línea de datos en modo 12C.

RC5/SDO: E/S digital, salida de datos en modo SPI.

• •

RC6ITX/CK: E/S digital, línea de Tx en el USART, señal de reloj síncrona en transmisión serie.

RC7IRX1DT: E/S digital, línea de Rx en el USART, línea de datos en transmisión serie síncrona.

Puerto D

Este puerto es de 8 bits, sólo lo poseen los encapsulados de 40 pines de la familia P16F877x,
su registro de configuración es el TRISD. Además de usarse como líneas de E/S digitales
normales, implementan una puerta paralela esclava de 8 líneas (PSP), que sirve para
permitir la comunicación en paralelo con otros elementos del sistema. .

Puerto E

Este puerto es de 3 bits, sólo lo poseen los encapsulados de 40 pines de la familia P16F877x,
su registro de configuración es el TRISE, las funciones de capa patita son las siguientes:

REOI RDIAN5: E/S digital, señal de lectura en el modo de PSP, canal 5 del
CAD. RE1/WRIAN6: E/S digital, señal de escritura en modo PSP, canal 6 del
CAD. RE21 es IAN7: E/S digital, selección de chip en el modo PSP, canal 7
del CAD.

1.3.5 Organización de la memoria

En primer lugar tenemos que distinguir claramente entre tres tipos de memoria:

Una: la memoria EEPROM donde almacenaremos el programa que haremos
podrá ser leída por el pic (el pic va leyendo las instrucciones de
memoria y las va ejecutando

Dos: la memoria RAM en cuyos registros se irán almacenando los valores de
nosotros queramos y cuando nosotros queramos (por programa
se borra.

Tres: la memoria EEPROM para datos
pueden guardar variables que queremos conservar aunque se apague el pic
por ser una memoria más difícil de emplear.

Bancos-y-registros
de la memoria
En primer lugar tenemos que distinguir claramente entre tres tipos de memoria:
la memoria EEPROM donde almacenaremos el programa que haremos
por el pic (el pic va leyendo las instrucciones de
memoria y las va ejecutando). Al apagar el pic esta memoria no se borra.
Dos: la memoria RAM en cuyos registros se irán almacenando los valores de
nosotros queramos y cuando nosotros queramos (por programa
Tres: la memoria EEPROM para datos, es un espacio de memoria
variables que queremos conservar aunque se apague el pic
por ser una memoria más difícil de emplear.
registros
En primer lugar tenemos que distinguir claramente entre tres tipos de memoria:
la memoria EEPROM donde almacenaremos el programa que haremos, esta memoria solo
por el pic (el pic va leyendo las instrucciones del programa almacenado en esta
. Al apagar el pic esta memoria no se borra.
Dos: la memoria RAM en cuyos registros se irán almacenando los valores de las variables que
nosotros queramos y cuando nosotros queramos (por programa), al apagar el pic esta memoria
es un espacio de memoria EEPROM en la que se
variables que queremos conservar aunque se apague el pico No se tratará aquí
1.3.7. Palabra de configuración

Es una Posición reservada de la memoria de programa FLASH, que ocupa la dirección Ox2007
y que sólo es accesible durante la programación del PIC. El valor de sus bits determina algunas
características de funcionamiento.


CP Bit de protección de la memoria flash del programa (bit 13)
1 = Protección del código activada O =
Código no protegido.

No implementado (bit 12)

DEBUG Modo de (monitoreo) debug en circuito. (Bit 11)
1 = Monitoreo en el circuito desactivado, RB6 y RB7 son pines de propósito

WRT1: WRTO Bits de escritura a la memoria flash de programa (bit 10-9)

Para el PIC16F877 A/876:
11 = La protección de la escritura esta desactivada. 10
= Protegido desde 0x0000 a 0x00FF
01 = Protegido desde 0x0000 a 0x07FF
00 = Protegido desde 0x0000 a 0x0FFF


Instrucciones orientadas a bits

output_low (GP0);
output_high (GP0);

output_low (GP1);
output_high (GP1);

Instrucciones orientadas a constantes y de control
#define GP0 PIN_A0
#define GP1 PIN_A1
Float A=4, B=23;

Instrucciones básicas para el compilador CCS
#include "16f877A.h"
#device adc=10 //Usa resolución de 10 bits.
#use delay (clock=4000000)
#fuses xt,nowdt,noput,nobrownout,nolvp,noprotect

Void main (void)
{
Instrucciones del programa a ejecutar
}

Un poco de orden (ejemplo)

#include <12F629.h>

#FUSES NOWDT //No Watch Dog Timer}
#FUSES INTRC //Internal RC Osc
#FUSES NOCPD //No EE protection
#FUSES NOPROTECT //Code not protected from reading
#FUSES MCLR //Master Clear pin disabled
#FUSES NOPUT //No Power Up Timer
#FUSES BROWNOUT //Reset when brownout detected

#use delay (clock=4000000)



Void main ()
{

setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_comparator(NC_NC);
setup_vref(FALSE);

set_tris_a(0x00);
//con esta instruccion programas que el puerto sea unicamente salida

for(;;)
{

output_high(PIN_A0);
delay_us(9);

output_low(PIN_A0);
delay_us(9);

}

// TODO: USER CODE!!

}


El PWM (pulse wide modulation)
En este modo de trabajo, se consiguen impulsos lógicos cuya anchura del nivel alto es de
duración variable, que son de enorme utilidad para controlar motores, dispositivos de estado
sólido o grabar información al digitalizarla.

El pin RC2/CCP1 es la salida del primer módulo PWM, es decir varía entre los niveles lógicos O
y 1 a intervalos de tiempo diferentes en base a un periodo establecido en la programación. La
variación del nivel alto con respecto al nivel bajo se llama ciclo de trabajo (Duty Cycle).

Para lograr el cambio del pin de salida RC2/CCP1, o bien ya sea el pin RC1/CCP2 donde se
encuentra el segundo modulo PWM que contiene este modelo de PIC, se utiliza un comparador
que pone a 1 el set en un flip-flop cuando el valor del registro PR2 coincide con la parte alta del
TMR2, instante en el que el TMR2 toma el valor 0x00. Acto seguido el flip-flop se resetea (se
pone a 0) cuando otro comparador detecta la coincidencia del valor existente en CCPR1H con
el de la parte alta del TMR2. De esta manera, variando los valores que se cargan en PR2 y en
CCPR1 L (que luego se pasa a CCPR1 H) se varía el intervalo de tiempo en el que el pin de
salida está en 1 ó 0.

Ejemplo

#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)

void main()
{
setup_ccp1(CCP_COMPARE_CLR_ON_MATCH);
// Configure CCP1 in COMPARE mode
setup_timer_1(T1_INTERNAL); // Set up timer to instruction clk

while(TRUE)
{
while(input(PIN_B0)) ; // Wait for keypress

setup_ccp1(CCP_COMPARE_SET_ON_MATCH); // Configure CCP1 to set
CCP_1=0; // C2 high now
set_timer1(0);

CCP_1 = 500; // Set high time limit
// to 100 us
// limit is time/(clock/4)
// 500 = .0001*(20000000/4)

setup_ccp1(CCP_COMPARE_CLR_ON_MATCH);
// Configure CCP1 in COMPARE
// mode and to pull pin C2
// low on a match with timer1

delay_ms(1000); // Debounce - Permit only one pulse/sec
}
}

TEMA 2

PROGRAMACiÓN EN "C" E IMPLEMENTACIÓN DEL PIC16F877

Una gran ventaja de los PIC y que los hace estar entre el microcontrolador preferido a nivel
mundial; es su bajo costo, tanto del chip en si, como de sus componentes electrónicos
necesarios para hacerla funcionar. Otra situación es que Microchip opto por que sus software's
programadores fueran sencillos y no necesitaran de licencias especiales para programar la
memoria de los integrados. Estas dos estrategias le han funcionado de maravilla a Microchip.
Actualmente hay un esfuerzo mundial entre fanáticos de los PICs para crear herramientas para
programarlos y el mejoramiento de estas herramientas es constante. Actualmente el software
más rápido para programar un Pie y que tiene muy buena compatibilidad con muchas PCs es el
WinPIC800.

Para instalar el software WinPic800, bastará con ejecutar el archivo Winpic800.exe, se instalara
en la carpeta C:\Winpic800.

Una vez hecho esto ejecutar el EXE con doble click y establecer la configuración del hardware.

Para grabar un Pic:

1. Seleccionar el dispositivo a programar, elegimos Pie F, luego el Pie 16F877 por ejemplo.

2. Abrir el archivo que contiene los datos a programar en el Pic. El programa trabaja con
ficheros .HEX. En el menú Archivo seleccionamos Abrir archivo, en el cuadro de diálogo que
nos aparece seleccionamos el fichero que deseamos grabar en el Pic.
3. Pulsamos el botón Config. para ajustar el tipo de oscilador y los bits de configuración (de ser
necesario).
4. Para programar el dispositivo seleccionamos Programar todo del menú Dispositivo. Con ello
comenzará la grabación.

El bootloader es un programa pequeño que nos permite escribir solamente en la memoria de
programa flash del microcontrolador PIC a través del puerto serie de una computadora utilizando
únicamente el botón de reset y la electrónica necesaria para la comunicación 232 serial. La
primera vez tiene que ser grabado con un programador quemador, pero una vez instalado, el
grabar sobre la memoria flash es muy rápido y práctico.

Tiny Bootloader

• Es muy pequeño para todas las versiones de PIC 16F, 18F Y dsPIC. (ocupa menos de
100 palabras).
• Permite escribir en memoria FLASH o EEPROM y las palabras de configuración.

• Después de un reset espera 1 segundo (puede ajustarse a mas o menos tiempo) a que
la PC responda.
• Permite seleccionar fácilmente la velocidad de baudaje.

2.2 COMUNICACIÓN USANDO EL PUERTO SERIE DE UNA PC
CON UN PIC.

La comunicación serial o serie surgió debido a la necesidad que se tenía de reducir el
número de cables para trasmitir señales digitales a grandes distancias. Una forma para
hacer esto fue a través de las líneas telefónicas y el uso de los modems. Un modem
(modulador-demulador) es un dispositivo que, del lado trasmisor, modula las señales
digitales para enviarlas por la línea telefónica en forma de cambios de frecuencia y, del
lado del receptor, remodula estos cambios de frecuencia para convertirlos en pulsos
digitales.

Comunicación Síncrona y comunicación Asíncrona.
A grandes rasgos en la comunicación síncrona debe esperarse una señal de tiempo
para empezar a trasmitir y recibir, mientras que en la asíncrona, el envío y recepción
de datos no depende de ninguna señal de tiempo.

Debido a que puede existir transmisión de datos en cualquier momento, es necesario
que la palabra digital que se vaya a trasmitir, tenga cierto formato que reconozcan
todos los dispositivos serie.




• •

El bit de inicio debe ser siempre un nivel bajo. Los bits de datos, marcados con Dn,
pueden ser 4,5,6,7 u 8. El bit de paridad puede estar o no presente. También existe el
bit de parada que puede ser 1, 1 1/2, ó 2 bits. De esta forma, una comunicación serie
debe empezar siempre con un nivel bajo y acabar con un nivel alto. El bit de paridad
sirve para detectar errores en la comunicación.

Estandar RS-232C
Para que una comunicación serie funcione correctamente se necesita, a parte de las
características ya mencionadas, que los niveles de voltaje, que representan el "1" Y el
"O" sea iguales para cada caso; se necesita también de unas señales de protocolo
para preparar a los dispositivos a trasmitir o recibir. Todo esto se incluye en el estándar
RS-232C que se explica a continuación.

Publicado par la Asociación de Industrias Electrónicas (EIA por sus iníciales en inglés),
el estándar RS-232C define las señales de protocolo, los niveles de voltaje de las
señales y un conectar de 25 terminales, necesarios para la comunicación serie
actualmente este estándar es el más usado para la comunicación serie y es el que
viene incluido en la mayoría de las computadoras personales. Esta especificado para
una distancia máxima de 15m (50 pies) a una velocidad máxima de 20,000 baudios
(bits por segundo). Para velocidades de transmisión menores, se pueden usar cables
de 610 a 915 m (2000 a 3000 pies). Existen otras versiones de este estándar, como el
RS-422 y el RS-423, en los que se ve mejorada la velocidad de transmisión
principalmente.

El conectar RS-232C tiene 25 terminales, aunque en la mayoría de los sistemas serie,
sólo se ocupan las terminales 1 a 8 y I~ 20; existiendo inclusive computadoras que
traen un conectar serie RS-232 de 9 terminales. La razón de esta reducción de
terminales es que las patas restantes son líneas secundarias, es decir, líneas que
tienen la misma función pero que nos son usadas a menos que sean sistemas muy
complejos de transmisión. Por este motivo se describirán sólo las terminales más
comunes.




Las terminales descritas en amabas figuras con excepción de TxD, RxD y GND, son las que
conforman las señales de protocolo. Un protocolo es la forma en que la computadora y la interfaz se
piden permiso para trasmitir datos, para avisar que ya están preparados para recibir datos, para
interrumpir la transmisión, etc.
El protocolo es la forma en que dialogan computadoras e interfaz y se lleva a cabo de la siguiente
manera: después de encender la computadora, ésta corre una rutina de auto verificación y envía la
señal DTR a la interfaz. La interfaz responde con la señal DSR para indicar que está funcionando. La
computadora envía la señal RTS a la interfaz y después de un intervalo apropiado de tiempo, la
interfaz responde con CTS. La computadora entonces envía los datos serie por la terminal TxD.




Cuando la computadora debe recibir datos, el protocolo es el mismo, sólo que la computadora envía
las señales que enviaba la interfaz y viceversa, enviando la interfaz, además, la señal CD.

Un protocolo posterior puede llevarse a cabo, ya dentro del programa, para indicarle al dispositivo
externo el inicio de la transmisión y el fin de datos, o por parte del dispositivo hacia la computadora
para pedirle más datos, etc. Este protocolo se explicará cuando se desarrolle el programa de
comunicación definitivo.

En cuenta a los niveles de voltaje, las señales RS-232C están estandarizadas a los siguientes
valores; Un "1" lógico o marca es un voltaje entre -3 y -15 volts. Un "O" lógico o espacio es un voltaje
entre +3 y +15 volts.

Debido a que la interfaz trabajará con circuitos TIL y CMOS deben convertirse estos voltajes a
niveles de +5 volts para el "1" Y O volts para el "O". Esto se logra utilizando un circuito integrado el
MAX232.


Comunicación síncrona

La comunicación se realiza sobre dos líneas, la DT que traslada en los dos sentidos los bits a la
frecuencia de los impulsos de reloj que salen por la línea CK desde el maestro. Se utiliza para
comunícarse con periféricos como memorias, conversores, etc.
















En ambos modos las líneas de comunicación son las dos de más peso de la Puerta C:
RC6ITX/CK y RC7/RX/DT.
Como nuestro fin es la comunicación con un dispositivo que posea comunicación serie y no a un
nivel de comunicación circuito integrado con circuito integrado (esclavo y maestro). Se describirá la
comunicación Asíncrona.
Configuración Comunicación Asíncrona
Los cuatro bloques que configuran la arquitectura del USART, en modo asíncrono, son:
1. Circuito Maestro
2. Generador de baudios
3. Transmisor asíncrono


Módulo de comunicación USART del PIC16F877
Este módulo es capaz de soportar la comunicación serie síncrona y asíncrona

Comunicación asíncrona

Las transferencias de información se realizan sobre dos líneas TX (transmisión) y RX (recepción),
saliendo y entrando los bits por dichas líneas al ritmo de una frecuencia controlada internamente por
el USART (Universal Synchronous Asynchronous Receiver Transmitter). Se utiliza para comunicarse
con dispositivos tales como el monitor CRT, el ratón, módems o el ordenador PC.

Receptor asíncrono

Circuito maestro
Actúa sobre la patita RC7/RX/DT, que es por donde se recibe el bit de información o control y se
encarga de muestrear tres veces su valor, para decidir éste por mayoría.

Transmisor asíncrono
El dato que se desea transmitir por el USART transmisor se deposita en el registro TXREG y a
continuación se traspasa al registro de desplazamiento TSR, que va sacando los bits
secuencialmente y a la frecuencia establecida. Además, antes de los bits del dato de información
incluye un bit de inicio y después de sacar todos los bits añade un bit de PARADA. El USART
receptor recibe uno a uno, los bits, elimina los dos de control y los de información una vez que han
llenado el registro de desplazamiento RSR los traslada automáticamente al registro RCREG, donde
quedan disponibles para su posterior procesamiento.










Le secuencia de pasos para configurar la transmisión en el USART es la siguiente:
1. Hay que configurar las líneas RC6 como salida y RC7 como entrada
2. Poner SYNC = O Y SPEN = 1 para activar la comunicación asíncrona y la comunicación
puerto serie respectivamente.
3. Si se desea trabajar con interrupción poner TXIE = 1, además de habilitar las interrupciones
en general (registro INTCON).
4. Si el dato consta de 9 bits, en lugar de los 8 típicos, poner el bit TX9 = 1. El noveno bit se
coloca en TX9D (TESTA).
5. Se carga el valor X adecuado en el registro SPBRG, para producir la frecuencia de trabajo
deseada. Hay que controlar el bit BRGH (alta y baja velocidad)
6. Activar la transmisión con TXEN = 1. El bit TXIF tendrá valor 1, ya que TXREG se
encuentra vacío.
7. Cargar en TXREG el dato a transmitir. Comienza transmisión.



Receptor asíncrono

Los datos se reciben en serie, bit a bit, por la patita RC7 y se van introduciendo secuencialmente en
el registro desplazamiento RSR, que funciona a una frecuencia 16 veces más rápida que la de
trabajo. Cuando el dato consta de 9 bits hay que programar el bit RX9 = 1 Y el noveno bit de
información se colocará en el bit RX9D del registro RESTA. Cuando CREN = 1 en el registro RCSTA,
se habilita la recepción.

1. Hay que configurar las líneas RC6 como salida y RC7 como entrada
2. Poner SYNC = O Y SPEN = 1 para activar la comunicación asíncrona y la comunicación puerto
serie respectivamente.
3. Se carga con el valor X al registro SPBRG para trabajar con la frecuencia deseada, controlando
además el valor de BRGH.
4. Si se desea que se genere una interrupción con la llegada del bit PARADA,
se pone RCIE = 1, además de habilitar las interrupciones en general.
5. Poner RX9 = 1 para permitir la recepción del bit 9.
6. Para detectar la dirección, poner ADDEN = 1.
7. SE habilita la recepción poniendo CREN= 1.
8. Al complementarse la recepción RCIF se pondrá a 1 y se produce una interrupción si se
había permitido.
9. Se lee el registro Resta y se averigua si se ha producido algún error.
10. Lee los 8 bits del registro RCREG para determinar si el dispositivo ha sido el direccionado.
11. Si se ha producido algún error, poner CREN=0.
12. Si ha sido direccionado el dispositivo, poner ADDEN=0 para permitir la recepción de la
información.





























Configuración del circuito completo de la interfaz serie.

























http://verona.fi-p.unam.mx/crofi/
http://www.microchip.com/
http://es.wikipedia.org/wiki/Microcontrolador_PIC
http://ww1.microchip.com/downloads/en/devicedoc/39582b.pdf