Curso PIC Nivel Medio en Politecnico-Buffer

172
POLITECNI CO 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 digital”. 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 constitutivos 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 mejorando 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.

description

Curso sobre microcontroladores PIC

Transcript of Curso PIC Nivel Medio en Politecnico-Buffer

Page 1: 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:

Page 2: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 3: Curso PIC Nivel Medio en Politecnico-Buffer

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-

Page 4: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 5: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 6: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 7: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 8: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 9: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 10: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 11: Curso PIC Nivel Medio en Politecnico-Buffer

P O L I T E C N IC O

25

En consecuencia el registro INTCON queda definido:

Page 12: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 13: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 14: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 15: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 16: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 17: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 18: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 19: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 20: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 21: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 22: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 23: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 24: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 25: Curso PIC Nivel Medio en Politecnico-Buffer

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)

Page 26: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 27: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 28: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 29: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 30: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 31: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 32: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 33: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 34: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 35: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 36: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 37: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 38: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 39: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 40: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 41: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 42: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 43: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 44: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 45: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 46: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 47: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 48: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 49: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 50: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 51: Curso PIC Nivel Medio en Politecnico-Buffer

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?.

Page 52: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 53: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 54: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 55: Curso PIC Nivel Medio en Politecnico-Buffer

P O L I T E C N IC O

25

El programa en sí es:

Page 56: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 57: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 58: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 59: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 60: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 61: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 62: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 63: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 64: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 65: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 66: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 67: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 68: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 69: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 70: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 71: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 72: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 73: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 74: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 75: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 76: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 77: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 78: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 79: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 80: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 81: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 82: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 83: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 84: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 85: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 86: Curso PIC Nivel Medio en Politecnico-Buffer

Microcontroladores PIC Nivel Medio

P O L I T E C N IC O

2626

PÁGI

NA 2

Page 87: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 88: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 89: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 90: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 91: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 92: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 93: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 94: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 95: Curso PIC Nivel Medio en Politecnico-Buffer

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>)

Page 96: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 97: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 98: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 99: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 100: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 101: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 102: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 103: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 104: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 105: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 106: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 107: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 108: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 109: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 110: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 111: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 112: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 113: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 114: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 115: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 116: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 117: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 118: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 119: Curso PIC Nivel Medio en Politecnico-Buffer

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.

Page 120: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 121: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 122: Curso PIC Nivel Medio en Politecnico-Buffer

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

Page 123: Curso PIC Nivel Medio en Politecnico-Buffer

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:

Page 124: Curso PIC Nivel Medio en Politecnico-Buffer

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