Curso PIC Nivel Medio en Politecnico-Buffer
-
Upload
jarielmar4259 -
Category
Documents
-
view
86 -
download
9
description
Transcript of Curso PIC Nivel Medio en Politecnico-Buffer
P O L I T E C N IC O
25
1. MICROCONTROLADOR 16F873A
1.2 Estructura del Microcontrolador
1.2.1 Generales.
Si tomamos como punto de partida el 16F84A, vemos que es adecuado para sistemas peque-
ños, pero es insuficiente para aplicaciones más demandantes, ya que es un micro “puramente digi-
tal”. Para aplicaciones mas profesionales que requieran comunicación y conexión con el mundo
analógico exterior vamos a necesitar microcontroladores más poderosos.
La potencia de un microcontrolador esta determinada por los tres elementos básicos consti-
tutivos del mismo que son:
Núcleo o core de Microcontrolador + Memoria + Periféricos
Podemos agregar mas potencia a un microcontrolador mejorando cualquiera de estas áreas.
El núcleo contiene la CPU, que puede ser hecha mas poderosa haciéndola más rápida o me-
jorando su arquitectura interna o su conjunto de instrucciones.
La memoria puede ser hecha más poderosa actualizando su tecnología, incrementando su
capacidad y velocidad.
Por último la adición de los periféricos apropiados, pueden simplificar considerablemente el
diseño de un sistema embebido.
El 16F873A comparte el mismo core (mismo set de instrucciones) que el 16F84, pero a di-
ferencia de este último tiene una significativa mejora en lo que a memoria se refiere así como en
la cantidad y diversidad de periféricos que forman parte del chip.
Su distribución de pines es la siguiente:
Microcontroladores PIC Nivel Medio
Y su constitución interna es:
1.2.2 Descripción general CPU y core.
Recordemos que la estructura de la CPU esta conformada esencialmente por el ALU, el re-
gistro de trabajo W y el registro Status
Como se puede apreciar del esquema la estructura en si de la CPU es exactamente igual a la
existente en el 16F84A y a todos los micros del tipo 16F.
La principal diferencia es que en el 16F873A los últimos 2 bits del registro Status, ahora son
usados para poder seleccionar algunos de los 4 bancos de memoria.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
1.2.3 Memoria de Programa.
Observando el esquema notamos que la estructura de memoria del 16F873A es muy similar
a la del 16F84A, siendo su principal diferencia en que ha sido agrandado su tamaño.
Siendo que el contador de programa (PC) es una palabra de 13 bits de ancho (213 = 8192)
debería poder direccionar los 4KBytes (4096 Bytes) de memoria Flash que lo componen en forma
directa, sin el uso de ningún registro auxiliar, sin embargo, no es así. La CPU “ve” la memoria
fragmentada en páginas.
Este es el mapa de memoria vista por la CPU del 16F873A:
La razón por la cual la memoria de programa tuvo que ser paginada en esta forma, es debi-
do a las diferentes formas en que es generada la dirección de programa contenida en el registro
PC, lo cual tiene su origen en los 14bit de la palabra de instrucción que no puede contener, a la
ves, OPCODE + Dirección(13-Bits).
El PC tiene 13 bits de ancho, sus 8 bits inferiores provienen del registro PCL, uno de los re-
gistros especiales que puede ser accedido y manipulado como cualquier otra posición de la memo-
ria Ram. Los 5 bits superiores del PC no pueden leídos, pero sí escritos a través de los 5 bits infe-
Microcontroladores PIC Nivel Medio
riores del registro PCLATH, otro registro contenido en el SFR. El contenido del PCLATH es
transferido a los 5 bits superiores del PC cada vez que es escrito el registro PCL.
En la ejecución normal de un programa el Contador de Programa es incrementado después
de cada instrucción. Sin embargo hay 3 formas diferentes para cambiar su valor, a continuación se
describe cada uno de ellos.
Por Transferencia desde Stack:
El stack tiene un ancho de 13 bits. Por lo tanto toda instrucción, como return, que use el
stack, causa un transferencia completa (de sus 13 bits) entre el stack y el PC, por lo tanto no hay
que preocuparse en hacer algún tipo de corrección.
Por las instrucciones call y goto:
Debido a formato que tienen las instrucciones:
P O L I T E C N IC O
2626
PÁGI
NA 2
Instrucciones operando en el PCL,ej. goto computado
estos bits transferidos del PCLATH estos bits escritos al PCL
estos bits incrustados en la instrucción
estos bits transferidos del PCLATHen una instrucción Call y Goto
Todos los bits desde/hacia el stack
P O L I T E C N IC O
25
Estas instrucciones de por sí, aportan solo los 11 bits inferiores del PC, pudiendo direccio-
nar solamente 2K de memoria (211 = 2048) que es precisamente el tamaño de las páginas vista por
la CPU. Los 2 bits superiores que faltan del PC son tomados de los bits 4 y 3 del registro PCLA-
TH. El programador es el responsable de reconocer si se va a producir un salto de página y modi-
ficar los bits 3 y 4 del registro PCLATH antes de ejecutar las instrucciones goto o call.
Por escribir el registro PCL:
El PCL es escrito directamente en situaciones como cuando se implementa tablas o goto
computado. En esta situación solo los 8 bits inferiores del PC, reflejado en el registro PCL, son es-
critos en forma directa, esto es como si el programador estuviera trabajando con páginas de 256
palabras. Los 5 bits superiores del PC son tomados de los valores contenidos en los 5 bits inferio-
res del PCLATH.
1.2.4 Memoria de datos y registros de funciones especiales
Estructuralmente la memoria esta dividida en 4 bancos, los cuales son seleccionados por
los valores contenidos en los bits 5 y 6 del registro Status.
Sumados a estos 2 bits faltan 7 bits para poder direccionar las 128 posiciones posibles de ca-
da banco. Estos bits están directamente encastrados en el código de operación de las instrucciones.
Microcontroladores PIC Nivel Medio
Para el caso del direccionamiento indirecto para formar la dirección de 9 bits se usan los 8
bits del registro FSR más el 7º bit del registro Status.
Se puede observar que los 2 primeros bancos son usados en su totalidad, en cambio los 2
últimos son poco usados y son espejos de los 2 primeros.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
1.2.5 Palabra de Configuración
La palabra de configuración determina algunas de las características programables de los
microcontroladores, la cuales solo pueden ser cambiadas cuando el dispositivo es programado.
Si lo comparamos con la correspondiente al 16F84A vemos que comparten los 4 primeros
bits y el bits numero 13.
Microcontroladores PIC Nivel Medio
Los 2 nuevos modos de operación ( in-circuit programming y in-circuit debugging ) son
habilitados a través de los bits 7 y 11 de la palabra de configuración, además incluye una mayor
flexibilidad en la protección de código y detección de una perdida parcial de la alimentación a tra-
vés de los circuitos de brown-out
1.2.6 Operaciones especiales de Memoria Eeprom y Flash
Los microcontroladores convencionales leían las instrucciones desde la memoria no-volátil
y usaban la memoria volátil (RAM) para el almacenamiento temporario de datos. Desde la intro-
ducción de la memoria Flash, para el almacenamiento no-volátil, la situación ha cambiado ya que
esta memoria puede ser grabada o leída en el medio de la ejecución del programa, esto permite,
por ejemplo, que la memoria de programa pueda ser grabada serial (por ejemplo usando la UART)
mientras esta puesto en el sistema que controla, o almacenar datos directamente en Flash para ser
leídos durante la ejecución del programa.
También como pasa con otros microcontroladores, éste posee una porción de memoria ee-
prom de 128 bytes que puede ser leída o escrita durante la ejecución del programa.
La interacción con la memoria de programa se hace a través de los mismos registros de da-
tos y dirección que son usados para la eeprom (EEDATA y EEADR), pero debido a que la palabra
contenida en la memoria de programa es de 14 bits y que se necesitan 13 bits de direccionamiento
es necesario agregar un par de registro mas que puedan contener esos bits extras en caso de tratar -
se de la memoria Flash. Estos registros son EEDATH y EEADRH.
En el siguiente esquema se muestra el uso de estos registros en función de cual de las me-
morias se esté accediendo.
En el caso de querer escribir la Flash primero deber ser habilitada por los bits de
configuración WRT0 y WRT1 la región de memoria en cuestión, además hay que tener en cuenta
que por ser memoria Flash solo puede ser escrita en bloques, en este caso, de 4 palabras al mismo
tiempo.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Todas las transferencias de datos son controladas por el registro EECON1 que como se
aprecia usa el bit 7 para discernir a cual de las dos memorias se va a acceder, el resto de los bits
se usan en forma similar tanto para la memoria eeprom como para la flash.
En este curso vamos a guardar en Flash las cadenas que van a aparecer en la pantalla del LCD, la rutina que lee la memoria flash es la siguiente:
Microcontroladores PIC Nivel Medio
La directiva de compilación “BANKSEL” inserta las instrucciones necesarias y selecciona
el banco de memoria donde se encuentra el registro que acompaña a esta directiva, de esta forma
no tenemos que andar buscando en que banco se encuentra cada registro ya que el ensamblador, a
través de esta directiva, lo hace por nosotros.
1.2.7 Estructura Interrupciones
Como miembro de la familia de la serie 16 de microcontroladores, se espera del 16F873A
que tenga la misma estructura de interrupciones que la que posee el 16F84A
En el siguiente esquema se puede apreciar que el lugar que ocupaba en la estructura los bits
EEIE y EEIF en el 16F84A, es reemplazado por el bit PEIE que actúa como subsidiaria del bit
GIE permitiendo habilitar o deshabilitar todas las nuevas fuentes de interrupciones generadas por
los periféricos anexados.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
En consecuencia el registro INTCON queda definido:
Microcontroladores PIC Nivel Medio
Al pasar de 4 a 15 fuentes de interrupciones, ya no es posible contenerlas en un solo regis-
tro, por lo que fue necesario agregar 4 registros mas para poder manejarlas, estos registros son:
PIE1, PIE2, PIR1 y PIR2:
Debido a que solo se tiene un solo vector de interrupción, es necesario contar dentro de la
rutina de servicio de interrupción con una porción código que identifique cual es la fuente de inte-
rrupción actual.
Además a igual que pasaba en el 16F84A, cuando se produce la interrupción la CPU solo
guarda el PC y queda a cargo del programador guardar los otros registros del contexto como el re-
gistro W y el STATUS, lo cual se hacía en variables auxiliares definidas en RAM para este come-
tido. Sin embargo en esta tarea se suma una dificultad más, debido a que en el momento de produ-
cirse la interrupción el registro STATUS podría estar apuntado a un banco diferente al banco cero
(donde están las variables temporales de estos registros) y estaríamos salvando el contexto en un
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
banco diferente a donde están definidas sus variables temporales fallando el proceso de guardar el
contexto.
Para evitar este inconveniente se debe definir otra variable temporal para W, en los otros
bancos distintos del cero que no sean espejo de este y con el mismo offset respecto al comienzo
del banco. Además se debe realizar el siguiente procedimiento:
1) Almacenar el registro W sin importar en que banco nos encontremos
2) Almacenar el registro STATUS en el banco cero
3) Almacenar registro auxiliares en el banco cero
4) Ejecutar la rutina de interrupción
5) Recuperar los registros auxiliares
6) Recuperar el registro STATUS
7) Recuperar el registro W
Ejemplo:
Microcontroladores PIC Nivel Medio
1.2.8 Reset y Alimentación
La estructura de reset de este microcontrolador es muy similar a la del 16F84A, con la ex-
cepción de una nueva fuente que ha sido agregada: el Brown-out reset. El brown-out es una pe-
queña depresión en la alimentación.
Esta forma de perder temporalmente la alimentación puede llegar a ser particularmente peli-
grosa debido a que puede pasar totalmente inadvertida. Parte del sistema podría seguir trabajando
mientras otra parte podría fallar o perder datos. Este tipo de reset asegura que el micro se resetea
por completo cuando se produce este fenómeno.
Este es habilitado por el bit BOREN en la palabra de configuración. Si este bit está habilita-
do y un brown-out ocurre el microcontrolador es forzado a un reset. De acuerdo a la hoja de datos
el valor típico de brown-out es de 4V.
En cuanto a la alimentación tiene los mismos requerimientos que el 16F84A, solo que si el
bit de brown-out está habilitado, éste impone la mínima tensión permisible de trabajo para el mi-
crocontrolador.
1.3 PUERTOS
El 16F873A contiene 3 puertos A, B y C. El puerto A y B son similares a los respectivos
puertos del 16F84A, excepto que ahora el puerto A contiene un bit mas y varios periféricos conec-
tados a este.
El puerto C es el que realmente hace la diferencia ya que la mayoría de los nuevos periféri-
cos están conectados a los pines de este puerto.
1.3.1 Puerto A
En este puerto se encuentran las funciones analógicas como ser los comparadores analógi-
cos y el conversor A/D que comparten sus pines de conexión con las salidas/entradas digitales del
puerto.
Es muy importante notar que en el momento de reset estos pines están definidos como en-
tradas analógicas.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Su estructura genérica es:
donde vemos que el camino de la entrada digital al puerto puede ser deshabilitado a través de la lí-
nea “Analog Input Mode”
A diferencia de lo que sucedía con el 16F84A, en este y en los demás puertos sus pines ya
no son controlados simplemente por el registro TRIS, otros registros (asociados a los periféricos
conectados al pin) pueden tener efecto sobre el desempeño del mismo.
1.3.2 Puerto B
Este puerto no ha sido modificado respecto a del 16F84A, por lo que sigue siendo un puerto
puramente digital con las únicas funciones agregadas: INT en RB0 y weak-pullup en RB4-RB7.
Debido a estas características este es el puerto que vamos a elegir para expandir las entra -
das-salidas del microcontrolador ya que al usarlos como pines digitales no vamos a estar perdien-
do ninguna función “extras” de algún periférico.
Microcontroladores PIC Nivel Medio
1.3.3 Puerto C
Su esquema es:
RC<2:0> RC<7:5> RC<4:3>
Este es el puerto más complejo del 16F873A. Sus pines a igual que con los demás puertos
pueden ser simplemente usados como entradas-salidas digitales, sin embargo todos los pines están
compartidos con algunos de los nuevos periféricos que le dan su potencia a este microcontrolador.
Observando el diagrama del puerto vemos que el corazón del mismo aún se encuentra los
circuitos estándar de entrada-salida. Estos, ahora, tienen multiplexores que los separan del pin de
salida y lo comparten con los periféricos integrados.
Además se puede observar que ahora los periféricos pueden tomar el control de la función
TRIS a través de la línea “Peripheral OE”.
La mayor parte de los periféricos que están conectados a estos pines cumplen funciones de
comunicación serial, que algunas serán vista a lo largo del curso.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
2. INTERFACE HUMANA
2.1 GENERALIDADES
La gran mayoría de los sistemas realizados con microcontroladores requieren de alguna for-
ma de comunicarse con el operador (interfase humana), ya sea para entregar información respecto
al estado del sistema o para poder modificarlo de acuerdo a los requerimiento del usuario.
El los sistemas embebidos es común usar como dispositivo de salida a: leds, 7 segmentos y
LCD, el uso de uno u otro dispositivo depende de: costo, consumo, tamaño, estética, etc. Y como
dispositivo de entrada: teclado, touch-screem.
En el presente curso vamos a estudiar en detalle los requerimientos necesarios, de software
y hardware, para incorporar algunos de estos dispositivos a nuestro diseño, pero con una dificul-
tad más, el control de los mismos lo haremos a través “expansores de entradas/salidas” que vere-
mos a continuación.
2.2 EL REGISTRO DE DESPLAZAMIENTO 74HC595
En ciertos sistemas las cantidades de entradas o salidas provistas por el microcontrolador
pude llegar a ser insuficientes, la solución obvia a este problema sería elegir un microcontrolador
con mayor cantidad de puertos que nos permitan agrandar la cantidad de entradas o salidas. Pero
ésta no es siempre la mejor solución, ya sea por razones de espacio disponible, costo, distribución
de entradas/salidas, etc. Una solución posible sería usar componentes que tengan una buena canti-
dad de entradas y/o salidas, que se puedan ubicar lejos del microcontrolador y se comuniquen con
el mismo con unas pocas líneas (para que realmente sean “expansores”).
Los dispositivos que cumplen con los requerimientos antes mencionados son los registros de
desplazamiento.
El registro de desplazamiento es un dispositivo lógico que permite realizar la tarea de con-
vertir datos de serie a paralelo o de paralelo a serie. O sea recibe una ristra de datos en forma se-
rial y los saca por su puerto en paralelo o toma las entradas en su puerto paralelo y lo transmite en
forma serial dependiendo de si el puerto paralelo está actuando como entrada o como salida.
El registro de desplazamiento que usamos es el 74HC595 cuyo puerto paralelo actúa como
salida. Internamente esta conformado por una cadena de Flip-Flop que le permite almacenar los
Microcontroladores PIC Nivel Medio
datos recibidos en forma serial y presentarlos en paralelo. El siguiente esquema muestra su consti-
tución interna.
Observemos que la primera columna de Flip-Flop es la encargada de almacenar el dato se-
rial recibido y transformarlo en paralelo, ya que el primero de la columna esta conectado a la en-
trada serial (SER), y en los Flip-Flop siguientes su salida esta conectado a la entrada del que le si-
gue inmediatamente debajo.
Para almacenar un dato, simplemente se genera una transición de bajo a alto (de 0 a 1) en la
entrada SCK, y el dato presente a la entrada de cada Filp-Flop se almacena y se manifiesta a su
salida. La transición de SCK de alto a bajo ( de 1 a 0) no produce ningún efecto.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
De esta forma, si quisiéramos que a la salida (de la primera columna de Flip-Flop) aparecie-
ra el dato ‘10000000’ donde el 1 corresponde al Flip-Flop de la salida QH, deberíamos transmitir
el dato ‘00000001’, así de esta forma el primer bit transmitido ( el ‘1’) después de 8 ciclos de reloj
llegaría hasta el último Flip-Flop (el asociado a QH), o sea simplemente tomar los bits a transmitir
empezando por el bit7 hacia el bit0.
Ahora para poder entender la necesidad de la segunda columna de Flip-Flop imaginemos
que no está y que las salidas de la primera columna están conectadas a los pines del integrado,
además supongamos que a cada una de estas salidas conectamos un relé que controla una lámpara.
Si quisiéramos encender la última lámpara, la que está conectada a QH, como ya fue dicho,
tendríamos que transmitir por el pin serial (SER) la palabra en binario ‘00000001’, a medida que
el ‘1’ se vaya desplazando hacia el último Flip-Flop iría pasando por todos los anteriores y encen-
dería momentáneamente (lo que dure un período de reloj) la lámpara que esa salida tenga asocia-
da. De esta forma vemos que no podríamos cambiar el estado de una salida sin afectar momentá-
neamente (lo que dura el desplazamiento de los ocho datos) a todas las demás.
Es para resolver este problema es que existe esta segunda columna de Flip-Flop, ya que su
reloj (RCK) se debería activar (transición de 0 a 1) una vez que la transición ha finalizado, de es-
ta forma ésta, ya no se manifiesta más a la salida.
Un esquema simplificado del integrado es el siguiente:
Microcontroladores PIC Nivel Medio
Ahora denominando a los pines de la siguiente manera:
Ouput Enable = OESerial Data Input (A) = SERLatch Clock = RCLKShift Clock = SRCLKReset = SRCLRSQH = QH’
Y la función de cada pin esta descrito en la siguiente tabla de verdad:
SER SRCLK SRCLR RCLK OE Función
X X X X H Salida QA a QH deshabilitadas
X X X X L Salida QA a QH habilitadas
X X L X XSe limpia el registro de desplaza-
miento (S.R.)
L ↑ H X XLa primera etapa del S.R. pasa a “0”
y las otras toman el valor de la etapa previa
H ↑ H X XLa primera etapa del S.R. pasa a “1”
y las otras toman el valor de la etapa previa
X ↓ H X X El estado del S.R. no cambia
X X X ↑ XLos datos S.R. son almacenados en
el registro del almacenamiento
X X X ↓ XEl estado del registro de almacena-
miento no cambia
X = No importa H = 1 lógico L = 0 lógico ↑ = Transición de bajo a alto ( 0 --> 1)↓ = Transición de alto a bajo ( 1 --> 0)
Un pin muy útil del integrado es el QH’ que nos permite colocar estos integrados en serie
dando una expansión del registro de desplazamiento con el solo hecho de conectar esta salida a la
entrada serial (SER) de la siguiente etapa.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
En el siguiente esquema hemos conectado 3 de estos integrados en serie, anulando los pines
SRCLR y OE poniéndolos a Vcc y GND respectivamente, los otros pines de control fueron conec-
tados entre sí. De esta forma los 3 integrados se comportan como si fuera uno solo de un registro
de desplazamiento de 24 etapas, un registro de almacenamiento de 24 etapas y 24 pines de salida.
2.3 EL REGISTRO DE DESPLAZAMIENTO 74HC165
Este registro de desplazamiento es el dual del 74HC595, ya realiza la función inversa a este,
es decir, lee los datos de su puerto paralelo (ahora es una entrada y no una salida), y comunica
esos datos en forma serial.
Un esquema simplificado del dispositivo es el siguiente:
Microcontroladores PIC Nivel Medio
De esta forma es ideal para expandir la cantidad de entradas de un microcontrolador, en
nuestro caso esta expansión las vamos a usar para agregar al sistema un teclado, con la única ne-
cesidad de disponer de un pin mas del microcontrolador (RB0) para leer los datos transmitido por
el dispositivo. Nuestro teclado va estar conformado por 4 switch y 4 jumpers.
Observar que tomamos la salida negada, esto es porque queremos que el estado de las teclas
se manifiesten como “0” en reposo y como “1” cuando se apreta el switch o cortocircuita el jum-
per
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
2.4 DISPLAY DE 7 SEGMENTOS
El display de 7 segmentos no es más que una agrupación de led, donde cada led enciende un
segmento del mismo. Teniendo una más para el encendido del punto decimal. Todos los leds están
unidos por el cátodo o por el ánodo denominándose cátodo común o ánodo común respectivamen-
te.
A cada segmento se los denomina con una letra como muestra la figura siguiente:
De esta forma para encender un segmento determinado por ejemplo el “a” se debe poner un
“1” lógico en el led del pin 7 a través de una resistencia limitadora de corriente.
En el circuito propuesta existen cuatro 7 segmentos conectados en paralelo entre sí, y todos
conectados a un integrados 74HC595 de la siguiente forma.
Microcontroladores PIC Nivel Medio
Ahora tenemos que deducir cual es la palabra que deberíamos transmitir para poder encen-
der algún segmento en particular. De las conexiones se ve para encender solo el segmento “b”
debería aparecer a la salida del 74HC595; QH = 1 y QA=QB=QC=QD=QE=QF=QG = 0, o sea el
valor binario “10000000”.
De igual forma si quisiéramos encender solo el segmento “c” la salida del 74HC595 sería:
QC = 1 y QA=QB=QD=QE=QF=QG=QH = 0, o sea el valor binario “00000100”.
Conjugando lo antes deducido para que en el display apareciera el numero “1” (b y c)
encendidos se debe transmitir el valor “10000100”
La siguiente tabla resume el valor binario a transmitir y lo que se muestra en el display de 7-
Segmentos.
Tabla Nº 1VALOR BINARO DISPLAY
11010111 010000100 111100011 211100110 310110100 401110110 501110111 611000100 711110111 811110110 9
Observemos que:
La relación que hay entre el valor binario a transmitir y lo que se muestra en
el display depende exclusivamente de la conexiones eléctricas que hay entre los pines de salida
del 74HC595 y los pines del display de 7-Segmentos (7Seg). Si cambiamos estas conexiones
cambia el valor binario a transmitir.
Una forma posible de manejar cuatro 7Seg sería usar un registro de desplazamiento por cada
uno de estos, pero sería una forma muy ineficiente ya que podríamos aprovechar la característica
que posee el ojo humano de retener las imágenes por unos cuantos milisegundos, para mantener
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
encendido solo un 7Seg a la vez y encenderlos en forma consecutiva. Un circuito como el si-
guiente cumpliría con este requisito.
El software tendría que trabajar de la siguiente forma:
1) El registro de desplazamiento saca los datos correspondientes a DS1, activa
el transistor Q1 y desactiva los otros. Se hace un tiempo de espera (en nuestro caso de 2 miliseg.).
2) El registro de desplazamiento saca los datos correspondientes a DS2, activa
el transistor Q2 y desactiva los otros. Se hace un tiempo de espera (en nuestro caso de 2 miliseg.).
3) El registro de desplazamiento saca los datos correspondientes a DS3, activa
el transistor Q3 y desactiva los otros. Se hace un tiempo de espera (en nuestro caso de 2 miliseg.).
4) El registro de desplazamiento saca los datos correspondientes a DS4, activa
el transistor Q4 y desactiva los otros. Se hace un tiempo de espera (en nuestro caso de 2 miliseg.).
5) Se vuelve reinicia nuevamente el ciclo a partir del punto 1)
Microcontroladores PIC Nivel Medio
Start
Cuenta = 3
Cuenta = 3 ?
dato = DatLCD
2
Cuenta = 2 ?
Si
Si
No
No dato = DatCont
dato = Dat7Seg
1
BTx = 8
En nuestro sistema, la base de los transistores están controlados por 4 salidas de otro
registro de desplazamiento que esta conectado en serie con el que saco los datos para los 7Seg.
Si observamos el esquema general de circuito propuesto como interface humana, vemos que
todas las salidas están conformadas por 3 integrados 74HC595.
El primero de ellos, sus salidas manejan los datos transmitidos al LCD, el segundo contiene
una señal de control del LCD, 4 salidas que manejan los transistores de los 7Seg. y 3 mas que
manejan Leds y por último el tercero es el provee los datos que van a aparecer en los 7 Seg.
En el programa se definen 3 variables que contienen los datos asociados a cada 74HC595 y
estos son:
DatLCD: Contiene el valor que se va a escribir en el 595 que transmite los datos al LCD
DatCont : Contiene el valor que se va a escribir en el que controla los transistores y los leds
Dat7Seg: Contiene el valor que se va a escribir en el 595 de los 7-Seg
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
RB4 = 7º bit de dato
BTx = 0 ?
Correr dato 1 bit a la izq.
2
Cuenta = 3?Si
Si
No
No0 bit Teclado =
RB0
Generar Clock
2
Correr Teclado 1 bit a la izq.
BTx = Btx-1
Cuenta = 0 ?
Si
Cuenta = Cuenta-1
No1
Generar Lacth en los 595
Fin
Un detalle importante a notar en estas últimas líneas de software es que la señal que realiza
la carga paralela (Rclk) de los registros de desplazamiento permanece el tiempo entre
transmisiones en un valor alto y solo va a un valor bajo por un par de ciclo de instrucción.
La razón para manejar de esta forma esta señal radica en que los registros de
desplazamientos trabajan diferente a la hora de guardar sus datos paralelos, para el caso del
2 mseg.
Lacht de datos en el 74HC165
Lacht de datos en el 74HC165
Microcontroladores PIC Nivel Medio
74HC595 se realiza en el flanco ascendente de la señal, mientras que para el caso del 74HC165 es
por nivel y los datos presente en la entrada de los pines pasan al registro paralelo mientras halla
un cero en Rclk, para que los datos almacenados puede ser leídos en forma serial esta señal debe
estar a un valor alto, de ahí la forma en que se maneja la misma.
Una vez que hemos generado el software para la carga y lectura de los registros de
desplazamiento vamos a ver el código que nos permite ir alternando cual de los 7Seg es mostrado.
Para lograrlo vamos a usar 4 variables:
_7SegDat0 ; Contiene lo que se muestra en el 7-Seg Nº1
_7SegDat1 ; Contiene lo que se muestra en el 7-Seg Nº2
_7SegDat2 ; Contiene lo que se muestra en el 7-Seg Nº3
_7SegDat3 ; Contiene lo que se muestra en el 7-Seg Nº4
_7SegMos ; Contiene cual de los 4 7-Seg es el que se tiene que mostrar
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
2.4.1 Conversión de Binario a BCD
Sin bien la mayoría de las operaciones realizadas en un microcontrolador ( sumas, restas,
operaciones lógicas ), naturalmente, son realizadas en numeración en base dos (binaria), los
resultados de las mismas cuando son mostradas al operador deben ser, de alguna forma, traducidas
al formato decimal que es con lo que las personas estamos habituados.
Un paso intermedio en esta transformación de binario a decimal es usar el formato conocido
como Decimal Codificado en Binario o BCD. En este formato se usan 4 bit para representar
“cada uno de dígitos decimales” ya que con 3 bit no nos alcanzaría porque solo es posible
representar 8 símbolos diferentes (23 = 8) y no 10 como necesitamos.
La asociación que realizamos entre un dígito decimal y su equivalente en BCD viene dado
por la siguiente tabla:
Microcontroladores PIC Nivel Medio
Debido a que con 4 bit podemos representar 16 cantidades diferentes, en la codificación
BCD los números binarios 1010 (0xA), 1011 (0xB), 1100 (0xC), 1101 (0xD), 1110 (0xE) y 1111
(0xF), no son usados. En la tabla también se muestra el equivalente en codificación ASCII que
será usada con el LCD.
Pongamos algunos ejemplos:
Decimal Binario/Hex BCD
69 10001010x45
0110 1001(6) (9)
317 1001111010x13D
0011 0001 0111(3) (1) (7)
6834 11010101100100x1AB2
0110 1000 0011 0100(6) (8) (3) (4)
De tabla deducimos que la conversión no es más que “extraer” del número binario los
dígitos que lo componen y representar cada dígito en un nibble (4-bits).
De esta forma el número binario 1000101 representa 6 decenas y 9 unidades, cada uno de
estos dígitos en BCD se presenta en un nibble por separado.
Supongamos que sabemos que nuestro número binario (BBB) a convertir es menor a 100:
Un algoritmo que permitiría esta conversión es el siguiente:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Ahora supongamos que sabemos que nuestro número binario (BBB) a convertir es menor a
1000:
En nuestro caso vamos a mostrar valores de 0 a 9999 en los 4 7-Segmentos, por lo tanto
para que el código sea robusto al comienzo de la rutina debemos comprobar que la variable a
mostrar sea inferior a 10000, sin embargo si fuera superior, vamos a recortar el número al valor
9999 (saturación).
El valor a convertir lo recibiremos en las variables: contH:cont
Y el resultado será puesto en las variables: bcdH:bcd
Microcontroladores PIC Nivel Medio
bcdH bcd
Unidad Centena Decena Unidad
de Mil
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Una vez que hemos convertido el valor binario a su formato BCD tenemos que usar la Tabla
Nº 1 (pág. 24) para convertir un número BCD a la correspondiente secuencia de bits que hagan
que ese número se refleje en los 7-Segmentos. El Código de la tabla es el siguiente:
Microcontroladores PIC Nivel Medio
El resultado de esta conversión se guardará en las variables correspondientes a cada uno de
los 7-Segmentos.
Unidad _7SegDat0
Decena _7SegDat1
Centena _7SegDat2
Unidad de Mil _7SegDat3
El código es el siguiente:
2.5 DISPLAY DE CRISTAL LÍQUIDO (LCD)
El cristal líquido es un componente orgánico que permite, a través de una tensión aplicada al
mismo, polarizar la luz que lo atraviesa. Mientras se han diseñados distintos tipos de LCD los mas
comunes son los alfanuméricos y los gráficos, en el presente curso se estudiaran los LCD
alfanuméricos.
El manejo directo del LCD no es una tarea sencilla, gracias a la evolución tecnológica,
tiempo atrás apareció en el mercado un chip que resuelve este inconveniente. Es el HD44780 de la
empresa Hitachi cuya electrónica genera todas las señales necesarias para el manejo del LCD y
P O L I T E C N IC O
2626
PÁGI
NA 2
Tabla Nº1
Tabla Nº1
Tabla Nº1
Tabla Nº1
P O L I T E C N IC O
25
ofrece al mismo tiempo una interfase simple que puede ser conectada a cualquier microprocesador
o microcontrolador.
Si bien con el tiempo aparecieron en el mercado otros controladores, estos han respetado la
interfase creada por el HD44780, la cual se ha vuelto una interfase estándar.
Hoy en día la mayoría de los fabricantes de LCD incorporan como parte de su producto un
chip del tipo antes mencionado, resultando en un componente de salida común a muchos sistemas
embebidos ya que casi se puede controlar desde cualquier microcontrolador.
Desde el punto de vista del microcontrolador el LCD no es más que un matriz de memoria,
como se muestra en la siguiente figura:
Memoria en el LCD Pantalla del LCD Posic Valor0x00 0x350x01 XX0x02 XX0x03 XX
0x08 0x3F
0x40 0x500x41 XX0x42 XX0x43 XX
0x47 0x61
en la cual cada una de sus posiciones tiene una relación biunívoca con uno de los caracteres que
aparecen en el display, así por ejemplo, si depositamos el valor hexadecimal 0x35 en una
posición de memoria, el carácter asociado mostrará el número 5, ya que se usa la codificación
ASCII.
Como se ve de la gráfica posiciones de memoria consecutivas corresponden a caracteres
consecutivos en el LCD.
5 ?
P a
Microcontroladores PIC Nivel Medio
Un punto importante a notar es que los caracteres del LCD de la segunda fila se
corresponden con las posiciones de memoria a partir de la dirección hexadecimal 0x40, por lo
tanto, para que aparezcan caracteres en la segunda fila debemos escribir sus correspondiente
códigos ASCII a partir de la dirección de memoria 0x40.
La tabla ASCII que relaciona lo que esta escrito en memoria con lo que aparece en el LCD
es la siguiente:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Aparte de la transmisión de los datos a la memoria del LCD, se deben transferir datos de
control o instrucciones que nos permiten entre otras cosa
Modificar el puntero de memoria que determina cual va a ser la próxima posición de
memoria a escribir
Establecer si la interfase va a ser de 4 o 8 bits
Hacer visible o invisible el cursor
Posicionar el cursor en el extremo superior izquierdo
Limpiar toda la memoria, etc.
La selección si se esta escribiendo un dato o una instrucción se hace a través de una de sus
señales físicas (RS) como se verá a continuación.
2.5.1 Interfase física
Los LCD se conectan con el mundo exterior a través de las siguientes señales:
PIN Símbolo Función
1 Vss Masa
2 Vdd Alimentación de 5V
3 Vo Ajuste de contraste del LCD. Tensión entre 0v y 5V
4 RS RS = 0 Registros de Control RS =1 Registro de Datos
5 R/W R/W = 0 Se escribe el LCD R/W = 1 se lee el LCD
6 E E = 0 LCD desconectado E = 1 LCD conectado
7-14 DB0-DB7 Bus bidireccional de datos y control
Microcontroladores PIC Nivel Medio
A LED+ Tensión positiva para el backlight
K LED- Tensión negativa para el backlight
Cuyo significa es el siguiente:
En el circuito propuesto las conexiones son las siguientes:
Del esquema de conexiones notamos:
La tensión Vo se obtiene de un potenciómetro conectado entre masa y 5V
La señal R/W esta a masa, lo que indica que solo se puede escribir el LCD
La señales del bus de datos se conectan a las salidas del 74HC595 del U1
La alimentación del backlight se hace a través de un jumper y una resistencia de 12
ohm a 5V, el jumper podría ser reemplazado por un transistor actuando como llave.
La señal RS se genera en Qg ( = Q6) del segundo 74HC595 U2
La señal E es generada directamente por el pin RB1 ya que es una señal pulsante y
no por nivel.
2.5.2 Comandos
Los comandos emitidos hacia el controlador del LCD, tienen un tiempo de ejecución que es
bastante mayor a la velocidad con que trabajan la mayoría de los microcontroladores. Por lo tanto
el manejo de los mismos trae aparejado requerimientos de tiempos.
Para aliviar esta situación es que después de emitir un comando hacia el LCD, el
controlador permite leer el LCD (R/W = 1), en modo comando (RS = 0). El bit 7, que lo
llamaremos BF, del valor devuelto en la lectura indica el estado de ejecución del último comando
emitido.
Si BF = 1 LCD todavía ejecutando el comando.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Si BF = 0 LCD listo para recibir otro comando.
Notar que en nuestro sistema, con el objetivo de minimizar la interface de hardware con el
LCD es que el R/W fue puesto a masa, por lo que no nos he posible realizar lecturas.
En nuestro caso, simplemente vamos a tomar un intervalo de tiempo suficiente para
asegurarnos de que toda ejecución interna haya terminado antes de enviar el próximo dato o
comando.
Son muchos y variados los comandos que pueden admitir la interfase HD44780, a
continuación una lista de los mismos:
Microcontroladores PIC Nivel Medio
A continuación estudiaremos los comandos más utilizados:
Function Set:
Establece el tamaño de la interfase con el bus de datos (DL), número de líneas de display
(N) y tipo de carácter (F)
En nuestro caso será:
DL = 1, Trabajamos con interfase de 8 bits
N = 1, La presentación se hace en 2 líneas
F = 0, Caracteres 5x7 dots
Por lo tanto el byte que vamos a transmitir es el siguiente:
LCD8bit equ B'00111000'
Display On/Off Control:
Activa o desactiva poniendo en ON/OFF tanto al display (D) como el cursor (C) y se
establece si este último parpadea o no (B).
En nuestro caso será:
D = 1, Pantalla activa (On)
C = 0, Cursor desactivado (Off)
B = 0, Cursor sin parpadeo
Por lo tanto el byte que vamos a transmitir es el siguiente:
LCDOn equ B'00001100'
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Clear Display:
Borra el modulo LCD y coloca el cursor en la primera posición (Dirección 0x00)
Por lo tanto el byte que vamos a transmitir es el siguiente:
LCDClr equ B'00000001'
Entry Mode Set:
Incrementa (I/D = 1) o decrementa (I/D = 0) en 1 el puntero a la RAM del LCD cuando se
ejecutan operaciones de lectura o escritura de la DD RAM o CG RAM y especifica si la visualiza-
ción se va desplazando a la siguiente posición de la pantalla o no (S).
En nuestro caso será:
I/D = 1, Incrementa la posición RAM en cada lectura o escritura
S = 0, Normal, sin desplazamiento en la visualización. Si scroll
Por lo tanto el byte que vamos a transmitir es el siguiente:
LCDInc equ B'00000110'
Set DD RAM Adress:
Este comando modifica el valor del puntero de memoria interno del LCD. Es la posición de
memoria a partir de la cual se va a escribir o leer el próximo dato.
Microcontroladores PIC Nivel Medio
Para nuestro caso cuando queramos que el puntero señale la primera posición de la primera
fila vamos a tener que transmitir el valor B'10000000' (0x80), en cambio cuando queramos que
apunte al comienzo de la segundo fila debemos transmitir el valor B'11000000' (0xC0).
Write Data to DDRAM:
Mediante este comando se escribe en la memoria DD RAM los datos que se quieren presen-
tar en pantalla y que serán los diferentes códigos ASCII de los caracteres a visualizar.
Observar que a diferencia de los comandos anteriores este tiene la señal RS a “1”.
Finalmente vamos a decir que existen comandos que nos permiten crear caracteres persona-
lizados, los cuales se manejan en una memoria aparte dentro del LCD denominada CGRAM, tam-
bién hay comando que nos permiten hacer un “scroll” o corrimiento de la pantalla, pero estos, no
serán estudiados en el presente curso.
2.5.3 Secuencia de Inicialización
Después de ser aplica la tensión de alimentación al LCD se produce una secuencia interna
de inicialización, la cual debe finalizar antes de poder enviar comandos. El fabricante recomienda
que esta espera sea superior a 15mseg.
Inmediatamente tenemos que enviar el comando Function Set que nos permite definir el ti-
po de interfase a usar (4bits o 8 bits). En nuestro sistema vamos a usar la interfase de 8 bits, que es
la asumida por el LCD por defecto, si se quisiera usar la de 4 bits, se usan los 4 bits superiores de
la interfase del LCD (DB7-DB4) como muestra la siguiente figura, en este caso cada byte se
transmite en 2 paso, transmitiéndose primero el nibble superior (Bit7-Bit4) y el luego el inferior
(Bit3-Bit0).
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
De acuerdo a la nota de aplicación del fabricante el resto de la inicialización debe seguir las
siguientes secuencias:
Microcontroladores PIC Nivel Medio
Por lo visto nuestra secuencia de inicialización es la siguiente:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Del código anterior se ve que para hacer la medición del tiempo llamamos a unas subrutinas
como las siguientes:
Microcontroladores PIC Nivel Medio
Donde se ve claramente que estamos usando el Timer0 en la medición de estos tiempos.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Observemos que la penúltima sentencia “MacroLCDMsg” no es en realidad una instrucción
de programa sino una macro (pág. 44).
Las macros asignan un nombre simbólico a un bloque de sentencias o directivas. Luego se
puede usar dicho nombre para reemplazarlo por ese conjunto de sentencias en el código. Opcio-
nalmente se pueden definir parámetros que van a representar argumentos para la macro.
La estructura general de una macro es la siguiente:
Nombre_Macro macro [arg1, arg2,…., argn]
…..
…..
endm
Donde “Nombre_Macro” es el nombre con el cual será invocada esta macro, “argx” son los
argumento que pueden ser definidos con la macro y serán reemplazadas por lo valores correspon-
diente al momento de su invocación. Hay que tener presente que es necesario definir la macro pre-
viamente a ser invocada, sino un aviso de error aparecerá como resultado.
Para nuestro software la macro esta definida de la siguiente forma:
Aunque no es fácil verlo en un primer momento, lo que hace el código de la macro es: tomar
una cadena grabada en la Flash en la posición de memoria “MsgPtr” y mostrarla en el LCD a par-
tir del carácter “Posc”. La que realmente hace este trabajo es la rutina “_EscCadLCD”, la primera
parte de la macro prepara las variables necesarias para esta rutina.
Microcontroladores PIC Nivel Medio
Si bien es variada la forma en que se puede manejar la información que va a aparecer en el
LCD, nosotros elegimos la siguiente.
Se va a definir una porción de la memoria RAM (buffer), cuyo nombre genérico será
“BufferLCD”, que tendrá un tamaño de 16 bytes, donde cada byte tendrá una correspondencia
biunívoca con cada uno de los caracteres que conforma el LCD como se muestra en la siguiente
figura:
Memoria RAM del PIC Pantalla LCD Posic ValorBufferLCD + 0 0x35BufferLCD + 1 XXBufferLCD + 2 XXBufferLCD + 3 XXBufferLCD + 4 XXBufferLCD + 5 XXBufferLCD + 6 XXBufferLCD + 7 0x3F BufferLCD + 8 0x50BufferLCD + 9 XXBufferLCD + 10 XXBufferLCD + 11 XXBufferLCD + 12 XXBufferLCD + 13 XXBufferLCD + 14 XXBufferLCD + 15 0x61
Por lo tanto si quisiéramos que aparezca un determinado carácter en la primera posición de
la segunda fila, solamente tendríamos que depositar su código ASCII correspondiente en la posi-
ción de memoria: “BufferLCD + 8”, por lo tanto, desde el punto de vista del programa, el LCD
no es mas que un array continuo de memoria dentro del propio microcontrolador.
Por lo tanto para hacer aparecer en el LCD lo mismo que se muestra en los 7-Segmentos
solo tenemos que tomar el resultado de la conversión a BCD sumarles el valor 0x30 para
convertirlo a código ASCII y ponerlo a partir de la posición de memoria que queremos que
aparezca.
Como se muestra a continuación:
5 ?
P a
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
En los dos últimos caracteres de la segundo fila del LCD vamos a hacer aparecer el estado
del teclado, por lo tanto el código a agregar es el siguiente.
Antes de continuar con el estudio de la macro, veamos el significado de la siguiente
sentencia:
Microcontroladores PIC Nivel Medio
La directiva de compilación “dt” nos permite formar los llamados goto computados en una
forma mas amigable.
Si analizamos el contenido de la memoria de programa, vamos a ver que esta sentencia va a
ser reemplazada por la siguiente secuencia de instrucciones:
Donde notamos que cada instrucción “RETLW” contiene el código ASCII de los caracteres
sucesivos que conforman la cadena, empezando por la izquierda a partir de la posición de memo-
ria indicada (MsgIni).
Observando la columna “Opcode”, notamos que el valor 0x34 (byte alto) corresponde al
código de operación de la instrucción RETLW y el otro valor (byte bajo), corresponde al código
ASCII del carácter de la cadena que representa.
Entonces, los caracteres que conforman nuestra cadena van a ser grabados en el byte bajo
en posiciones sucesivas de la memoria de programa. Para poder “extraer” la cadena de la memo-
ria, tenemos que leerla y quedarnos con el contenido del byte bajo.
Una vez hechas todas estas definiciones, continuemos con el análisis de la macro. En las pri-
meras instrucciones definimos en el registro FSR la posición a partir queremos grabar la cadena y
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
luego grabamos en las posiciones de memoria DIRH y DIRL la dirección de la memoria de pro-
grama a partir de la cual esta grabada la cadena.
La última instrucción llama a la rutina _EscCadLCD:
la cual lee, a través de “_LeerFlash”, la memoria de programa devolviendo el resultado en la va-
riables DatL y DatH, solo DatL se tiene en cuenta, notemos que si la lectura da cero se da por ter-
minado la rutina, de esta forma usamos el valor cero para indicar en fin de la cadena.
Luego incrementamos la posición de memoria Flash a leer y la posición de la memoria
RAM a donde guardar el valor leído.
Hasta aquí realmente no hemos escrito nada en el LCD, sino, sobre una porción de memoria
RAM dentro del microcontrolador. Aparte de tener que realizar la tarea de transferir la informa-
ción desde la memoria RAM del micro a la del LCD, debemos preguntarnos ¿cada cuanto? ,
¿transferimos todos los datos o de a uno?, ¿esperamos a que se modifique un valor, para transfe-
rir?.
Microcontroladores PIC Nivel Medio
Para nuestro sistema vamos a elegir la siguiente metodología:
Memoria RAM del PIC Cada 2 mseg Memoria Pantalla LCD Posic PosicBufferLCD + 0 0x00BufferLCD + 1 0x01BufferLCD + 2 0x02BufferLCD + 3 0x03BufferLCD + 4 0x04BufferLCD + 5 0x05BufferLCD + 6 0x06BufferLCD + 7 0x07BufferLCD + 8 0x40BufferLCD + 9 0x41BufferLCD + 10 0x42BufferLCD + 11 0x43BufferLCD + 12 0x44BufferLCD + 13 0x45BufferLCD + 14 0x46BufferLCD + 15 0x47
Vamos a transmitir un byte cada 2 milisegundos de tal forma que el LCD será refrescado
por completo en 32 milisegundos. Hay que tener la precaución que, al querer enviar el byte Nº 8
primero hay que mandar al LCD un comando para cambiar el puntero interno de memoria y pase
de apuntar de la posición nº 7 a la Nº 64 (0x40). La transferencia la haremos en una interrupción
generada por el Timer0 cada 2 mseg.
La rutina de interrupción comienza de la siguiente forma:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Se salva el estado del sistema y se recarga el timer0 para la próxima transferencia.
Ahora se ejecuta la transferencia en sí:
Luego se selecciona los datos de los 7-Seg como ya vimos en la página 34, se actualiza el
valor de PuntBuf y se sale de la interrupción recuperando el estado del sistema.
Microcontroladores PIC Nivel Medio
Para probar el funcionamiento del LCD y de los 7-Segmentos vamos a desarrollar un pro-
grama que incremente una cuenta de 0 a 9999 y realice un “roll-over”. La variable que lleva la
cuenta se incrementara cada vez que se desborde el Timer1, al cual le tomara aproximadamente
210 milisegundos.
La cuenta se va a llevar sobre las variables
NPul : Byte Bajo de la cuenta
NPulH: Byte Alto de la cuenta
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
El programa en sí es:
Microcontroladores PIC Nivel Medio
3. ADQUISICIÓN DE DATOS-CONVERSOR A/D
3.1 SISTEMA DE ADQUISICION DE DATOS
Hasta ahora nos hemos limitado a realizar aplicaciones en el mundo puramente digital, todo
lo hecho hasta aquí podría ser implementado sin inconveniente en un 16F84A, por lo que hasta
ahora no hemos usado las ventajas cualitativas que posee el 16F873A.
En el mundo que nos rodea, la mayoría de las variables son naturalmente analógicas. Son
variables continuas que pueden tomar infinitos valores, como ejemplo pensemos en la temperatu-
ra, intensidad sonora, frecuencia, etc. Por lo tanto es necesario para un microcontrolador poder
leer valores de naturaleza analógica y también generarlos, a pesar de ser un dispositivo intrínsica-
mente digital.
Adquisición de datos, se denomina al proceso de convertir la señal analógica a digital junto
a las manipulaciones de la señal necesarias para conseguirlo
Una vez que el dato del mundo exterior ha sido adquirido, necesita ser procesado para poder
ser utilizado. Este procesamiento podría incluir: promediado, escalado, linealizado, almacena-
miento, etc.
Sabiendo que la mayoría de los traductores transforman una variable física analógica en una
variables eléctrica analógica, nos podríamos preguntar acerca de las razones de porque no hacer
las manipulaciones necesarias en el mundo analógico, es decir, ¿Por qué convertirlo al formato di-
gital? .Para responder a esta pregunta tenemos que hacer un análisis comparativo respecto a las
ventajas y desventajas de uno y otro.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Propiedad Analógico Digital
Medio de RepresentaciónUna variable continua en ten-sión o corriente
Variable representada en for-mato binario
Presición de la representación
Puede tomar infinitos valores. Una absoluta precisión es teóri-camente posible, siempre que la señal no sea corrompida de nin-guna forma. Enorme ancho de banda
Solamente un número fijo de combinaciones de dígitos es-tán disponibles para la medi-ción. Ej, un número de 8 bits solo puede tomar 256 combi-naciones diferentes. Ancho de banda representado limitado
Resistencia a la degradación de la señal
Casi inevitablemente se sufre de derivas, distorsión, interfe-rencia. Una vez que la señal es-tá corrompida no puede ser completamente recuperada
La representación digital es intrínsicamente tolerante a la mayoría de las formas de de-gradación de la señal. Puede ser introducido un chequeo de errores para poder recuperar una señal digital corrompida
Procesamiento
El procesamiento analógico de señales usando A.Op. a alcan-zado un nivel sofisticado, pero está limitado en flexibilidad y siempre sufre de algún tipo de degradación de señal.
Fantásticos algoritmos puede realizar tareas imposibles des-de el mundo analógico. Por ejemplo en el filtrado digital se consigue regiones de tran-sición totalmente abruptas. Al ser un algoritmo se lo puede cambiar por uno mas avanza-do, o sea, flexibilidad
AlmacenamientoEs difícil conseguir almacena-miento analógico por tiempo prolongados
Siendo que la tecnología ac-tual aumenta día a día la capa-cidad de almacenamiento de los componentes digitales su-mado a los avances en los al-goritmos de compresión, ha-cen al mundo digital en medio más conveniente para el alma-cenamiento.
Microcontroladores PIC Nivel Medio
3.1.1 Generalidades
Antes de que efectivamente la señal analógica llegue a la entrada del conversor A/D,
generalmente sufre de un procesamiento como el mostrado en la figura:
3.1.2 Acondicionamiento de Señal. Amplificación y filtrado
Para hacer un mejor uso del conversor A/D, la señal de entrada debe extenderse lo más
posible en su rango, sin llegar a excederlo. Ya que, como sabemos existen traductores cuya salida
se mide en milivoltio y aun en microvoltios, pensemos en un micrófono o en una termocupla, la
amplificación es una proceso necesario para el aprovechamiento del rango del conversor A/D.
A veces, aparte de amplificación, una señal de entrada requiere de un corrimiento debido a
que algunas de ellas son de carácter bipolar, en contraposición al carácter unipolar del conversor.
A esto primeros procedimientos en la amplitud de la señal, le debe seguir una manipulación
en el contenido en frecuencia de la misma. Este procedimiento es el que llamamos filtrado.
P O L I T E C N IC O
2626
PÁGI
NA 2
TraductorGenera Señales
Amplificación y offsetAmplifica señales y suma un offset de
continua para llevarlo al rango de entrada
del A/D
FiltroRemueve
componentes de señales no
deseadas. Evita aliasing
MultiplexorSelecciona
cual canal de entrada es
conectado a su salida
Muestreo y Retención
Muestrea su entrada y
mantiene el voltaje en su salida hasta la próxima adquisición
ADCConvierte su
entrada analógica a salida digital
Tensión de Referencia
Determina el rango de tensión
admisible para el A/D
Salida Digital
Control CPU
Interno al MicrocontroladorExterno al Microcontrolador
P O L I T E C N IC O
25
El filtrado tiene dos objetivos principales:
1. Eliminar el ruido electrónico sumado a la señal, ya sea proveniente del ambiente
exterior o del propio transductor.
2. Eliminar el contenido de frecuencia de la señal que es superior a la mitad de la
frecuencia de muestreo, para evitar el fenómeno de aliasing.
Para entender el fenómeno de aliasing, primero debemos saber que es el teorema de
muestreo (Shannon o Nyquist), este teorema, que es una de las piedras angulares del
procesamiento de señales digitales, nos dice que “una señal continua muestreada, puede ser
recuperada solo si su máximo componente en frecuencia es inferior al doble de la frecuencia
de muestreo” o sea supongamos que la frecuencia de muestreo sea de 2Khz, requiere que la señal
analógica sea compuesta por frecuencias inferiores al 1KHz. Si existieran frecuencias superiores a
este límite, estas se verían “reflejadas” en el entorno de frecuencia entre 0 y 1KHz, combinándose
con la información legítima contenida en este entorno.
La siguiente figura nos ayudara a comprender lo dicho.
Microcontroladores PIC Nivel Medio
Observemos como el fenómeno de aliasing se manifiesta en la figura d) donde una señal de
frecuencia 0.95 de la de muestreo, se manifiesta como si tuviera una frecuencia de solo 0.05 de la
de muestreo.
Por lo antes comentados, concluimos que en la gran mayoría en estos sistemas el filtrado va
a estar a cargo de filtros pasa-bajo, cuya frecuencia de corte va estar determinado ya sea por, la
mitad de la frecuencia de muestreo o la frecuencia del ruido que queremos eliminar, el menor de
los dos.
Para profundizar mas en el procesamiento de señales digitales (DSP), recomiendo leer el li-
bro: “The Scientist and Engineer´s Guide to Digital Signal Processing” de Steven W. Smith, que
se puede bajar gratuitamente. Un link a este libro se encuentra en la página del autor de este curso
http://www.microdiseños.com.ar
3.1.3 Multiplexor Analógico
Cuando es necesario muestrear mas de una entrada analógica, se podría recurrir a poner en
el sistema múltiples A/D, tantos como entradas sean necesarias muestrear. Sin embargo esta
solución incrementa el costo, el tamaño de la placa, la complejidad del ruteo del pcb y la
complejidad de software.
Por esto se suele recurrir a multiplexores que actúan como selectores, eligiendo cual de las
entradas esta conectada a la entrada del A/D en un instante determinado.
Debido a que el multiplexor esta construido con llaves hechas de semiconductores, no
debemos olvidar las imperfecciones que esta tecnología trae aparejada. En particular cuando la
llave está cerrada tiene una resistencia interna que puede rondar desde las decenas hasta las
centenas de ohms, lo cual impacta directamente en el proceso de adquisición de datos.
Gracias a los niveles de integración hoy alcanzables, los multiplexores forman parte de chip,
pudiendo el mismo tener un considerable número de entradas.
Una importante desventaja de usar multiplexores, es que la máxima frecuencia posible de
muestreo del microcontrolador se tiene que dividir entre todas las entradas muestreadas.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
3.1.4 Muestreo y Retención y Tiempo de Adquisición
Debido a que el proceso de conversión de analógico a digital se realiza en un tiempo finito,
o sea no es instantáneo, se recurre a una técnica que consiste sacar una instantánea de la tensión
(muestreo) y conservar este valor mientras dure la conversión (retención).
Un circuito sencillo que realiza esta tarea es el siguiente:
El corazón del circuito esta formado por una llave, que hace el muestreo, y un capacitor, que
realiza la retención. Cuando la llave es cerrada, después de un cierto tiempo, el capacitor se llena
hasta el valor de la señal presente en la entrada, a partir de aquí podemos abrir la llave y el
capacitor retendrá su valor.
Uno de los problemas con este circuito, es que el capacitor no se puede llenar
instantáneamente ya sea por la resistencia de la llave selectora o la de la propia fuente de tensión
a medir. Esto va a traer aparejado una evolución exponencial de la tensión:
Es nuestro interés que la tensión haya llegado suficientemente cerca de su valor final con la
llave cerrada, antes que esta sea abierta y comience el proceso de conversión en sí.
Precisamente, este intervalo de tiempo en que dejamos evolucionar la tensión del capacitor
es lo que llamamos tiempo de adquisición.
Microcontroladores PIC Nivel Medio
Veamos gráficamente la ecuación de llenado del capacitor:
Los valores representados fueron sacados con la ecuación anterior, por ejemplo,
supongamos que queramos calcular que tiempo llevaría llegar al 90% del valor final.
Entonces:
Para conseguir una buena precisión en la conversión, el error introducido por este proceso
debe ser menor a la mitad de un LSB. Si nuestro conversor es de 10bit tenemos:
De la gráfica vemos que corresponde a:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
3.1.5 Conversor Analógico Digital
La tarea que realiza este dispositivo es la de generar una palabra digital a partir de una
tensión analógica, debido a que solo puede generar un numero finito de palabras digitales trae
como consecuencia que, en realidad se reconozcan intervalos de tensión, como muestra su función
de transferencia:
Este proceso se llama cuantización, ya que asocia un intervalo de tensión a un valor
determinado (el valor en que se produce la transición de la palabra digital).
Por lo tanto vemos que mientras el proceso de muestreo y retención discretiza la señal, la
conversión la digitaliza o cuantifica, introduciendo un error denominado de cuantificación.
La figura ejemplifica lo antes dicho:
Microcontroladores PIC Nivel Medio
Además de este error existen otros errores asociados con la precisión con que se reconoce el
tensión de transición de la palabra digital algunos de ellos son: error de ganancia, error de offset,
error de linealidad, no-linealidad diferencial, etc.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Respecto a los métodos de conversión, existen diferentes formas de conseguir esta
conversión, algunos de ellos están apuntados a la velocidad (y menor precisión) como los
conversores Flash, mientras que otro a la precisión (y menor velocidad) como los conversores
Doble rampa.
Lo microcontroladores tiene implementado un tipo de conversor denominado de
Aproximaciones sucesivas que lo ubica en un rango medio de velocidad y precisión.
Esquemáticamente este método implementa lo siguiente:
Microcontroladores PIC Nivel Medio
El circuito posee un conversor digital analógico que va transformando los valores de la
salida digital a su equivalente analógico y los compara con la tensión de entrada, en base a el
resultado de esta comparación se decide si un bit en particular debe estar a 0 o 1.
Inicialmente todos los bits están a cero, luego empezando por el bit MSB hacia el LSB, se
van activando de a uno y en función de la comparación se decide si ese bit en particular tiene que
estar a 1 o 0.
Con n bits un conversor puede discriminar 2n valores diferentes y el valor máximo que
puede alcanzar es (2n-1).
Así para el conversor de 8 bits tenemos:
2n = 28 = 256 y el valor máximo es (2n-1) = (256-1) = 255 = 0xFF = 0b11111111
Para el de 10 bits
2n = 210 = 1024 y el valor máximo es (2n-1) = (1024-1) = 1023 = 0x3FF = 0b1111111111
Por último notemos que si aumentamos el numero de bits, es mayor nuestra capacidad para
discriminar tensiones cercana entre sí, a esto se le llama resolución, de esta forma un conversor de
n bits tiene una resolución de Vr/2n, donde Vr es el rango de tensión del conversor A/D.
3.2 MODULO A/D DEL 16F873A
Hasta ahora hemos hablado en forma genérica acerca de los conversores, pero ahora nos
enfocaremos específicamente en el que está incluido en el 16F873A.
El modulo consiste en un conversor de 10 bits, que implementa aproximaciones sucesivas,
posee internamente el multiplexor que para el microcontrolador que nos compete posee 5 canales,
los cuales están compartidos con todas los pines que conforman el Puerto A, con excepción de
RA4.
Además el módulo provee la posibilidad de tener referencias de tensiones diferentes de Vcc
y GND, lo que lo dota de una mayor flexibilidad. Por lo tanto la ventana de conversión del
módulo A/D no tiene porque tener la misma extensión que la de alimentación del
microcontrolador, puede se mas chica y comenzar con un offset respecto a masa.
Incluido en el módulo está el circuito de muestreo y retensión.
El siguiente diagrama de bloque lo muestra en forma esquemática:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
3.2.1 Generalidades
El microcontrolador realiza la conversión siguiendo una determinada secuencia, que
consiste en un tiempo de adquisición donde se toma una muestra de la tensión, seguida de un
tiempo de conversión donde se hace la transformación a digital como se muestra en la figura:
El capacitor de retención comienza a cargarseDespués de una conversión A/D, o cuando seselecciona un nuevo canal
Comienza la conversión. Se activo el bit GOel capacitor de retensión se desconecta del multiplexor
La conversión se completo, el resultado es cargado en el registro ADRESel capacitor de retención comienza a transitaral voltaje del canal seleccionado. El bit ADIF es puesto a 1
Microcontroladores PIC Nivel Medio
El tiempo de conversión en sí, esta gobernado por el reloj del A/D, el cual tiene un período
denominado TAD, cuyo valor depende de cual haya sido la fuente de reloj elegida para el
conversor.
Para un conversor de 10 bits, la conversión insume 12 ciclos TAD, como se muestra en la
figura:
Por lo tanto podemos aumentar la velocidad de conversión si disminuimos el período TAD,
sin embargo tenemos un límite inferior, para una correcta operación del conversor que es de 1,6
useg (TADMin = 1,6 µSeg). El mínimo tiempo de conversión conseguible es:
Tconv =
3.2.2 Calculo del tiempo de Adquisición
Como vimos en el punto anterior el proceso de conversión no solo esta compuestos por el
tiempo empleado por el A/D, sino también por un tiempo previo que implica la adquisición del
valor de tensión a convertir.
Para poder hacer una estimación de este tiempo, necesitamos un modelo eléctrico que nos
permita realizar los cálculos pertinentes.
Microchip ofrece el siguiente modelo para sus conversores:
P O L I T E C N IC O
2626
PÁGI
NA 2
Prox Q4: ADRES es cargado bit GO es limpiado
bit ADIF es puesto el capacitor de retención es conectado a la entrada analógica
Se pone a 1 el bit GO
El capacitor de retención se desconecta de la entrada analógica (típico 100ns)
Comienza la conversión
P O L I T E C N IC O
25
De acuerdo a las hojas de datos el tiempo de adquisición esta compuesto por tres fuentes:
Tac = Tiempo de establecimiento del Amplificador + Carga del capacitor de retención + Co
eficiente de temperatura
El tiempo del establecimiento del amplificador es un tiempo fijo de 2 µSeg.
El coeficiente de temperatura se aplica solo para temperatura por encima de los 25ºC
específicamente:
Coeficiente de Temperatura = (Temperatura – 25 ºC)*(0,05 µSeg/ºC).
De la ecuación se deduce que se crea un tiempo de retardo de solo 0,5 µSeg cada 10ºC por
encima de los 25ºC, por lo tanto su influencia es despreciable.
Por los cálculos previos vemos que el tiempo de adquisición esta totalmente determinado
por el tiempo de carga del capacitor de retensión. Al principio del capítulo habíamos calculado
que para conseguir un error menor a ½ LSB el tiempo de adquisición tenía que ser:
Del modelo eléctrico de las entradas y despreciando la capacidad del pin tenemos:
C = 120 pF
La resistencia estaría integrada por 3 componentes:
R = RS + RIC + RSS
Siendo RSS la resistencia del multiplexor, que de acuerdo a las hojas de datos se modifica
con la tensión en la siguiente forma:
Microcontroladores PIC Nivel Medio
Para una alimentación de 5V asume un valor de 7K
RIC es la denominada resistencia de interconexión y asume un valor de 1K
RS es el valor de la fuente de tensión a convertir que en un buen diseño puede ser unas pocas
decenas de ohm, por lo tanto despreciando esta última, como también la corriente de pérdida
resulta:
Tac = 2 µSeg + 7,6 * 120pf * (1K+7K) = 2 µSeg + 7,3 µSeg = 9,3 µSeg
Este es el tiempo mínimo que se requiere para tener un error menor a ½ LSB
Sumando a este tiempo el tiempo mínimo empleado por el conversor nos da que, una entra-
da se puede llegar a convertir cada:
Tac + Tconv = 9,3 µSeg + =
O sea a una frecuencia máxima de:
Sin embargo el manual nos dice que después de cada conversión el sistema se toma un tiem-
po de 2xTAD antes de comenzar un nuevo período de adquisición por lo que recalculando:
Tac + Tconv + 2 x TAD = 9,3 µSeg + + 3,2 µSeg =
O sea a una frecuencia máxima de:
3.2.3 Controlando el A/D
P O L I T E C N IC O
2626
PÁGI
NA 2
Rss
P O L I T E C N IC O
25
El A/D está controlado por dos registros: ADCON0 y ADCON1. El resultado de la
conversión es puesto en otros dos: ADRESH y ADRESL
Otros registros que también están relacionados con el módulo A/D son TRISA ya que cual-
quier entrada del puerto A, que sea elegida para trabajar como entrada analógica debe tener su co-
rrespondiente bit TRIS a “1”, y los registros PIR1 y PIE1, que contienen la bandera de interrup-
ción y habilitación de interrupción del módulo A/D.
Registro ADCON0
Microcontroladores PIC Nivel Medio
El módulo A/D es encendido o apagado por el bit ADON. Apagándolo, cuando no es usado,
trae aparejado un pequeño ahorro de consumo.
Como ya se mencionó anteriormente el proceso de conversión está regido por un reloj cuyo
período se denomina TAD, la hoja de datos especifica que este valor no debe ser inferior 1,6 useg.,
aunque tampoco es adecuado que sea mucho mayor, ya que habría una pérdida de cargas por parte
del capacitor de retención que haría imprecisa la medición. Por lo tanto la mejor práctica consiste
en acercarse al valor límite establecido.
La selección de la fuente del reloj se hace a través de los bits ADCS2, ADCS1, ADCS0.
Además posee un oscilador RC interno con un período típico de 4 µs y rango de 2 a 6 µs.
La tabla siguiente muestra el menor valor permitido para cumplir con el requisito de los
1,6µs, en función del reloj del sistema:
El canal de entrada es seleccionado por los bits CHS0, CHS1 y CHS2. Elegir el canal apro-
piado es el primer paso en el proceso de adquisición.
Una conversión es inicializado llevando a “1” el bit GO/DONE, cuando la conversión finali-
za este bit es limpiado por el hardware, además se activa la bandera, bit ADIF. Por lo tanto se pue-
de usar cualquiera de los 2 bits para testear la finalización de la conversión.
Registro ADCON1
Después del reset, todas las entradas que son compartidas con los canales de entrada al
conversor A/D son definidas por defecto como entradas analógicas, por lo tanto uno de los pri-
meros trabajos que se debe realizar en el proceso de inicialización es decidir sobre cual de estos
pines va a funcionar realmente como entrada analógica, si alguno, de acuerdo a las conexiones del
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
hardware. Esta elección es independiente de que el módulo esté activado o no, por lo tanto, si nin-
gunos de los pines va a ser usado como entrada analógica, como parte de la inicialización se debe
modificar este registro para definir los pines del Puerto A como entradas/salidas digitales.
No todas las combinaciones de selección de entradas es posible, y esta, se realiza a través de
los bits PCFG0 a PCFG3, observar que también permite la selección de algunas de las entradas
como fuente de tensión de referencia.
Microcontroladores PIC Nivel Medio
Si bien es una práctica común, elegir como tensión de referencia la alimentación del micro-
controlador, a veces, puede ser más conveniente elegirla en función de la variación de la entrada
analógica. Así por ejemplo, supongamos que un sensor de presión da 4mV por cada BAR de pre-
sión, en este caso convendría alimentar el módulo A/D con una tensión de referencia de 4,096V
de tal forma que cada 4mV se produzca un incremento (4,096/1024 = 4) en la palabra digital con-
vertida.
Hay que tener en cuenta de que no todos los valores de Vref son posibles, el siguiente cua-
dro, sacado del manual, lo pone de manifiesto.
Por último al ser el conversor de 10 bits, el resultado de la conversión se debe guardar en 2
byte, pero como no puede cubrir los 16 bits de los 2 bytes, el resultado se podría alinear hacia la
derecha o hacia la izquierda, la elección del lado hacia el que se alinea se elige con el bit ADFM.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
En nuestro circuito las conexiones físicas de los traductores analógicos con el microcontro-
lador se muestran en la siguiente figura.
En función del hardware, esta es la rutina de inicialización
Microcontroladores PIC Nivel Medio
Aprovechando el hardware previamente implementado, vamos a modificar el software para
que cuando el jumper del bit 7 del teclado esté activado muestre en las salidas (LCD y 7-Segmen-
tos) la medición del sensor de temperatura o del potenciómetro en función de si el switch del bit 0
del teclado está a 1 o 0.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
La lectura en sí de los dos canales se va alternando en cada llamada:
3.3 TÉCNICAS DE MANIPULACIÓN DE DATOS
Las operaciones binarias de suma, resta, multiplicación y división se resume en los siguien-
tes gráficos:
Microcontroladores PIC Nivel Medio
Hasta ahora siempre nos hemos manejados con representaciones binarias de valores positi-
vos. Sin embargo se puede llegar a representar valor negativos con números binarios, si bien hay
varias, la forma mas utilizada es la denominado complemento a dos.
En complemento a dos un número positivo se transforma en negativo, complementando y
luego sumándole uno. Supongamos que tenemos 4 bits para representar los valores positivos y ne-
gativos.
El valor 2 es:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
0010; representación binario de valor 2 decimal
El valor -2 será:
0010; representación binario de valor 2 decimal
1101; complemento del valor 2
; complemento a dos del valor
Por lo tanto el valor negativo -2 se representa en complemento a dos como 1110, para com-
probar la veracidad de esta afirmación sumemos 4 + (-2) = 2
lo que nos da el resultado esperado
Otra operación 2 + (-2) = 0
lo que nos da el resultado esperado
Con esto ejemplos se pone de manifiesto una de la grandes ventajas del complemento a dos
y es la de poder hace una resta con los circuitos de suma, simplemente complementando a dos el
número que resta.
En el siguiente cuadro se muestra que representa cada número binario en función de si lo es-
tamos interpretando exclusivamente como números positivos o como números signados en com-
plemento a dos.
Observemos que los números negativos siempre tienen el bit mas significativo (MSB) a “1”,
además vemos como se reduce la capacidad de representación de los números positivos, por dar
lugar a los negativos.
Numero Binario Decimal No Signado Decimal Signado
0000 0 0
0001 1 1
Microcontroladores PIC Nivel Medio
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 -8
1001 9 -7
1010 10 -6
1011 11 -5
1100 12 -4
1101 13 -3
1110 14 -2
1111 15 -1
3.3.1 Representación en Punto Fijo y Flotante
Los números binarios también puede representar valores decimales, para ello tenemos que
agregar un punto binario y trabajar los dígitos hacia la derecha como potencias negativas de dos
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
A este tipo de representación se la denomina de punto fijo, la aritmética asociada a estos nú-
meros solo debe respetar, a igual que pasa en decimal, la alineación del punto binario y la suma y
la resta se hace de igual forma que con los enteros.
La presentación de punto fijo limita el rango de representación de los números, por ejemplo
en el caso anterior, el menor valor que se puede representar distinto de cero es 0,25 y el mayor
15,75.
Para poder ampliar el rango representado debemos recurrir a un formato equivalente a la no-
tación científica decimal, denominada de punto flotante. Este formato necesita un bit de signo (v),
una mantisa (M)y un exponente (E), el número que representa sería:
V = (-1)S x M x 2E-127
Cuando usamos 32 bits para contener estos parámetros se denomina de simple precisión.
Ejemplos:
Microcontroladores PIC Nivel Medio
Donde M = 1.m22m21m20m19….m2m1m0
La aritmética asociada a la representación en punto flotante es más compleja que la de punto
fijo.
3.3.2 Multiplicación y escalado binario
Después de la suma y la resta, la multiplicación es la operación aritmética más utilizada en
los sistemas embebidos. Algunos microcontroladores disponen internamente de multiplicadores
por hardware que facilitan enormemente este proceso, sin embargo la serie 16 no dispone de estos
dispositivos por lo que es necesario llevarlos a cabo a través de rutinas de software.
La tarea de desarrollar estas rutinas no es sencilla, por suerte, la empresa Microchip ha
desarrollado estas rutina y forman parte de la nota de aplicación AN617, esta, también incluye
rutinas de división, que son aún más complejas que las de multiplicación.
Existen rutinas diferentes de acuerdo al formato de los operando, si son de 8, 16 o 32 bits, y
si son signados o no-signados.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Por ejemplo la rutina denominada FXM1616U, permite multiplicar 2 operandos de 16 bit
cada uno en formato no-signado. FXD1608S, realiza la división donde el dividendo es de 16 bit y
el divisor de 8 bit, ambos no-signados.
Una aplicación común para la multiplicación es el escalado de las entradas analógicas para
cambiar su rango. Pongamos como ejemplo la medición de corriente en un rango de 0-80 Amp,
inicialmente a través de un transductor (por ejemplo un TI) y el circuito de amplificación y offset
se produce un escalado por hardware que transforma este rango inicial a un rango de 0-5V para el
trabajo óptimo del conversor A/D. Internamente el conversor lo transforma a un rango digital de
0-1023, que tendrá que ser escalado para poder representar (quizás en un LCD) el rango original.
De esta forma, se necesita encontrar la constante que me permita hacer este escalado de
rangos.
En el ejemplo del sensor de temperatura implementado, habíamos tomado que cada 2
cuentas se producía un incremento de 1ºC de temperatura, pero si hacemos un cálculo mas preciso
tenemos:
5/1024 = 4.883 mV
Además sabemos que el sensor da 10mV/ºC, por lo que, en un calculo exacto tendríamos
que hacer:
Temperatura = ADC Ouput x (4.883/10)
Al valor 4.883 lo vamos a representamos con el siguiente valor binario:
100.11100010 (0x4.E2) en decimal es: 4,8828125
y lo vamos a representar en 2 byte (0x04E2), la multiplicación por un número con coma binario es
igual a como se hace en decimal, es decir, se multiplica como si no existiera la coma y luego en el
resultado, a partir del final, se corre la coma tantas veces como la correspondiente a la suma del
Microcontroladores PIC Nivel Medio
multiplicando y el multiplicador, es nuestra caso, tendríamos que correr la coma 8 lugares a partir
del final o lo que es lo mismo decir, despreciar el último byte del resultado. Luego se lo divide por
el número 10 como se muestra en el software:
3.3.3 Estabilización de la Lectura
Es frecuente que la lectura de conversor A/D no dé el mismo resultado en dos lecturas
sucesivas, suponiendo que la variable medida no ha variado, generalmente el origen de este
fenómeno esta en el ruido electrónico ya sea del transductor, los cables de conexión, la
amplificación o la misma alimentación del microcontrolador. También podría darse que la tensión
a convertir este en el umbral de una conmutación de dígitos, y esto es más cierto mientras mayor
sea la resolución del conversor.
Una forma de estabilizar estos resultado es promediando las últimas “n” lecturas,
consiguiendo así una reducción en la variación del resultado, ya que el promediado actúa como un
filtrado pasabajo.
El promediado simplemente consiste en suma los últimos “n” cantidad de muestras y el
resultado dividirlo por “n”.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Sumar “n” valores consume más tiempo mientras mayor sea “n”. ¿Habrá algún algoritmo
que nos permita hacer esta suma en pocos pasos independiente del valor de “n”?. Observemos el
siguiente ejemplo donde n = 7:
Observando los dos promedios adyacentes obtenidos, vemos que el cálculo repite la mayoría
de los sumandos, los puntos desde x[48] a x[53] deben ser sumados tanto para y[50] como para
y[51]. Si ya tenemos el valor de y[50], la forma más eficiente de obtener y[51] sería:
De esta forma notamos que con solo una suma y una resta podemos calcular el promedio
adyacente cualquiera sea el valor de “n”.
Ahora dividiendo esta suma por “n” obtenemos el valor buscado.
Una cuestión a resolver sería saber ¿Cuál es valor adecuado de “n”?.
Si es muy chico, sería poco efectivo en el promediado, si es muy grande introduciría un
retardo en la variable medida que para monitoreo no es un inconveniente, pero si podría serlo si
interviene en un lazo de control.
Como sabemos “n” interviene en la división en la obtención del promedio por lo que un
buen criterio sería elegirla como potencia de 2 (2, 4, 8, 16, 32,..) consiguiendo de esta forma que
la división se transforme en un simple corrimiento binario lo que aceleraría notablemente la
velocidad del cálculo.
A continuación la implementación del algoritmo con n = 8.
Microcontroladores PIC Nivel Medio
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
4. TIMERS Y PWM
4.1 CARACTERÍSTICAS GENERALES DE LOS TIMERS
Una de las funciones infaltables en todo sistema embebido, es la capacidad de contar
eventos, que se manifiesta como cambio en el estado de alguna entrada, y la de temporizar, no
solo para relacionarse con el mundo que lo rodea, sino también para poder integrar en el
microcontrolador periféricos que funciones en base a temporizaciones, como por ejemplo UART
y PWM.
Respecto a 16F84A las funciones de cuenta y temporización se han ampliado y mejorado
notablemente con la incorporación 2 nuevos temporizadores con capacidades ampliadas, como se
analizará a continuación.
4.1.1 Timer0
Es exactamente igual a contenido en el 16F84A.
Microcontroladores PIC Nivel Medio
Es un temporizador/contador de 8 bits con preescala compartida con el WDT, siendo el
Option_Register su registro de control.
En el software se lo usa para contar 2mseg y generar una interrupción que actualiza el LCD
y los 7-Segmentos.
4.1.2 Timer1
El timer0 está a limitado a ser de 8 bit, el timer1 que está construido en el mismo concepto
que el timer0, es un temporizador de 16 bits, conformado por 2 registros TMR1H y TMR1L, los
cuales forman parte del SFR y pueden ser tanto escritos como leídos en cualquier momento.
Juntos, estos registros pueden contar desde 0x00 a 0xFFFF ( 65535 ), cuando llega a su
máxima cuenta se desborda y vuelve a cero en el próximo ciclo de reloj, y su vez origina que el
bit TMR1IF tome el valor “1”, originándose una interrupción si la misma está habilitada.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
El Timer1 es controlado por el registro T1CON:
A diferencia del Timer0, este temporizador se puede apagar o prender a través del bit
TMR1ON, permitiendo un pequeño ahorro de energía cuando no es requerido.
Tiene 3 fuentes diferentes de reloj. Para su función de contador dispone de la entrada
externa T1CKL compartida con el pin 0 del Puerto C. Para su función de temporización
permanece la opción del reloj interno (FOSC/4) derivado del oscilador del sistema, la elección de
estas 2 últimas fuente de reloj, es decir si va a ser interna o externa, se hace a través del bit
TMR1CS.
La tercera fuente de reloj, puede ser derivada directamente de un oscilador externo
conectado a 2 pines del microcontrolador, que trabaja en forma independiente del oscilador
principal. Por lo tanto puede trabajar a una frecuencia completamente diferente a la del reloj
principal y seguir funcionando aún cuando el sistema esté en Sleep. Este oscilador está preparado
Microcontroladores PIC Nivel Medio
para trabajar a bajas frecuencia, con un máximo de 200KHz, una aplicación muy común que se
suele realizar con este temporizador y este oscilador es poner un cristal de 32,768 KHz para la
implementación del reloj de tiempo real o RTC como se describe en la nota de aplicación AN582.
Cualquiera sea la fuente de reloj usada, existe la posibilidad de usar preescala, gobernada
por 2 bits TICKPS1 y TICKPS0, que permiten elegir un valor para la misma de 2, 4 o 8.
Es posible la sincronización de la entrada externa llevando a cero el bit T1SYNC, pero hay
que tener en cuenta que de esta forma el temporizador deja de incrementarse en modo sleep.
Por último tengamos en cuenta que el temporizador, con reloj externo, se incrementa en
cada flanco ascendente, siempre que haya habido previamente un flanco de descendente.
Observar que en la segunda gráfica la cuenta comienza a partir del segundo flanco, este
problema se puede solucionar fácilmente precargando el temporizador con el valor “1”.
Una consideración más a tener en cuenta cuando se trabaja con este periférico, es cuando se
lo tiene que leer o escribir. Al estar compuesto por 2 registros, no puede ser leído o cargado de
una vez, por lo tanto al leer o escribir uno de los registro el otro puede haber sido modificado.
Por ejemplo supongamos que la cuenta del periférico es 0xFFFF:0xFFFF y leemos primero
el byte LSB con un valor de 0xFFFF, antes de comenzar la lectura del registro MSB se produjo el
overflow y nuestra lectura devuelve 0x0000, estas 2 lecturas nos levaría a pensar, erróneamente,
que valor del temporizador es 0x0000:0xFFFF cuando en realidad era 0x0000:0x0000 al terminar
la lectura. Por lo tanto en este caso hubiese sido conveniente esperar que el byte bajo conmute y
luego releer los 2 byte nuevamente.
Si el valor a escribir está cerca del overflow de algunos de los 2 registros convendría llevar
primero el LSB a cero y luego hacer el proceso escribiendo primero el MSB y luego el LSB.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
En nuestro software el Timer1 se usa para marcar el tick del sistema (cuando se desborda)
durante el cual se actualiza los valores a mostrar y se procede a la adquisición del A/D
4.1.3 Timer2
Este temporizador es un dispositivo de 8-bit, cuya única fuente de reloj es la proveniente del
oscilador interno, por lo tanto, no puede actuar como contador. La cuenta es llevada en el registro
TMR2, que está mapeado en la posición 0x11del SFR.
Este registro puede ser leído y escrito. Además cuenta con una preescala, tal como muestra
la figura. Su registro de control es el T2CON, cuyos bits tienen los siguientes significados
Microcontroladores PIC Nivel Medio
Su arquitectura de funcionamiento es diferente a los vistos hasta el momento, lo cuales
contaban desde un valor inicial hasta el overflow del mismo, ahora este cuenta con un registro
adicional, el registro de Período PR2, el cual es continuamente comparado con el contenido del
registro del temporizador Timer2. Cuando ambos registros son iguales, en el siguiente ciclo, el
Timer2 es reseteado a cero y el ciclo comienza nuevamente.
En la figura se muestra lo dicho:
Por lo tanto existe (PR2 + 1) ciclos entre cada reset. Cada reset produce un pulso que
funciona como entrada para el postescala, cuya salida puede ser usada como fuente de
interrupción, consiguiendo de esta manera, dilatar la indicación de interrupción para el Timer2
La forma de funcionamiento de este temporizador, se vuelve mucho mas natural para el
programador que los otros dos, ya que puede poner directamente en el registro PR2, el valor que
se desea contar sin tener que andar calculando un complemento respecto al overflow, como se
hace en el TMR0 y TMR1.
4.2 CAPTURE COMPARE Y PWM
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Una de las necesidades más comunes que se debe satisfacer en los sistemas embebidos es,
la posibilidad de indicar la llegada de un determinado tiempo, funcionando como si fuera una
alarma, o la de almacenar el momento en que se produce un determinado evento, funcionando
como un registrador, lo cual fue resuelto por los diseñadores del microcontrolador sencillamente
agregando un par de registro al TMR1.
Otra función muy interesante sería la de poder generar una onda cuadrada de frecuencia
variable y ciclo de trabajo variables sin intervención del software, ya que este tipo de onda
denominada PWM encuentra una enorme aplicación en electrónica. Al agregar al Timer2 otro
comparador, como se verá más adelante, se lo puede implementar en el 16F873A. En los pic, el
módulo que implementa estas tres funciones mencionadas se lo denomina CCP.
El 16F873A tiene a 2 de estos módulos, cada uno de estos contienen 2 registros de 8-bits
denominados CCPRxL y CCPRxH (x = 1 o 2) que forman un registro del 16-bits que pueden ser
usados para la función de captura, comparación o para formar el ciclo de trabajo del Pwm.
Los módulos son controlados por su respectivo registro de control denominado CCPxCON.
Microcontroladores PIC Nivel Medio
Como se ve en el gráfico, los últimos 4-bits determinan el funcionamiento y el modo de
trabajo del módulo.
El uso de los temporizadores de acuerdo a la función, se muestra en la siguiente tabla:
4.2.1 Capture
El circuito de captura es el siguiente.
Si bien en el esquema se muestra el modulo CCP1 el módulo CCP2 es exactamente igual
solo que está conectado al pin RC1. Como estos pines están compartidos con el Puerto C, es
necesario para el uso del módulo que los correspondientes bits TRIS sean definidos como
entradas.
El evento que dispara la captura del registro Timer1, es un flanco en el pin, que puede ser
seleccionado para que sea ascendente o descendente, si es ascendente, es más versátil porque
permite, para este caso, la elección de una preescala de 4 o 16. El Timer1 podría esta funcionando
como contador, pero debe hacerlo en forma sincrónica, es decir, con el bit T1SYNC del registro
T1CON a cero.
4.2.2 Compare
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
En el modo de comparación, un comparador digital diseñado en el hardware del
microcontrolador, esta continuamente comparando el contenido del Timer1 con el registro de 16-
bits formado por los registros CCPRxH y CCPRxL. El Timer1 podría esta funcionando como
contador, pero debe hacerlo en forma sincrónica, es decir, con el bit T1SYNC del registro T1CON
a cero.
En el siguiente diagrama se muestra su funcionamiento.
Cuando el comparador detecta igualdad en los registros la reacción depende del valor
seteado en el registro de control.
CCPxM3:CCPxM0 CCP1 CCP2
1000 CCP1F = 1Pin RC2 = 1
CCP2F = 1Pin RC1 = 1
1001 CCP1F = 1Pin RC2 = 0
CCP2F = 1Pin RC1 = 0
1010 CCP1F = 1Pin RC2 no afectado
CCP2F = 1Pin RC1 no afectado
1011CCP1F = 1Pin RC2 no afectadoReset TIMER1
CCP2F = 1Pin RC1 no afectadoReset TIMER1GO/DONE = 1
Para que el módulo tenga la capacidad de modificar el estado de los pines en cuestión, sus
correspondientes bit TRIS deben estar a cero.
Dispara de Evento Especial:Resetea Timer1, pero no lleva a 1 el bit TMR1IF (PIR1<0>)y pone a 1 el bit GO/DONE (ADCON0<2>)
Microcontroladores PIC Nivel Medio
Camino de decaimiento de la corriente cuando el transistor es cortado.
4.2.3 Principios del PWM (Pulse Width Modulation)
La técnica conocida como modulación por ancho de pulso, permite implementar un control
de variables analógicas a partir de una salida puramente digital.
La raíz de esta capacidad está en los sistemas analógicos en sí, en su capacidad de
almacenar energía y no poder modificarla en forma instantánea.
Como ejemplo veamos el siguiente circuito.
La ecuación que gobierna la inductancia es:
V = L di/dt
Si un cambio abrupto de tensión positiva es aplicada a la inductancia, la corriente va a
crecer en forma exponencial hasta el máximo valor permitido por el circuito iLMAX = V/R, si ahora
mediante otro cambio abrupto llevamos esta tensión cero, va a dar lugar a un decaimiento
exponencial de la corriente hasta que alcance el valor cero, como se muestra en la figura.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
La velocidad de crecimiento o decaimiento depende de sus parámetros físicos, en este caso
L y R. Al parámetro que la caracteriza se la llama, constante de tiempo y su valor es L/R.
Este gráfico nos sugiere que el cambio del estado de energía no puede ser instantáneo, sino
que va implicar el transcurso de cierto tiempo y que la corriente, en su transición, va a asumir
todos los valores intermedios entre su valor inicial y final.
Por lo tanto si conmutamos la tensión entre sus valores extremos con una velocidad mayor a
su constante de tiempo, podremos obtener valores intermedios de corrientes, como muestra los
gráficos:
donde el sistema permanece en un estado continuo de transición. Este es el principio del
control de variables analógicas con PWM.
Todo lo mismo se puede usar para cargar un capacitor o controlar la velocidad de un motor.
4.2.4 Generando señales PWM en el hardware del 16F873A
Toda señal Pwm tiene dos constantes temporales que la definen, y son el período y el ciclo
de trabajo de la misma.
El período de la señal Pwm es determinado por el Timer2 que junto con el registro PR2,
determinan la extensión del mismo. En el momento en que el Timer2 es igual a PR2, el
comparador limpia el temporizador y activa el flip-flop cuya salida lleva el pin correspondiente a
uno.
Una vez establecido el período, tenemos que considerar la duración o ancho del pulso.
Microcontroladores PIC Nivel Medio
Para lograrlo se introduce un segundo comparador, y se usa el registro CCPR1H y se lo
compara continuamente con el valor del Timer2, cuando ambos coinciden resetea el flip-flop cuya
salida es llevada al valor cero.
Para poder cambiar el período debemos cambiar el valor del registro CCPR1H, que en este
modo de trabajo no puede ser hecho directamente, sino a través del registro CCPR1L, que
transfiere su valor a registro anterior, solo en el momento en que el ciclo Pwm ha finalizado.
El diagrama simplificado del módulo CCP configurado para producir señal Pwm se muestra
a continuación:
De acuerdo a la hoja de datos el Pwm tiene una resolución del 10-bits, aunque hasta ahora
los registros involucrados son solo de un byte (8-bits).
Para poner el ciclo de trabajo se usan 2 bits adicionales bits 4 y 5 del registro CCPxCON,
para lograr la extensión de CCPR1H se usan 2 latch internos y lo mismo sucede con el Timer2
que ahora es conducido directamente desde la frecuencia de oscilación FOSC y no FOSC/4 como
P O L I T E C N IC O
2626
PÁGI
NA 2
Este registro actúa como buffer. El programador escribe aquí el ancho de pulso requerido
Toma el valor desde el buffer. Determina el ancho del pulso del PWM
Timer2, en corrida libre, conectado a FOSC/4 a través de su preescala
Pone el período del PWM para ambos módulos CCP1 y CCP2
P O L I T E C N IC O
25
sucedía hasta ahora. Notemos sin embargo que al registro PR2 no se lo extiende y sigue siendo de
8-bits, por lo que el período sigue teniendo esta resolución.
El período del PWM es determinado de la siguiente ecuación:
T = (PR2 + 1) x (TOSC x 4 x Timer2 Preescala)
El ancho del pulso o tON es determinado por la siguiente ecuación:
tON = (CCPR1L:CCP1CON<5:4>) x TOSC x Timer2 Preescala )
Timer2 = PR2.Se resetea Timer2El pin de salida a unoSe carga el valor CCPR1L
Se cambia en programa el valor de CCPR1L
El valor de CCPR1L es transferido al CCPR1H
Timer2 [2Qbits]= CCPR1L:CCP1CON<5:4>El pin de salida va a cero
Microcontroladores PIC Nivel Medio
Observar que ahora no aparece el factor 4 que acompaña a TOSC en la formula del período
Si el valor calculado para tON > T, la salida permanece siempre a uno.
Si el valor de tON = 0, la salida permanece siempre a cero.
Cada vez que termina un período de PWM se activa el TMR2IF de acuerdo al valor de
posescala y se puede generar una interrupción.
Por último notemos que, aunque tenemos dos módulos CCP las distintas configuraciones
comparten los mismos recursos, es decir, el Timer1 y el Timer2, por lo que no es posible que
ambos módulos estén activos al mismo tiempo sin que halla algún tipo de interacción entre ellos,
salvo que no compartan los mismos recursos.
Las interacciones entre las distintas configuraciones es la siguiente:
CCPx Mode CCPy Mode Interacción
Captura Captura Comparten el mismo TMR1 como base de tiempo
Captura CompareEl comparador debería ser configurado para el disparo de eventos especiales
( 1011 ), el cual resetea el TMR1
Compare CompareLos comparadores deberían ser configurados para el disparo de eventos
especiales ( 1011 ), el cual resetea el TMR1
Pwm PwmLos PWMs tendrán las mismas frecuencias y por lo tanto la interrupción del
TMR2 sería la mismaPwm Captura Ninguna
Pwm Compare Ninguna
El circuito propuesto para comprobar la generación de la señal PWM es el siguiente:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
El objetivo del programa que vamos a desarrollar es controlar la velocidad de un motor de
DVD conectado al Conector P2 con PWM, modificando su ciclo de trabajo en función del valor
leído del potenciómetro.
Rutina de Inicialización
Como parte de la inicialización se setea el TRISC2 como salida y luego se configura los
parámetros del PWM de la siguiente forma:
Calculamos el período del Pwm:
T = (PR2 + 1) x (TOSC x 4 x Timer2 Preescala) = 256 x 100nseg x 4 x 16 = 1.638,4 useg
F = 1/1.638,4 useg = 610,3 Hz
Ahora la función de modificación del ciclo de trabajo del PWM, será activada solo cuando
el bit6 el teclado esté activo.
Microcontroladores PIC Nivel Medio
Se carga el valor correspondiente en las variables de la rutina de carga
Y se realiza la carga en sí:
4.2.5 Uso del PWM como conversor D/A
Alrededor del año 1807 Joseph Fourier, matemático francés, descubrió que cualquier
función periódica puede ser pensada como la suma de una constante mas funciones senoidales y
cosenoidales cuyas frecuencias sean armónicas de la fundamental. Expresado matemáticamente
es:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
La función originada por el módulo Pwm es una función periódica, por lo tanto, puede
expresarse en una serie de Fourier como la siguiente:
Con una respuesta en frecuencia:
Por lo tanto si hacemos pasar esta señal por un filtro pasa bajo con frecuencia de corte
menor a f = 1/T, se eliminará todas las componentes cosenoidales y solo quedará la componente
de continua
ana0/2
Microcontroladores PIC Nivel Medio
El circuito pasa bajo puede ser implementado con un simple R-C:
, donde vemos que la continua obtenida va a ser proporcional al ciclo de trabajo
del PWM y por lo tanto variando el ciclo de trabajo modificamos el nivel de continua de salida y
de esta forma tenemos implementado un conversor D/A.
Ahora supongamos que ahora usamos solo los 8 bits MSB del PWM, llevando los 2 bits
LSB a cero y supongamos que A = 5V entonces la ecuación anterior se transforma en:
En la siguiente tabla se muestra algunos valores:
PR2 = 0xFF
CCPR1L VC
0xFF 5V
0xC5 3,86V
0x80 2,51V
0x32 0,98V
0x00 0V
Vamos a generar un onda senoidal a partir del PWM, para lograrlo vamos a ir variando el
ciclo de trabajo del PWM en función del valor de la senoide, y lo haremos en la interrupción del
TMR0, es decir cada 2 mseg.
Los valores de la senoide los extraemos de una ecuación como la siguiente:
k = 0, 1, 2,….., 19
P O L I T E C N IC O
2626
PÁGI
NA 2
Frecuencia de Corte: 1/R*C
La frecuencia del PWM debe estar lo mas alejado posible de la frecuencia de Corte
P O L I T E C N IC O
25
Donde vemos que muestreamos un ciclo completo de la misma en 20 muestras.
Una vez obtenidos los valores los colocamos en una tabla y en cada interrupción vamos
reemplazando el ciclo de trabajo del PWM con los valores leídos en la misma, al llegar al final
volvemos al comienzo de la tabla y así proseguimos el ciclo.
Si bien el Pwm puede manejar 10-bits, vamos a usar una palabra de 8-bits para representar
los valores de la senoide llevando los 2-bits menos significativos a cero, y de esta forma
simplificar el software
Para mejorar la operación de filtrado vamos a aumentar el período del PWM llevando la
preescala de 16 a 1, de esta forma la frecuencia pasa de 610 Hz a 9.760 Hz.
La generación de la onda senoidal solo lo haremos cuando el bit5 del teclado esté activado,
a través de una macro.
El software es el siguiente:
Microcontroladores PIC Nivel Medio
En la rutina de interrupción se agrega el siguiente código:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
5. COMUNICACIÓN SERIAL-USART
Una actividad esencial dentro de todo sistema embebido es el movimiento de datos entre el
microcontrolador y algún dispositivo externo como por ejemplo: memorias, LCD, conversor A/D
o D/A externo, PC, etc. Los bit de datos son empaquetados dentro de una palabra (generalmente
byte, aunque no siempre) antes de ser transferidos
Hablando en forma generalizada, decimos que hay 2 formas de transferencia de datos. La
transferencia en paralelo, donde todos los bits que conforman la palabra son transmitidos al
mismo tiempo, ya que cada bit tiene su propia conexión y la alternativa que es la de enviar un bit
a continuación del otro sobre una misma conexión hasta completar la palabra. Esta forma de
comunicación es llamada serial.
Haciendo un análisis comparativo notamos que la comunicación paralela requiere de más
cables, haciéndola mas susceptible al ruido, pero es mas veloz, mientras que la comunicación
serial requiere muchos menos cables, siendo más inmune al ruido, pero es mas lenta.
Por estas razones es que, en el pasado, se solía usar principalmente la comunicación paralela
en cortas distancias, mientras que se reservaba la comunicación serial para largas distancias. Sin
embargo hoy en día debido al incremento en la velocidad de transferencia serial, sumada a la
necesidad de reducir mas y mas espacio en los sistemas embebidos, hacen de esta forma de
comunicación la dominante.
En la comunicación serial hay importantes desafíos que resolver. Por ejemplo: Con un
simple cable para transmitir los datos, ¿Cómo sabemos cuando un bit comienza y termina?,
¿Dónde comienza y termina una palabra?
Existen dos formas diferentes para la identificación individual de los bits. La mas sencilla es
la de enviar en otra conexión, la información de cuando es válido un bit, a esta señal se la
denomina clock o reloj, y a esta forma de transmitir los bits es llamada sincrónica.
El transmisor envía los Bits en el flanco descendente del Clock
El receptor lee los Bits en el flanco ascendente del Clock
Microcontroladores PIC Nivel Medio
Otra forma sería, que en vez de enviar la señal de clock, poner ciertos requerimientos de
tiempos en los mismos bits, donde la duración de la validez de cada bits sea un tiempo fijo y
conocido tanto por el transmisor como por el receptor a esta forma de comunicación se la
denomina asincrónica.
Como se puede ver, en la comunicación sincrónica la temporización de la transferencia de
datos la lleva quien origina la señal de reloj, en cambio, en la asincrónica, tanto el receptor como
el transmisor tienen que tener relojes internos que trabajen a la misma frecuencia y en fase,
aunque solo sea por el tiempo que dure la transferencia.
Ahora necesitamos una forma de identificar el comienzo y el fin de cada grupo de bits o
palabra. Para conseguirlo se empaqueta los datos en cierto formato. En la comunicación
asincrónica suele haber un bit que indica el comienzo y otro que indica el final de la palabra como
se muestra en el gráfico superior. En la sincrónica es el mismo reloj, la cantidad de ciclos que
origina, la que determina los límites de cada palabra.
La sincronización y el formato de los datos implican la necesidad de ciertos conjuntos de
reglas para asegurar una comunicación coherente. A este conjunto de reglas se lo denomina
Protocolo.
P O L I T E C N IC O
2626
PÁGI
NA 2
El transmisor usa un reloj interno para determinar cuando enviar cada bit
El receptor detecta el flanco descendente del Start, entonces usa su reloj interno para leer el siguientebit cerca de su centro
P O L I T E C N IC O
25
5.1 COMUNICACIÓN RS-232
La comunicación RS-232 como toda comunicación asincrónica tiene que cumplir con dos
requerimientos básicos:
La velocidad de transmisión de datos está determinada de antemano, tanto en el
transmisor como en el receptor, debe ser preestablecida la misma velocidad de
transferencia de datos. Para conseguirlo, cada uno de los nodos de comunicación
debe tener un fuente de reloj precisa y estable, del cual derivar el Baud Rate, sin
embargo, también debe poder lidiar con pequeñas variaciones en los relojes.
Cada byte o palabra esta encuadrado con un bit de Comienzo (Star) y un bit de Fin
(Stop), lo que permite la sincronización previo a que comience el flujo de bits.
5.1.1 Generalidades
El formato que usa la comunicación RS-232 es el siguiente:
El estado Idle o reposo es el estado predeterminado cuando no hay transferencia de datos en
proceso, el comienzo de esta se inicia con el bit de Star, que tiene polaridad opuesta al estado de
reposo, siendo su flanco descendente usado para la sincronización. Luego son transmitidos los
ocho bits que conforman los datos, seguido por un noveno, usado optativamente, que se emplea
para el chequeo de paridad. Por último, la línea regresa al estado de reposo conformando de esta
Bit de Start
Estado de ReposoPrimer Bit de Datos
Comienzo de la Sincronización
Ultimo Bit de Datos
Bit de Stop
Estado de Reposo
El Bit extra de paridad puede ser insertado aquí
Posiblemente nuevo bit de Start
Microcontroladores PIC Nivel Medio
forma el bit de parada o stop. Un nuevo dato puede ser enviado inmediatamente a la finalización
del bit de stop, o permanecer en reposo hasta que una nueva transferencia es llevada a cabo.
Con el objeto de recibir los datos correctamente, cuando no hay una señal de reloj, como
pasa en este protocolo, el receptor deber ser capaz de detectar el comienzo de la palabra y el
momento en que cada bit es válido. Habiéndose de antemano determinado la velocidad de los
datos, podría parecer una tarea sencilla, pero en realidad es imposible conseguir que dos sistemas
tengan la misma frecuencia, ya que nunca, ni los microcontroladores ni los cristales van a ser
exactamente iguales, además hay que tener en cuenta que es muy posible que los sistemas están
expuestos a condiciones ambientales diferentes (humedad, temperatura, etc.) lo que trae aparejado
un motivo más de dispersión de frecuencias.
¿Como se podría minimizar este problema? La siguiente gráfica muestra la solución
generalmente implementada.
La frecuencia de trabajo del reloj del receptor es un múltiplo exacto de la frecuencia
esperada, usualmente el múltiplo es 16.
El receptor esta continuamente monitoreando el estado de la línea de entrada de datos,
cuando el bit de Start es detectado, un contador interno comienza a contar ciclos de reloj hasta que
se llega hasta la mitad del tiempo esperado de duración del bit de Start, en nuestro caso, 8 ciclos.
Aquí testea nuevamente el estado de la línea para confirmar que se trata del bit de Start y no de un
P O L I T E C N IC O
2626
PÁGI
NA 2
Estado de Reposo
Punto Medio Bit de Start
Bit de Start
Punto Medio del primer Bit de Datos
Primer Bit de Datos
Data Arribando
El reloj del receptor resuena al un múltiplo de la velocidad esperada
P O L I T E C N IC O
25
ruido espurio. A partir de aquí cuenta 16 ciclos para poder leer el primer bit del dato en su mitad
y prosigue así con los demás, hasta llegar al bit de Stop, que en caso de encontrar un cero en vez
de un uno pone un aviso de error denominado “framing error” o error de encuadre.
Por últimos notemos que el flanco descendente del bit de Start permite la sincronización de
fases de los relojes de transmisión y recepción, lo que permite reducir la discrepancia entre los dos
relojes siempre que la cantidad de datos transmitidos, en cada encuadre, sea reducido.
5.1.2 Driver 232
El protocolo RS-232 fue diseñado para comunicar dos dispositivos con una distancia límite
de alrededor de 24 m a 36 m, dependiendo de la velocidad de transmisión y del tipo de cable. RS-
232 usa una conexión no balanceada, lo que significa que cada línea de la interfase tiene una solo
conexión física dedicada y su tensión se mide respecto a la conexión común de masa.
Para poder alcanzar distancias importantes en una conexión no balanceada, la inmunidad al
ruido se consigue a base de ampliar los rangos de tensión, es así que, los niveles lógicos para este
protocolo se definen con valores positivos y negativos de tensión, en vez de, tensiones solamente
positivas como pasa con la lógica CMOS o TTL.
En el siguiente cuadro se muestra la relación entre los niveles lógicos y las tensiones
correspondientes para el RS-232.
Salida Voltaje
0 Lógico +5V a +15V
1 Lógico -5V a -15V
Entrada Voltaje
0 Lógico +3V a +15V
1 Lógico -3V a -15V
Microcontroladores PIC Nivel Medio
El 16F873A, como la mayoría de los microcontroladores, usa niveles CMOS basado en una
fuente de 5V para la salida de su pines, incluida la UART, por lo que es necesario algún tipo de
hardware que permita hacer la traducción de las tensiones necesarias entre, el microcontrolador y
la comunicación RS-232, que no se limita solo a las tensiones, ya que el protocolo también
impone ciertas restricciones en cuanto a los tiempos de transición máximo y mínimos para las
señales.
La empresa Maxim fue la primera en ofrecer un chip que cumplía esta función y solo
requería de una alimentación de +5V y no una dual.
A continuación el MAX232:
Como se aprecia este dispositivo cuenta con dos transmisores que convierte una señal de
entrada TTL/CMOS a una salida RS-232 y dos receptores que convierten una entrada RS-232 a
una salida compatible con TTL/CMOS. Tanto el transmisor como el receptor invierten la señal.
El chip cuenta internamente con un doblador de tensión y un inversor que le permite
alcanzar los niveles requeridos, para lograrlo necesita tener conectado 4 capacitores de acuerdo a
lo recomendado por el fabricante. Si se usan capacitares polarizados, como suele suceder, hay que
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
tener la precaución de colocarlos correctamente en el circuito, y elegir tensiones de ruptura de los
mismos igual o superior a los 16V.
El MAX232 supera con creces los mínimos requerimientos exigidos por el protocolo, como
se puede observar en el siguiente gráfico.
Las conexiones que debemos hacer entre nuestro microcontrolador y el MAX232 se
muestran a continuación.
Microcontroladores PIC Nivel Medio
Un punto importante a notar es que en los conectores DB9, como el que suelen tener las
computadoras, el pin 3 es el de transmisión (TX) y el pin 2 es el de recepción (RX). Por lo tanto
en algún punto la línea que conecta dos dispositivos deben invertirse, como se muestra en la
figura:
En nuestro caso usamos un cable directo, lo que significa que los pines entre los extremos
del cable no se invierten (2 con 2, 3con 3), y la inversión la hacemos en la plaqueta entre el
conector DB9 y el MAX232, como se ve en el esquema de conexión. También bien se podría
haber usado un cable cruzado que se encarga de hacer la inversión mencionada, pero en este caso
hubiésemos que haber tendido que conectar la salida del MAX232 al pin 3 y la entrada al pin 2
del conector DB9.
5.2 MODULO USART
Este módulo puede ser configurado como maestro sincrónico, esclavo sincrónico o en modo
asincrónico, en este último caso es full duplex, lo que significa que puede transmitir y recibir
datos al mismo tiempo, pero ambas secciones no son independientes entre sí, sino que comparten
el generador de Baud Rate y el formato de los datos.
5.2.1 Generalidades
El módulo comparte sus pines con el Puerto C, estando la línea de recepción en el pin 7 y la
de transmisión en la 6. Los correspondientes bits TRIS deben estar a uno.
Las operaciones del USART están controladas a través de dos registros TXSTA y RCSTA,
el port es habilitado por el bit SPEN del registro RCSTA y la selección del modo de
funcionamiento, sincrónico o asincrónico, a través del bit SYNC del registro TXSTA.
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
5.2.2 Transmisor Asincrónico
Un diagrama en bloques del trasmisor es el siguiente:
Notemos que el componente más importante del puerto es el registro de desplazamiento
(TSR), que transmite los bits con el bit LSB primero. El dato a transmitir es almacenado
temporalmente en el registro TXREG, que es el único que puede ser accedido desde las
instrucciones del microcontrolador.
La frecuencia de reloj que le marca el ritmo de trabajo al TSR es elegido a través del valor
contenido en el registro SPBRG. La conexión entre la salida del registro de desplazamiento y el
pin del Puerto C se hace por medio de un circuito de control que es habilitado con el bit SPEN.
Cuando se necesita transmitir un dato, el mismo es cargado en el registro TXREG por el
programa, si el registro TSR está vacío, se le transfiere el contenido del TXREG al TSR en forma
inmediata y se pone a uno el bit TXIF, indicando este bit que nuevamente el buffer esta vacío, este
bit solo puede ser leído ya es enteramente manejado por el hardware. Si el TSR no esta vacío, es
decir hay una transmisión en progreso, el TXREG retiene el dato escrito hasta que el TSR está
vacío. El bit TRMT indica el estado del registro de desplazamiento y solo puede ser leído.
A parte de los 8 bits correspondientes al dato el módulo puede llegar a transmitir un noveno
bit de datos, para habilitar esta opción se tiene que poner a 1 el bit TX9 del registro TXSTA y el
valor en sí del noveno bit, se los coloca en el bit0 de este último registro. Cuando la transmisión
HabilitaTransmisor
Habilita 9-bitTransmisión
Bit Nº 9
Habilita el Port Serial
Estado del Registro de Desplazamiento
Microcontroladores PIC Nivel Medio
de 9-bits esta activada, hay que tener la precaución de escribir primero el noveno bit antes de
colocar los 8 restantes en el registro TXREG.
Uno de los usos posible de este noveno bit puede ser, usarlo como bit de paridad, ya que la
USART presente en el microcontrolador no implementa el bit de paridad, y por lo tanto en caso
de necesitarlo se debe hacer el cálculo por cuenta propia (no lo hace el hardware).
El bit de paridad ocupa el noveno bit-time en la trama del RS-232 y se usa para detectar
errores elementales. Se puede elegir trabajar con paridad par o impar.
Con paridad par este bit toma el valor que permita contener un número par de unos en la
trama:
vemos como el noveno bit (el de paridad), completa la cantidad de unos para que su número
sea par.
Con paridad impar este bit toma el valor que permita contener un número impar de unos en
la trama:
vemos como el noveno bit (el de paridad), completa la cantidad de unos para que su número
sea impar.
Para poder implementar un algoritmo para el cálculo de paridad, nos podemos basar en el
cálculo de la función Or-Exclusiva (XOR) entre los bits que conforman la palabra, si el número de
“1” es par el resultado será cero y si el número es impar el resultado será igual a uno, o sea:
1 = Nº de unos impares
Bit de Datos Bit de Paridad (Par)
11001101 1
00010001 0
11110111 1
Bit de Datos Bit de Paridad (Par)
00111011 0
00000011 1
10000101 0
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
0 = Nº de unos pares
Un algoritmo que puede conseguir este resultado se extrae del siguiente gráfico:
b7 b6 b5 b4 b3 b2 b1 b0
b7 b6 b5 b4 b3 b2 b1 b0
b7,6 b5,4 b3,2 b1,0
b7,6 b5,4 b3,2 b1,0
b7,6,5,4 b3,2,1,0
b7,6,5,4 b3,2,1,0
b7,6,5,4,3,2,1,0
El 7º bit del último resultado contiene el resultado buscado.
Como se mencionó antes, el registro que controla la transmisión es el TXSTA
Se corre un lugar
Se corre dos lugares
Se corre cuatro lugares
Microcontroladores PIC Nivel Medio
Por último, lo pasos a seguir para habilitar la transmisión son:
Inicializar el Baud Rate, cargando el valor correspondiente en SPBRG, y activando
el bit BRGH, si corresponde.
Habilitar el puerto serial asincrónico limpiando SYNC y activando SPEN
Si se usa interrupciones activar TXIE
Si se desea transmitir 9-bit, activar el bit TX9
Activar el módulo de transmisión activando el bit TXEN
Si se eligió transmitir 9-bits, cargar el bit TX9D
Cargar el registro TXREG
Si se usa interrupción activar los bits GIE y PEIE en el registro INTCON
5.2.2 Generador de Baud Rate
Esta construido a partir de un contador de 8 bits controlador por el registro SPBRG, su
fuente de reloj proviene directamente del oscilador del microcontrolador. Por lo que la función
del contador es dividir, determinado por el contenido de SPBRG, la frecuencia del oscilador
principal. Esta división también esta influenciada por el bit de preescala BRGH.
La elección de si trabajar con BRGH = 0 o BRGH = 1, se hace en función de obtener la
velocidad más próxima a la buscada, como muestra las siguientes gráficas:
P O L I T E C N IC O
2626
PÁGI
NA 2
P O L I T E C N IC O
25
Así, teniendo en cuenta estar trabajando con una frecuencia del reloj de 10 Mhz y deseando
transmitir a velocidad de 9.600 vemos que con BRGH = 1 obtenemos un error del orden del
0,16% contra el 1,73% si usáramos BRGH = 0. El valor máximo admitido de error en la velocidad
debe ser menor al 3%.
En conclusión nuestra elección sería BRGH = 1 y SPBRG = 64.
Microcontroladores PIC Nivel Medio
5.2.3 Receptor Asincrónico
El diagrama en bloque del receptor es el siguiente:
El módulo está controlado por los bits del registro RCSTA. Su componente principal el un
registro de desplazamiento (RSR), que recibe los datos por el 7º bit y lo desplaza hacia el bit 0,
comportándose de esta manera en espejo del transmisor.
El bloque denominado “Data Recovery”, es un circuito que se encarga de muestrear tres
veces seguida, en el medio del bit, y decidir el valor del bit muestreado en función de la mayoría
obtenida, de esta forma el circuito ayuda a minimizar las interferencias.
El registro de desplazamiento tiene un doble almacenamiento temporario de los datos
recibidos, lo que permite almacenar los últimos dos datos mientras se está recibiendo un tercero.
Si este dato arriba sin que ninguno de los otros dos hayan sido leídos se activa el bit OERR
indicando un error de overrun, llegado a este punto, la recepción se inhabilita hasta que este bit el
limpiado, lo cual se logra limpiando el bit CREN. Siempre que el buffer contenga algún dato no
leído el bit RCIF va a permanecer a uno, solo va a cero cuando todos los datos del buffer han sido
leídos.
P O L I T E C N IC O
2626
PÁGI
NA 2
9º bit de datos recibido
Habilita el Puerto Serial
Habilita recepción de 9 bits
Recepción continua Habilitada
ErrorOverrun
Error deEncuadre
P O L I T E C N IC O
25
El buffer de recepción es del tipo FIFO (First In First Out), o sea el primer dato en entrar al
buffer es también el primero en salir.
Como vimos en el caso del transmisor el puerto serial se habilita con el bit SPEN y el bit
CREN habilita una recepción única o continua.
El bit FERR detecta un error de encuadre o “Framing Error” cuando en vez de leer un uno
en el bit de Stop lee un cero. Hay que tener en cuenta que, cada vez que se lee el registro RCREG,
se actualizan los valores de los bits FERR y RX9D, con los correspondientes a la palabra
siguiente recibida (suponiendo que en el buffer había 2 byte esperando ser leídas), este dato es
importante porque nos dice que si usamos una transmisión de 9 bits debemos leer primero el bit
RX9D antes del leer el contenido del registro RCREG.
El registro RCSTA contiene los siguientes bits:
Microcontroladores PIC Nivel Medio
Por último, lo pasos a seguir para habilitar la recepción son:
Inicializar el Baud Rate, cargando el valor correspondiente en SPBRG, y activando
el bit BRGH, si corresponde.
Habilitar el puerto serial asincrónico limpiando SYNC y activando SPEN
Si se usa interrupciones activar RCIE
Si se desea transmitir 9-bit, activar el bit RX9
Activar la recepción activando el bit CREN
El bit RCIF se activara cuando un dato sea recibido y se generará una interrupción si
el bit RCIE = 1
Si se eligió recibir 9-bits, leer el bit RX9D y el FERR
Leer los datos recibidos, leyendo el registro RCREG
Si se usa interrupción activar los bits GIE y PEIE en el registro INTCON
5.2.4 UART en Recepción con Detección de Dirección
Un uso interesante que se le puede dar a la capacidad de recibir un dato de 9 bits junto al bit
ADDEN, es la de poder implementar nodos direccionables, todos conectados al mismo cable
serial. Esta habilidad deriva de que cuando el bit ADDEN esta a uno, el módulo receptor descarta
los datos recibidos si estos tienen su noveno bit a cero, es decir, solo transfiere un dato al registro
RCREG cuando el bit RX9D del dato recibido está a uno. A esta habilidad se la puede usar para
direccionamiento.
El sistema funcionaría de la siguiente forma:
P O L I T E C N IC O
2626
PÁGI
NA 2
Tx
Transmisor
Rx
Rx Tx
Receptor
Direcc = 1
Rx Tx
Receptor
Direcc = 2
Rx Tx
Receptor
Direcc = 3
Rx Tx
Receptor
Direcc = 4
P O L I T E C N IC O
25
Inicialmente todos los receptores tendrán su bit ADDEN a “1” de tal forma que solo
“escuchan” los datos con el bit 9 a uno
El transmisor desea conectarse con el Receptor 3, para ello transmite el dato con el
valor 3 y el bit 9 a uno
El receptor 3 reconoce su dirección y pone a cero el bit ADDEN, los demás
receptores al no coincidir el dato con su dirección dejan el bit ADDEN intacto a su
valor uno
Ahora el transmisor se comunica con el receptor Nº 3 transfiriendo los datos con el
bit 9 a cero, razón por la cual los demás receptores ignoran los datos del bus.
Al terminar la transferencia de datos con el transmisor el receptor Nº 3 vuelve a
poner su bit ADDEN a uno. Y el ciclo comienza nuevamente.
Ahora veamos un ejemplo donde el micro se comunica con una PC:
Se inicializa el puerto para transmisión y recepción a 9600 Baudios.
Si el bit 4 del teclado está a uno entonces se envían y se reciben datos:
Microcontroladores PIC Nivel Medio
Ahora si además se apretó el primer botón se envían los datos del byte bajo de
potenciómetro, sino, se envía la lectura del sensor de temperatura. Al byte recibido se lo muestra
en los displays.
P O L I T E C N IC O
2626
PÁGI
NA 2