Login | Cart (0)

Mini Cart Cart Loading

Microcontrolador PIC16F887 - Capítulo 3 - LIbro: Microcontroladores PIC - Programación en BASIC

 

Capítulo 3: Microcontrolador PIC16F887

El PIC16F887 es un producto conocido de la compañía Microchip®.Dispone de todos los componentes disponibles en la mayoría de los microcontroladores modernos. Por su bajo precio, un rango amplio de aplicaciones, alta calidad y disponibilidad, es una solución perfecta aplicarlo para controlar diferentes procesos  en la industria, en dispositivos de control de máquinas, para medir variables de procesos etc. Algunas de sus características principales se enumeran a continuación.

3.1 CARACTERÍSTICAS BÁSICAS PIC16F887

  • Arquitectura RISC
    • El microcontrolador cuenta con solo 35 instrucciones diferentes
    • Todas las instrucciones  son uni-ciclo  excepto por las de ramificación
  • Frecuencia de operación 0-20 MHz
  • Oscilador interno de alta precisión
    • Calibrado de fábrica
    • Rango de frecuencia de  8MHz a 31KHz seleccionado por software
  • Voltaje de la fuente de alimentación de 2.0V a 5.5V
    • Consumo: 220uA (2.0V, 4MHz), 11uA (2.0 V, 32 KHz), 50nA (en modo de espera)
  • Ahorro de energía en el Modo de reposo
  • Brown-out Reset (BOR) con opción para controlar por software
  • 35 pines de entrada/salida 
    • Alta corriente de fuente y de drenador para manejo de LED
    • Resistencias pull-up programables
      individualmente por software  
    • Interrupción al cambiar el estado del pin
  • Memoria ROM de 8K con tecnología FLASH
    • El chip se puede re-programar hasta 100.000 veces
  • Opción de programación serial en el circuito
    • El chip se puede programar incluso incorporado en el dispositivo destino
  • 256 bytes de memoria EEPROM
    •  Los datos se pueden grabar más de 1.000.000 veces
  • 368 bytes de memoria RAM
  • Convertidor A/D:
    • 14 canales
    • Resolución de 10 bits
  • 3 temporizadores/contadores independientes
  • Temporizador perro guardián
  • Módulo comparador analógico con
    • Dos comparadores analógicos
    • Referencia de voltaje fija (0.6V)
    • Referencia de voltaje programable en el chip
  • Módulo PWM incorporado
  • Módulo USART mejorado
    • Soporta las comunicaciones seriales RS-485, RS-232 y LIN2.0
    • Auto detección de baudios
  • Puerto Serie Síncrono Maestro (MSSP)
    •  Soporta los modos SPI e I2C
Microcontrolador PIC16F887 en el encapsulado DIP40
Microcontrolador PIC16F887 en el encapsulado QFN44
Diagrama de bloques del PIC16F887

DESCRIPCIÓN DE PINES

La mayoría de los pines del microcontrolador PIC16F887 son multipropósito como se muestra en la figura anterior. Por ejemplo, la asignación RA3/AN3/Vref+/C1IN+ para el quinto pin del microcontrolador indica que éste dispone de las siguientes funciones:

  • RA3 Tercera entrada/salida digital del puerto A
  • AN3 Tercera entrada analógica
  • Vref+ Referencia positiva de voltaje
  • C1IN+ Entrada positiva del comparador C1

La funcionalidad de los pines presentados anteriormente es muy útil puesto que permite un mejor aprovechamiento de los recursos del microcontrolador sin afectar a su funcionamiento. Estas funciones de los pines no se pueden utilizar simultáneamente, sin embargo se pueden cambiar en cualquier instante durante el funcionamiento.

Las siguientes tablas se refieren al microcontrolador PIC16F887 DIP de 40 pines.

Funciones de los pines (a)
Funciones de los pines (b)
Funciones de los pines (c)

UNIDAD CENTRAL DE PROCESAMIENTO (CPU)

Con el propósito de explicar en forma clara y concisa, sin describir profundamente el funcionamiento de la CPU, vamos a hacer constar que la CPU está fabricada con la tecnología RISC ya que esto es un factor importante al decidir qué microcontrolador utilizar.
RISC es un acrónimo derivado del inglés Reduced Instruction Set Computer, lo que proporciona al PIC16F887 dos grandes ventajas:

  • La CPU cuenta con sólo 35 instrucciones simples. Cabe decir que para poder programar otros microcontroladores en lenguaje ensamblador es necesario saber más de 200 instrucciones.
  • El tiempo de ejecución es igual para casi todas las instrucciones y tarda 4 ciclos de reloj. La frecuencia del oscilador se estabiliza por un cristal de cuarzo. Las instrucciones de salto y de ramificación tardan ocho ciclos de reloj en ejecutarse. Esto significa que si la velocidad de operación del microcontrolador es 20 MHz, el tiempo de ejecución de cada instrucción será 200nS, o sea, ¡el programa ejecutará 5millones de instrucciones por segundo!

CPU

MEMORIA

El PIC16F887 tiene tres tipos de memoria: ROM, RAM y EEPROM. Como cada una tiene las funciones, características y organización específicas, vamos a presentarlas por separado.

ROM

La memoria ROM se utiliza para guardar permanente el programa que se está ejecutando. Es la razón por la que es frecuentemente llamada “memoria de programa”. El PIC16F887 tiene 8Kb de memoria ROM  (en total 8192 localidades). Como la memoria ROM está fabricada con tecnología FLASH, su contenido se puede cambiar al proporcionarle un voltaje de programación especial (13V).

Programar el microcontrolador

No obstante, no es necesario explicarlo en detalles puesto que se realiza automáticamente por un programa especial en la PC y un simple dispositivo electrónico denominado programador.

EEPROM

Similar a la memoria de programa, el contenido de memoria EEPROM está permanentemente guardado al apagar la fuente de alimentación. Sin embargo, a diferencia de la ROM, el contenido de la EEPROM se puede cambiar durante el funcionamiento del microcontrolador. Es la razón por la que esta memoria (256 localidades) es perfecta para guardar permanentemente algunos resultados creados y utilizados durante la ejecución del programa.

MEMORIA RAM

Es la tercera y la más compleja parte de la memoria del microcontrolador. En este caso consiste en dos partes: en registros de propósito general y en los registros de funciones especiales (los SFR). Todos estos registros se dividen en cuatro bancos de memoria de los que vamos a hablar más tarde en este capítulo.
Aunque los dos grupos de registros se ponen a cero al apagar la fuente de alimentación,  además están fabricados de la misma forma y se comportan de la manera similar, sus funciones no tienen muchas cosas en común.

Memoria RAM

REGISTROS DE PROPÓSITO GENERAL

Los registros de propósito general se utilizan para almacenar los datos temporales y los resultados creados durante el funcionamiento. Por ejemplo, si el programa realiza el conteo (de los productos en una cadena de montaje), es necesario tener un registro que representa lo que en la vida cotidiana llamamos “suma”. Como el microcontrolador no es nada creativo, es necesario especificar la dirección de un registro de propósito general y asignarle esa función. Se debe crear un programa simple para incrementar el valor de este registro por 1, después de que cada producto haya pasado por el sensor. Así es cómo es creado un simple programa.

' En esta secuencia, la variable en el registro sum se aumenta cada vez que se
' lleve un uno (1) lógico en el pin de entrada RB0
...
if PORTB.0 = 1 ' Comprobar si el pin RB0 está a uno
sum = sum + 1 ' Si está, el valor de la variable se aumenta por 1
end if ' Si no está, el programa sale de la sentencia if
...

Ahora el microcontrolador puede ejecutar el programa ya que sabe qué es y dónde está la suma que se va a incrementar. De manera similar, a cada variable de programa se le debe pre-asignar alguno de los registros de propósito general.

REGISTROS DE FUNCIONES ESPECIALES (SFR)

Los registros de funciones especiales son también parte de la memoria RAM. A diferencia de los registros de propósito general, su propósito es predeterminado durante el proceso de fabricación y no se pueden cambiar. Como los bits están conectados a los circuitos parti-culares en el chip (convertidor A/D, módulo de comunicación serial, etc), cualquier cambio de su contenido afecta directamente al funcionamiento del microcontrolador o de alguno de sus módulos. Por ejemplo, el registro ADCON0 controla el funcionamiento del convertidor A/D. Al cambiar los bits se determina qué pin del puerto se configurará como la entrada del convertidor, el momento del inicio de la conversión así como la velocidad de la conversión.

Otra característica de estas localidades de memoria es que tienen nombres (tanto los registros como sus bits), lo que simplifica considerablemente el proceso de escribir un programa. Como el lenguaje de programación de alto nivel puede utilizar la lista de todos los registros  con sus direcciones exactas, basta con especificar el nombre de registro para leer o cambiar su contenido.

'En esta sección de programa, el contenido de los registros TRISC y PORTC será modificado
...
TRISC = 0x00 ' un cero lógico (0) se escribe en el registro TRISC (todos               
' los pines del puerto PORTC se configuran como salidas)
PORTC = %01100011 ' cambio de estado lógico de todos los pines del puerto PORTC
...

BANCOS DE LA MEMORIA RAM

La memoria RAM está dividida en cuatro bancos. Antes de acceder a un registro al escribir un programa (para leer o cambiar su contenido), es necesario seleccionar el banco que contiene ese registro. Más tarde vamos a tratar dos bits del registro STATUS utilizados para selección del banco. Para simplificar el funcionamiento, los SFR utilizados con más frecuencia tienen la misma dirección en todos los bancos, lo que permite accederlos con facilidad.

Bancos de la memoria RAM

Trabajar con bancos puede ser difícil sólo si se escribe un programa en lenguaje ensamblador. Al utilizar el lenguaje de programación de alto nivel como es Basic y el compilador como es mikroBasic PRO for PIC, basta con escribir el nombre del registro. A partir de esa información, el compilador selecciona el banco necesario. Las instrucciones apropiadas  para la selección del banco serán incorporadas en el código durante el proceso de la compilación. Hasta ahora usted ha utilizado sólo el lenguaje ensamblador y esta es la primera vez que utiliza el compilador mikroBasic PRO for PIC, verdad? Es una noticia maravillosa, no lo cree?

Registros SFR del banco 0
Registros SFR del banco 1
Registros SFR del banco 2
Registros SFR del banco 3

PILA

Una parte de la RAM utilizada como pila consiste de ocho registros de 13 bits. Antes de que el microcontrolador se ponga a ejecutar una subrutina (instrucción GOSUB) o al ocurrir una interrupción, la dirección de la primera siguiente instrucción en ser ejecutada se coloca en la pila (se apila), o sea, en uno de los registros. Gracias a eso, después de ejecutarse una subrutina o una interrupción, el microcontrolador “sabe” dónde continuar con la ejecución de programa. Esta dirección se borra (se desapila) después de volver al programa, ya que no es necesario guardarla, disponiendo automáticamente esas localidades de la pila para un uso futuro.

Cabe tener en mente que el dato se apila circularmente. Esto significa que después de que se apile ocho veces, la novena vez se sobrescribe el valor que se almacenó al apilar el dato por primera vez. La décima vez que se apile, se sobrescribe el valor que se almacenó al apilar el dato por segunda vez etc. Datos sobrescritos de esta manera no se pueden recuperar. Además, el programador no puede acceder a estos registros para hacer escritura/lectura. No hay ningún bit de estado para indicar el estado de desbordamiento o subdesbordamiento de pila. Por esta razón hay que tener un especial cuidado al escribir un programa.

Vamos a hacerlo en mikroBasic...

' Al entrar o al salir de la instrucción en ensamblador del programa, el compilador 
' no va a guardar los datos en el banco de la RAM actualmente activo. Esto significa
' que en esta sección de programa la selección de banco depende de los registros SFR
' utilizados. Al volver a la sección de programa escrito en mikroBasic, los bits de
' control RP0 y RP1, que seleccionan el banco activo, deben devolver el estado que              
' tenían antes de la ejecución del código en lenguaje ensamblador. La variable   
' auxiliar saveBank  guarda el estado de estos dos bits.

saveBank = STATUS and %01100000 ' Guardar el estado de los bits RP0 y RP1    
' (bits 5 y 6 del registro STATUS)
asm ' Inicio de la secuencia en ensamblador
...
... ' Código ensamblador
...
end asm ' Final de la secuencia en ensamblador
STATUS = STATUS and %10011111 ' Bits RP0 y RP1 devuelven su estado original
STATUS = STATUS or saveBank
...
...

SISTEMAS DE INTERRUPCIONES

Al aparecer una petición de interrupción lo primero que hace el microcontrolador es ejecutar la instrucción actual después de que se detiene el proceso de ejecución de programa. Como resultado, la dirección de memoria de programa actual se apila automáticamente y la dire-cción por defecto (predefinida por el fabricante) se escribe en el contador de programa. La localidad en la que el programa continúa con la ejecución se le denomina vector de interrupción. En el caso del microcontrolador PIC16F887 esta dirección es 0x0004h. Como se muestra en la siguiente figura la localidad que contiene el vector de interrupción se omite durante la ejecución de programa regular.

Una parte de programa que se ejecutará al hacer una petición de interrupción se le denomina rutina de interrupción. Su primera instrucción se encuentra en el vector de interrupción. Cuánto tiempo tardará en ejecutar esta subrutina y cómo será depende de la destreza del programador así como de la fuente de interrupción. Algunos microcontroladores tienen más de un vector de interrupción (cada petición de interrupción tiene su vector), pero en este caso sólo hay uno. En consecuencia, la primera parte da la rutina de interrupción consiste en detectar la fuente de interrupción.
Por fin, al reconocer la fuente de interrupción y al terminar de ejecutar la rutina de inte-rrupción el microcontrolador alcanza la instrucción RETFIE, toma la dirección de la pila y continúa con la ejecución de programa desde donde se interrumpió.

Sistema de interrupciones

MikroBasic reconoce una rutina de interrupción que se ejecutará por medio de la palabra clave interrupt. La rutina de interrupción, debe ser escrita por el usuario.

sub procedure interrupt ' Rutina de interrupción
cnt = cnt + 1 ; ' Interrupción causa el incremento de la variable cnt por 1
end sub

¿Cómo utilizar los registros SFR?

Supongamos que usted ha comprado ya un microcontrolador y que tiene una buena idea de cómo utilizarlo... La lista de los registros SFR así como de sus bits es muy larga. Cada uno controla algún proceso en el microcontrolador. En general, parece como una gran tabla de control con un gran número de instrumentos e interruptores. ¿Ahora está preocupado de cómo conseguir aprender acerca de todos ellos? Es poco probable, pero no se preocupe, ¡Usted no tiene que hacerlo! Los microcontroladores son tan potentes que se parecen a los supermercados: ofrecen tantas cosas a bajos precios y a usted solo le toca elegir las que necesita. Por eso, seleccione el campo en que está interesado y examine sólo lo que necesita. Cuando entienda completamente el funcionamiento de hardware, examine los registros SFR encargados de controlarlo (normalmente son unos pocos).

Como todos los dispositivos tienen un tipo de sistema de control el microcontrolador tiene sus “palancas” con las que usted debe estar familiarizado para ser capaz de utilizarlos correctamente. Por supuesto, estamos hablando de los registros SFR desde los que el proceso de programación se inicia y en los que el mismo termina.

3.2 PRINCIPALES REGISTROS SFR

El siguiente texto describe los principales registros SFR del microcontrolador PIC16F887. Los bits de cada registro controlan los circuitos diferentes dentro del chip, así que no es posible clasificarlos en grupos especiales. Por esta razón, se describen junto con los procesos que controlan.

Registro STATUS

Registro STATUS

Leyenda: R/W - Bit de lectura/escritura, R - Bit de solo lectura, (0) - Después del reinicio, el bit se pone a cero, (1) - Después del reinicio, el bit se pone a uno, (X) - Después del reinicio, el estado de bit es desconocido

El registro STATUS contiene: el estado aritmético de datos en el registro W, el estado RESET, los bits para seleccionar el banco para los datos de la memoria.

  • IRP - Registro de selección de Banco (usado para direccionamiento indirecto)
    • 1 - Bancos 0 y 1 son activos (localidades de memoria 00h-FFh)
    • 0 - Bancos 2 y 3 son activos (localidades de memoria 100h-1FFh)
  • RP1,RP0 - Registro de selección de banco (usado para direccionamiento directo).        
RP1 RP0 Banco activo
0 0 Banco 0
0 1 Banco 1
1 0 Banco 2
1 1 Banco 3
  • TO - Time-out bit (bit de salida del temporizador perro guardián)
    • 1 - Después de encender el microcontrolador, después de  ejecutarse la instrucción CLRWDT que reinicia al WDT (temporizador perro guardián) o después de ejecutarse la instrucción SLEEP que pone al microcontrolador en el modo de bajo consumo.
    • 0 - Después de acabarse el tiempo del WDT.
  • PD - Power-down bit  (bit de apagado)
    • 1 - Después de encender el microcontrolador, después de ejecutar la instrucción  CLRWDT que reinicia al WDT.
    • 0 - Después de ejecutarse la instrucción SLEEP que pone al microcontrolador en el modo de bajo consumo. 
  • Z - Zero bit (bit cero)
    • 1 - El resultado de una operación lógica o aritmética es 0.
    • 0 - TEl resultado de una operación lógica o aritmética es distinto de 0.
  • DC - Digit carry/borrow bit (bit de acarreo/préstamo de dígito) cambia al sumar o al restar si ocurre un “desbordamiento” o un “préstamo” en el resultado.
    • 1 - Hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
    • 0 - No hubo acarreo del cuarto bit de orden bajo (nibble bajo) en el resultado.
  • C - Carry/Borrow bit (bit de acarreo/préstamo)  cambia al sumar o al restar si ocurre un “desbordamiento” o un “préstamo” en el resultado, o sea si el resultado es mayor de 255 o menor de 0.
    • 1 - Ocurrió acarreo en el bit más significativo (MSB) del resultado.
    • 0 - No ocurrió acarreo en el bit más significativo (MSB) del resultado.

Registro OPTION_REG

Registro OPTION_REG

Leyenda: R/W - Bit de lectura/escritura, (1) Después del reinicio, el bit se pone a uno

El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del Timer0/WDT, el temporizador Timer0, la interrupción externa y las resistencias pull-up en el puerto PORTB.

RBPU Port B Pull up Enable bit (resistencia Pull Up Puerto B)
  • RBPU - Port B Pull up Enable bit (resistencia Pull Up Puerto B)   
    • 1 - Desactivadas
    • 0 - Activadas
INTEDG Interrupt Edge Select bit (bit selector de flanco activo de la interrupción externa)
  • INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupción externa)
    • 1 - Interrupción por flanco ascendente en el RB0/INT
    • 0 - Interrupción por flanco descendente en el RB0/INT
T0CS TMR0 Clock Source Select bit (bit selector de tipo de reloj para el Timer0)
  • T0CS - TMR0 Clock Source Select bit (bit selector de tipo de reloj para el Timer0)
    • 1 - Pulsos introducidos a través del TOCKI (contador)
    • 0 - Pulsos de reloj internos Fosc/4 (temporizador)
T0SE	TMR0 Source Edge Select bit (bit selector de tipo de flanco en TOCKI)
  • T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco en TOCKI) selecciona el flanco (ascendente o descendente) contado por el temporizador Timer0 por el pin RA4/T0CKI.
    • 1 - Incrementa en flanco descendente en el pin TOCKI.
    • 0 - Incrementa en flanco ascendente en el pin TOCKI.
PSA - Prescaler Assignment bit (bit de asignación del pre-escalador)
  • PSA - Prescaler Assignment bit asigna el pre-escalador (hay sólo uno) al temporizador o al WDT.
    • 1 - Pre - escalador se le asigna al WDT
    • 0 - Pre - escalador se le asigna al temporizador Timer0.

PS2, PS1, PS0 Prescaler Rate Select bits (bit selector del valor del divisor de frecuencia)

El valor del divisor de frecuencia se selecciona al combinar estos tres bits. Como se muestra en la siguiente tabla, el valor del divisor de frecuencia se le asigna al temporizador Timer0 o al temporizador perro guardián (WDT).

PS2 PS1 PS0 TMR0 WDT
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128

Para conseguir el valor del divisor de frecuencia 1:1 cuando el temporizador Timer0 cuenta pulsos, el pre-escalador debe ser asignado al WDT. En consecuencia, el temporizador Timer0 no utiliza el pre-escalador, sino que cuenta directamente los pulsos generados por el oscilador, lo que era el objetivo.

Vamos a hacerlo en mikroBasic...

' Si el comando CLRWDT no se ejecuta, el WDT va a reiniciar al microcontrolador cada 32.768
' uS (f=4 MHz)
OPTION_REG = %00001111 ' Pre-escalador está asignado al WDT (1:128)
asm
CLRWDT ' Comando en ensamblador para reiniciar al WDT
end asm
... ' El tiempo entre estos dos comandos CLRWDT no debe exceder 32.768 microsegundos (128x256)
CLRWDT ' Comando en ensamblador para reiniciar al WDT
...
... ' El tiempo entre estos dos comandos CLRWDT no debe exceder 32.768 microsegundos (128x256)
CLRWDT ' Comando en ensamblador para reiniciar al WDT
...

REGISTROS DEL SISTEMA DE DESARROLLO

Al llegar la petición de interrupción, no significa que una interrupción ocurrirá automáticamente, puesto que debe ser habilitada por el usuario (por el programa) también. Por esta razón, hay bits especiales utilizados para habilitar o deshabilitar interrupciones. Es fácil de reconocerlos por las letras IE contenidas en sus nombres (Interrupt Enable - Interrupción habilitada). Además, cada interrupción se asocia con otro bit denominado bandera que indica que una petición de interrupción ha llegado sin verificar si está habilitada. Asimismo, se reconocen con facilidad por las dos últimas letras contenidas en sus nombres - IF (Interrupt Flag - Bandera de interrupción).

Registros del sistema de interrupción

Como hemos visto, toda la idea es muy simple y eficiente. Al llegar la petición de interrupción, primero el bit de bandera se pone a uno. Si el bit IE apropiado está a cero (0), esta condición será ignorada completamente. De lo contrario, ocurre una interrupción. Si varias fuentes de interrupción están habilitadas, es necesario detectar la activa antes de que la rutina de interrupción se ponga a ejecutar. La detección de la fuente se realiza al comprobar los bits de las banderas.  

Cabe destacar que los bits de cada bandera no se ponen a cero automáticamente, sino por el software, mientras que la ejecución de la rutina de interrupción continúa ejecutándose. Si no hacemos caso a este detalle, ocurrirá otra interrupción inmediatamente después de volver al programa principal, aunque no hay más peticiones de ejecución. Simplemente, la bandera, así como el bit IE, se quedan en uno.

Todas las fuentes de interrupción típicas para el microcontrolador PIC16F887 se muestran en la siguiente página. Fíjese en lo siguiente: 

El bit GIE habilita/deshabilita simultáneamente las interrupciones no enmascaradas.
El PEIE habilita/deshabilita las interrupciones no enmascaradas de periféricos. Esto no se refiere al temporizador Timer0 y a las fuentes de interrupción del puerto PORTB.
Para habilitar una interrupción causada por el cambio del estado lógico en el puerto PORTB, es necesario habilitarla para cada bit por separado. En este caso, los bits del registro IOCB se comportan como los bits IE de control.

Sistema de interrupción del microcontrolador PIC16F887

Sistema de interrupción del microcontrolador PIC16F887

Registro INTCON

El registro OPTION_REG contiene varios bits de control para configurar el pre - escalador del Timer0/WDT, el temporizador Timer0, la interrupción externa y las resistencias pull-up en el puerto PORTB.

Registro INTCON

Leyenda: R/W - Bit de lectura/escritura, (0) Después del reinicio, el bit se pone a cero, (X) - Después del reinicio, el estado de bit es desconocido

  • GIE - Global Interrupt Enable bit (bit de habilitación de interrupciones globales) controla simultáneamente todas las fuentes de interrupciones posibles.
    • 1 - Habilita las interrupciones no enmascaradas.
    • 0 - Deshabilita las interrupciones no enmascaradas.
  • PEIE - Peripheral Interrupt Enable bit (bit de habilitación de interrupciones periféricas) es similar al bit GIE, sin embargo controla interrupciones habilitadas por los periféricos. Eso significa que no influye en interrupciones causadas por el temporizador Timer0 o por el cambio del estado en el puerto PORTB o por el cambio en el pin RB0/INT.
    • 1 -Habilita las interrupciones periféricas no enmascaradas.
    • 0 -Deshabilita las interrupciones periféricas no enmascaradas
  • T0IE - TMR0 Overflow Interrupt Enable bit (bit de habilitación de interrupciones por el desbordamiento del registro Timer0) controla interrupciones causadas por el desbordamiento del Timer0.
    • 1 - Habilita interrupciones por Timer0
    • 0 - Deshabilita interrupciones por Timer0
  • INTE - RB0/INT External Interrupt Enable bit (bit de habilitación de la interrupción externa en RB0) controla interrupciones causadas por el cambio del estado lógico en el pin de entrada RB0/INT (interrupción externa).
    • 1 - Habilita interrupciones externas INT
    • 0 - Deshabilita interrupciones externas INT
  • RBIE - RB Port Change Interrupt Enable bit. (bit de habilitación de interrupciones por cambios en el puerto PORTB). Cuando se configuran como entradas, los pines en el puerto PORTB pueden causar una interrupción al cambiar el estado lógico (no importa si se produce bajada o subida de tensión, lo que importa es que se produce un cambio). Este bit determina si una interrupción va a ocurrir.
    • 1 - Habilita interrupciones por cambio en el puerto PORTB
    • 0 - Deshabilita interrupciones por cambio en el puerto PORTB
  • T0IF - TMR0 Overflow Interrupt Flag bit (bit de bandera de interrupción por el desbordamiento del Timer0) detecta el desbordamiento en el registro del temporizador Timer0, o sea el contador se pone a cero.
    • 1 - En el registro TMR0 ha ocurrido desbordamiento (esta bandera debe volverse a 0 por software)
    • 0 - En el registro TMR0 no ha ocurrido desbordamiento
  • INTF - RB0/INT External Interrupt Flag bit (bit de bandera de interrupción externa en INT) detecta el cambio en el estado lógico en el pin INT.
    • 1 - Ha ocurrido una interrupción externa por INT (esta bandera debe volverse a 0 por software)
    • 0 - No ha ocurrido una interrupción externa por INT
  • RBIF - RB Port Change Interrupt Flag bit (bit de bandera de interrupción por cambio en el puerto RB) detecta cualquier cambio del estado lógico de alguno de los pines de entrada en el puerto PORTB.
    • 1 - Al menos uno de los pines de E/S de propósito general en el puerto PORTB ha cambido de valor. Después de leer el puerto PORTB, el bit RBIF debe volverse a 0 por software)
    • 0 - Ninguno de los pines de E/S de propósito general en el puerto PORTB ha cambiado de valor.

Vamos a hacerlo en mikroBasic...

' El pin PORTB.4 se configura como una entrada sensible al cambio del estado lógico. 
ANSEL, ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
PORTB = 0 ' Todos los pines del puerto PORTB se ponen a cero
TRISB = %00010000 ' Todos los pines del puerto PORTB menos PORTB.4
' se configuran como salidas
INTCON.RBIE = 1 ' Se habilitan las interrupciones por el cambio en el puerto PORTB
IOCB.IOCB4 = 1 ' Se habilita la interrupción por el cambio en el pin 4 en el puerto PORTB
INTCON.GIE = 1 ' Se habilita la interrupción global
...
...
'Desde este punto, se produce una interrupción con cualquier cambio del estado lógico en el pin
'PORTB.

PIE1 Register

El registro PIE1 contiene los bits de habilitación de interrupciones periféricas.

Registro PIE1

Leyenda: (-)  Bit no implementado, (R/W) - Bit de lectura/escritura, (0) Después del reinicio, el bit se pone a cero 

  • ADIE - A/D Converter Interrupt Enable bit (bit de habilitación de interrupciones del convertidor A/D)
    • 1 - Habilita la interrupción ADC.
    • 0 - Deshabilita la interrupción ADC.
  • RCIE - EUSART Receive Interrupt Enable bit (bit de habilitación de interrupciones de recepción del EUSART)
    • 1 - Habilita la interrupción de recepción del EUSART.
    • 0 - Deshabilita la interrupción de recepción del EUSART.
  • TXIE - EUSART Transmit Interrupt Enable bit (bit de habilitación de interrupciones de transmisión del EUSART)
    • 1 - Habilita la interrupción de transmisión del EUSART.
    • 0 - Deshabilita la interrupción de transmisión del EUSART.
  • SSPIE - Master Synchronous Serial Port (MSSP) Interrupt Enable bit (bit de habilitación de la interrupción del puerto serie síncrono maestro (MSSP) habilita generar una petición de interrupción después de cada transmisión de datos por el módulo de comunicación serie síncrona (modo SPI o I2C).
    • 1 - Habilita la interrupción del MSSP.
    • 0 - Deshabilita la interrupción del MSSP.
  • CCP1IE - CCP1 Interrupt Enable bit bit de habilitación de la interrupción del módulo 1 de Comparación/Captura/PWM  - CCP1) permite generar una petición de interrupción en el módulo CCP1 utilizado para procesamiento de la señal PWM.
    • 1 - Habilita la interrupción CCP1.
    • 0 - Deshabilita la interrupción CCP1.
  • TMR2IE - TMR2 to PR2 Match Interrupt Enable bit (bit de habilitación de la interrupción de igualdad entre TMR2 y PR2)
    • 1 - Habilita la interrupción de igualdad entre TMR2 y PR2
    • 0 - Deshabilita la interrupción de igualdad entre TMR2 y PR2
  • TMR1IE - TMR1 Overflow Interrupt Enable bit (bit de habilitación de la interrupción de desbordamiento del temporizador Timer1) habilita generar una petición de interrupción después de cada desbordamiento en el registro del temporizador Timer1, o sea el contador se pone a cero.
    • 1 - Habilita la interrupción por desbordamiento en el registro TMR1.
    • 0 - Deshabilita la interrupción por desbordamiento en el registro TMR1.

Vamos a hacerlo en mikroBasic...

' El comparador C2 se configura para utilizar los pines RA0 y RA2 como entradas. Al producirse 
' un cambio en la salida del comparador, el pin de salida PORTB.1 cambia el estado lógico en 
' la rutina de interrupción.

dim unsigned short cnt ' Definir la variable cnt
sub procedure interrupt ' Inicio de la rutina de interrupción
cnt = cnt + 1        ' Al producirse una interrupción, la cnt se incrementa por 1
  PIR1.TMR1IF = 0      ' El bit TMR1IF se reinicia  
  TMR1H = 0x80         ' A los registros del temporizador TMR1H y TMR1L se les  
TMR1L = 0x00            ' devuelven sus valores iniciales
end sub

main:
  ANSEL, ANSELH = 0      ' Todos los pines de E/S se configuran como digitales    
  T1CON = 1              ' Encender el temporizador Timer1
  PIR1.TMR1IF = 0          ' El bit TMR1IF se pone a cero
  TMR1H = 0x80            ' Establecer los valores iniciales para el temporizador Timer1
  TMR1L = 0x00
  PIE1.TMR1IE  = 1         ' Habilitar la interrupción al producirse un
                ' desbordamiento en el Timer1

  cnt =   0              ' Reiniciar la variable cnt
  INTCON = 0xC0    ' Habilitar la interrupción (los bits GIE y PEIE)
  ...

Registro PIE2

El registro PIE2 también contiene varios bits de habilitación de interrupciones.

Registro PIE2

Leyenda: (-)  Bit no implementado, (R/W) - Bit de lectura/escritura, (0) Después del reinicio, el bit se pone a cero

  • OSFIE - Oscillator Fail Interrupt Enable bit  (bit de habilitación de la interrupción de fallo en el oscilador)
    • 1 - Habilita la interrupción de fallo en el oscilador.
    • 0 - Deshabilita la interrupción de fallo en el oscilador.
  • C2IE - Comparator C2 Interrupt Enable bit (bit de habilitación de la interrupción del comparador C2)
    • 1 - Habilita la interrupción del comparador C2.
    • 0 - Deshabilita la interrupción del comparador C2.
  • C1IE - Comparator C1 Interrupt Enable bit (bit de habilitación de la interupción del comparador C1)
    • 1 - Habilita la interrupción del comparador C1.
    • 0 - Deshabilita la interrupción del comparador C1.
  • EEIE - EEPROM Write Operation Interrupt Enable bit (bit de habilitación de la interrupción de escritura en la memoria EEPROM)
    • 1 - Habilita la interrupción de escritura en la memoria EEPROM.
    • 0 - Deshabilita la interrupción de escritura en la memoria EEPROM.
  • BCLIE - Bus Collision Interrupt Enable bit (bit de habilitación de la interrupción de colisión de bus)
    • 1 - Habilita la interrupción de colisión de bus.
    • 0 - Deshabilita la interrupción de colisión de bus.
  • ULPWUIE - Ultra Low-Power Wake-up Interrupt Enable bit (bit de habilitación de la interrupción para salir del modo de ultra bajo consumo - la reactivación)
    • 1 - Habilita la interrupción para salir del modo de ultra bajo consumo.
    • 0 - Deshabilita la interrupción para salir del modo de ultra bajo consumo.
  • CCP2IE - CCP2 Interrupt Enable bit (bit de habilitación de la interrupción del módulo 2 de Comparación/Captura/PWM (CCP2)
    • 1 - Habilita la interrupción del CCP2.
    • 0 - Deshabilita la interrupción del CCP2.

Vamos a hacerlo en mikroBasic...

' El comparador C2 se configura para utilizar los pines RA0 y RA2 como entradas. Al producirse
' un cambio en la salida del comparador, el pin de salida PORTB.1 cambia el estado lógico en  
' la rutina de interrupción.

sub procedure interrupt ' Inicio de la rutina de interrupción
PORTB.F1 = not PORTB.F1 ' La interrupción invertirá el estado lógico del                   
' pin PORTB.1
PIR2.C2IF = 0 ' Bit de bandera de interrupción C2IF se pone a cero
' Final de la rutina de interrupción
end sub ' Todos los pines del puerto PORTB se configuran
main:
TRISB = 0 ' Bit de bandera de interrupción C2IF se pone a cero
' como salidas
PORTB.1 = 1 ' El pin PORTB.1 se pone a uno
ANSEL = %00000101 ' Los pines RA0/C12IN0- y RA2/C2IN+ son las
' entradas analógicas
ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
CM2CON0.C2CH0 = 0 ' El pin RA0 se selecciona para ser una entrada                     
' invertida del C2
CM2CON0.C2CH1 = 0
PIE2.C2IE = 1 ' Habilita la interrupción del comparador C2
INTCON.GIE = 1 ' Interrupción global está habilitada
CM2CON0.C2ON = 1 ' Comparador C2 está habilitado
...
...

Registro PIR1

El registro PIE2 también contiene varios bits de habilitación de interrupciones.

Registro PIR1

Leyenda: (-)  Bit no implementado, (R/W) - Bit de lectura/escritura, (R) - Bit de lectura (0), Después del reinicio, el bit se pone a cero

  • ADIF - A/D Converter Interrupt Flag bit (bit de bandera de la interrupción del convertidor A/D)
    • 1 - Se ha completado una conversión A/D (el bit debe volverse a 0 por software).   
    • 0 - No se ha completado una conversión A/D o no ha empezado.
  • RCIF - EUSART Receive Interrupt Flag bit (bit de bandera de la interrupción de recepción del EUSART)
    • 1 - El búfer de recepción del EUSART está lleno. El bit se pone a cero al leer el registro RCREG.
    • 0 - El búfer de recepción del EUSART no está lleno.
  • TXIF - EUSART Transmit Interrupt Flag bit (bit de la interrupción de transmisión del EUSART)
    • 1 - El búfer de transmisión del EUSART está vacío. El bit se pone a cero al esribir un dato en el registro TXREG
    • 0 - El búfer de transmisión del EUSART está lleno.
  • SSPIF - Master Synchronous Serial Port (MSSP) Interrupt Flag bit (bit de bandera de la interrupción de puerto serie síncrono maestro)
    • 1 - Se ha cumplido la condición de ocurrir una interrupción del MSSP al transmitir/recibir los datos. Difieren dependiendo del modo de operación del MSSP (SPI o I2C). El bit debe ponerse a cero por software antes de volver de la rutina de servicio de interrupciones)
    • 0 - No se ha cumplido ninguna condición de ocurrir una interrupción del MSSP.
  • CCP1IF - CCP1 Interrupt Flag bit (bit de bandera de la interrupción del módulo 1 de Comparación/Captura/PWM (CCP1)
    • 1 - Se ha cumplido la condición de la interrupción del CCP1 (CCP1 es una unidad para captar, comparar y generar una señal PWM). Dependiendo del modo de operación (modo captura o modo comparación), se produce una captura o la igualdad en la comparación. En ambos     casos, el bit debe volverse a cero por software. El bit no se utiliza en el modo PWM.
    • 0 - No se ha cumplido la condición de la interrupción del CCP1
  • TMR2IF - Timer2 to PR2 Interrupt Flag bit (bit de bandera de la interrupción de igualdad entre el temporizador Timer2 y el registro PR2)
    • 1 - Se ha producido igualdad con el valor del TMR2 (registro de 8 bits del temporizador) y el valor del PR2. El bit debe ponerse a cero por software antes de volver de la rutina de servicio de interrupciones)
    • 0 - No se ha producido igualdad con el valor del TMR2 y el valor del PR2.
  • TMR1IF - Timer1 Overflow Interrupt Flag bit (bit de bandera de la interrupción de desbordamiento del temporizador Timer1)
    • 1 - Se ha producido desbordamiento en el registro TMR1. El bit debe ponerse a cero por software.
    • 0 - No se ha producido desbordamiento en el registro TMR1.

Registro PIR2

El registro PIR2 contiene los bits de banderas da la interrupción.

Registro PIR2

Leyenda: (-)  Bit no implementado, (R/W) - Bit de lectura/escritura, (0) Después del reinicio, el bit se pone a cero

  • OSFIF - Oscillator Fail Interrupt Flag bit (bit de bandera de la interrupción de fallo en el oscilador)
    • 1 - Se ha producido un fallo en el oscilador del sistema. La entrada de reloj ha sido conmutada al oscilador interno INTOSC. El bit debe ponerse a cero por software.    
    • 0 - El oscilador del sistema funciona correctamente.
  • C2IF - Comparator C2 Interrupt Flag bit (bit de bandera de la interrupción del comparador C2)
    • 1 - La salida del comparador analógico C2 ha sido cambiada (el bit C2OUT). El bit debe ponerse a cero por software.
    • 0 - La salida del comparador analógico C2 no ha sido cambiada.
  • C1IF - Comparator C1 Interrupt Flag bit  (bit de bandera de la interrupción del comparador C1)
    • 1 - La salida del comparador analógico C1 ha sido cambiada (el bit C1OUT). El bit debe ponerse a cero por software.
    • 0 - La salida del comparador analógico C1 no ha sido cambiada
  • EEIF - EE Write Operation Interrupt Flag bit (bit de bandera de la interrupción de la operación de escritura en la memoria EEPROM)
    • 1 - La operación de escritura en la memoria EEPROM se ha completado. El bit debe ponerse a cero por software.
    • 0 - La operación de escritura en la memoria EEPROM no se ha completado o todavía no se ha iniciado.
  • BCLIF - Bus Collision Interrupt Flag bit (bit de bandera de la interrupción de colisión de bus en el MSSP)
    • 1 - Se ha producido una colisión de bus en el MSSP al ser configurado para el modo maestro I2C. El bit debe ponerse a cero por software.
    • 0 - No se ha producido colisión de bus en el MSSP.
  • ULPWUIF - Ultra Low-power Wake-up Interrupt Flag bit (bit de bandera de la interrupción para salir del modo de ultra bajo consumo - la reactivación)
    • 1 - Se ha cumplido la condición de salir del modo de ultra bajo consumo. El bit debe ponerse a cero por software.
    • 0 - No se ha cumplido la condición de salir del modo de ultra bajo consumo.
  • CCP2IF - CCP2 Interrupt Flag bit (bit de la interrupción del módulo 2 de Comparación/Captura/PWM - CCP2)
    • 1 - Se ha cumplido la condición de la interrupción del CCP2 (CCP2 es una unidad para captar, comparar y generar una señal PWM). Dependiendo del modo de operación (modo captura o modo comparación), se produce una captura o la igualdad en la comparación. En ambos casos, el bit debe volverse a cero por software. El bit no se utiliza en el modo PWM.
    • 0 -No se ha cumplido la condición de la interrupción del CCP2.

Vamos a hacerlo en mikroBasic...

' Secuencia de activación del módulo ULPWU
main:
PORTA.0 = 1 ' Pin PORTA.0 se pone a uno
ANSEL,ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
TRISA = 0 ' Los pines del puerto PORTA se configuran como salidas
Delay_ms(1) ' Cargar el capacitor
PIR2.ULPWUIF = 0 ' Bandera ULPWUIF se pone a cero
PCON.ULPWUE = 1 ' Habilitar el funcionamiento del módulo ULPWU
TRISA.0 = 1 ' PORTA.0 se configura como entrada
PIE2.ULPWUIE = 1 ' Habilitar la interrupción por el módulo ULPWU
INTCON.GIE = 1 ' Habilitar todas las interrupciones no enmascaradas
INTCON.PEIE = 1 ' Habilitar las interrupciones de los periféricos
asm ' Instrucción Asm
SLEEP ' Pasar al modo de bajo consumo
...

Registro PCON

El registro PCON contiene solamente dos bits de banderas utilizados para diferenciar entre un Power-on reset (POR), un Brown-out reset (BOR), un reinicio por el temporizador perro guardián (WDT) y un reinicio externo por el pin MCLR.

Registro PCON

Leyenda: (-)  Bit no implementado, (R/W) - Bit de lectura/escritura, (1) - Después del reinicio, el bit se pone a uno, (0) Después del reinicio, el bit se pone a cero

  • ULPWUE - Ultra Low-Power Wake-up Enable bit (bit de habilitación para salir del modo de  ultra bajo consumo - la reactivación)
    • 1 - Se habilita salir del modo de ultra bajo consumo.
    • 0 - No se habilita salir del modo de ultra bajo consumo.
  • SBOREN - Software BOR Enable bit (bit de habilitación del BOR por software)
    • 1 - Se habilita Brown-out reset.
    • 0 - Se deshabilita Brown-out reset.
  • POR - Power-on Reset Status bit (bit de estado Power - on reset)
    • 1 - No se ha producido Power - on reset
    • 0 - Se ha producido Power - on reset. El bit debe ponerse a uno por software después de que se haya producido un Power - on reset.
  • BOR - Brown-out Reset Status bit (bit de estado Brown - out reset)
    • 1 - No se ha producido Brown - out reset.
    • 0 - Se ha producido Brown - out reset. El bit debe ponerse a uno por software después de que se haya producido Brown - out reset.

Registros PCL y PCLATH

La memoria de programa del  PIC16F887 es de 8K y tiene 8192 localidades para el almace-namiento de programa. Por esta razón, el contador de programa (PC) debe de ser de 13 bits de anchura (213 = 8192). Para habilitar el acceso a una localidad de memoria de programa durante el funcionamiento del microcontrolador, es necesario acceder a su dirección por medio de los registros SFR. Como todos los registros SFR son de 8 bits de anchura, este registro de direccionamiento es creado al combinar dos registros independientes: el byte bajo (de 8 bits) del contador de programa ocupa el registro PCL, mientras que el byte alto (5 bits) ocupa el registro PCLATH. Si la ejecución de programa no afecta al contador de programa, el valor de este registro  (PCL y PCLATH) va incrementándose automática y constantemente: +1, +1, +1, +1... De esta manera, el programa se ejecuta como está escrito - instrucción a instrucción, seguido por un incremento de dirección constante. 

Registros PCL y PCLATH

Si el contador de programa ha sido cambiado por software, debe tomar en cuenta lo siguiente:

  • Los ocho bits inferiores (el byte inferior) del registro PCL son de lectura/escritura, mientras que los cinco bits superiores del registro PCLATH son de sólo escritura.
  • El registro PCLATH se borra con cada reinicio.
  • En el lenguaje ensamblador, el valor del contador de programa está marcado con PCL y se refiere sólo a los ocho bits más bajos. Usted debe tener cuidado al utilizar la instrucción en ensamblador “ADDWF PCL”. Esto es una instrucción de salto que especifica la localidad destino al añadir un número a la dirección actual. Se utiliza con frecuencia para saltar a la tabla de búsqueda o a la tabla de ramificación de programa y leerlas. Un problema surge si el registro PCLATH ha sido cambiado al añadir un número a la dirección actual. La ejecución de una instrucción sobre el registro PCL causa simultáneamente la sustitución de los bits del contador de programa por los contenidos de los dos registros, PCLATH y PCL. De todos modos, el registro PCL puede acceder sólo a 8 bits inferiores del resultado de la instrucción, pues el siguiente salto será completamente incorrecto. La solución a este problema es poner estas instrucciones en las direcciones que terminan en xx00h. De esta manera se habilitan los saltos de programa hasta 255 localidades. Si se ejecutan los saltos más largos por medio de esta instrucción, el registro PCLATH debe ser incrementado por 1 cada vez que se produce desbordamiento en el registro PCL.
  • Al llamar una subrutina o al ejecutarse un salto (instrucciones CALL y GOTO), el microcontrolador es capaz de proporcionar solamente direccionamiento de 11 bits. Similar a la RAM que está dividida en “bancos”, la ROM está dividida en las cuatro “páginas” de 2K cada una. Las instrucciones dentro de estas páginas se ejecutan regularmente. Dicho de manera sencilla, como el procesador está proporcionado con una dirección de 11 bits del programa, es capaz de direccionar cualquier localidad dentro de 2KB.

La siguiente figura muestra el salto a la dirección del subprograma PP1. Sin embargo, si una subrutina o una dirección de salto no está en la misma página que la localidad de salto, se deben proporcionar dos bits superiores que faltan al escribir en el registro PCLATH. La siguiente figura muestra el salto a la dirección de la subrutina PP2.

Registros PCLATH

En ambos casos, cuando la subrutina llega a las instrucciones RETURN, RETLW o RETFIE (vuelta al programa principal), el microcontrolador continuará con la ejecución de programa desde donde se interrumpió, ya que la dirección de retorno se empuja y se guarda en la pila que consiste en registros de 13 bits, como hemos mencionado.

DIRECCIONAMIENTO INDIRECTO  

Además del direccionamiento directo, que es lógico y claro (basta con especificar la dirección de un registro para leer su contenido), este microcontrolador es capaz de realizar el direccionamiento indirecto por los registros INDF y FSR. A veces esto facilita el proceso de escribir un programa. El procedimiento entero está habilitado ya que el registro INDF no es real (no existe físicamente), sino que solamente especifica el registro cuya dirección está situada en el registro FSR. Por esta razón, escribir o leer los datos del registro INDF realmente significa escribir o leer del registro cuya dirección está situada en el registro FSR. En otras palabras, direcciones de registros se especifican en el registro FSR, y su contenido se almacena en el registro INDF. La diferencia entre el direccionamiento directo e indirecto se muestra en la siguiente figura:

Direccionamiento directo e indirecto

Como hemos visto, el problema con “los bits de direccionamiento que faltan” se soluciona con un “préstamo” del otro registro. Esta vez, es el séptimo bit, denominado bit IRP del registro STATUS.

3.3 PUERTOS DE ENTRADA/SALIDA

Una de las características más importantes del microcontrolador es el número de los pines de entrada/salida, que permite conectarlo con los periféricos. El PIC16F887 tiene en total 35 pines de E/S de propósito general, lo que es suficiente para la mayoría de las aplicaciones.

Con el propósito de sincronizar el funcionamiento de los puertos de E/S con la organización interna del microcontrolador de 8 bits, ellos se agrupan, de manera similar a los registros, en cinco puertos denotados con A, B, C, D y E. Todos ellos tienen las siguientes características en común:

  • Por las razones prácticas, muchos pines de E/S son multifuncionales. Si un pin realiza una de estas funciones, puede ser utilizado como pin de E/S de propósito general.
  • Cada puerto tiene su propio registro de control de flujo, o sea el registro TRIS correspondiente: TRISA, TRISB, TRISC etc. lo que determina el comportamiento de bits del puerto, pero no determina su contenido. Al poner a cero un bit del registro TRIS (bit=0), el pin correspondiente del puerto se configurará como una salida. De manera similar, al poner a uno un bit del registro TRIS (bit=1), el pin correspondiente del puerto se configurará como una entrada. Esta regla es fácil de recordar: 0 = Salida 1 = Entrada.
Puertos de E/S

Registros PORTA y TRISA

El puerto PORTA es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISA controlan los pines del puerto PORTA, o sea si se comportan como entradas o salidas digitales:

Registros PORTA y TRISA

Similar a que los bits del registro TRISA determinan cuáles  pines serán configurados como entradas y cuáles serán configurados como salidas, los bits apropiados del registro ANSEL determinan si los pines serán configurados como entradas analógicas o entradas/salidas digitales.

RA0 = AN0 (determinado por el bit  ANS0 del registro ANSEL)

RA1 = AN1 (determinado por el bit  ANS1 del registro ANSEL)

RA2 = AN2 (determinado por el bit  ANS2 del registro ANSEL)

RA3 = AN3 (determinado por el bit  ANS3 del registro ANSEL)

RA5 = AN4 (determinado por el bit  ANS4 del registro ANSEL)

Cada bit de este puerto tiene una función adicional relacionada a algunas unidades periféricas integradas. Este capítulo cubre sólo la función adicional del pin RA0, puesto que está relacionado al puerto PORTA y a la unidad ULPWU. En los siguientes capítulos  vamos a describir las funciones adicionales de los otros pines.

Vamos a hacerlo en mikroBasic...

' El pin PORTA.2 se configura como una entrada digital. Todos los demás pines del puerto PORTA 
' son salidas digitales
 ...
ANSEL = ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
PORTA = 0 ' Todos los pines del puerto PORTA se ponen a cero
TRISA = %00000100 ' Todos los pines del puerto PORTA excepto el
' PORTA.2 se configuran como salidas
...

UNIDAD ULPWU

El microcontrolador se utiliza generalmente en los dispositivos que funcionan periódicamente y completamente independiente utilizando una fuente de alimentación de batería. En tal caso, el consumo de corriente mínimo es una de las prioridades. Los ejemplos típicos de tales aplicaciones son: termómetros, sensores de detección del fuego y similar. Es conocido que al reducir frecuencia de reloj se reduce el consumo de corriente, pues una de las soluciones más convenientes a este problema es bajar la frecuencia de reloj, o sea utilizar el cristal de cuarzo de 32KHz en vez de el de 20MHz.

Unidad ULPWU

Al poner el microcontrolador en el modo de reposo es otro paso en la misma dirección. Aún ha quedado el problema de salir de este modo y poner el microcontrolador en modo normal de funcionamiento. Es obviamente necesario tener una señal externa en alguno de los pines. Esta señal
debe ser generada por componentes electrónicos adicionales, lo que resulta en un consumo de energía más alto del dispositivo completo...
La solución perfecta sería que el microcontrolador saliera del modo de reposo periódicamente por si mismo, lo que no es imposible. El circuito que lo habilita se muestra en la figura a la izquierda.

El principio de funcionamiento es simple:

Un pin se configura como salida  y se le lleva  un uno lógico (1). Esto causa una carga del capacitor. Inmediatamente después, el mismo pin se configura como entrada.  El cambio de estado lógico habilita una interrupción y el microcontrolador entra en modo de reposo. Sólo ha quedado esperar que se descargue el capacitor por la corriente de fuga fluyendo por el pin de entrada. Después de la descarga, se produce una interrupción y el microcontrolador continúa con la ejecución de programa en modo normal. Todo el procedimiento se repite.

Modo de reposo

En teoría, esto es una solución perfecta. El problema es que todos los pines capaces de causar una interrupción son digitales y tienen una corriente de fuga relativamente alta cuando el voltaje sobre ellos no está cerca de los valores  límites de Vdd (1) o VSS (0). En este caso, el condensador se descarga en poco tiempo ya que la corriente es de varias centenas de microamperios. Por esta razón se diseñó el circuito ULPWU, capaz de  indicar una lenta caída de voltaje con un consumo de corriente mínimo. La salida genera una interrupción, mientras que la entrada está conectada al pin RA0 del microcontrolador. Refiriéndose a la Figura (R=200 ohms, C=1nF), el tiempo de descarga es aproximadamente 30mS, mientras que un consumo total de corriente del microcontrolador es 1000 veces más bajo (de varias centenas de nanoamperios).

Registros PORTB y TRISB

El puerto PORTB es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISB determinan la función de sus pines.

Registros PORTB y TRISB

Similar al puerto PORTA, un uno lógico (1) en el registro TRISB configura el pin apropiado en el puerto PORTB y al revés. Los seis pines de este puerto se pueden comportar como las entradas analógicas (AN). Los bits del registro ANSELH determinan si estos pines serán configurados como entradas analógicas o entradas/salidas digitales:

RB0 = AN12 (determinado por el bit ANS12 del registro ANSELH)

RB1 = AN10 (determinado por el bit ANS10 del registro ANSELH)

RB2 = AN8 (determinado por el bit ANS8 del registro ANSELH)

RB3 = AN9 (determinado por el bit ANS9 del registro ANSELH)

RB4 = AN11(determinado por el bit ANS11 del registro ANSELH)

RB5 = AN13 (determinado por el bit ANS13 del registro ANSELH)

Cada bit de este puerto tiene una función adicional relacionada a algunos módulos periféricos integrados, que vamos a describir en los siguientes capítulos.

Este puerto dispone de varias características por las que se distingue de otros puertos y por las que sus pines se utilizan con frecuencia:

  • Todos los pines del puerto PORTB tienen las resistencias pull-up integradas, que los hacen perfectos para que se conecten con los botones de presión (con el teclado), interruptores u optoacopladores. Con el propósito de conectar las resisitencias a los puertos del microcontrolador, el bit apropiado del registro WPUB debe estar a uno.*
Registro WPUB

Al tener un alto nivel de resistencia (varias decenas de kiloohmios), estas resistencias “virtuales” no afectan a los pines configurados como salidas, sino que sirven de un complemento útil a los pines configurados como entradas. De lo contrario, se comportarían como si fueran flotantes gracias a su alta resistencia de entrada.

Resistencias Pull-up

* Además de los bits del registro WPUB, hay otro bit que afecta a la instalación de las resistencias pull-up. Es el bit RBPU del registro OPTION_REG.

  • El puerto PORTB se puede utilizar como una fuente de aliemntación. Al estar habilitado, cada bit del puerto PORTB configurado como una entrada puede causar una interrupción al cambiar su estado lógico. Con el propósito de habilitar que los pines causen una interrupción, el bit apropiado del registro IOCB debe estar a uno.
Registro IOCB

Gracias a estas características, los pines del puerto PORTB se utilizan con frecuencia para comprobar los botones de presión en el teclado ya que detectan cada apretón de botón infaliblemente. Por eso, no es necesario examinar todas las entradas una y otra vez.Cuando los pines X,Y y Z se configuran como entradas de puesta a uno (1), sólo se necesita esperar una petición de interrupción que aparece al apretar un botón. Más tarde, se comprueba cuál botón fue activado al combinar ceros y unos en las entradas.

Ejemplo de teclado

Vamos a hacerlo en mikroBasic...

'El pin PORTB.1 se configura como entrada digital. Se produce una interrupción con cualquier 
'cambio de su estado lógico. También tiene una resistencia pull-up. Todos los demás pines del
'puerto PORTB son salidas digitales.
...
ANSEL, ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
PORTB = 0 ' Todos los pines del puerto PORTB se ponen a cero
TRISB = %00000010 ' Todos los pines del puerto PORTB excepto PORTB.1
' se configuran como salidas
OPTION_REG.RBPU = 0 ' Se habilitan las resistencias pull-up
WPUB.1 = 1 ' La resistencia pull-up se conecta al pin PORTB.1
IOCB.1 = 1 ' El pin PORTB.1 puede causar una interrupción por el                   
  ' cambio del estado lógico
INTCON.RBIE = 1 ' Se habilita una interrupción por el cambio del estado
' lógico en el puerto
INTCON.GIE = 1 ' Se habilitan todas las interrupciones no enmascaradas
...

PIN RB0/INT

El pin RB0/INT es la única fuente “verdadera” de la interrupción externa. Se puede confi-gurar de manera que responda al borde ascendente de señal (transición de cero a uno) o al borde descendente de señal (transición de uno a cero). El bit INTEDG del registro OPTION_REG selecciona la señal apropriada.

Pines RB6 y RB7

El PIC16F887 no dispone de ningún pin especial para la programación. Esta función se les asigna a los pines de E/S. Más concretamente son los pines del puerto PORTB utilizados para la transmisión de señal de reloj (RB6) y de datos (RB7) durante la programación. Además, es necesario suministrar el voltaje de alimentación Vdd (5V) así como el voltaje apropiado Vpp (12-14V) para la programación de memoria FLASH. El pin MCLR se utiliza para este propósito. No se preocupe de los detalles relacionados a este proceso, tampoco se preocupe de cuál voltaje se aplica primero puesto que el programador se encargan de eso. Se habilita cargar   el programa en el microcontrolador aún después de haber sido soldado en el dispositivo destino. Por supuesto, el programa cargado se puede cambiar de la misma manera. Esta función se le denomina ICSP (In-Circuit Serial Programming - Programación serial en circuito). Para utilizarlo correctamente es necesario planificar con antelación. 

Sólo es necesario instalar un conector miniatura de 5 pines en el dispositivo destino para suministrar al microcontrolador un voltaje de programación necesario. Para evitar la interferencia entre los voltajes y el funcionamiento de los otros módulos conectados a los pines del microcontrolador, es necesario aislarlos de la placa durante la programación utilizando las resistencias o los puentes.

Conector en la placa para la programación ICSP Zócalo del programador

Como hemos visto, los voltajes aplicados a los pines del zócalo del programador son los mismos que los utilizados durante la programación ICSP.

Registros PORTC y TRISC

El puerto PORTC es un puerto bidireccional, de 8 bits de anchura. Los bits del registro TRISC determinan la función de sus pines. Similar a otros puertos, un uno lógico (1) en el registro TRISC  configura el pin apropiado del puerto PORTC como entrada.

Registros PORTC y TRISC

Todas las funciones adicionales del puerto PORTC se describen en los siguientes capítulos.

Registros PORTD y TRISD

El puerto PORTD es un puerto bidireccional de 8 bits de anchura. Los bits del registro TRISD determinan la función de sus pines. Similar a otros puertos, un uno lógico (1) en el registro TRISD configura el pin apropiado del puerto PORTD como entrada

Registros PORTD y TRISD

Registros PORTE y TRISE

El puerto PORTE es un puerto bidireccional, de 4 bits de anchura.

Los bits del registro TRISE determinan la función de sus pines. Similar a otros puertos, un uno lógico (1) en el registro TRISE  configura el pin apropiado del puerto PORTE como entrada.

La excepción es el pin RE3, que siempre está configurado como entrada.

Registros PORTE y TRISE

Similar a los puertos PORTA y PORTB, en este caso los tres pines se pueden configurar como entradas analógicas. Los bits del registro ANSEL determinan si estos pines serán configurados como entradas analógicas (AN) o entradas/salidas digitales:

RE0 = AN5 (determinado por el bit ANS5 del registro ANSEL);

RE1 = AN6 (determinado por el bit ANS6 del registro ANSEL); y

RE2 = AN7 (determinado por el bit ANS7 del registro ANSEL).

Vamos a hacerlo en mikroBasic...

' El pin PORTE.0 se configura como una entrada analógica mientras que los demás tres pines
' del mismo puerto se configuran como digitales
ANSEL = %00100000 ' El pin PORTE.0 se configura como analógico
ANSELH = 0 ' Todos los pines de E/S se configuran como digitales
TRISE = %00000001 ' Todos los pines del puerto PORTE excepto el
' PORTE.0 se configuran como salidas
PORTE = 0 ' Todos los bits del puerto PORTE se ponen a cero
...

Registros ANSEL y ANSELH

Los registros ANSEL y ANSELH se utilizan para configurar el modo de entrada de un pin de E/S como analógico o como digital.

Registros ANSEL y ANSELH

La regla es la siguiente:
Para configurar un pin como una entrada analógica, el bit apropiado de los registros ANSEL o ANSELH se debe poner a uno (1). Para configurar un pin como una entrada/salida digital, el bit apropiado se debe poner a cero (0).

El estado lógico de los bits del registro ANSEL no tiene influencia en las funciones de salidas digitales. Al intentar a leer un pin de puerto configurado como una entrada analógica, el resultado es siempre 0. 

Configuración de los registros ANSEL y ANSELH

En breve

Es probable que usted nunca vaya a escribir un programa que no utilice puertos, así que el esfuerzo para aprender todo sobre ellos en definitiva vale la pena. De todos modos, los puertos son probablemente los módulos más simples dentro del microcontrolador. Se utilizan de la siguiente manera:

  • Al diseñar un dispositivo, seleccione un puerto por el que el microcontrolador comunicará al entorno periférico. Si usted utiliza sólo entradas/salidas digitales, seleccione cualquier puerto. Si utiliza alguna de las entradas analógicas, seleccione los puertos apropiados que soportan al configuración de los pines (AN0-AN13).
  • Cada pin del puerto se puede configurar como salida o como entrada. Los bits de los registros TRISA,TRISB, TRISC, TRISD y TRISE determinan cómo se comportarán los pines apropiados de los puertos PORTA, PORTB, PORTC, PORTD y PORTE. Simplemente...
  • Si utiliza alguna de las entradas analógicas, primero es necesario poner a uno los bits apropiados de los registros ANSEL y ANSELH en el principio de programa.
  • Si utiliza resistencias o botones de presión como una fuente de señal de entrada, conéctelos a los pines del puerto PORTB, ya que tienen las resistencias pull-up. El uso de estos registros está habilitado por el bit RBPU del registro OPTION_REG, mientras que la instalación de las resistencias individuales está habilitada por los bits del registro WPUB.
  • Con frecuencia se necesita responder tan pronto como los pines de entrada cambien su estado lógico. Sin embargo, no es necesario escribir un programa para comprobar el estado lógico de los pines. Es mucho más simple conectar estas entradas a los pines del puerto PORTB y habilitar que ocurra una interrupción con cada cambio de voltaje. Los bits de los registros IOCB e INTCON se encargan de eso.

3.4 TEMPORIZADOR TIMER0

El microcontrolador PIC16F887 dispone de tres temporizadores/contadores independientes, denominados Timer0, Timer1 y Timer2. En este capítulo se presenta una descripción detallada de los mismos.

El temporizador Timer0 tiene una amplia gama de aplicaciones en la práctica. Sólo unos pocos programas no lo utilizan de alguna forma. Es muy conveniente y fácil de utilizar  en programas o subrutinas para generar pulsos de duración arbitraria, en medir tiempo o en contar los pulsos externos (eventos) casi sin limitaciones.

El módulo del temporizador Timer0 es un temporizador/contador de 8 bits con las siguientes características:

  • Temporizador/contador de 8 bits;
  • Pre-escalador de 8 bits (lo comparte con el temporizador perro guardián);
  • Fuente de reloj interna o externa programable;
  • Generación de interrupción por desbordamiento; y
  • Selección del flanco de reloj externo programable.

La siguiente figura muestra el esquema del temporizador Timer0 con todos los bits que determinan su funcionamiento. Estos bits se almacenan en el registro OPTION_REG.

Temporizador Timer0

Registro OPTION_REG

Registro OPTION_REG
  • RBPU - PORTB Pull-up enable bit (resistencia Pull Up del puerto PORTB)
    • 0 - Resistencias pull-up del puerto PORTB están deshabilitadas.
    • 1 - Pines del puerto PORTB pueden estar conectados a las resistencias pull-up.
  • INTEDG - Interrupt Edge Select bit (bit selector de flanco activo de la interrupción externa)
    • 0 - Interrupción por flanco ascendente en el pin INT (0-1).
    • 1 - Interrupción por flanco descendente en el pin INT (1-0).
  • T0CS - TMR0 Clock Select bit (bit selector de tipo de reloj para el Timer0)
    • 0 - Los pulsos se llevan a la entrada del temporizador/contador Timer0 por el pin RA4.
    • 1 - El temporizador utiliza los pulsos de reloj internos (Fosc/4).
  • T0SE - TMR0 Source Edge Select bit (bit selector de tipo de flanco)
    • 0 - Incrementa en flanco descendente en el pin TMR0.
    • 1 - Incrementa en flanco ascendente en el pin TMR0.
  • PSA - Prescaler Assignment bit (bit de asignación del pre-escalador)
    • 0 - Pre-escalador se le asigna al WDT.
    • 1 - Pre-escalador se le asigna al temporizador/contador Timer0.
  • PS2, PS1, PS0 - Prescaler Rate Select bit (bit selector del valor del divisor de frecuencias)
    • El valor del divisor de frecuencias se ajusta al combinar estos bits.  Como se muestra en la tabla a la derecha, la misma combinación de bits proporciona los diferentes valores del divisor de frecuencias para el temporizador/contador Timer0 y el temporizador perro guardián, respectivamente.
PS2 PS1 PS0 TMR0 WDT
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 0 1:32 1:16
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128

Cuando el bit PSA está a 0, el pre-escalador se le asigna al temporizador/contador Timer0, como se muestra en la siguiente figura:

Función del bit PSA al estar a 0

Vamos a hecerlo en mikroBasic...

' En este ejemplo, Timer0 se configura como un temporizador y se le asigna un pre-escalador.
unsigned cnt ' Declarar la variable cnt
sub procedure interrupt ' Rutina de interrupción
cnt = cnt + 1 ' Interrupción causa el incremento de cnt por 1
TMR0 = 155 ' Temporizador (o contador) Timer0 devuelve su valor inicial
INTCON = 0x20 ' Bit T0IE está a 1, bit T0IF está a 0

end sub
main:
OPTION_REG = 0x04 ' Pre-escalador (1:32) se le asigna al temporizador Timer0
TMR0 = 155 ' Timer0 cuenta de 155 a 255
INTCON = 0xA0 ' Habilitada la interrupción por el desbordamiento en el registro TMR0
...
...
' En el siguiente ejemplo, Timer0 se configura como un temporizador y se le asigna
' un pre-escalador.
OPTION_REG = 0x20 ' Pre-escalador (1:2) se le asigna al Timer0
TMR0 = 155 ' Timer0 cuenta de 155 a 255
INTCON = 0xA0 ' Habilitada la interrupción por el desbordamiento en el
     ' registro TMR0
...

Cuando el bit PSA está a 1, el pre-escalador se le asigna al temporizador perro guardián como se muestra en la siguiente figura:

Función del bit PSA al estar a 1

Vamos a hacerlo en mikroBasic...

'  En este ejemplo, el pre-escalador (1:64) se le asigna al temporizador perro guardián.
main:
OPTION_REG = 0x0E ' Pre-escalador se le asigna al WDT (1:64)
asm
CLRWDT ' Comando en ensamblador para reiniciar el WDT
end asm
...
...
asm
CLRWDT ' Comando en ensamblador para reiniciar el WDT
end asm
...

Aparte de lo dicho anteriormente, cabe destacar lo siguiente:

  • Al asignarle el pre-escalador al temporizador/contador,  el pre-escalador se pondrá a 0 con cualquier escritura en el registro TMR0.
  • Al asignar el pre-escalador al temporizador perro guardián, tanto el WDT como el pre- escalador se pondrán a 0 con la instrucción CLRWDT.
  • Al escribir en el registro TMR0, utilizado como un temporizador, no se inicia el conteo de los  pulsos inmediatamente, sino con retraso de dos ciclos de instrucciones. Por consiguiente, es necesario ajustar el valor escrito en el registro TMR0.
  • Al poner el microcontrolador en el modo de reposo se apaga el oscilador de reloj. No puede ocurrir el desbordamiento ya que no hay pulsos a contar. Es la razón por la que la interrupción por el desbordamiento del TMR0 no puede“despertar” al procesador del modo de reposo..
  • Si se utiliza como un contador de reloj externo sin pre-escalador, la longitud de pulso mínima o tiempo muerto entre dos pulsos deberá ser 2 Tosc + 20 nS (Tosc es el período de señal de reloj del oscilador).
  • Si se utiliza como un contador de reloj externo con pre-escalador, la longitud de pulso mínima o tiempo muerto entre dos pulsos es sólo 10nS.
  • El registro del pre-escalador de 8 bits no está disponible al usuario, lo que significa que no es posible leerlo o escribir en él directamente.
  • Al cambiar de asignación del pre-escalador del Timer0 al temporizador perro guardián, es necesario ejecutar la siguiente secuencia de instrucciones escritas en ensamblador para impedir reiniciar el microcontrolador:
BANKSEL TMR0
CLRWDT ;PONER A CERO WDT
CLRF TMR0 ;PONER A CERO TMR0 Y PRE-ESCALADOR
BANKSEL OPTION_REG
BSF OPTION_REG,PSA ;ASIGNARLE EL PRE-ESCALADOR AL WDT
CLRWDT ;PONER A CERO WDT
MOVLW b’11111000’ ;;SELECCIONAR LOS BITS PS2,PS1,PS0 Y PONERLOS
ANDWF OPTION_REG,W ;A CERO POR LA INSTRUCCIÓN ‘Y LÓGICO’
IORLW b’00000101’ ;BITS PS2, PS1, Y PS0 PONEN EL VALOR
MOVWF OPTION_REG ;DEL DIVISOR DE FRECUENCIAS A 1:32
  • De manera similar, al cambiar de asignación del pre-escalador del WDT al Timer0, es necesario ejecutar la siguiente secuencia de instrucciones, también escritas en ensamblador:
BANKSEL TMR0
CLRWDT ;PONER A CERO WDT Y PRE-ESCALADOR
BANKSEL OPTION_REG
MOVLW b’11110000’ ;SELECCIONAR SÓLO LOS BITS PSA,PS2,PS1,PS0
ANDWF OPTION_REG,W ;Y PONERLOS A CERO POR LA INSTRUCCIÓN ‘Y LÓGICO’
IORLW b’00000011’ ;VALOR DEL DIVISOR DE FRECUENCIAS ES 1:16
MOVWF OPTION_REG

En breve

Para utilizar el Timer0 apropiadamente, es necesario:

Paso 1: Seleccionar el modo:

  • El modo de temporizador se selecciona por el bit TOSC del registro OPTION_REG (TOSC: 0=temporizador, 1=contador).
  • Cuando se asigna el pre-escalador al temporizador/contador se debe poner a cero el bit PSA del registro OPTION_REG. El valor del divisor de frecuencias se configura al
    utilizar los bits PS2-PS0 del mismo registro.    
  • Al utilizar una interrupción, los bits GIE y TMR0IE del registro INTCON deben estar a uno.

Paso 2: Medir y contar

Para medir tiempo:

  • Reiniciar el registro TMR0 o escribir un valor conocido en él. 
  • El tiempo transcurrido(en microsegundos al utilizar el oscilador de 4MHz) se mide al leer el registro TMR0.
  • El bit de bandera TMR0IF del registro INTCON se pone a uno automáticamente siempre que ocurra el desbordamiento del registro TMR0. Si está habilitada, ocurre una interrupción.

Para contar pulsos:

  • La polaridad de pulsos a contar en el pin RA4 se selecciona por el bit TOSE del registro OPTION_REG  (T0SE: 0=pulsos positivos, 1=pulsos negativos).
  • Varios pulsos se pueden leer del registro TMR0. El pre-escalador y la interrupción se utilizan de la misma forma que en el modo de temporizador.

3.5 TEMPORIZADOR TIMER1

El módulo del temporizador Timer1 es un temporizador/contador de 16 bits, lo que significa que consiste en dos registros (TMR1L y TMR1H). Puede contar hasta 65535 pulsos en un solo ciclo, o sea, antes de que el conteo se inicie desde cero.

Temporizador Timer1

Similar al temporizador Timer0, estos registros se pueden leer o se puede escribir en ellos en cualquier momento. En caso de que ocurra un desbordamiento, se genera una interrupción si está habilitada.

El módulo del temporizador Timer1 puede funcionar en uno o dos modos básicos, eso es como un temporizador o como un contador. A diferencia del temporizador Timer0, cada uno de estos dos modos tiene funciones adicionales.

El temporizador Timer1 tiene las siguientes características:

  • Temporizador/contador de 16 bits compuesto por un par de registros;
  • Fuente de reloj interna o externa programable;
  • Pre-escalador de 3 bits;
  • Oscilador LP opcional;
  • Funcionamiento síncrono o asíncrono;   
  • Compuerta para controlar el temporizador Timer1 (conteo habilitado) por medio del comparador o por el pin T1G;
  • Interrupción por desbordamiento;
  • “Despierta” al microcontrolador (salida del modo de reposo) por desbordamiento (reloj externo); y
  • Fuente de reloj para la función de Captura/Comparación.
Esquema simplificado del temporizador Timer1

Esquema simplificado del temporizador Timer1

SELECCIÓN DE LA FUENTE DE RELOJ DEL TEMPORIZADOR TIMER1

El bit TMR1CS del registro T1CON se utiliza para seleccionar la fuente de reloj para este temporizador:

Fuente de reloj
TMR1CS
Fosc/4 0
pin T1CKI 1

Al seleccionar la fuente de reloj interna, el par de registros TMR1H-TMR1L será incrementado con varios pulsos Fosc como es determinado por el pre-escalador.

Al seleccionar la fuente de reloj externa, este temporizador puede funcionar como un  temporizador o un contador. Los pulsos en el modo temporizador pueden estar sincronizados con el reloj interno del microcontrolador o funcionar asíncronamente.

PRE-ESCALADOR DEL TEMPORIZADOR TIMER1

El temporizador Timer1 tiene un escalador completamente separado que permite dividir la  frecuencia de entrada de reloj por 1, 2, 4 o 8. No es posible leer el pre-escalador o escribir en él directamente. De todas formas, el contador del pre-escalador se pone a 0 automáticamente después de escribir en los registros TMR1H o TMR1L.

OSCILADOR DEL TIMER1

Los pines RC0/T1OSO y RC1/T1OSI se utilizan para registrar los pulsos que vienen de los dispositivos periféricos, pero también tienen una función adicional. Como se puede ver en la siguiente figura, se configuran simultáneamente como entrada (pin RC1) y salida (pin RC0) del oscilador de cuarzo LP (Low Power - de bajo consumo) adicional. Este circuito está principalmente diseñado para funcionar a bajas frecuencias (hasta 200 KHz), exactamente para el uso de cristal de cuarzo de 32.768 KHz. Este cristal se utiliza en los relojes de cristal puesto que es fácil de obtener un pulso de duración de un segundo al dividir esta frecuencia. Como el oscilador no depende del reloj interno, puede funcionar incluso en el modo de reposo. Se habilita al poner a uno el bit de control T1OSCEN del registro T1CON. El usuario debe proporcionar  tiempo muerto por medio de software (unos pocos milisegundos) para habilitar que el oscilador se inicie apropiadamente.

Oscilador del Timer1

La siguiente tabla muestra los valores recomendados de los capacitores convenientes con el oscilador de cuarzo.  No es necesario que estos valores sean exactos. De todas formas, la regla general es: cuánto más alta sea la capacidad, tanto más alta será la estabilidad, lo que a la vez prolonga el tiempo necesario para la estabilización del oscilador.

Oscilador Frecuencia C1 C2
LP
32 kHz 33 pF 33 pF
100 kHz 15 pF 15 pF
200 kHz 15 pF 15 pF

El consumo de corriente del microcontrolador se reduce a nivel más bajo en el modo de reposo ya que el consumidor de corriente principal - el oscilador - no funciona.  Es fácil de poner al microcontrolador en este modo - al ejecutar la instrucción SLEEP. El problema es cómo despertar al microcontrolador, o sea cómo generar una interrupción para “despertarlo”. Como el microcontrolador “duerme”, se debe usar una interrupción causada por dispositivos periféricos para despertarlo. Se pone muy complicado si es necesario despertar al microcontrolador a intervalos de tiempo regulares...

Para resolver el problema, un oscilador de cuarzo LP (de bajo consumo de corriente) completamente independiente, capaz de funcionar en el modo de reposo, está integrado en el microcontrolador PIC16F887. Simplemente, un circuito anteriormente separado ahora está integrado en el microcontrolador y asignado al temporizador Timer1. El oscilador está habilitado al poner a 1 el bit T1OSCEN del registro T1CON. El bit TMR1CS del mismo re-gistro se utiliza para habilitar que el temporizador Timer1 utilice secuencias de pulsos de ese oscilador.

Oscilador del Timer1
  • Una señal generada por este oscilador de cuarzo está sincronizada con el reloj del microcontrolador al poner a 0 el bit T1SYNC. En este caso, el temporizador no puede funcionar en modo de reposo porque el circuito para sincronización utiliza el reloj del microcontrolador.
  • La interrupción por desbordamiento en el registro del temporizador Timer1 puede estar habilitada. Si el bit T1SYNC se pone a 1, tales interrupciones se producirán en el modo de reposo también.

COMPUERTA DEL TEMPORIZADOR TIMER1

El pin TG1 o la salida del comparador C2 pueden ser una fuente de los pulsos que pasan por la compuerta del temporizador Timer1. Se configuran por software. Esta compuerta permite que el temporizador mida directamente la duración de los eventos externos al utilizar el pin T1G o las señales analógicas al utilizar la salida del comparador C2. Refiérase a la Figura en la página 163. Para medir duración de señal, basta con habilitar esta compuerta y contar los pulsos en el registro TMR1.

TIMER1 EN EL MODO CONTADOR 

El temporizador Timer1 se pone a funcionar como un contador al poner a 1 el bit TMR1CS. Este bit cuenta los pulsos llevados al pin PC0/T1CKI y se incrementa en el flanco ascendente de la entrada del reloj externo T1CKI. Si el bit de control T1SYNC del registro T1CON se pone a 0, las entradas del reloj externo se sincronizarán antes de llegar al par del registro TMR1. En otras palabras, el temporizador Timer1 se sincroniza con el reloj interno del microcontrolador y se le denomina contador síncrono.

Al poner en modo de reposo el microcontrolador que funciona en el modo contador, los registros del temporizador TMR1H y TMR1L no serán incrementados aunque los pulsos de reloj aparezcan en los pines de entrada. Como el reloj interno del microcontrolador no funciona en este modo, no hay entradas de reloj que se utilicen para la sincronización. De todas formas, el pre-escalador sigue funcionando siempre que haya pulsos de reloj en los pines, porque es un simple divisor de frecuencias.

Timer1 en el modo contador

Este contador detecta un uno lógico (1) en los pines de entrada. Cabe destacar que al menos un flanco ascendente debe ser detectado antes de empezar a contar los pulsos. Refiérase a la Figura a la izquierda. Las flechas en la figura indican los incrementos del contador.

Contador de los pulsos

 TIMER1 EN EL MODO TEMPORIZADOR

Para seleccionar este modo, es necesario poner a 0 el bit TMR1CS. Después de eso, el re-gistro de 16 bits será incrementado con cada pulso generado por el oscilador interno. Si se utiliza el cristal de cuarzo de 4 MHZ, el registro será incrementado cada microsegundo.

En este modo, el bit T1SYNC no afecta al temporizador porque cuenta los pulsos de reloj interno. Como todos los dispositivos utilizan estos pulsos, no hace falta sincronizarlos.

Oscilador del temporizador Timer1

El oscilador de reloj del microcontrolador no funciona durante el modo de reposo así que el desbordamiento en el registro del temporizador no puede causar interrupción en este modo.

Vamos a hacerlo en mikroBasic...

' En este ejemplo, el Timer1 está configurado como un temporizador con el valor del 
' pre-escalador 1:8. Cada vez que ocurra un desbordamiento de los registros TMR1H
' y TMR1L, se solicitará una interrupción.  

main:
...
PIR1.TMR1IF = 0 ' Poner a 0 la bandera de bit del TMR1IF
TMR1H = 0x22 ' Poner el valor inicial para el temporizador Timer1
TMR1L = 0x00
T1CON.TMR1CS = 0 ' Timer1 cuenta los pulsos del oscilador interno
T1CON.T1CKPS0 = 1 ' El valor del pre-escalador asignada es 1:8
T1CON.T1CKPS1 = 1
PIE1.TMR1IE = 1 ' Interrupción habilitada por desbordamiento
INTCON = 0xC0 ' Interrupción habilitada (bits GIE y PEIE)
T1CON.TMR1ON = 1 ' Encender el temporizador Timer1
...

Registro T1CON

Los bits del registro T1CON están en control del funcionamiento del temporizador Timer1.

Registro T1CON

T1GINV - (Bit  inversor de la compuerta del temporizador1) se comporta como un inversor del estado lógico en la compuerta formada por el pin T1G o la salida (C2OUT) del comparador C2. Este bit habilita al temporizador para contar los pulsos cuando la compuerta esté a alto o a bajo.

  • 1 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estén a alto (1).
  • 0 - Temporizador 1 cuenta los pulsos cuando el pin T1G o el bit C2OUT estén a bajo (0).

TMR1GE - (Bit de habilitación de la compuerta del temporizador Timer1) determina si la compuerta formada por el pin T1G o salida del comparador C2  (C2OUT) estará activa o no. Este bit es funcional sólo en caso de que el temporizador Timer1 esté encendido (el bit TMR1ON = 1). De lo contrario, este bit se ignora.

  • 1 - Temporizador Timer1 está encendido sólo si la compuerta no está activa.
  • 0 - Compuerta no afecta al temporizador Timer1.

T1CKPS1, T1CKPS0 - (Bits de selección del pre-escalador de señal de reloj del Temporizador1) determina el valor del divisor de frecuencias asignada al temporizador Timer1.

T1CKPS1 T1CKPS0 Valor del pre-escalador
0 0 1:1
0 1 1:2
1 0 1:4
1 1 1:8

T1OSCEN - (bit de habilitación del oscilador LP del Timer1)

  • 1 - Oscilador LP  está habilitado para el reloj del Timer1 (oscilador de bajo consumo y de frecuencia de 32.768 kHz).
  • 0 - Oscilador LP está apagado.

T1SYNC - (Bit de control de sincronización de la señal de entrada) habilita la sincronización de la entrada del oscilador LP o de la entrada del pin T1CKI con el reloj interno del microcontrolador. Este bit se ignora al contar los pulsos desde el oscilador principal (el bit TMR1CS = 0).

  • 1 - Entrada de reloj externa no está sincronizada.
  • 0 - Entrada de reloj externa está sincronizada.

TMR1CS - (bit de selección de la fuente de reloj del temporizador Timer1)   

  • 1 - Cuenta los pulsos por el pin T1CKI  (por el flanco ascendente 0-1)
  • 0 - Cuenta los pulsos del reloj interno del microcontrolador

TMR1ON - (TMR activo, hace entrar o no en funcionamiento el Timer1).

  • 1 - Habilita el temporizador Timer1.
  • 0 - Deshabilita el temporizador Timer1.

En breve

Para utilizar el Timer1 apropiadamente, es necesario hacer lo siguiente:

  • Como no es posible apagar el pre-escalador, su valor debe estar ajustado a los bits T1CKPS1 y T1CKPS0 del registro T1CON (Refiérase a la tabla anterior).
  • Seleccionar el modo por el bit TMR1CS del registro T1CON. TMR1CS: 0= la fuente de reloj es oscilador de cuarzo interno, 1= la fuente de reloj es oscilador de cuarzo externo.
  • Al configurar el bit T1OSCEN del mismo registro, el oscilador está habilitado y los registros TMR1H y TMR1L se incrementan con cada pulso de reloj. Al poner este bit a 0, se detiene el conteo.
  • Al reiniciar los registros del contador o al escribir en ellos, se reinicia el pre-escalador.
  • Al llenar ambos registros del temporizador, la bandera TMR1IF se pone a uno y el conteo empieza desde cero.

3.6 TEMPORIZADOR TIMER2

El temporizador Timer2 es un temporizador de 8 bits.

Temporizador TMR2

Los pulsos que vienen del oscilador de cuarzo primero pasan por el pre-escalador cuyo valor  puede ser modificado al combinar los bits T2CKPS1 y T2CKPS0. La salida del pre-escalador se utiliza para incrementar el registro TMR2 empezando por 00h. Los valores del TMR2 y del PR2 se comparan constantemente y el registro TMR2 va incrementándose hasta alcanzar el valor del registro PR2. Cuando se igualan los valores de los registros, lo que será registrado por el comparador, el Timer2 se reinicia  automáticamente. El post-escalador del temporizador Timer2 se incrementa con cada igualdad de valores y su salida se utiliza para generar una interrupción si está habilitada.

Los ambos registros TMR y PR2 son de lectura y escritura. El conteo se puede detener al  poner a 0 el bit TMR2ON, lo que resulta en un ahorro de energía.

El momento de reinicio del TMR2 se puede utilizar para determinar la velocidad de transmisión en baudios de la comunicación serie síncrona. 

Varios bits del registro T2CON están en control del temporizador Timer2.

Registro T2CON

Registro T2CON

TOUTPS3 - TOUTPS0 - (bits de selección del rango del divisor del post-escalador para el Timer2) se utilizan para determinar el valor del post-escalador según la siguiente tabla:

TOUTPS3 TOUTPS2 TOUTPS1 TOUTPS0 Valor del post-escalador
0 0 0 0 1:1
0 0 0 1 1:2
0 0 1 0 1:3
0 0 1 1 1:4
0 1 0 0 1:5
0 1 0 1 1:6
0 1 1 0 1:7
0 1 1 1 1:8
1 0 0 0 1:9
1 0 0 1 1:10
1 0 1 0 1:11
1 0 1 1 1:12
1 1 0 0 1:13
1 1 0 1 1:14
1 1 1 0 1:15
1 1 1 1 1:16

TMR2ON - (bit de activación del TIMR2) hace entrar en funcionamiento el temporizador Timer2.

  • 1 - Habilita el funcionamiento del Timer2.
  • 0 - Deshabilita el funcionamiento del Timer2.

T2CKPS1, T2CKPS0 - (selección del rango del divisor del pre-escalador del Timer2) determina el valor del divisor de frecuencias:

T2CKPS1 T2CKPS0 Valor del post-escalador
0 0 1:1
0 1 1:4
1 x 1:16

En breve

Al utilizar el temporizador Timer2 hay que saber varios detalles relacionados con sus registros:

  • En el momento de encender una fuente de alimentación, el registro PR2 contiene el valor FFh.
  • Tanto el pre-escalador como el post-escalador se borran al escribir en el registro TMR2.
  • Tanto el pre-escalador como el post-escalador se borran al escribir en el registro T2CON.
  • Al producirse cualquier reinicio, como puede anticiparse, tanto el pre-escalador como el post-escalador se borran.

3.7 MÓDULOS CCP

Los módulos CCP pueden funcionar en muchos modos diferentes, por lo que se consideran los más complicados. Si usted intenta analizar su funcionamiento a base de tablas que describen las funciones de bits, comprenderá mejor de lo qué le estamos hablando. Si utiliza alguno de los módulos CCP, primero seleccione el modo que necesita, analice la figura apropiada y entonces póngase a modificar los bits de registros. Si no...

El módulo CCP  (Captura/Comparación/PWM) es un periférico que le permite medir y controlar diferentes eventos. Como indica su nombre, puede funcionar en tres modos diferentes:

El modo de captura proporciona el acceso al estado actual de un registro que cambia su valor constantemente. En este caso, es el registro del temporizador Timer1.

El modo de comparación compara constantemente valores de dos registros. Uno de ellos es el registro del temporizador Timer1.

PWM (Pulse Width Modulation - modulación por ancho de pulsos) puede generar señales de frecuencia y de ciclo de trabajo variados por uno o más pines de salida.

El microcontrolador PIC16F887 dispone de dos módulos CCP - CCP1 y CCP2. Ambos son idénticos en modo normal de funcionamiento, mientras que las características del PWM mejorado están disponibles sólo en el modo CCP1. Ésta es la razón por  la que en este capítulo se describe detalladamente el funcionamiento del módulo CCP1. Con respecto al CCP2, se presentarán sólo las características que lo distinguen del CCP1.

MÓDULO CP1

Una parte central de este circuito es un registro CCPR1 de 16 bits que consiste en registros CCPR1L y CCOR1H. Se utiliza para capturar los números binarios desde el registro del temporizador TMR1(TMR1H y TMR1L) o para comparar los números binarios almacenados en los registros CCPR1 y TMR1.

Módulo CCP1

Si está habilitado por software, puede ocurrir el reinicio del temporizador Timer1 al igualarse los valores en modo de Comparación. Además, el módulo CCP1 puede generar señales PWM de frecuencia y de ciclo de trabajo variados.

Los bits del registro CCP1CON están en control del módulo CCP1.

CCP1 EN MODO DE CAPTURA

En este modo, registro CCP1 (que consiste en los registros CCPR1H y CCPR1L) captura el valor de 16 bits del registro del temporizador TMR1 (que consiste en los registros TMR1H y TMR1L) en las siguientes situaciones:

  • Cada flanco ascendente (1 g 0) en el pin RC2/CCP;
  • Cada flanco descendente (0 g 1) en el pin RC2/CCP1;
  • Cada cuarto flanco ascendente (0g 1) en el pin RC2/CCP1; y
  • Cada decimosexto flanco descendente (0g 1) en el pin RC2/CCP1.

Al combinar cuatro bits (CCP1M3, CCP1M2, CCP1M1 y CCP1M0) del registro de control se determina cuál de estos eventos causará la captura de dato de 16 bits. Además, se deben cumplir los siguientes requisitos:

  • El pin RC2/CCP1 debe estar configurado como entrada; y
  • El Timer1 debe funcionar como temporizador o contador síncrono. 
CCP1 en modo de captura

El bit de bandera CCP1IF se pone a uno después de acabar la captura. Si se pone a 1 el bit CCP1IE del registro PIE1, se producirá una interrupción.

Cuando el módulo CCP1 sale del modo de captura, puede producirse una interrupción de captura no deseada. Para evitarlo, antes de que ocurra un cambio en el registro de control CCP1CON se deben poner a 0 tanto el bit que habilita la interrupción CCP1IE, como el bit de bandera CCP1IF.

Las interrupciones no deseadas pueden producirse al cambiar el valor del pre-escalador. Para evitarlo, el módulo CCP1 debe estar apagado temporalmente antes de cambiar el valor del pre-escalador. Se recomienda la siguiente secuencia de programa, escrita en ensamblador:

BANKESEL CCP1CON
CLRF CCP1CON 'REGISTRO DE CONTROL BORRADO
'MÓDULO CCP1 ESTÁ APAGADO
MOVLW XX 'NUEVO MODO DEL PRE-ESCALADOR ESTÁ SELECCIONADO
MOVWF CCP1CON 'MÓDULO CCP1 SE ENCIENDE SIMULTÁNEAMENTE
'MÓDULO CCP1 SE ENCIENDE SIMULTÁNEAMENTE

Vamos a hacerlo en mikroBasic...

...
asm
BANKESEL CCP1CON
CLRF CCP1CON 'REGISTRO DE CONTROL BORRADO
'MÓDULO CCP1 ESTÁ APAGADO
MOVLW XX 'NUEVO MODO DEL PRE-ESCALADOR ESTÁ SELECCIONADO
MOVWF CCP1CON 'EN EL REGISTRO DE CONTROL SE INTRODUCE UN NUEVO VALOR
'MÓDULO CCP1 SE ENCIENDE SIMULTÁNEAMENTE
end asm
...

CCP1 EN MODO DE COMPARACIÓN

En este modo, el valor almacenado en el registro CCP1 se compara constantemente al valor almacenado en el registro del temporizador TMR1. Al igualarse los valores, el estado lógico en el pin de salida RC2/CCP1 puede ser cambiado, lo que depende del estado de bits en el registro de control (CCP1M3 - CCP1M0). El bit de bandera CCP1IF se pone a uno simultáneamente.

CCP1 EN MODO DE COMPARACIÓN

Para poner el módulo CCP1 en este modo de funcionamiento, se deben cumplir dos condiciones:

  • El pin RC2/CCP1 debe estar configurado como salida; y
  • El temporizador Timer1 debe estar sincronizado con el reloj interno.

CCP1 EN MODO PWM

Las señales de frecuencia y de ciclo de trabajo variados tienen una amplia gama de aplicaciones en automatización. Un ejemplo típico es un circuito de control de potencia. Refiérase a la siguiente figura. Si un cero lógico (0) indica  un interruptor abierto y un uno lógico (1) indica un interruptor cerrado, la potencia eléctrica que se transmite a los consumidores será directamente proporcional a la duración del pulso. Esta relación se le denomina Ciclo de Trabajo.

CCP1 en modo PWM

El otro ejemplo, común en la práctica, es el uso de señales PWM en un circuito para generar señales de forma de onda arbitraria como una onda sinusoidal. Vea la siguiente figura:

CCP1 en modo PWM con filtro

Los dispositivos que funcionan según este principio se utilizan con frecuencia en la práctica como variadores de frecuencia ajustable que controlan motores eléctricos (velocidad, aceleración, desaceleración etc.).

Módulo PWM

La Figura anterior muestra el diagrama de bloques del módulo CCP1 puesto en el modo PWM. Para generar un pulso de forma arbitraria en el pin de salida, es necesario ajustar el período de pulsos (frecuencia) y la duración de pulsos.

Modo PWM

PERÍODO PWM

El período de pulso de salida (T) depende del valor almacenado en el registro PR2 del temporizador Timer2. El período de PWM se puede calcular por la siguiente ecuación:

Período PWM = (PR2 +1) * 4Tosc * Valor de pre-escala del TMR2

Si el período de PWM (T) es conocido, es fácil caluclar la frecuencia de señal (F), porque estos dos valores están relacionados por la ecuación F=1/T.

ANCHO DE PULSOS DE PWM

El ancho de pulsos de PWM se especifica al utilizar en total 10 bits: los ocho bits más significativos del registro CCPR1L y los dos bits menos significativos del registro CCP1CON (DC1B1 y DC1B0). El resultado es un número de 10 bits dado por la siguiente fórmula:

Ancho de pulsos = (CCPR1L,DC1B1,DC1B0) * Tosc * Valor de pre-escala del TMR2

La siguiente tabla muestra cómo generar las señales PWM de diferentes frecuencias cuando el microcontrolador utiliza un cristal de cuarzo de 20 MHz (Tosc=50nS).

Frecuencia [KHz] 1.22 4.88 19.53 78.12 156.3 208.3
Pre-escalador del TMR2
16 4 1 1 1 1
Registro PR2
FFh FFh FFh 3Fh 1Fh 17h

CICLO DE TRABAJO DE PWM

El ciclo de trabajo se obtiene al dividir el ancho de pulsos por el período:

Ciclo de trabajo = (CCPR1L,DC1B1,DC1B0) / ( 4(PR2 + 1))

Notas adicionales:

  • El pin de salida se va a poner a 1 constantemente, si por error el ancho de pulso generado es más largo que el período de PWM.
  • En este caso, no se puede utilizar el post-escalador del temporizador Timer2 para generar períodos de PWM largos.

RESOLUCIÓN DE SEÑAL PWM

Una señal PWM no es nada más que una secuencia de pulsos que varían su ciclo de trabajo. Para una frecuencia específica (número de pulsos por segundo), hay un número limitado de combinaciones de ciclos de trabajo. Este número representa una resolución  medida en bits. Por ejemplo, si una resolución es de 10 bits estarán disponibles 1024 ciclos de trabajo discretos; si una resolución es de 8 bits estarán disponibles 256 ciclos de trabajo disretos etc. En este microcontrolador la resolución depende del contenido del registro PR2. La máxima  resolución se obtiene al introducir el número FFh en este registro.

Frecuencias y resoluciones de señales PWM (Fosc = 20MHz):

Frecuencia PWM
1.22kHz 4.88kHz 19.53kHz 78.12kHz 156.3kHz 208.3kHz
Pre-escala del temporizador
16 4 1 1 1 1
Valor del PR2
FFh FFh FFh 3Fh 1Fh 17h
Resolución máxima
10 10 10 8 7 6

PWM signals' frequences and resolutions (Fosc = 8MHz):

Frecuencia PWM 1.22kHz 4.90kHz 19.61kHz 76.92kHz 153.85kHz 200.0kHz
Pre-escala del temporizador 16 4 1 1 1 1
Valor del PR2 65h 65h 65h 19h 0Ch 09h
Resolución máxima 8 8 8 6 5 5

Vamos a hacerlo en mikroBasic...

' En este ejemplo, el módulo PWM está inicializado y ajustado para producir una secuencia
' de pulsos de ciclo de trabajo del 50%. Para este propósito, se utilizan las funciones
' PWM1_Init(), PWM1_Start() y PWM1_Set_Duty(). Todas las funciones las contiene la         
' librería PWM del mikroC PRO for PIC. Sólo es necesario copiarlas al programa.

dim duty_c as byte ' Definir la variable duty_c
...
sub procedure InitMain()
ANSEL,ANSELH = 0 ' Todos los pines de  E/S se configuran como digitales
PORTC,TRISC = 0 ' Estado inicial de los pines de salida del puerto PORTC
PWM1_Init(5000) ' Inicialización del módulo PWM (5KHz)

end sub
main:
InitMain()
duty_c = 127 ' Valor inicial del ciclo de trabajo
PWM1_Start ' Iniciar el módulo PWM1
PWM1_Set_Duty(duty_c) ' Ajustar el ciclo de trabajo de PWM al 50%
...
...

Registro CCP1CON

Registro CCP1CON

P1M1, P1M0 - PWM Output Configuration bits (bits de configuración del modo PWM). El pin P1A se siempre configura como una entrada en el modo de Captura/Comparación. Los pines P1B, P1C y P1D actúan como los pines de E/S del puerto PORTD.
En el modo PWM estos bits afectan al funcionamiento del módulo CCP1 como se muestra en la siguiente tabla:

P1M1 P1M0 Modo
0 0 PWM con una sola salida
Por el pin P1A sale una señal modulada.
Pines P1B, P1C y P1D son entradas/salidas del puerto D.
0 1 Configuración Full Bridge - Forward (puente completo con salida directa)
Por el pin P1D sale una señal modulada.
Pin P1A está activo.
Pines P1B y P1C están inactivos.
1 0 Configuración Half Bridge (medio-puente)
Por los pines P1A y P1B sale una señal modulada.
Pines P1C y P1D son entradas/salidas del puerto D.
1 1 Configuración Full Bridge - Reverse (puente completo con salida inversa)
Por el pin P1B sale una señal modulada.
Pin P1C está activo.
Pines P1A y P1D están inactivos.

DC1B1, DC1B0 -PWM Duty Cycle Least Significant bits (bits menos significativos del ciclo de trabajo de PWM). Se utilizan sólo en el modo PWM y representan dos bits menos significativos de un número de 10 bits. Este número determina el ciclo de trabajo de la señal PWM. Los demás 8 bits se almacenan en el registro CCPR1L.

CCP1M3 - CCP1M0 bits - CCP1 Mode Select bits (bits de selección de modo del módulo CCP1) determina el modo de funcionamiento del módulo CCP1.

CCP1M3 CCP1M2 CCP1M1 CCP1M0 Modo
0 0 0 0 Módulo está deshabilitado (reinicio)
0 0 0 1 No utilizado
0 0 1 0 Modo de comparación
El bit CCP1IF bit se pone a 1 al ocurrir una coincidencia.
0 0 1 1 No utilizado
0 1 0 0 Modo de captura
Cada flanco descendente en el pin CCP1
0 1 0 1 Modo de captura
Cada flanco ascendente en el pin CCP1
0 1 1 0 Modo de captura
Cada cuarto flanco ascendente en el pin CCP1
0 1 1 1 Modo de captura
Cada decimosexto flanco ascendente en el pin CCP1
1 0 0 0 Modo de comparación
La salida y el bit CCP1IF se ponen a 1 al ocurrir una coincidencia
1 0 0 1 Modo de comparación
La salida se pone a 0 y el bit CCP1IF se pone a 1 al ocurrir una coincidencia
1 0 1 0 Modo de comparación
Llega la solicitud de interrupción y el bit CCP1IF se pone a 1 al ocurrir una coincidencia
1 0 1 1 Modo de comparación
Wl bit CCP1IF se pone a 1 y los registros de temporizadores 1 o 2 se borran al ocurrir una coincidencia
1 1 0 0 Modo PWM
Pines P1A y P1C están activos a nivel alto
Pines P1B y P1D estan activos a nivel alto
1 1 0 1 Modo PWM
Pines P1A y P1C están activos a nivel alto
Pines P1B y P1D están activos a nivel bajo
1 1 1 0 Modo PWM
Pines P1A y P1C están activos a nivel bajo
Pines P1B y P1D están activos a nivel alto
1 1 1 1 Modo PWM
Pines P1A y P1C están activos a nivel bajo
Pines P1B y P1D están activos a nivel bajo

MÓDULO CCP2

Con exclusión de los nombres diferentes de los registros y de los bits en los módulos CCP1 y CCP2, el módulo CCP2 es una muy buena copia del módulo CCP1 puesto en modo normal. La única diferencia significativa entre ellos es el funcionamiento en modo de comparación del módulo CCP2.
La diferencia se refiere a la señal de reinicio del temporizador Timer1. Concretamente, si el convertidor A/D está habilitado, al igualarse los valores de los registros TMR1 y CCPR2, la señal de reinicio del temporizador Timer1 iniciará automáticamente la conversión A/D.

Módulo CCP2

El módulo CCP2 está bajo el control de los bits del registro de control. Esta vez es el registro CCP2CON. 

Registro CCP2CON

Registro CCP2CON

DC2B1, DC2B0 -PWM Duty Cycle Least Significant bits (bits menos significativos del ciclo de trabajo de PWM). Se utilizan sólo en modo PWM y representan dos bits menos significativos de un número de 10 bits. Este número determina el ciclo de trabajo de la señal PWM. Los demás 8 bits se almacenan en el registro CCPR2L.

CCP2M3 - CCP2M0 bits -CCP2 Mode Select bits (bits de selección de modo del módulo CCP2) determina el modo del módulo CCP2.

CCP2M3 CCP2M2 CCP2M1 CCP2M0 Modo
0 0 0 0 Módulo está deshabilitado (reinicio).
0 0 0 1 No utilizado
0 0 1 0 No utilizado
0 0 1 1 No utilizado
0 1 0 0 Modo de captura
Cada flanco descendente en el pin CCP2
0 1 0 1 Modo de captura
Cada flanco ascendente en el pin CCP2
0 1 1 0 Modo de captura
Cada cuarto flanco ascendente en el pin CCP2
0 1 1 1 Modo de captura
Cada decimosexto flanco ascendente en el pin CCP2
1 0 0 0 Modo de comparación
La salida y el bit CCP2IF bit se ponen a 1 al ocurrir una coincidencia
1 0 0 1 Modo de comparación
La salida se pone a 0 y el bit CCP2IF se pone a 1 al ocurrir una coincidencia
1 0 1 0 Modo de comparación
Se produce una interrupción, el bit CCP2IF bit se pone a 1 y no hay cambio en el pin CCP2 al ocurrir una coincidencia
1 0 1 1 Modo de comparación
Al ocurrir una coincidencia, el bit CCP2IF se pone a 1, los registros del temporizador Timer 1 se borran y la conversión A/D se inicia si el convertidor A/D está habilitado.
1 1 x x Modo PWM

En breve

¿Cómo configurar e iniciar el módulo CCP1 para funcionar en modo PWM?

Para configurar e iniciar el módulo CCP1 para funcionar en modo PWM, siga los siguientes pasos:

  • Deshabilitar el pin de salida del CCP1. Deberá estar configurado como entrada.
  • Seleccionar el período de señal PWM al introducir el valor en el registro PR2.
  • Configurar el módulo CCP1 para funcionar en modo PWM al combinar los bits del registro CCP1CON.
  • Ajustar el ciclo de trabajo de señal PWM al introducir el valor en el registro CCPR1L y al utilizar los bits DC1B1 y DC1B0 del registro CCP1CON.
  • Configurar e iniciar el temporizador Timer2:
    • Poner a cero el bit de bandera de interrupción TMR2IF en el registro PIR1
    • Ajustar el valor de división de frecuencia del temporizador Timer2 por los bits T2CKPS1 y T2CKPS0 del registro T2CON.
    • Iniciar el temporizador Timer2 al poner a uno el bit TMR2ON  del registro T2CON.
  • Habilitar los pines de salida de PWM después de que haya sido acabado un ciclo de PWM:
    • Esperar el desbordamiento del temporizador Timer2 (el bit TMR2IF del registro PIR1 se pone a uno)
    • Configurar el pin apropiado como salida al poner a cero el bit en el registro TRIS.

MÓDULO CCP1 EN MODO MEJORADO

El módulo CCP1 es el único que se puede poner en modo mejorado. Este modo básicamente no difiere del modo normal del CCP1 y la mejora se refiere a la transmisión de la señal PWM a los pines de salida. ¿Por qué es eso tan importante? Por el uso cada vez más frecuente de los microcontroladores en los sistemas de control de motores eléctricos. Aquí no vamos a describir estos dispositivos, sin embrago si tiene la oportunidad de trabajar en el desarrollo de los dispositivos similares, reconocerá los elementos que se utilizaban  hasta hace poco como los periféricos. Decimos “se utilizaban” porque todos estos elementos ahora están integrados en el microcontrolador y pueden funcionar en varios modos diferentes.

MODO PWM CON UNA SALIDA

El modo PWM con una salida está habilitado sólo en el caso de que se pongan a cero los bits P1M1 y P1M0 en el registro CCP1CON. En tal caso, una señal PWM puede estar disponible simultáneamente en como máximo cuatro diferentes pines de salida. Además, la secuencia de señales PWM puede aparecer en forma de onda básica o invertida. La distribución de señales depende de los bits del registro PSTRCON, mientras que su polaridad depende de los bits CCP1M1 y CCP1M0 del registro CCP1CON.

Si se utiliza una salida invertida, los pines activos a nivel bajo y los pulsos que tienen la misma forma de onda se generan siempre en parejas: en los pines P1A y P1C  así como en los pines P1B y P1D, respectivamente.

Modo PMW con una salida

MODO DE MEDIO-PUENTE

En cuanto al modo de medio-puente, la señal PWM es una salida en el pin P1A, mientras que a la vez la señal complementaria PWM es una salida en el pin P1B. Estos pulsos activan a los controladores MOSFET en modo de Medio-Puente que habilitan/deshabilitan el flujo de corriente por el dispositivo.

Modo de medio-puente

En este modo es muy peligroso encender los controladores MOSFET simultáneamente (el cortocircuito producido en aquel momento sería fatal). Para evitarlo, es necesario proporcionar un tiempo muerto entre encender y apagar los controladores. Este tiempo muerto está marcado con ‘td’ (time delay) en la siguiente figura. El problema se resuelve al utilizar los bits PDC0-PDC6 del registro PWM1CON.

Pulsos en modo de medio-puente

Como se muestra en la siguiente figura, el modo de medio-puente se puede utilizar para activar los controladores MOSFET en la configuración Puente completo:

Activar los controladores MOSFET

MODO PUENTE-COMPLETO

Todos los cuatro pines se utilizan como salidas en el modo Puente completo. En la práctica, este modo es utiliza con frecuencia para activar los motores, lo que proporciona un control simple y completo de velocidad y dirección de rotación. Hay dos configuraciones de este modo:  Full Bridge-Forward (puente completo con salida directa) y Full Bridge-Reverse (puente completo con salida inversa).

Modo puente-completo

CONFIGURACIÓN PUENTE COMPLETO - DIRECTO 

En modo Directo ocurre lo siguiente:

  • Un uno lógico (1) aparece en el pin P1A  (pin está activo a nivel alto);
  • Secuencia de pulsos aparece en el pin P1D; y
  • Un cero lógico (0) en los pines P1B y P1C (pines están activos a nivel bajo).

La siguiente figura muestra el estado de los pines P1A-P1D durante un ciclo PWM completo:

Modo puente completo-directo

 CONFIGURACIÓN PUENTE COMPLETO - INVERSO

Lo similar ocurre en modo Inverso, a menos que estos pines dispongan de funciones diferentes:

  • Un uno lógico (1) aparece en el pin P1C  (pin está activo a nivel alto);  
  • Secuencia de pulsos aparece en el pin P1B; y
  • Un cero lógico (0) aparece en los pines P1A  y  P1D (pines están activos a nivel bajo).
Modo puente completo-reverso

Registro PWM1CON

Registro PWM1CON

PRSEN PWM Restart Enable bit (Bit de habilitación del reinicio automático del PWM)

  • 1 - Después de un apagado automático, el módulo PWM se reinicia automáticamente, y el bit ECCPASE del registro ECCPAS se pone a cero.
  • 0 - Para iciar el módulo PWM después de un apagado automático, el bit ECCPASE debe ponerse a cero por software.

PDC6 - PDC0 PWM Delay Count bits - (Bits de configuración del tiempo muerto en el modo PWM) El número binario de 7 dígitos determina el número de ciclos de instrucciones (4žTosc) añadidos como tiempo muerto al activar los pines de entrada PWM.

PRSEN = 0
PRSEN = 1

Registro PSTRCON

Registro PSTRCON

STRSYNC - Steering Sync bit (bit de sincronización de dirección) determina el momento de la dirección de los pulsos de PWM:

  • 1 - La dirección ocurre después de que el registro PSTRCION haya sido cambiado, sólo si se ha completado la forma de onda del PWM.
  • 0 - La dirección ocurre después de que el registro PSTRCION haya sido cambiado. La señal PWM en la salida del pin será cambiada inmediatamente sin reparar en si el ciclo anterior ha sido completado. Este procedimiento es útil cuando es necesario detener la transmisión de una señal PWM del pin.

STRD - Steering Enable bit D (bit D de habilitación de dirección) determina la función del pin P1D.

  • 1 - El pin P1D tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1
  • 0 - Pin está configurado como entrada/salida general del puerto PORTD.

STRC Steering Enable bit C (bit C de habilitación de dirección) determina la función del pin P1C.

  • 1 - El pin P1C tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1
  • 0 - Pin está configurado como entrada/salida general del puerto PORTD.

STRB - Steering Enable bit B (bit B de habilitación de dirección) determina la función del pin P1B.

  • 1 - El pin P1B tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1.
  • 0 - Pin está configurado como entrada/salida general del puerto PORTD.

STRA - Steering Enable bit A (bit A de habilitación de dirección) determina la función del pin P1A.

  • 1 - El pin P1A tiene la forma de onda del PWM con polaridad determinada por los bits CCP1M0 y CCP1M1
  • 0 -Pin está configurado como entrada/salida general del puerto PORTC.

Registro ECCPAS

Registro ECCPAS

ECCPASE - ECCP Auto-Shutdown Event Status bit  (bit de estado del apagado automático) indica si ha ocurrido el apagado automático del módulo CCP (estado de Apagado):

  • 1 - Módulo CCP está en estado de Apagado.
  • 0 - Módulo CCP funciona normalmente.

ECCPAS2 - ECCPAS0 - ECCP Auto-Shutdown Source Select bits (Bits de selección de la fuente de apagado automático) selecciona la fuente de apagado automático.

ECCPAS2 ECCPAS1 ECCPAS0 Fuente del estado de apagado
0 0 0 Estado del apagado deshabilitado
0 0 1 Cambio de salida del comparador C1
0 1 0 Cambio de salida del comparador C2
0 1 1 Cambio de salidas de los comparadores C1 o C2
1 0 0 Cero lógico (0) en el pin INT
1 0 1 Cero lógico (0) en el pin INT o cambio de salida del comparador  C1
1 1 0 Cero lógico (0) en el pin INT o cambio de salida del comparador  C2
1 1 1 Cero lógico (0) en el pin INT o cambio de salidas de los comparadores C1 o C2

PSSAC1, PSSAC0 - Pins P1A, P1C Shutdown State Control bits (Bits de configuración de los pines P1A y P1C en modo de apagado) define el estado lógico de los pines P1A y P1C cuando el módulo CCP está en el estado de apagado.

PSSAC1 PSSAC0 Estado lógico de los pines
0 0 0
0 1 1
1 X Alta impedancia (Tri-estado)

PSSBD1, PSSBD0 - Pins P1B, P1D Shutdown State Control bits (Bits de configuración de los pines P1B y P1D en modo de apagado) define el estado lógico de los pines P1B y P1D cuando el módulo CCP está en el estado de apagado.

PSSBD1 PSSBD0 Estado lógico de los pines
0 0 0
0 1 1
1 X Alta impedancia (Tri-estado)

3.8 MÓDULOS DE COMUNICACIÓN SERIE

El microcontrolador PIC 16F887 dispone de varios módulos de comunicación serie independientes, además cada uno se puede configurar a funcionar en modos diferentes. Eso es  lo que los hace insustituibles en muchos casos. Acuérdese de lo que hemos dicho sobre los módulos CCP ya que lo mismo se aplica aquí. No se preocupe de los detalles del funcionamiento de todos los módulos, solo seleccione uno y utilice lo que realmente necesita.

El USART es uno de los primeros sistemas de comunicación serie. Las versiones nuevas de este sistema están actualizadas y se les denomina un poco diferente - EUSART.

EUSART

Cómo utilizar EUSART

El módulo Transmisor/Receptor Universal Síncrono/Asíncrono mejorado (Enhanced Universal Synchronous Asynchronous Receiver Transmitter - EUSART) es un periférico de comunicación serie de entrada/salida. Asimismo es conocido como Interfaz de comunicación serie (Serial Communications Interface - SCI). Contiene todos los generadores de señales de reloj, registros de desplazamiento y búfers de datos necesarios para realizar transmisión de datos serie de entrada/salida,  independientemente de la ejecución de programa del dispositivo. Como indica su nombre, aparte de utilizar el reloj para la sincronización, este módulo puede establecer la conexión asíncrona, lo que lo hace único para algunas aplicaciones. Por ejemplo, en caso de que sea difícil o imposible proporcionar canales especiales para transmisión y recepción de datos y señales de reloj (por ejemplo, mando a distancia de radio o infrarrojas), el módulo EUSART es definitivamente la mejor opción posible.

El EUSART integrado en el PIC16F887 posee las siguientes características:

  • Transmisión y recepción asíncrona en modo Full-duplex;
  • Caracteres de anchura de 8 – 9 bits programables;
  • Detección de dirección en modo de 9 bits;
  • Detección de errores por saturación del búfer de entrada; y
  • Comunicación Half Duplex en modo síncrono.

EUSART EN MODO ASÍNCRONO

El EUSART  transmite y recibe los datos utilizando la codificación de no retorno a cero - NRZ (non-return-to-zero). Como se muestra en la siguiente figura, no se utiliza una señal de reloj y los datos se transmiten de forma muy simple:

EUSART en modo asíncrono

Cada dato se transmite de la siguiente forma:

  • En estado inactivo la línea de datos permanece en estado alto (1);
  • Cada transmisión de datos comienza con un bit de arranque (START), el cual, siempre es cero (0);
  • Cada dato tiene un ancho de 8 o 9 bits (primero se transmite el bit menos significativo- LSB); y
  • Cada transmisión de datos termina con un bit de parada (STOP), el cual, siempre es uno (1).

La siguiente figura muestra cómo conectar de manera habitual un microcontrolador PIC que utiliza el módulo EUSART. El circuito RS-232 se utiliza como un convertidor de nivel de voltaje.

Cómo conectar de manera habitual un microcontrolador PIC que utiliza el módulo EUSART

EUSART EN MODO DE TRANSMISOR ASÍNCRONO

EUSART en modo transmisor asíncrono

Para habilitar la transmisión de datos por medio del módulo EUSART, es necesario configurarlo para que funcione como un transmisor. En otras palabras, es necesario definir el estado de los siguientes bits:

  • TXEN = 1 - El transmisor EUSART se habilita al poner a uno el bit TXEN del registro TXSTA
  • SYNC = 0 - El EUSART se configura a funcionar en modo asíncrono al poner a cero el bit SYNC del registro TXSTA.
  • SPEN = 1 - Al poner a uno el bit SPEN del registro RCSTA, el EUSART está habilitado y el pin TX/CK se configura automáticamente como salida. Si el bit se utiliza simultáneamente para alguna función analógica, se debe deshabilitar al poner a cero el bit correspondiente del registro ANSEL.

La parte central del transmisor EUSART ocupa el registro de desplazamiento TSR que no está directamente disponible al usuario. Para iniciar la transmisión de datos, el módulo debe estar habilitado al poner a uno el bit TXEN del registro TXSTA. Los datos a enviar se deben escribir en el registro TXREG, lo que resultará en la siguiente secuencia de eventos:

  • Byte será transmitido inmediatamente al registro de desplazamiento TSR;
  • El registro TXREG permanece vacío, lo que indica la bandera de bit TXIF del registro PIR1. Si se pone a uno el bit TXIE del registro PIE1, se generará una interrupción. De todos modos, la bandera se pone a uno sin reparar en si una interrupción está habilitada o no y no se puede poner a cero por software, sino al escribir un dato nuevo en el registro TXREG.
  • Dispositivos electrónicos de control “empujan” el dato hacia el pin TX en sincronización con señal de reloj interna: bit de arranque (START) (1).....datos....bit de parada (STOP) (1).
  • Cuando el último bit abandona el registro TSR, el bit TRMT en el registro TXSTA se pone a uno automáticamente.
  • Si mientras tanto se escribe un dato nuevo en el registro TXREG, todo el procedimiento se repite inmediatamente después de la transmisión del bit de parada del dato anterior.

Para transmitir un dato de 9 bits es necesario poner a uno el bit TX9 del registro TXSTA.  El bit TX9D del registro TXSRTA es el noveno bit y el más significativo.  Al transmitir  un dato de 9 bits, el bit de datos TX9D deberá estar escrito antes de que de se escriban los 8 bits menos significativos en el registro TXREG. Todos los nueve bits de datos se transmiten al registro de desplazamiento TSR inmediatamente después de que se acabe la escritura en el registro TXREG.

EUSART EN MODO RECEPTOR ASÍNCRONO

EUSART en modo receptor asíncrono

Similar al poner en marcha el transmisor del EUSART, para habilitar el receptor es necesario configurar los siguientes bits:

  • CREN = 1 - El receptor EUSART se habilita al poner a uno el bit CREN del registro RCSTA;
  • SYNC = 0 - El EUSART se configura a funcionar en modo asíncrono al poner a cero el bit SYNC del registro TXSTA; y
  • SPEN = 1 - Al poner a uno el bit SPEN del registro RCSTA, el EUSART está habilitado y el pin RX/DT se configura automáticamente como salida. Si el bit se utiliza simultáneamente para alguna función analógica, se debe deshabilitar al poner a cero el bit correspondiente del registro ANSEL.

Después de que se haya terminado el primer paso necesario y se haya detectado el bit de   arranque (START), el dato se transmite al registro de desplazamiento RSR por el pin RX. Al haber recibido el bit de parada (STOP), ocurre lo siguiente:

  • El dato se transmite automáticamente al registro RCREG (si está vacío);
  • El bit de bandera RCIF se pone a uno y ocurre una interrupción si está habilitada por el bit RCIE en el registro PIE1. Similar al transmisor, el bit de bandera se pone a cero sólo por software, o sea, al leer el registro RCREG. Tenga en cuenta que esto es un doble registro de tipo FIFO (primero en entrar, primero en salir - first-in, first-out), lo que permite almacenamiento de dos caracteres simultáneamente);
  • Si el registro RCREG está ocupado (contiene dos bytes) y el registro de desplazamiento detecta el nuevo bit de parada (STOP), el bit de sobrescritura OERR se pondrá a uno. En tal caso se pierde un dato nuevo que viene, y el bit OERR debe ponerse a cero por software al poner a cero y luego al poner a uno el bit CREN; 
    Nota: No es posible recibir un dato nuevo sino hasta que el bit OERR esté a uno.
  • Si el bit de parada (STOP) está a cero (0), el bit FERR del registro RCSTA estará a uno, lo que indica un error en recepción; y
  • Para habilitar la recepción de un dato de 9 bits, es necesario poner a uno el bit RX9 del registro RCSTA.

DETECCIÓN DE ERRORES EN RECEPCIÓN

El microcontrolador puede detectar automáticamente dos tipos de errores. El primero es denominado error de encuadre (Framing error). Ocurre cuando el receptor no detecta el bit de parada en un intervalo predeterminado de tiempo. Este error se indica mediante el bit FERR del registro RCSTA. Si el bit está a uno, el último dato recibido puede ser incorrecto. Cabe destacar lo siguiente:

  • El error de encuadre no genera  por si mismo una interrupción;
  • Si el bit FERR está a uno, el último dato recibido contiene un error;
  • El error de encuadre (bit está a uno) no impide la recepción de un dato nuevo;
  • El bit FERR se pone a cero al leer el dato recibido, lo que significa que se debe hacer una verificación antes de leer el dato; y 
  • El bit FERR no se puede poner a cero por software. Si es necesario, se puede borrar al poner a cero al bit SPEN del registro RCSTA, lo cual, simultáneamente causa una reinicialización del sistema EUSART.

Otro tipo de error es denominado error de sobrescritura (Overrun Error). Como hemos mencionado anteriormente, el registro de tipo FIFO puede almacenar sólo dos caracteres. Un error de sobrescritura ocurre cuando el registro recibe el tercer carácter. Simplemente no hay espacio para almacenar un byte más, por lo que un error es inevitable. Cuando ocurre este error, el bit OERR del registro RCSTA se pone a uno. Las consecuencias son las siguientes:

  • Los datos almacenados en los registros FIFO (2 bytes) se pueden leer normalmente;
  • No se recibirán más datos hasta que el bit OERR esté puesto a cero; y
  • A este bit no se le puede acceder directamente. Para borrarlo, es necesario poner a cero el bit CREN del registro RCSTA o reiniciar el sistema EUSART al poner a cero al bit SPEN del registro RCSTA.

RECEPCIÓN DE DATOS DE 9 BITS

Aparte de recibir los datos de forma estándar de 8 bits, el sistema EUSART soporta la recepción de datos de 9 bits. En el lado del transmisor, el noveno bit “se adjunta” al byte ori-ginal directamente antes del bit de parada. En el lado del receptor, al poner a uno el bit  RX9 del registro RCSTA, el noveno bit de datos será automáticamente escrito en el bit RX9D del mismo registro. Después de almacenar este byte, es necesario tener cuidado en como leer estos bits - primero se debe leer el bit RX9D y luego los ocho (8) bits menos significativos del registro RCREG. De otra forma, el noveno bit será puesto a cero antes de ser leído.

Recepción de datos de 9 bits

DETECCIÓN DE DIRECCIÓN

Cuando el bit ADDEN del registro RCSTA está a uno, el modulo EUSART es capaz de recibir sólo los datos de 9 bits, mientras que se ignoran todos los datos de 8 bits. Aunque  parece una restricción, este modo habilita la comunicación serial entre varios microcontroladores. El principio de funcionamiento es muy simple. El dispositivo maestro envía un dato de 9 bits que representa la dirección de un microcontrolador esclavo. No obstante, todos deben tener el bit ADDEN puesto a uno, ya que de esta manera se habilita la detección de dirección. Todos los microcontroladores esclavos que comparten la misma línea de transmisión, reciben este dato (dirección)  y verifican automáticamente si coincide con su propia dirección. El software, en el que ocurre la coincidencia de dirección, debe deshabilitar la detección de dirección, poniendo a cero el bit ADDEN.

Detección de dirección

El dispositivo maestro sigue enviando los datos de 8 bits al microcontrolador. Todos los datos que pasan por la línea de transmisión serán recibidos sólo por el módulo EUSART direccionado. Una vez recibido el último byte, el microcontrolador esclavo debe poner a uno el bit ADDEN para habilitar de nuevo la detección de dirección.

Enviar los datos

Registro TXSTA

Registro TXSTA

CSRC - Clock Source Select bit - (bit de selección de la fuente de reloj) determina la fuente del reloj. Se utiliza sólo en modo sincrónico.

  • 1 - Modo Maestro. Reloj generado internamente por el generador de tasa de baudios.
  • 0 - Modo Esclavo. Reloj proveniente de una fuente externa.

TX9 - 9-bit Transmit Enable bit  (bit de habilitación del modo de 9 bits en transmisión)

  • 1 - Se habilita el modo de 9 bits en transmisión por el sistema EUSART.
  • 0 - Se habilita el modo de 8 bits en transmisión por el sistema EUSART.

TXEN - Transmit Enable bit (Bit de habilitación de transmisión)

  • 1 - Transmisión habilitada.
  • 0 - Transmisión deshabilitada.

SYNC - EUSART Mode Select bit  (Bit de selección del modo EUSART)

  • 1 - El EUSART funciona en modo síncrono
  • 0 - El EUSART funciona en modo asíncrono.

SENDB - Send Break Character bit (Bit de envío de carácter Break en modo asíncrono) se utiliza sólo en modo asíncrono y cuando se requiere obedecer el estándar de bus LIN.

  • 1 - Se enviará un carácter Break en la próxima transmisión (se pone a 0 por hardware cuando finaliza el envío)
  • 0 - Envío del carácter de transmisión Break completado.

BRGH - High Baud Rate Select bit (bit de selección de modo de alta velocidad en modo asíncrono). Determina la velocidad de transmisión en modo síncrono. No afecta al EUSART en modo síncrono.

  • 1 - EUSART funciona a alta velocidad.
  • 0 - EUSART funciona a baja velocidad.

TRMT - Transmit Shift Register Status bit (bit de estado de registro de desplazamiento de transmisión)

  • 1 - Registro TSR está vacío.
  • 0 - Registro TSR está lleno.

TX9D - Ninth bit of Transmit Data  (Valor del noveno bit en transmisión) Puede ser utilizado como dirección o bit de paridad o para distinguir entre dirección o dato en los buses maestro-esclavo).

Transmisión asíncrona

Registro RCSTA

Registro RCSTA

SPEN - Serial Port Enable bit (bit de habilitación del puerto serie)

  • 1 - Puerto serie habilitado. Los pines RX/DT y TX/CK se configuran automáticamente como entrada y salida, respectivamente.
  • 0 - Puerto serie deshabilitado.

RX9 - 9-bit Receive Enable bit (bit de habilitación del modo de 9 bits en recepción):

  • 1 - Se habilita la recepción de datos de 9 bits por medio del sistema EUSART.
  • 0 - Se habilita la recepción de datos de 8 bits por medio del sistema EUSART.

SREN - Single ReceiveEnable bit  (bit de habilitación de la recepción simple). Es utilizado msólo en modo sincrónico y en funcionamiento como Maestro.

  • 1 - Recepción simple habilitada.
  • 0 - Recepción simple deshabilitada.

CREN - Continuous Receive Enable bit (bit de habilitación de la recepción continua) actúa dependiendo del modo EUSART

Modo asíncrono:

  • 1 - Recepción habilitada.
  • 0 - Recepción deshabilitada.

Modo síncrono:

  • 1 - Se habilita la recepción continua hasta que el bit CREN esté a cero.
  • 0 - No se habilita la recepción en forma continua.

ADDEN - Address Detect Enable bit (bit de habilitación de la detección de dirección) se utiliza sólo en modo de detectar la dirección.

  • 1 - Habilita la detección de dirección (sólo se procesa un byte recibido en el registro de desplazamiento de recepción si el noveno bit está a uno)
  • 0 - Detección de dirección deshabilitada (todos los bytes recibidos en el registro de desplazamiento de recepción son procesados independientemente del valor del noveno bit recibido). El noveno bit se utiliza como bit de paridad.

FERR - Framing Error bit  (bit de error de encuadre)

  • 1 - Se ha producido un error de encuadre en recepción.
  • 0 - No se ha producido un error de encuadre.

OERR - Overrun Error bit (bit de error de sobrescritura).

  • 1 - Se ha producido un error de sobrescritura en recepción.
  • 0 - No se ha producido un error de sobrescritura.

RX9D - Ninth bit of Received Data (valor del noveno bit recibido) puede ser utilizado como bit de dirección o de paridad.

El siguiente diagrama muestra tres palabras que aparecen en la entrada RX. El búfer de recepción de datos será leído después de la tercera palabra, lo que causa poner a uno el bit OEER (bit de error de sobrescritura).

Recepción asíncrona

GENEREADOR DE BAUDIOS DEL EUSART (BRG)

Si mira atentamente al diagrama del receptor o transmisor EUSART asíncrono, verá que los ambos utilizan señal de reloj del temporizador local BRG para la sincronización. La misma fuente de reloj se utiliza también en modo síncrono.

El temporizador BRG consiste en dos registros de 8 bits haciendo un registro de 16 bits.

Registros del generador de baudios del EUSART (BRG)

El valor de un número escrito en estos dos registros determinará la velocidad de transmisión en baudios. Adicionalmente, el bit BRGH del registro TXSTA y el bit BRGH16 del registro BAUDCTL, afectan la frecuencia de reloj utilizada para el cálculo de los baudios. Las tablas en las siguientes páginas contienen los valores que deben estar escritos en el registro de 16 bits SPBRG y asignados a los bits SYNC, BRGH y BRGH16 para obtener  algunos valores de la velocidad de transmisión en baudios estándar.

La fórmula para hacer el cálculo de la velocidad de transmisión en baudios: 

Formula utilizada para hacer el cálculo de la velocidad de transmisión en baudios

Ejemplo

Para un dispositivo en modo asíncrono con una frecuencia de reloj de 16MHz y velocidad de transimisión de datos en baudios de 9600, el Generados de baudios (BRG) se calcula de la siguiente manera:

Formulas used to determine the Baud Rate

Table 01
Tabla 02
Tabla 03
Tabla 04
Tabla 05
Tabla 06
Tabla 07
Tabla 08

Registro BAUDCTL

Registro BAUDCTL

ABDOVF - Auto-Baud Detect Overflow bit (bit de desbordamiento de auto-detección de la velocidad de transmisión) se utiliza sólo en modo asíncrono durante la detección de la velocidad de transmisión.

  • 1 -Se ha producido desbordamiento durante la auto-detección.
  • 0 -No se ha producido desbordamiento durante la auto-detección.

RCIDL - Receive Idle Flag bit (bit de estado de la operación de recepción) se utiliza sólo en modo asíncrono.

  • 1 - Receptor en estado inactivo. No hay operación de recepción en marcha.
  • 0 - Se ha recibido el bit de arranque (START) y hay una operación de recepción en marcha.

SCKP - Synchronous Clock Polarity Select bit (bit de selección de polaridad de la señal de reloj en modo síncrono). El estado lógico de este bit difiere dependiendo de cuál modo de EUSART está activo

Modo asíncrono:

  • 1 - El dato invertido se transmite al pin RC6/TX/CK.
  • 0 - El dato no invertido se transmite al pin RC6/TX/CK.

Modo síncrono:

  • 1 - Sincronización en el flanco ascendente de la señal de reloj.
  • 0 - Sincronización en el flanco descendente de la señal de reloj.

BRG16 16-bit Baud Rate Generator bit - (bit de habilitación del generador de velocidad de transmisión de 16 bits) determina si el registro SPBRGH se utilizará, o sea si el temporizador BGRG tendrá 8 o 16 bits.

  • 1 - Se utiliza el generador de velocidad de transmisión de 16 bits.
  • 0 - Se utiliza el generador de velocidad de transmisión de 8 bits.

WUE Wake-up Enable bit (bit de habilitación del modo de auto-activación en modo asíncrono):

  • 1 - Modo de auto-activación habilitado. El receptor espera a que el flanco descendente aparezca en el pin RC7/RX/DT para que el microcontrolador se despierte del modo de reposo
  • 0 - Modo de auto-activación habilitado. El receptor funciona normalmente.

ABDEN - Auto-Baud Detect Enable bit (bit de habilitación de auto-detección de velocidad de transmisión) se utiliza sólo en modo asíncrono.

  • 1 - Modo de auto-detección habilitado. Al detectar la velocidad de transmisión, el bit se pone a uno automáticamente. 
  • 0 - Modo de auto-detección deshabilitado.

Vamos a hacerlo en mikroBasic...

'En este ejemplo, el módulo EUSART interno se inicializa y se ajusta para enviar el
'mensaje inmediatamente después de recibirlo. La velocidad de transmisión en baudios
'se ajusta a 9600 bps. El programa utiliza las siguientes rutinas de librería UART: 
'UART1_init(), UART1_Write_Text(), UART1_Data_Ready(), UART1_Write() y UART1_Read().

dim uart_rd as byte
main:
ANSEL,ANSELH = 0 ' Todos los pines AN se configuran como digitales
CM1CON0.C1ON = 0 ' Deshabilitar los comparadores
CM2CON0.C2ON = 0
UART1_Init(9600) ' Inicializar el módulo UART a 9600 bps
Delay_ms(100) ' Esperar a que señal de reloj del módulo UART se ponga estable
UART1_Write_Text("Start")
while 1 ' Bucle infinito
if (UART1_Data_Ready() ' Si el dato se ha recibido,
uart_rd = UART1_Read() ' léalo,
end if
UART1_Write(uart_rd) ' y envíelo atrás por el UART
wend
...

En breve

Transmisión serial asíncrona a través de los registros del módulo EUSART

  1. La velocidad de transmisión deseada deberá estar ajustada a través de los bits  BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
  2. El bit SYNC  (del registro TXSTA) deberá estar puesto a cero  y el bit SPEN (del registro RCSTA) deberá estar puesto a uno (1) a fin de habilitar el puerto serie.
  3. Para una transmisión de datos de 9 bits, el bit TX9 (del registro TXSTA) deberá estar puesto a uno (1)
  4. La transmisión de datos es habilitada poniendo a uno el bit TXEN del registro TXSTA. El bit TXIF del registro PIR1 está automáticamente puesto a uno.
  5. Para que el bit TXEN cause una interrupción, tanto el bit TXIE del registro PIE1 como los bits GIE, PEIE  del  registro INTCON deberán estar puestos a uno.
  6. En una transmisión de datos de 9 bits, el valor del noveno bit deberá estar escrito en el bit TX9D del registro TXSTA.
  7. La transmisión comienza cuando se escribe el dato de 8 bits sobre el registro de recepción TXREG.

Recepción serial asíncrona a través de los registros del módulo EUSART:

  1. La velocidad de transmisión deseada deberá estar ajustada a través de los bits BRGH (del registro TXSTA) y  BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
  2. El bit SYNC  (del registro TXSTA) deberá estar puesto a cero  y el bit SPEN (del registro RCSTA) deberá estar puesto a uno a fin de habilitar el puerto serie.
  3. Tanto el bit RCIE del registro PIE1 como los bits GIE y PEIE del registro INTCON deberán estar puestos a uno si se necesita habilitar que la recepción de dato cause una interrupción.
  4. Para una recepción de datos de 9 bits, el bit RX9 (del registro RCSTA) deberá estar puesto a uno.
  5. La recepción de datos es habilitada poniendo a uno el bit CREN del registro RCSTA.
  6. El registro RCSTA deberá leerse para obtener información acerca de la ocurrencia de errores durante la recepción. Para una recepción de datos de 9 bits, El valor del noveno bit será almacenado en este registro.
  7. El dato de 8 bits recibido será almacenado en el registro RCREG y deberá leerse para obtener dicho dato.

Ajustar el modo de detección de dirección:

  1. La velocidad de transmisión deseada deberá estar ajustada a través de los bits BRGH (del registro TXSTA) y BRG16 (del registro BAUDCTL) y de los registros SPBRGH y SPBRG.
  2. El bit SYNC  (del registro TXSTA) deberá estar puesto a cero  y el bit SPEN (del registro RCSTA) deberá estar puesto a uno (1) a fin de habilitar el puerto serie.
  3. Tanto el bit RCIE del registro PIE1 como los bits GIE y PEIE del registro INTCON deberán estar puestos a uno si se necesita habilitar que la recepción de dato cause una interrupción.
  4. El bit RX9 del registro RCSTA debe estar a uno.
  5. El bit ADDEN del registro RCSTA debe estar a uno, lo que habilita que un dato sea reconocido como dirección.
  6. La recepción de datos es habilitada poniendo a uno el bit CREN del registro RCSTA.
  7. Tan pronto como se reciba un dato de 9 bits, el bit RCIF del registro PIR1 estará automáticamente puesto a uno. Si está habilitada se produce una interrupción.
  8. El registro RCSTA deberá leerse para obtener información acerca de la ocurrencia de errores durante la transmisión. El noveno bit RX9D siempre estará a uno.
  9. El dato de 8 bits recibido será almacenado en el registro RCREG y deberá leerse. Se deberá comprobar si la combinación de estos bits coincide con la dirección predefinida. Si coincide, es necesario poner a cero el bit ADDEN del registro RCSTA, lo que habilita la recepción de datos de 8 bits.

MÓDULO PUERTO SERIE SÍNCRONO MAESTRO (MSSP) 

El MSSP  (Puerto serie síncrono maestro - Master Synchronous Serial Port) es un módulo muy útil, y a la vez uno de los circuitos más complejos dentro del microcontrolador. Este módulo permite la comunicación de alta velocidad entre un microcontrolador y otros pe-riféricos u otros microcontroladores al utilizar varias líneas de E/S (como máximo dos o tres líneas). Por eso, se utiliza con frecuencia para conectar el microcontrolador a los visualizadores LCD, los convertidores A/D, las memorias EEPROM seriales, los registros de desplazamiento etc. La característica principal de este tipo de comunicación es que es síncrona y adecuada para ser utilizada en sistemas con un sólo maestro y uno o más esclavos. Un dispositivo maestro contiene un circuito para generación de baudios y además, suministra señales de reloj a todos los dispositivos del sistema. Los dispositivos esclavos no disponen de un circuito interno para generación de señales de reloj. El módulo MSSP puede funcionar en uno de dos modos:

  • modo SPI (Interfaz periférica serial - Serial Peripheral Interface); y
  • modo I2C (Circuito inter-integrado - Inter-Integrated Circuit).

Como se muestra en la siguiente figura, un módulo MSSP representa sólo una mitad de un hardware necesario para establecer una comunicación serial, mientras que la otra mitad se almacena en el dispositivo con el que  intercambia los datos. Aunque los módulos en ambas puntas de línea son los mismos, sus modos de funcionamiento difieren esencialmente dependiendo de si el módulo funciona como Maestro o como Esclavo:

Si el microcontrolador a ser programado controla otro dispositivo o circuito (periféricos), deberá funcionar como un dispositivo maestro. Este módulo generará señal de reloj cuando sea necesario, o sea sólo cuando se requiera recibir y transmitir los datos por software. Por consiguiente, el establecimiento de conexión depende únicamente del dispositivo maestro.

Módulo MSSP

De lo contrario, si el microcontrolador a ser programado está integrado en un dispositivo más complejo (por ejemplo en una PC), deberá funcionar como un  dispositivo esclavo. Como tal, un esclavo siempre tiene que esperar a que un dispositivo  maestro envíe la solicitud de transmisión de datos.

MODO SPI

El modo SPI permite la transmisión y recepción simultánea de datos de 8 bits al utilizar tres líneas de entrada/salida:

  • SDO - Serial Data Out (salida de datos serie )- línea de transmisión;
  • SDI - Serial Data In (entrada de datos serie) - línea de recepción; y
  • SCK - Serial Clock (reloj de comunicación) - línea de sincronización.

Adicionalmente, hay una cuarta línea (SS) que se puede utilizar si el microcontrolador intercambia los datos con varios dispositivos periféricos. Refiérase a la siguiente figura.

SS - Slave Select (Selección de esclavo) - Es una línea adicional utilizada para la selección de un dispositivo específico. Esta línea está activa sólo si el microcontrolador funciona como esclavo, o sea cuando el dispositivo externo - maestro requiere intercambiar los datos.
Al funcionar en modo SPI, el módulo MSSP utiliza 4 registros en total:

  • SSPSTAT - registro de estado
  • SSPCON - registro de control
  • SSPBUF - búfer serie de transmisión/recepción
  • SSPSR - registro de desplazamiento (no es accesible directamente)

Los primeros tres registros son de lectura/escritura y se pueden modificar en cualquier momento, mientras que el cuarto, como no es accesible, se utiliza para convertir datos en formato serial.

Modo SPI

Como se muestra en la siguiente figura, la parte central del módulo SPI consiste de dos re-gistros conectados a los pines para recepción, transmisión y sincronización.

Comunicación SPI

El registro de desplazamiento (SSPRS) está directamente conectado a los pines del microcontrolador y es utilizado para transmisión de datos en formato serie. El registro SSPRS dispone de la entrada y salida para desplazar los datos hacia dentro y hacia fuera del dispositivo. En otras palabras, cada bit que aparece en la entrada (línea de recepción) desplaza simultáneamente otro bit hacia la salida (línea de transmisión).

El registro SSPBUF (Búfer) es una parte de memoria utilizada para almacenar temporalmente los datos antes de que se envíen, o sea inmediatamente después de que se reciban. Después de que todos los 8 bits hayan sido recibidos, el byte se mueve del registro SSPRS al registro SSPBUF. Este proceso de crear un doble búfer para recibir los datos permite iniciar la recepción del próximo byte antes de leer los datos que se acaban de recibir. Durante la transmisión/recepción de datos se ignora un intento de escribir un dato en el registro SSBUF. Desde el punto de vista de un programador, este registro se considera el más importante por haber sido accedido con más frecuencia.

Concretamente, si dejamos aparte el ajuste del modo de funcionamiento, la transmisión de datos por el módulo SPI no es nada más que escritura y lectura de datos de este registro, mientras que  las demás “acrobacias” como mover los registros, se llevan a cabo automáticamente por el hardware.

Vamos a hacerlo en mikroBasic...

' En este ejemplo, el microcontrolador PIC (maestro) envía un byte de datos a un chip periférico 
' (esclavo) por el módulo SPI. El programa utiliza las funciones de librería SPI SPI1_init() y
' SPI1_Write.
dim Chip_Select as sbit at PORTC.RC0 ' Línea periférica chip_select está conectada al pin RC0
dim Chip_Select_Direction as sbit at TRISC.0 ' Bit TRISC0 define el pin RC0 como entrada o salida
dim value as unsigned int ' Dato a ser enviado es de tipo unsigned int
main:
ANSEL, ANSELH = 0 ' Todos los pines de E/S son digitales
TRISB.0 = 1
TRISB.1 = 1 ' Configurar los pines RB0 y RB1 como entradas
Chip_Select = 0 ' Seleccionar el chip periférico
Chip_Select_Direction = 0 ' Configurar el pin CS# como salida
SPI1_Init() ' Inicializar el módulo SPI
SPI1_Write(value) ' Envíar el valor al chip periférico
...

En breve

Comunicación serial síncrona SPI

Antes de inicializar el módulo SPI, es necesario especificar varias opciones:

  • Modo maestro TRISC.3=0 (pin SCK es salida de señal de reloj);
  • Modo de esclavo TRISC.3=1 (pin SCK es entrada de señal de reloj);
  • Fase de datos de entrada - la mitad o el final del tiempo de salida  (bit SMP del registro SSPSTAT);
  • Flanco de reloj (bit CKE del registro SSPSTAT);
  • Velocidad de transmisión en baudios, los bits SSPM3-SSPM0 del registro SSPCON (sólo en modo Maestro);
  • Selección de modo esclavo, bits SSPM3-SSPM0 del registro SSPCON (sólo en modoEsclavo).

El módulo se pone en marcha al poner a uno el bit SSPEN:

Paso 1.

Paso 1    
Los datos a ser transmitidos deberán ser escritos en el registro del búfer SSPBUF. Si el módulo SPI  funciona en modo maestro, el microcontrolador ejecutará automáticamente la secuencia de los siguientes pasos 2,3 y 4. Si el módulo SPI funciona en modo esclavo, el microcontrolador no ejecutará la secuencia de los si-guientes pasos hasta que el pin SCK detecte señal de reloj.

Paso 2.

Paso 2
El dato se mueve al registro SSPSR y el contenido del registro SSPBUF no se borra.

Paso 3.
Paso 3

El dato se desplaza hacia el pin de salida (primero se desplaza el bit más significativo - MSB), mientras que a la vez el registro se carga con los bits por el pin de entrada. En modo maestro el microcontrolador en si mismo genera señal de reloj, mientras que el modo esclavo utiliza señal de reloj externa (pin SCK).

Paso 4.

Paso 4    
El registro SSPSR está lleno después de que hayan sido recibidos 8 bits de datos, lo que se indica al poner a uno el bit BF del registro SSPSTAT y el bit SSPIF del registro PIR1. Los datos recibidos (un byte) son automáticamente movidos del registro SSPSR al registro SSPBUF. Como la transmisión de datos serial se realiza automáticamente, el resto de programa se ejecuta normalmente mientras que la transmisión de datos está en progreso. En este caso, la función del bit SSPIF es de generar una interrupción al acabar la transmisión de un byte.

Paso 5.

Paso 5
Por último, el dato almacenado en el registro SSPBUF está listo para su uso y debe moverse al registro deseado.

MODO I2C

El modo I2C (Bus de circuito inter-integrado) es adecuado para ser utilizado cuando el microcontrolador debe intercambiar los datos con un circuito integrado dentro de un mismo dispositivo. Éstos son con frecuencia otros microcontroladores, o los circuitos integrados especializados y baratos que pertenecen a la nueva generación de así llamados “periféricos inteligentes” (memorias, sensores de temperatura, relojes de tiempo real etc.)
Similar a la comunicación serie en modo SPI, la transmisión de datos en modo I2C es síncrona y bidireccional. Esta vez sólo dos pines se utilizan para transmisión de datos. Éstos son los pines de SDA (Datos seriales) y SCL (Reloj serial). El usuario debe configurar estos pines como entradas o salidas por los bits TRISC.  
Al observar las reglas particulares (protocolos), este modo habilita conectar simultáneamente de una manera simple hasta 112 diferentes componentes al utilizar sólo dos valiosos pines de E/S. Vamos a ver cómo funciona el sistema: 
El reloj, necesario para sincronizar el funcionamiento de ambos dispositivos, siempre es generado por un dispositivo maestro (un microcontrolador) y su frecuencia directamente afecta a la velocidad de transmisión de datos. Aunque hay un protocolo que permite como máximo una frecuencia de reloj de 3,4 MHz (así llamado bus I2C de alta velocidad), este libro cubre sólo el protocolo utilizado con más frecuencia, con una frecuencia de reloj limitada a 100 KHz. La frecuencia mínima no está limitada.
Cuando los componentes maestro y esclavo están sincronizados por el reloj, el maestro siempre inicia cada intercambio de datos. Una vez que el módulo MSSP se ha habilitado, espera que ocurra una condición de arranque (Start condition). El dispositivo maestro primero envía el bit de arranque (está a cero) por el pin SDA, luego la dirección de 7 bits del dispositivo esclavo seleccionado, y por último, el bit que requiere al dispositivo escribir (0) o leer (1) el dato enviado. En otras palabras, los ocho bits se desplazan al registro SSPSR después de ocurrir una condición de arranque. Todos los dispositivos esclavos que comparten la misma línea de transmisión recibirán simultáneamente el primer byte, pero sólo el que contiene la dirección coincidente recibirá el dato entero.

Configuración de maestro y esclavo

Una vez que el primer byte se ha enviado (sólo se transmiten datos de 8 bits), el maestro se pone en modo de recepción y espera el reconocimiento del dispositivo receptor acerca de la dirección coincidente. Si el dispositivo esclavo envía un bit de reconocimiento (1) la transmisión de datos continuará hasta que el dispositivo maestro (microcontrolador) envíe el bit de parada (Stop).

Transmisión de datos

Esto es una explicación simple de cómo se comunican dos componentes. Este microcontrolador es capaz de controlar las situaciones más complicadas cuando están conectados 1024 diferentes componentes (dirección de 10 bits), compartidos por varios dispositivos maestros diferentes. Por supuesto, estos dispositivos se utilizan pocas veces en la práctica por lo que no es necesario hablar de ellos detalladamente.

La siguiente figura muestra el diagrama de bloques del módulo MSSP en modo I2C.

Diagrama de bloques del módulo MSSP en modo I2C.

En una operación I2C con el módulo MSSP intervienen seis registros. Algunos de ellos se muestran en la Figura anterior.

  • SSPCON
  • SSPCON2
  • SSPSTAT
  • SSPBUF
  • SSPSR
  • SSPADD

Registro SSPSTAT

Registro SSPSTAT

SMP Sample bit  (Bit de muestra)

Modo maestro SPI -Este bit determina fase de datos de entrada.

  • 1 - Estado lógico se lee al final del tiempo de salida.
  • 0 - Estado lógico se lee en la mitad del tiempo de salida.

Modo esclavo SPI - Este bit debe ser borrado cuando SPI se emplea en modo esclavo.

Modo I²C (maestro o esclavo)

  • 1 - Deshabilita control de variaciones para velocidad estándar (100kHz).
  • 0 - Habilita control de variaciones para velocidad alta (400k Hz).

CKE - Clock Edge Select bit  (bit de selección del flanco de reloj) selecciona el modo de sincronización.

CKP = 0:

  • 1 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1).
  • 0 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0).

CKP = 1:

  • 1 - Dato transmitido en flanco descendente de pulso de reloj (1 - 0).
  • 0 - Dato transmitido en flanco ascendente de pulso de reloj (0 - 1).

D/A - Data/Address bit (bit de direcciones/datos) se utiliza sólo en modo I2C

  • 1 - Indica que el último byte recibido o transmitido es un dato.
  • 0 - Indica que el último byte recibido o transmitido es una dirección.

P - Stop bit (bit de parada) se utiliza sólo en modo I²C.

  • 1 - Bit de parada (STOP) se ha detectado.
  • 0 - Bit de parada (STOP) no se ha detectado.

S - Start bit se utiliza sólo en modo I²C.

  • 1 - Bit de arranque (START) se ha detectado.
  • 0 - Bit de arranque (START) no se ha detectado.

R/W - Read Write bit (bit de información Lectura/Escritura) se utiliza sólo en modo I2C. Este bit contiene la información del bit de L/E después de la última dirección coincidente. Este bit es válido sólo desde la dirección coincidente hasta el siguiente bit de arranque, bit de parada o bit no ACK.

Modo I2C en modo esclavo

  • 1 - Lectura de dato.
  • 0 - Escritura de dato.

Modo I²C en modo maestro

  • 1 - Transmisión en progreso.
  • 0 - Transmisión no está en progreso.

UA - Update Address bit (bit de activación de dirección) se utiliza sólo en modo I2C de 10 bits.

  • 1 - Indica que es necesario actualizar la dirección en el registro SSPADD.
  • 0 - Indica que la dirección es correcta y que no se necesita actualizarla.

BF Buffer Full Status bit (bit de estado de búfer lleno)

Durante la recepción de dato (en modos SPI e I2C)

  • 1 - Recepción completa. El registro SSPBUF está lleno.
  • 0 - Recepción no completa. El registro SSPBUF está vacío.

Durante la transmisión de dato (sólo en modo I2C)

  • 1 - Transmisión de dato en progreso (no incluye el bit ACK y bits de parada).
  • 0 - Transmisión de dato completa (no incluye el bit ACK y bits de parada).

Registro SSPCON

Registro SSPCON

WCOL Write Collision Detect bit (bit detector de colisión)

  • 1 - Colisión detectada. En el registro SSPBUF se ha escrito cuando no se han cumplido las condiciones para iniciar una transmisión
  • 0 - No hay colisión.

SSPOV Receive Overflow Indicator bit (bit detector de desbordamiento en recepción)

  • 1 - Se recibe un nuevo byte antes de leer el dato anteriormente recibido. Como no hay  espacio para recibir datos nuevos, uno de estos dos bytes debe ser borrado. En este caso, los datos almacenados en el registro SSPSR se pierden irremediablemente.
  • 0 - Dato serial es recibido correctamente.

SSPEN - Synchronous Serial Port Enable bit (bit de habilitación del módulo SSP - puerto serie síncrono) determina la función de los pines del microcontrolador e inicializa el módulo MSSP:

En modo SPI

  • 1 - Enables MSSP module and configures pins SCK, SDO, SDI and SS as serial port pins.
  • 0 - Disables MSSP module and configures these pins as I/O port pins.

En modo I²C

  • 1 - Habilita el módulo MSSP y configura los pines SDA y SCL como una fuente de pines del puerto serie.
  • 0 - Deshabilita el módulo MSSP  y configura estos pines como pines del puerto de E/S.

CKP - Clock Polarity Select bit (bit de selección de polaridad de reloj) no se utiliza en modo I2C maestro.

En modo SPI

  • 1 - Para una señal de reloj, el estado inactivo es un nivel alto.
  • 0 - Para una señal de reloj, el estado inactivo es un nivel bajo.

En modo I2C esclavo

  • 1 - Señal de reloj habilitada.
  • 0 - Mantiene la salida de señal de reloj en estado bajo. Se utiliza para proporcionar más tiempo para estabilización de datos.

SSPM3-SSPM0 - Synchronous Serial Port Mode Select bits.(bit de selección del modo del SSP (puerto serie síncrono). El modo SSP se determina al combinar los siguientes bits:

SSPM3 SSPM2 SSPM1 SSPM0 Modo
0 0 0 0 Modo maestro del SPI, reloj = Fosc/4
0 0 0 1 Modo maestro del SPI, reloj = Fosc/16
0 0 1 0 Modo maestro del SPI, reloj = Fosc/64
0 0 1 1 Modo maestro del SPI, reloj = (output TMR)/2
0 1 0 0 Modo esclavo del SPI, habilitado el pin de control SS
0 1 0 1 Modo esclavo del SPI, deshabilitado el pin de control SS, SS se puede utilizar como pin de E/S
0 1 1 0 Modo esclavo I²C, dirección de 7 bits utilizada
0 1 1 1 Modo esclavo I²C, dirección de 10 bits utilizada
1 0 0 0 Modo mastro I²C, reloj = Fosc / [4(SSPAD+1)]
1 0 0 1 Máscara utilizada en modo esclavo I²C

0 1 0 No utilizado
1 0 1 1 Modo maestro I²C controlado
1 1 0 0 No utilizado
1 1 0 1 No utilizado
1 1 1 0 Modo esclavo I²C, dirección de 7 bits utilizada, los bits de arranque (START) y de parada (STOP) habilitan interrupción
1 1 1 1 Modo esclavo I²C, dirección de 10 bits utilizada, los bits de arranque (START) y de parada (STOP) habilitan interrupción

Registro SSPCON2

Registro SSPCON2

GCEN - General Call Enable bit (bit de habilitación general)

Sólo en modo esclavo I2C

  • 1 - Habilita interrupción cuando una dirección de llamada general es recibida en el SSPST (0000h).
  • 0 - Deshabilita dirección de llamada general.

ACKSTAT - Acknowledge Status bit (bit de estado de reconocimiento)

Sólo en modo de transmisión maestro I2C

  • 1 - Reconocimiento del esclavo no recibido.
  • 0 - Reconocimiento del esclavo recibido.

ACKDT - Acknowledge data bit (bit de recepción)

Sólo en modo de recepción maestro I²C

  • 1 - No reconocimiento
  • 0 - Reconocimiento

ACKEN - Acknowledge Sequence Enable bit (bit de habilitación de secuencia de reconocimiento)

En modo de recepción maestro I²C

  • 1 - Indica una secuencia de reconocimiento en los pines SDA y SCL y transmite el bit ACKDT. Automáticamente borrado por hardware.
  • 0 - Secuencia de reconocimiento en reposo.

RCEN - Receive Enable bit (bit de habilitación de recepción)

Sólo en modo maestro I²C

  • 1 - Habilita recepción en modo I2C.
  • 0 - Recepción deshabilitada.

PEN - STOP condition Enable bit (bit de habilitación de condición de Parada)

Sólo en modo maestro I²C

  • 1 - Indica una condición de Parada en los pines SDA y SCL. Luego, este bit es automáticamente borrado por hardware.
  • 0 - Condición de Parada en reposo.

RSEN - Repeated START Condition Enabled bit (bit de habilitación de repetir condición de Arranque)

Sólo en modo maestro I²C

  • 1 - Indica repetición de condición de Arranque en los pines SDA y SCL. Luego, este bit es automáticamente borrado por hardware
  • 0 - Condición de repetición de Arranque en reposo.

SEN - START Condition Enabled/Stretch Enabled bit (bit de habilitación de condición de Arranque)

Sólo en modo maestro I²C

  • 1 - Indica condición de Arranque en los pines SDA y SCL. Luego, este bit es automáticamente borrado por hardware.       
  • 0 - Condición de Arranque en reposo.

I2C En Modo Maestro

El caso más común es que un microcontrolador funciona como maestro y un periférico como esclavo. Es la razón por la que este libro sólo trata este modo. Se da por entendido que la dirección consiste en 7 bits y el dispositivo contiene un solo microcontrolador (dispositivo con maestro único).
Para habilitar el módulo MSSP en este modo, siga las siguientes instrucciones:

 I²C en modo maestro

Ajuste la velocidad de transmisión (registro SSPADD), desactive el control de velocidad de rotación (al poner a uno el bit SMP del registro SSPSTAT) y seleccione el modo maestro (registro SSPCON). Después de finalizar todos los ajustes y habilitar el módulo (registro SSPCON: bit SSPEN), es necesario  esperar a que los circuitos de control internos indiquen con una señal que todo esté preparado para transmisión de datos: o sea, que el bit SSPIF del registro PIR1 se haya puesto a uno.

Después de poner este bit a cero por software, el microcontrolador está listo para intercambiar los datos con los periféricos.

TRANSMISIÓN DE DATOS EN MODO MAESTRO I2C

La transmisión de datos en el pin SDA se inicia con un cero lógico (0) que aparece al poner a uno el bit SPEN del registro  SSPCON2. Sin embargo, aunque está habilitado, el microcontrolador tiene que esperar cierto tiempo antes de iniciar la comunicación. Se le denomina “Condición de Inicio” durante la que se realizan las preparaciones y verificaciones internas. Si se cumplen con todas la condiciones, el bit  SSPIF del registro PIR1 se pone a uno y la transmisión de datos se inicia en cuanto se cargue el registro SSPBUF.

Transmisión de datos en modo maestro I²C

Como máximo 112 circuitos integrados (dispositivos esclavos) pueden compartir simultáneamente la misma línea de transmisión. El primer byte de datos enviado por el dispositivo maestro contiene la dirección que coincide con una sola dirección del dispositivo esclavo. Todas las direcciones se enumeran en las hojas de datos respectivas. El octavo bit del primer byte de datos especifica la dirección de transmisión de datos, o sea si el microcontrolador va a enviar o recibir los datos. En este caso, como se trata de transmisión de datos, el octavo bit se pone a cero (0).

Transmisión de datos en modo maestro I²C

Cuando ocurre la coincidencia de dire-cciones, el microcontrolador tiene que esperar a que el dispositivo esclavo envíe el bit de reconocimiento, o sea que se ponga a cero el bit ASKSTAT del registro SSPCON2. Una vez que la coincidencia de dire-cciones ha ocurrido apropiadamente, todos los bytes de datos se transmiten de la misma manera.

La transmisión de datos termina al poner  a uno el bit SEN del registro SSPCON2. Ocurre la condición de parada (STOP), lo que habilita que el pin SDA reciba una secuencia de pulsos:

Inicio - Dirección - Reconocimiento - Dato -  Reconocimiento .... Dato - Reconocimiento - Parada!

Recepción de datos en modo maestro I2C

Las preparaciones para recibir los datos son similares a las de transmitir los datos, con excepción de que el último bit del primer byte enviado (el que contiene la dirección) se ponga a uno lógico (1). Eso especifica que el dispositivo maestro espera recibir los datos del dispositivo esclavo direccionado. Con respecto al microcontrolador, ocurre lo siguiente:

Después de hacer las pruebas internas y poner a uno el bit de arranque (START), el dispositivo esclavo envía byte por byte. Estos bytes se almacenan en el registro serial SSPSR. Después de recibir el último - octavo bit, cada dato se carga en el registro  SSPBUF del que se puede leer. Al leer este registro, se envía automáticamente el bit de reconocimiento, lo que significa que el dispositivo maestro está listo para recibir los nuevos datos.

Al igual que en el caso de la transmisión, la recepción de datos termina al poner a uno el bit de parada (STOP):

Recepción de datos en modo maestro I²C

Inicio - Dirección - Reconocimiento - Dato -  Reconocimiento .... Dato - Reconocimiento - ¡Parada!

En esta secuencia de pulsos, el bit de reconocimiento se envía al dispositivo esclavo.

GENERADOR DE BAUDIOS

Para sincronizar la transmisión de datos, todos los eventos que ocurren en el pin SDA deben estar sincronizados con la señal de reloj generada en el dispositivo maestro. Esta señal de reloj se genera por un simple oscilador cuya frecuencia depende de la frecuencia del oscilador principal del microcontrolador, del valor que se introduce al registro SSPADD y así como del modo SPI actual.
La frecuencia de señal de reloj del modo descrito en este libro depende del cristal de cuarzo seleccionado y del registro SPADD. La fórmula utilizada para hacer el cálculo de frecuencia de reloj es:

Generador de baudios

Vamos a hacerlo en mikroBasic...

' En este ejemplo, el microcontrolador PIC está conectado a la memoria EEPROM 24C02 por los 
' pines SCL y SDA. El programa envía un byte de dato a la dirección 2 de la EEPROM. Entonces,
' el programa lee este dato por el modo I2C de la EEPROM y lo envía al puerto PORTB para
' comprobar si el dato se ha escrito con éxito. El byte para direccionar la EEPROM está
' compuesto por 7 bits de la dirección (1010001) y el bit que determina lectura o escritura del
' dato (LSB - bit menos significativo).

main:
ANSEL = ANSELH = PORTB = TRISB = 0 ' Todos los pines son digitales. Los pines del
              ' puerto PORTB son salidas.
I2C1_Init(100000) ' Inicializar I2C con reloj deseado
I2C1_Start() ' Señal de inicio de I2C
I2C1_Wr(0xA2) ' Enviar byte por I2C (dirección de dispositivo + W)
I2C1_Wr(2) ' Enviar byte (dirección de la localidad EEPROM)
I2C1_Wr(0xF0) ' Enviar los datos a escribir
I2C1_Stop() ' Señal de parada de I2C
Delay_100ms()
I2C1_Start() ' Señal de inicio de I2C
I2C1_Wr(0xA2) ' Enviar byte por I2C (dirección de dispositivo + W)
I2C1_Wr(2) ' Enviar byte (dirección de dato)
I2C1_Repeated_Start() ' Se vuelve a generar el inicio de señal I2C
I2C1_Wr(0xA3) ' Enviar byte (dirección de dispositivo + R)
PORTB = I2C1_Rd(0u) ' Leer el dato (reconocimiento NO)
I2C1_Stop() ' Señal de parada de I2C

NOTAS ÚTILES ...

Cuando el microcontrolador se comunica con un periférico, puede ocurrir un fallo en la transmisión de datos por alguna razón. En este caso, es recomendable comprobar el estado de algunos bits que pueden aclarar el problema. En la práctica, el estado de estos bits se comprueba al ejecutar una pequeña subrutina después de transmisión y recepción de cada byte (por si acaso).

WCOL (SPCON,7) - Si intenta escribir un dato nuevo al registro SSPBUF mientras que  otra transmisión/recepción de datos está en progreso, el bit WCOL se pone a uno y el contenido del registro SSBUF se queda sin cambios. No hay escritura. Luego, el bit WCOL debe ser borrado por el software.

BF (SSPSTAT,0) -Al transmitir los datos, este bit se pone a uno durante la escritura en el registro SSPBUF y se queda puesto a uno hasta que el byte en formato serial se desplace del registro SSPRS. En modo de recepción, este bit se pone a uno al cargar un dato o una dirección al registro SSPBUF. Se pone a cero después de leer el registro SSPBUF.

Unidad ULPWU

SSPOV (SSPCON,6) - En modo de recepción, este bit se pone a uno al recibir un nuevo byte en el registro SSPSR por medio de la comunicación serial, todavía  sin haber leído el dato anteriormente recibido del registro SSPBUF.

Pines SDA y SCL -  Cuando el módulo SSP está habilitado, estos pines se vuelven a las salidas de Drenaje Abierto. Esto significa que deben estar conectados a resistencias conectados a la otra punta al polo positivo de la fuente de alimen- tación.

En breve

Recibir/Transmitir los datos en el modo I2C

Para establecer la comunicación serial en modo I2C, se debe realizar lo siguiente:

Ajustar el módulo y enviar la dirección:

  • Introducir en el registro SSPADD el valor para definir la velocidad de transmisión en baudios.
  • Poner a uno el bit SMP del registro SSPSTAT  para desactivar el control de la velocidad de rotación.
  • Introducir el valor binario 1000 a los bits SSPM3-SSPM0 del registro SSPCON1 para seleccionar el modo Maestro.
  • Poner a uno el bit SEN del registro SSPCON2 (secuencia de Inicio - START).
  • El bit SSPIF se pone a uno automáticamente en final de la secuencia de Inicio cuando el módulo está listo para funcionar. Se deberá poner a cero.
  • Introducir la dirección de esclavo al registro SSPBUF.
  • Cuando se envía un byte, el bit SSPIF (interrupción) se pone a uno automáticamente después de haber recibido el bit de reconocimiento del dispositivo esclavo.

Transmitir los datos:

  • Introducir en el registro SSPBUF los datos a enviar.
  • Cuando se envía un byte, el bit SSPIF (interrupción) se pone a uno automáticamente después de haber recibido el bit de reconocimiento del dispositivo esclavo. 
  • La condición de Parada (STOP) se debe iniciar al poner a uno el bit PEN del registro SSPCON para informar al dispositivo Esclavo que la transmisión de datos se acabó.

 Recibir los datos:

  • Poner a uno el bit RSEN  del registro SSPCON2 para habilitar la recepción.
  • El bit SSPIF indica con su estado lógico la recepción de datos. Después de leer los datos del registro SSPBUF, el bit ACKEN del registro SSPCON2 debe ponerse a uno para habilitar el envío del bit de reconocimiento.
  • La condición de Parada (STOP) se debe iniciar al poner a uno el bit PEN del registro SSPCON  para informar al dispositivo Esclavo que la transmisión se acabó.

3.9 MÓDULOS ANALÓGICOS

Aparte de disponer de un gran número de líneas digitales de E/S utilizadas para la comunicación con los periféricos, el PIC16F887 contiene 14 entradas analógicas. Debido a éstas, el microcontrolador no sólo puede reconocer si un pin es llevado a bajo o alto (0 o +5V), sino que puede medir con precisión el voltaje y convertirlo en un valor numérico, o sea, en formato digital.  

El convertidor A/D es uno de los módulos analógicos más importantes dentro del microcontrolodar. Dispone de las siguientes características:

  • La conversión se lleva al cabo aplicando el método de aproximación sucesiva;
  • Dispone de 14 entradas analógicas separadas que se conectan a los pines del puerto del microcontrolador;
  • El convertidor A/D convierte una señal de entrada analógica en un número binario de 10 bits;
  • La resolución mínima o calidad de conversión se puede ajustar a diferentes necesidades al seleccionar voltajes de referencia Vref- y Vref+.
Gráfico de la conversión A/D

CONVERTIDOR A/D

Aunque a primera vista parece muy complicado utilizar un convertidor A/D, en realidad es muy simple. De hecho resulta más simple utilizar un convertidor A/D que los temporizadores o módulos de comunicación serie.

Convertidor A/D

El funcionamiento del convertidor A/D está bajo el control de los bits de cuatro registros:

  • ADRESH  Registro alto del resultado de la conversión A/D;
  • ADRESL  Registro bajo del resultado de la conversión A/D;
  • ADCON0 Registro de control 0; y
  • ADCON1 Registro de control 1.

Registros ADRESH y ADRESL

El resultado obtenido después de convertir un valor analógico en digital es un número de 10 bits que se almacenará en los registros ADRESH y ADRESL. Hay dos maneras de manejarlo: justificación a la izquierda y a la derecha que simplifica en gran medida su uso. El formato del resultado de la conversión depende del bit ADFM del registro ADCON1. En caso de que no se utilice el convertidor A/D, estos registros se pueden utilizar como registros de propósito general.

Registros ADRESH y ADRESL

REQUERIMIENTOS DE ADQUISICIÓN A/D

Para que el convertidor A/D alcance su exactitud especificada, es necesario proporcionar un cierto tiempo muerto entre seleccionar una entrada analógica específica y la medición  misma. Este tiempo se le denomina “tiempo de adquisición” y generalmente depende de la impedancia de la fuente. Se utiliza una ecuación para hacer cálculo de tiempo de adquisición con precisión, cuyo valor mínimo es de 20uS aproximadamente. Por consiguiente, para realizar una conversión con precisión, no se olvide este detalle.

RELOJ PARA LA CONVERSIÓN A/D

El tiempo necesario para realizar una conversión A/D cuyo resultado es 1 bit se define en unidades de TAD. Se requiere que sea como mínimo 1,6 uS. Para realizar una conversión completa de 10 bits se requiere un poco más tiempo de lo esperado, son 11 TAD. Como la frecuencia de reloj así como la fuente de conversión A/D son determinadas por software, es necesario seleccionar una de las combinaciones de los bits disponibles ADCS1 y ADCS0 antes de empezar a medir voltaje en una de las entradas analógicas. Estos bits se almacenan en el registro ADCON0.

Fuente de reloj de ADC
ADCS1 ADCS0 Frecuencia de dispositivo (Fosc)
20 Mhz 8 Mhz 4 Mhz 1 Mhz
Fosc/2 0 0 100 nS 250 nS 500 nS 2 uS
Fosc/8 0 1 400 nS 1 uS 2 uS 8 uS
Fosc/32 1 0 1.6 uS 4 uS 8 uS 32 uS
Frc 1 1 2 - 6 uS 2 - 6 uS 2 - 6 uS 2 - 6 uS

Cualquier cambio de la frecuencia de reloj del microcontrolador afectará a la frecuencia de reloj de la conversión A/D, lo que puede perjudicar al resultado de la conversión A/D. En la siguiente tabla se muestran las frecuencias de reloj posibles del dispositivo y cómo afectan a la velocidad de la conversión A/D. Los valores en las celdas sombreadas están fuera del rango recomendado.

Ciclos TAD de la conversión A/D

¿CÓMO UTILIZAR EL CONVERTIDOR A/D?

Para llevar a cabo una conversión A/D sin problemas así como para evitar los resultados inesperados, es necesario considerar lo siguiente:

  • El convertidor A/D no hace diferencia entre señales digitales y analógicas.Para evitar errores en medición o dañar el chip, los pines se deben configurar como entradas analógicas antes de que empiece el proceso de conversión. Los bits utiliza dos para este propósito se almacenan en los registros TRIS y ANSEL (ANSELH);
  • Al leer el estado de puerto con las entradas analógicas marcadas como CH0-CH13, el estado de los bits correspondientes, o sea, su valor digital se leerá como cero lógico (0); y
  • Hablando en términos generales, la medición de voltaje en el convertidor está basado en comparar voltaje de entrada con una escala interna que tiene 1024 grados (210 =1024). El grado más bajo de esta escala representa el voltaje Vref-, mientras que el grado más alto se refiere al voltaje Vref+. La siguiente figura  muestra los voltajes de referencia seleccionables así como sus valoresmáximos y mínimos.
Cómo utilizar el convertidor A/D

Registros ADCON0

Registro ADCON0

ADCS1, ADCS0 - A/D Conversion Clock Select bits (bits de selección de reloj de conversión A/D) selecciona la frecuencia de reloj utilizada para sincronización interna del convertidor A/D. Asimismo afecta a la duración de la conversión.

ADCS1 ADCS2 Reloj
0 0 Fosc/2
0 1 Fosc/8
1 0 Fosc/32
1 1 RC *

* Señal de reloj se genera por el oscilador interno RC que está integrado en el convertidor. 

CHS3-CHS0 - Analog Channel Select bits (bits de selección de canal analógico) selecciona un pin o un canal analógico para la conversión A/D, o sea para medir el voltaje:

CHS3 CHS2 CHS1 CHS0 Canal Pin
0 0 0 0 0 RA0/AN0
0 0 0 1 1 RA1/AN1
0 0 1 0 2 RA2/AN2
0 0 1 1 3 RA3/AN3
0 1 0 0 4 RA5/AN4
0 1 0 1 5 RE0/AN5
0 1 1 0 6 RE1/AN6
0 1 1 1 7 RE2/AN7
1 0 0 0 8 RB2/AN8
1 0 0 1 9 RB3/AN9
1 0 1 0 10 RB1/AN10
1 0 1 1 11 RB4/AN11
1 1 0 0 12 RB0/AN12
1 1 0 1 13 RB5/AN13
1 1 1 0 CVref
1 1 1 1 Vref = 0.6V

GO/DONE - A/D Conversion Status bit (bit de estado de la conversión A/D) determina el estado actual de de la conversión:

  • 1 - La conversión A/D está en progreso
  • 0 - La conversión A/D ha finalizado. El bit se pone a cero automáticamente por hardware cuando la conversión A/D finaliza.

ADON - A/D On bit (bit de encendido A/D) habilita el convertidor A/D.

  • 1 - Convertidor A/D está habilitado.
  • 0 - Convertidor A/D está deshabilitado.

Vamos a hacerlo en mikroBasic...

' Este código es un ejemplo de leer el valor analógico del canal 2 y de visualizarlo
' en los puertos PORTB y PORTC como número binario de 10 bits.

dim adc_rd as word
main:
ANSEL = 0x04 ' Configurar AN2 como pin analógico
TRISA = 0xFF ' PORTA se configura como entrada
ANSELH = 0 ' Configurar los demás pines AN como E/S digitales
TRISC = 0x3F ' Pines RC7 y RC6 se configuran como salidas
TRISB = 0 ' PORTB se configura como salida

while 1
temp_res = ADC_Read(2) ' Obtener el resultado de 10 bits de la conversión AD
PORTB = temp_res ' Enviar los 8 bits más bajos al PORTB
PORTC = temp_res >> 2 ' Enviar los 2 bits más significativos a los RC7 y RC6
wend ' Quedarse en el bucle
end.

Registro ADCON1

Registro ADCON1

ADFM - A/D Result Format Select bit (bit de selección del formato del resultado de la conversión A/D)

  • 1 - Resultado de conversión está justificado a la derecha. No se utilizan los seis bits más significativos del registro ADRESH
  • 0 - Resultado de conversión está justificado a la izquierda. No se utilizan los seis bits menos significativos del registro ADRESL.

VCFG1 - Voltage Reference bit (bit de configuración de voltaje de referencia) selecciona la fuente de voltaje de referencia bajo que se necesita para el funcionamiento del convertidor A/D.

  • 1 - Voltaje de referencia bajo se aplica al pin Vref-
  • 0 - Voltaje de alimentación Vss se utiliza como una fuente de voltaje de referencia bajo.

VCFG0 - Voltage Reference bit (bit de configuración de voltaje de referencia) selecciona la fuente de voltaje de referencia alto que se necesita  para el fucionamiento del convertidor A/D.

  • 1 - Voltaje de referencia alto se aplica al pin Vref+
  • 0 - Voltaje de alimentación Vdd se utiliza como una fuente de voltaje de referenia alto.

En breve

Utilizar el convertidor A/D

Para medir el voltaje en un pin de entrada por medio del convertidor A/D, se debe   realizar lo siguiente:

Paso 1 - Configuración del puerto:

  • Escribir un uno lógico (1) a un bit del registro TRIS, lo que resulta en configurar el pin apropiado como una entrada.
  • Escribir un uno lógico (1) a un bit del registro ANSEL, lo que resulta en configurar el pin apropiado como una entrada analógica.

Paso 2 - Configuración del módulo de la conversión A/D:

  • Configurar voltaje de referencia en el registro ADCON1.
  • Seleccionar una señal de reloj de la conversión A/D en el registro ADCON0.
  • Seleccionar uno de los canales de entrada CH0-CH13 del registro ADCON0.
  • Seleccionar el formato de dato por medio de ADFM del registro ADCON1.
  • Habilitar el convertidor A/D al poner a uno el bit ADON del registro ADCON0.

Paso 3 - Configuración de la interrupción (opcionalmente):

  • Poner a cero el bit ADIF.
  • Poner a uno los bits ADIE, PEIE y GIE .

Paso 4 -Tiempo de espera para que transcurra el tiempo de adquisición (aproximadamente 20uS).

Paso 5 - Inicio de la conversión poniendo a uno el bit GO/DONE del registro ADCON0.

Paso 6 - Esperar a que la conversión A/D finalice.

  • Es necesario comprobar en el bucle de programa si el bit GO/DONE está a cero o esperar que se produzca una interrupción (deberá estar anteriormente habilitada).

Paso 7 - Lectura del resultado de la conversión A/D:

  • Leer los registros ADRESH  y ADRESL.

COMPARADOR ANALÓGICO

Aparte del convertidor A/D, hay otro módulo, que hasta hace poco ha sido incorpodo sólo en los circuitos integrados que pertenecen a los llamados “componentes analógicos”. Debido al hecho de que casi no hay ningún dispositivo automático complejo que en cierto modo no utilice estos circuitos, dos comparadores de alta calidad, junto con los componentes adicionales están integrados en el microcontrolador y conectados a sus pines.
¿Cómo funciona un comparador? Básicamente, el comparador analógico es un amplificador que compara la magnitud de voltajes en dos entradas. Dispone de dos entradas y una salida. Dependiendo de cuál voltaje de entrada es más alto (valor analógico), un cero lógico (0) o un uno lógico (1) (valores digitales) será la salida:

Comparador analógico
  • Cuando el voltaje analógico en Vin-  es más alto que el voltaje análogo en Vin+, la salida del comparador estará a un nivel digital bajo.
  • Cuando el voltaje analógico en Vin+ es más alto que el voltaje análogo en Vin-, la salida del comparador estará a un nivel digital alto.

El microcontrolador PIC16F887 dispone de dos de estos comparadores de voltaje cuyas entradas están conectadas a los pines de E/S RA0-RA3, mientras que las salidas están conectadas a los pines RA4 y RA5. Además, hay una fuente de voltaje de referencia interna en el chip mismo, la que vamos a discutir más tarde.

Estos dos circuitos están bajo el control de los bits almacenados en los siguientes registros:

  • CM1CON0 está en control del comparador C1;
  • CM2CON0 está en control del comparador C2;
  • CM2CON1 está en control del comparador C2;

FUENTE INTERNA DE VOLTAJE DE REFERENCIA

Uno de dos voltajes analógicos proporcionados en las entradas del comparador es por lo general estable e inalterable. Es denominado ‘voltaje de referencia’(Vref). Para generarlo, se pueden utilizar tanto una fuente de voltaje externa como una fuente de voltaje interna. El voltaje de referencia Vref  se deriva después de seleccionar una fuente, por medio de  las dos puntas de una red en escalera que consiste en 16 resistencias, formando un divisor de voltaje. El bit VRSS del registro VRCON se utiliza para seleccionar la fuente de voltaje de referencia.

El módulo de voltaje de referencia del comparador proporciona un voltaje de referencia generado internamente para los comparadores (CVref). El voltaje de referencia CVref dispone de dos gamas con 16 diferentes niveles de voltaje cada una. La selección de gama es controlada por el bit VRR del registro VRCON. El voltaje de referencia seleccionado CVref puede ser la salida al pin RA2/AN2 si el bit VROE se pone a uno. Además, los bits VR0-VR3 se utilizan para seleccionar los niveles de voltaje apropiados. Veamos la siguiente figura:

VREF

Aunque la idea principal con el módulo de voltaje de referencia era de proporcionar un voltaje de referencia variable a los módulos analógicos, ahora se utiliza como un convertidor A/D. Este convertidor se ha probado muy útil en algunas aplicaciones. Su funcionamiento está bajo el control del registro VRCON.

COMPARADORES E INTERRUPCIÓN 

Siempre que haya un cambio del estado lógico en la salida de un comparador, el bit de bandera CMIF del registro PIR se pone a uno. Ese cambio también causará una interrupción si los siguientes bits se ponen a uno:

  • El bit CMIE del registro PIE = 1;
  • El bit PEIE del registro INTCON  = 1; y
  • El bit GIE del registro INTCON = 1.

Si una interrupción está habilitada, un cambio en la salida de un comparador cuando el microcontrolador está en modo de reposo puede causar que el microcontrolador salga de reposo y vuelva a funcionar en modo normal.

FUNCIONAMIENTO EN MODO DE REPOSO (SLEEP MODE) 

Si está habilitado antes de entrar en modo de reposo, el comparador se queda activo durante el modo de reposo. Si el comparador no se utiliza para “despertar” el dispositivo, el consumo de corriente se puede reducir en modo de reposo al apagar el comparador. Esto se lleva a cabo al poner a cero el bit CxON del registro CMxCON0.
Para que el comparador “despierte” al microcontrolador del modo de reposo, el bit CxIE del registro IE2 y el bit PEIE del registro INTCON deberán ponerse a uno. La primera instrucción que se ejecutará después de que el microcontrolador salga del modo de reposo será la que sigue a la instrucción Sleep. Si el bit GIE del registro INTCON se pone a uno, el microcontrolador ejecutará la rutina de servicio de interrupción.

Registro CM1CON0

Registro CM1CON0

Los bits de este registro están en control del comparador C1. Eso afecta  principalmente a la configuración de las entradas. Para explicarlo con más claridad, vea la siguiente figura en la que se muestran sólo los componentes directamente afectados por los bits de este registro.

Bit de habilitación del comparador C1

C1ON - Comparator C1 Enable bit (bit de habilitación del comparador C1) habilita al comparador C1.

  • 1 - Comparador C1 está habilitado.
  • 0 - Comparador C1 está deshabilitado.

C1OUT - Comparator C1 Output bit (bit de salida del comparador C1) es la salida del comparador C1.

Si C1POL = 1 (salida del comparador está invertida)

  • 1 - Voltaje de entrada C1Vin+ es más bajo que el voltaje de entrada C1Vin-.
  • 0 - Voltaje de entrada C1Vin+ es más alto que el voltaje de entrada C1Vin-.

Si C1POL = 0 (salida del comparador no está invertida)

  • 1 - Voltaje de entrada C1Vin+ es más alto que el voltaje de entrada C1Vin-.
  • 0 - Voltaje de entrada C1Vin+ es más bajo que el voltaje de entrada C1Vin-.

C1OE Comparator C1 Output Enable bit (bit de habilitación de salida del comparador C1)

  • 1 - Salida del comparador C1OUT está conectada al pin C1OUT*.
  • 0 - Salida del comparador se utiliza internamente.

* Para habilitar que el bit  C1OUT aparezca en el pin, se deben cumplir dos condiciones:  C1ON = 1 (el comparador debe estar activado) y el pin correspondiente se debe configurar como salida (bit TRIS  = 0).

C1POL - Comparator C1 Output Polarity Select bit (bit de selección de polaridad de salida del comparador C1) habilita la inversión del estado de la salida del comparador C1.

  • 1 - Salida del comparador C1 está invertida.
  • 0 - Salida del comparador C1 no está invertida.

C1R - Comparator C1 Reference Select bit (bit de selección de la fuente de voltaje de referencia del comparador C1)

  • 1 - Entrada no invertida C1Vin+ está conectada a la fuente de voltaje de referencia C1Vref.
  • 0 - Entrada no invertida C1Vin+ está conectada al pin C1IN+.

C1CH1, C1CH0 - Comparator C1 Channel Select bit (bit de selección de canal del comparador C1)

C1CH1 C1CH0 Entrada C1Vin del comparador
0 0 Entrada C1Vin- está conectada al pin C12IN0-
0 1 Entrada C1Vin- está conectada al pin C12IN1-
1 0 Entrada C1Vin- está conectada al pin C12IN2-
1 1 Entrada C1Vin- está conectada al pin C12IN3-

Registro CM2CON0

Registro CM2CON0

Los bits de este registro están en control del comparador C1. Eso afecta principalmente  a la configuración de las entradas. Para explicarlo con más claridad, vea la siguiente figura en la que se muestran sólo los componentes directamente afectados por los bits de este registro.

Comparador C2

C2ON - Comparator C2 Enable bit  (bit de habilitación del comparador C2) habilita el comparador C2.

  • 1 - Comparador C2 está habilitado.
  • 0 - Comparador C2 está deshabilitado.

C2OUT - Comparator C2 Output bit (bit de salida del comparador C2) es la salida del comparador C2.

Si C2POL = 1 (salida del comparador está invertida)

  • 1 - Voltaje de entrada C2Vin+ es más bajo que el voltaje de entrada C2Vin-.
  • 0 - Voltaje de entrada C2Vin+ es más alto que el voltaje de entrada C2Vin-.

Si C2POL = 0 (salida del comparador no está invertida)

  • 1 - Voltaje de entrada C2Vin+ es más alto que el voltaje de entrada C2Vin-.
  • 0 - Voltaje de entrada C2Vin+ es más bajo que el voltaje de entrada C2Vin-.

C2OE - Comparator C2Output Enable bit (bit de habilitación de salida del comparador C2)

  • 1 - Salida del comparador C2OUT está conectada al pin C2OUT*.
  • 0 - Salida del comparador se utiliza internamente.

* Para habilitar que el bit  C2OUT aparezca en el pin, se deben cumplir dos condiciones:  C2ON = 1 (el comparador debe estar activado) y el pin correspondiente se debe configurar como salida (bit TRIS  = 0)

C2POL - Comparator C2 Output Polarity Select bit (bit de selección de polaridad de salida del comparador C2) habilita la inversión del estado de la salida del comparador C2.

  • 1 - Salida del comparador C2 está invertida.
  • 0 - Salida del comparador C2 no está invertida.

C2R - Comparator C2 Reference Select bit (bit de selección de la fuente de voltaje de referencia del comparador C2)

  • 1 - Entrada no invertida C2Vin+ está conectada a la fuente de voltaje de referencia C2Vref.
  • 0 - Entrada no invertida C2Vin+ está conectada al pin C2IN+.

C2CH1, C2CH0 Comparator C2 Channel Select bit (bit de selección de canal del comparador C2)

C2CH1 C2CH0 Entrada C2Vin del comparador
0 0 Entrada C2Vin- está conectada al pin C12IN0-
0 1 Entrada C2Vin- está conectada al pin C12IN1-
1 0 Entrada C2Vin- está conectada al pin C12IN2-
1 1 Entrada C2Vin- está conectada al pin C12IN3-

Registro CM2CON1

Registro CM2CON1

Mirror Copy of the C1OUT bit es una copia del bit C1OUT

Mirror Copy of the C2OUT bit es una copia del bit C2OUT

C1RSEL Comparator C1 Reference Select bit (bit de selección de la fuente de voltaje de referencia del comparador C1)

  • 1 - Voltaje seleccionable CVref se utiliza en la fuente de voltaje de referencia C1Vref.
  • 0 - Voltaje de referencia fijo de 0,6V se utiliza en  la fuente de voltaje de referencia C1Vref.

C2RSEL - Comparator C2 Reference Select bit (bit de selección de la fuente de voltaje de referencia del comparador C2)

  • 1 - Voltaje seleccionable CVref se utiliza en la fuente de voltaje de referencia C2Vref.
  • 0 - Voltaje de referencia fijo de 0,6V se utiliza en  la fuente de voltaje de referencia C2Vref.

T1GSS - Timer1 Gate Source Select bit (bit de selección de la fuente de la compuerta del temporizador Timer1)

  • 1 - Compuerta del temporizador Timer1 utiliza señal del pin T1G.
  • 0 - Compuerta del temporizador Timer1 utiliza señal  SYNCC2OUT.

C2SYNC - Comparator C2 Output Synchronization bit (bit de sincronización de salida del comparador C2)

  • 1 - Salida del comparador C2 está sincronizada con un flanco ascendente de señal de reloj del temporizador Timer1
  • 0 - Salida del comparador es una señal asíncrona.

Registro VRCON

Registro VRCON

VREN Comparator C1 Voltage Reference Enable bit (bit de habilitación de la fuente de voltaje de referencia del comparador C1)

  • 1 - Fuente de voltaje de referencia CVref está encendido.
  • 0 - Fuente de voltaje de referencia CVref está apagado.

VROE Comparator C2 Voltage Reference Enable bit (bit de habilitación de la fuente de voltaje de referencia del comparador C2)

  • 1 - Fuente de voltaje de referencia CVref está conectada al pin.
  • 0 - Fuente de voltaje de referencia CVref no está conectada al pin.

VRR - CVref Range Selection bit (bit de selección de gama de voltaje de referencia Vref)

  • 1 - Fuente de voltaje de referencia se ajusta a producir baja gama de voltaje.
  • 0 - Fuente de voltaje de referencia se ajusta a producir alta gama de voltaje.

VRSS - Comparator Vref Range selection bit (bit de selección de gama de voltaje de referencia Vref del comparador)

  • 1 - Voltaje de referencia está en la gama de Vref+ a Vref-.
  • 0 - Voltaje de referencia está en la gama de Vdd a Vss. (voltaje de alimentación).

VR3 - VR0 CVref Value Selection (selección de valor de voltaje de referencia)

Si VRR = 1 (gama baja)

El voltaje de referencia se calcula por medio de la fórmula: CVref = ([VR3:VR0]/24)Vdd.

Si VRR = 0 (gama alta)

El voltaje de referencia se calcula por medio de la fórmula CVref = Vdd/4 + ([VR3:VR0]/32)Vdd.

En breve

Pasos a seguir para utilizar apropiadamente los comparadores integrados:

Paso 1 - Configuración del módulo:

  • Para seleccionar el modo apropiado, se deben configurar los estados de los bits de los registros CM1CON0 y CM2CON0. La interrupción debe estar deshabilitada durante el cambio de modo. 

Paso 2 - Configurar la fuente de voltaje de referencia Vref interna (sólo si se utiliza). En el registro VRCON es necesario realizar lo siguiente:

  • Seleccionar una de dos gamas de voltaje por medio del bit VRR.
  • Configurar el voltaje de referencia Vref necesario por medio de los bits VR3 -VR0.
  • Poner a uno el bit VROE si es necesario.
  • Habilitar la fuente de voltaje de referencia Vref al poner a uno el bit VREN.

Fórmula utilizada para calcular el voltaje de referencia:

VRR = 1 (gama baja)
CVref = ([VR3:VR0]/24)VLADDER

VRR = 0 (gama alta)
CVref = (VLADDER/4) + ([VR3:VR0]VLADDER/32)

Vladder = Vdd or ([Vref+] - [Vref-]) or Vref+

Paso 3 - Inicio del funcionamiento:

  • Habilitar una interrupción al poner a uno los bits CMIE (registro PIE), PEIE y GIE (registro INTCON ).
  • Leer los bits C1OUT y C2OUT del registro CMCON.
  • Leer la bandera de bit CMIF del registro PIR. Después de haber sido puesto a uno, este bit se pone a cero por software.

3.10 OSCILADOR DE RELOJ

Para sincronizar todos los procesos que se llevan a cabo dentro del microcontrolador, se debe utilizar una señal de reloj, mientras que para generar una señal de reloj, se debe utilizar un oscilador. Así de simple. El microcontrolador dispone de varios osciladores capaces de funcionar en modos diferentes. Y aquí es donde viene lo interesante...

Como se muestra en la siguiente figura, la señal de reloj se genera por uno de los dos osciladores integrados.

Dos osciladore integrados

Un oscilador externo está incorporado dentro del microcontrolador y conectado a los pines OSC1 y OSC2. Es denominado ‘externo’ porque está conectado a los componentes externos tales como: cristal de cuarzo, resonador cerámico o circuito resistor - capacitor. El modo de funcionamiento del oscilador se selecciona  por los bits de la Palabra de Configuración, cargados en el microcontrolador durante la programación.

El oscilador interno consiste en dos osciladores internos separados: 

El HFINTOSC es un oscilador interno de alta frecuencia calibrado a 8MHz. El microcontrolador puede utilizar una señal de reloj generada a esta frecuencia o después de haber sido dividida en el pre-escalador.

El LFINTOSC es un oscilador interno de baja frecuencia calibrado a 31 kHz. Sus pulsos de reloj se utilizan para funcionamiento de los temporizadores de encendido y perro guardián, asimismo puede utilizarse como fuente de señal de reloj para el funcionamiento de todo el microcontrolador.

El bit System Clock Select (bit de selección del reloj del sistema - SCS) del registro OSCCON determina si una fuente de señal de reloj del microcontrolador será interna o externa.

Registro OSCCON

El registro OSCCON se utiliza para seleccionar y gobernar el oscilador de reloj y la frecuancia de reloj. Contiene los siguientes bits: bits de selección de frecuencia (IRCF2, IRCF1, IRCF0), bits de estado de frecuencia (HTS, LTS), bits de control de reloj del sistema (OSTA, SCS).

Registro OSCCON

IRCF2-0 - Internal Oscillator Frequency Select bits. (bits de selección de frecuencia del oscilador interno). El valor del divisor de frecuencias depende de la combinación de estos tres bits. La frecuencia de reloj del oscilador interno se determina de la misma manera.

IRCF2 IRCF1 IRCF0 Frecuencia OSC.
1 1 1 8 MHz HFINTOSC
1 1 0 4 MHz HFINTOSC
1 0 1 2 MHz HFINTOSC
1 0 0 1 MHz HFINTOSC
0 1 1 500 kHz HFINTOSC
0 1 0 250 kHz HFINTOSC
0 0 1 125 kHz HFINTOSC
0 0 0 31 kHz LFINTOSC

OSTS - Oscillator Start-up Time-out Status bit (bit de estado del temporizador de encendido) indica cuál fuente de reloj está actualmente en uso. Es un bit de sólo lectura.

  • 1 - Se utiliza el oscilador de reloj externo.
  • 0 - Se utiliza uno de los osciladores de reloj interno (HFINTOSC o LFINTOSC).

HTS - HFINTOSC Status bit (8 MHz - 125 kHz) (bit de estado del HFINTOSC) indica si el oscilador interno de alta frecuencia funciona en modo estable.

  • 1 - HFINTOSC está estable.
  • 0 - HFINTOSC no está estable.

LTS - LFINTOSC Stable bit (31 kHz) (bit de estado del LFINTOSC) indica si el oscilador de baja frecuencia funciona en modo estable.

  • 1 - LFINTOSC está estable.
  • 0 - LFINTOSC no está estable.

SCS - System Clock Select bit (bit de selección del reloj del sistema) determina cuál oscilador se utilizará como una fuente de reloj.

  • 1 - Oscilador interno se utiliza como reloj del sistema.
  • 0 - Oscilador externo se utiliza como reloj del sistema.                                                                                                                                                                                                                                                                                                                                   El modo del oscilador se configura por medio de los bits, denominados Palabra de Configuración,  que se escribe en  la memoria del microcontrolador durante el proceso de la programación.

MODOS DE RELOJ EXTERNO

El oscilador externo se puede configurar para funcionar en uno de varios modos, lo que habilita que funcione a diferentes velocidades y utilice diferentes componentes para estabilizar la frecuencia. El modo de funcionamiento se selecciona durante el proceso de escribir un programa en el microcontrolador. Antes que nada, es necesario activar el programa en una PC que se utilizará para programar el microcontrolador. En este caso, es el programa PICflash. Pulse sobre la casilla del oscilador y seleccione uno de la lista desplegable. Las informaciones sobre esta configuración se gurdan automáticamente en la Palabra de Configuración.
Durante el proceso de la programación del microcontrolador, los bits de la Palabra de Configuración se escriben en la memoria ROM del microcontrolador y se almacenan en los registros especiales no disponibles al usuario. A base de estos bits, el microcontrolador “sabe” qué hacer, aunque eso no se indica explícitamente en el programa.

Programa PICflash

Modo de funcionamiento se sele-cciona después de escribir y compilar un programa.

OSCILADOR EXTERNO EN MODO EC

El oscliador de reloj externo en el modo EC (external clock) utiliza un oscilador externo independiente como una fuente de señal de reloj. La máxima frecuencia de señal de reloj está limitada a 20 MHz.

Oscilador externo

Las ventajas del funcionamiento del oscilador externo en modo EC son las siguientes:

  • La fuente de reloj externa independiente está conectada al pin de entrada OSC1. El pin OSC2 está disponible como pin de E/S de propósito general;
  • Es posible sincronizar el funcionamiento del microcontrolador con los demás componentes incorporados en el dispositivo;
  • En este modo el microcontrolador se pone a funcionar inmediatamente después de encenderlo. No se requiere esperar para estabilizar la frecuencia.
  • Al deshabilitar temporalmente la fuente de reloj externa, se detiene el funcionamiento del dispositivo, dejando todos los datos intactos. Después de reiniciar el reloj externo, el dispositivo sigue funcionando como si no hubiera pasado nada.
Oscilador externo en modo EC

OSCILADOR EXTERNO EN MODO LP, XT o HS

Dos tipos de los osciladores externos

El oscilador en los modos LP, XT y HS utilizan un oscilador externo dentro del microcontrolador como una fuente de reloj. La  frecuencia  de reloj está determinada por un cristal de cuarzo o por resonadores cerámicos conectados a los pines OSC1 y OSC2. Dependiendo de las características de los componentes utilizados, seleccione uno de los siguientes modos:

  • Modo LP - (Baja potencia) se utiliza sólo para cristal de cuarzo de baja frecuencia. Este modo está destinado para trabajar con cristales de 32.768 KHz normalmente embebidos en los relojes de cristal. Es fácil de reconocerlos por sus dimensiones pequeñas y una forma cilíndrica. Al utilizar este modo el consumo de corriente será menor que en los demás modos.
  • Modo XT  se utiliza para cristales de cuarzo de frecuencias intermedias hasta 8 MHz. El consumo de corriente es media en comparación con los demás modos.
  • Modo HS - (Alta velocidad) se utiliza para cristales de reloj de frecuencia más alta de 8 MHz. Al utilizar este modo el consumo de corriente será mayor que en los demás modos.
Esquema del oscilador externo y de los componentes externos adicionales

Resonadores cerámicos en modo XT o HS

Los resonadores cerámicos son similares a los cristales de cuarzo según sus características, por lo que se conectan de la misma manera. A diferencia de los cristales de cuarzo, son más baratos y los osciladores que hacen uso de ellos son de calidad más baja. Se utilizan para las frecuencias de reloj entre 100 kHz y 20 MHz.

Resonador cerámico

OSCILADOR EXTERNO EN MODOS RC Y RCIO

El uso de los componentes para estabilizar la frecuencia sin duda alguna tiene muchas ventajas, pero a veces realmente no es necesario. En la mayoría de casos el oscilador puede funcionar a frecuencias que no son precisamente definidas, así que sería una pérdida de dinero embeber tales componentes. La solución más simple y más barata es estas situaciones es utilizar una resistencia y un capacitor para el funcionamiento del oscilador. Hay dos modos:

Modo RC

Modo RC. Cuando el oscilador externo se configura a funcionar en modo RC, el pin OSC1 debe estar conectado al circuito RC como se muestra en la figura a la derecha. La señal de frecuencia del oscilador RC dividida por 4 está disponible en el pin OSC2. Esta señal se puede utilizar para la calibración, sincronización o para otros propósitos.

Modo RCIO

Modo RCIO. De manera similar, el circuito RC está conectado al pin OSC1. Esta vez, el pin OSC2 está disponible para ser utilizado como pin de E/S de propósito general.

En ambos casos se le recomienda utilizar los componentes como se muestra en la figura.

La frecuencia de este oscilador se calcula por medio de la fórmula f = 1/T según la que:

  • f = frecuencia [Hz];
  • T = R*C = constante de tiempo [s];
  • R = resistencia eléctrica [W]; y
  • C = capacitancia del condensador [F].

MODOS DE RELOJ INTERNO 

El circuito del oscilador interno consiste en dos osciladores separados que se pueden sele-ccionar como la fuente del reloj del microcontrolador: 

El oscilador HFINTOSC está calibrado de fábrica y funciona a 8Mhz. La frecuencia de este oscilador se puede configurar por el usuario por medio de software utilizando los bits del registro OSCTUNE.
 
El oscilador LFINTOSC no está calibrado de fábrica y funciona a 31kHz.

Similar al oscilador externo, el interno también puede funcionar en varios modos. El modo de funcionamiento se selecciona de la misma manera que en el oscilador externo - por medio de los bits que forman Palabra de configuración. En otras palabras, todo se lleva a cabo dentro del software antes de escribir un programa en el microcontrolador.

OSCILADOR INTERNO EN MODO INTOSC

OSCILADOR INTERNO EN MODO INTOSC
En este modo, el pin OSC1 está disponible para ser utilizado como pin de E/S de propósito general. La señal de frecuencia del oscilador interno dividida por 4 está disponible en el pin OSC2.

OSCILADOR INTERNO EN MODO INTOSCIO

OSCILADOR INTERNO EN MODO INTOSCIO
En este modo, los dos pines están disponibles como pines de E/S de propósito general.

CONFIGURACIÓN DEL OSCILADOR INTERNO

El oscilador interno consiste en dos circuitos separados:

1. El oscilador interno de alta frecuencia HFINTOSC está conectado al post-escalador (divisor de frecuencias). Está calibrado de fábrica y funciona a 8 Mhz. Al utilizar el post-escalador, este oscilador puede producir una señal de reloj a una de siete frecuencias. La selección de frecuencia se realiza dentro del software utilizando los pines IRCF2, IRCF1 y IRCF0 del registro OSCCON.

El  HFINTOSC está habilitado al seleccionar una de siete frecuencias (entre 8 Mhz y 125 kHz) y poner a uno el bit de la fuente de reloj del sistema (SCS) del registro OSCCON. Como se muestra en la siguiente figura , todo el procedimiento se realiza por medio de los bits del registro OSCCON.

Configuración del oscilador interno

2. El oscilador de baja frecuencia LFINTOSC no está calibrado de fábrica y funciona a 31 kHz. Está habilitado al seleccionar la frecuencia (bits del registro OSCCON) y poner a uno el bit SCS del mismo registro.

MODE DE CAMBIO AUTOMÁTICO DE VELOCIDAD DE RELOJ
(Two-Speed Clock Start-up Mode)

El modo de cambio automático de velocidad de reloj se utiliza para reducir el consumo de corriente cuando el microcontrolador funciona en modo de reposo. ¿De qué se trata todo esto?

Cuando se configura en modo LP, XT o HS, el oscilador externo se desactiva al pasar a modo de reposo para reducir el consumo de corriente total del dispositivo.

Cuando se cumplen las condiciones de “despertamiento”, el microcontrolador no se pone a funcionar inmediatamente puesto que tiene que esperar a que se estabilice la frecuencia de señal de reloj. Este tiempo muerto dura exactamente 1024 pulsos, después de que el microcontrolador continúa con la ejecución del programa. El caso es que se ejecutan sólo unas pocas instrucciones antes de que el microcontrolador vuelva al modo de reposo. Eso significa que la mayoría de tiempo así como la mayoría de corriente de baterías se ha perdido en vano. El caso se soluciona utilizando el oscilador interno para ejecutar el programa durante la duración de 1024 pulsos. Tan pronto como se estabilice la frecuencia del oscilador externo, él retoma automáticamente “el papel principal.” Todo el procedimiento se habilita al poner a uno el bit de palabra de configuración. Para programar el microcontrolador, es necesario seleccionar la opción Int-Ext Switchover (conmutación interna/externa) por software.

Habilitar la opción Int-Ext Switchover

MONITOR PARA DETECTAR UN FALLO DE LA FUENTE DE RELOJ (FAIL-SAFE CLOCK MONITOR)

Como indica su nombre, el monitor para detectar un fallo de la fuente de reloj (Fail-Safe Clock Monitor - FSCM) monitorea el funcionamiento del oscilador externo y permite al microcontrolador continuar con la ejecución de programa en caso de que el oscilador falle por alguna razón. En tal caso, el oscilador interno toma su función.

Monitor para detectar un fallo de la fuente de reloj (Fail-Safe Clock Monitor)

El monitor detecta un fallo al comparar las fuentes de reloj interno y externo. Si los pulsos del oscilador externo tardan más de 2mS en llegar, la fuente de reloj será automáticamente cambiada por la interna. Así, el oscilador interno sigue funcionando controlado por los bits del registro OSCCON. Si el bit OSFIE del registro PIE2 está a uno, se producirá una inte-rrupción. El reloj interno sigue siendo la fuente del reloj del sistema hasta que el dispositivo reinicie con éxito el oscilador externo que vuelve a ser la fuente de reloj del sistema.

De manera similar a casos anteriores, este módulo está habilitado al cambiar la palabra de configuración justamente antes de que se inicie el proceso de programar el chip. Esta vez, esto se realiza al seleccionar la opción Fail-Safe Clock Monitor.

Habilitar la opción Fail-Safe Clock Monitor

Registro OSCTUNE

Los cambios del registro OSCTUNE afectan a la frecuencia del oscilador HFINTOSC, pero no a la frecuencia del LFINTOSC. No hay ninguna indicación de que haya ocurrido desplazamiento de frecuencia durante el funcionamiento del microcontrolador.

Registro OSCTUNE

TUN4 - TUN0 Frequency Tuning bits. (bits de calibrar la frecuencia). Al combinar estos cinco bits, la frecuencia del oscilador de 8Mhz se reduce o se aumenta. De este modo, las frecuencias obtenidas por la división en el post-escalador cambian también.

TUN4 TUN3 TUN2 TUN1 TUN0 Frecuencia
0 1 1 1 1 Máxima
0 1 1 1 0
0 1 1 0 1
 




 




0 0 0 0 1
0 0 0 0 0 Calibrada
1 1 1 1 1
 




 




1 0 0 1 0
1 0 0 0 1
1 0 0 0 0 Mínima

3.11 MEMORIA EEPROM

La EEPROM es un segmento de memoria separado, que no pertenece a la memoria de programa (ROM), tampoco a la memoria de datos (RAM). Aunque a estas localidades de memoria no se les puede acceder fácil y rápidamente, su propósito es insustituible. Los datos almacenados en la EEMPROM están permanentemente guardados incluso al apagar la fuente de alimentación, y pueden ser cambiados en cualquier momento. Por estas características excepcionales cada byte de la EEPROM se considera valioso. 

El microcontrolador PIC16F887 dispone de 256 localidades de memoria EEPROM controlados por los bits de los siguientes registros:

  • EECON1 (registro de control);
  • EECON2 (registro de control);
  • EEDAT (almacena los datos listos para escritura y lectura); y
  • EEADR (almacena la dirección de la EEPROM a la que se accede).

Además, el registro EECON2 no es un registro verdadero, no existe físicamente en el chip. Se utiliza sólo durante la escritura de los datos en la memoria.

Los registros EEDATH y EEADRH se utilizan durante la escritura y lectura de la EEPROM. Los dos se utilizan también durante la escritura y lectura de la memoria de programa (FLASH).

Por considerar esto una zona de riesgo (por supuesto usted no quiere que el microcontrolador borre su propio programa por casualidad), no vamos a discutirlo aquí, no obstante le avisamos que tenga cuidado.

Registro EECON1

Registro EECON1

EEPGD - Program/Data EEPROM Select bit (bit de selección de memorias)

  • 1 - Acceso a la memoria Flash de programa.
  • 0 - Acceso a la memoria de datos EEPROM.

WRERR - EEPROM Error Flag bit (bit de error de escritura)

  • 1 - Se produce un error de escritura de forma prematura y ha ocurrido un error.
  • 0 - Se ha completado la operación de escritura.

WREN - EEPROM Write Enable bit (bit de habilitación de escritura)

  • 1 - Escritura de datos en la EEPROM habilitada.
  • 0 - Escritura de datos en la EEPROM deshabilitada.

WR - Write Control bit  (bit de control de escritura)

  • 1 - Se ha iniciado una operación de escritura de datos en la EEPROM
  • 0 - Se ha completado una operación de escritura de datos en la EEPROM

RD - Read Control bit (bit de control de lectura)

  • 1 - Inicia una lectura de la memoria EEPROM.
  • 0 - Lectura de la memoria EEPROM deshabilitada.

LECTURA DE LA MEMORIA EEPROM

Para leer los datos de la memoria EEMPROM, siga los siguientes pasos:

  • Paso 1: Escribir la dirección (00h - FFh) en el registro EEADR.
  • Paso 2: Seleccionar el bloque de memoria EEPROM al poner a cero el bit EEPGD del registro EECON1.
  • Paso 3: Poner a uno el bit RD del mismo registro para leer el contenido de la localidad.
  • Paso 4: El dato se almacena en el registro EEDAT y está listo para su uso.

El siguiente ejemplo muestra el procedimiento anteriormente descrito al escribir un programa en lenguaje ensamblador:

BSF STATUS,RP1   ;
BCF STATUS,RP0 ; Acceder al banco 2
MOVF ADDRESS,W ; Mover la dirección al registro W
MOVWF EEADR ; Escribir la dirección
BSF STATUS,RP0 ; Acceder al banco 3
BCF EECON1,EEPGD ; Seleccionar la EEPROM
BSF EECON1,RD ; Leer los datos
BCF STATUS,RP0 ; Acceder al banco 2
MOVF EEDATA,W ; Dato se almacena en el registro W

La misma secuencia de programa escrita en Basic se parece a lo siguiente:

W = EEPROM_Read (ADDRESS)

Las ventajas del uso del lenguaje Basic se han hecho más obvias, no lo cree?

ESCRITURA EN LA MEMORIA EEPROM

Antes de escribir los datos en la memoria EEPROM es necesario escribir la dirección en el registro EESADR y los datos en el registro EESAT. Sólo ha quedado seguir a una secuencia especial para iniciar la escritura para cada byte. Durante el proceso de escritura  las interrupciones deben estar deshabilitadas.

El ejemplo que sigue muestra el procedimiento anteriormente descrito al escribir un programa en lenguaje ensamblador:

BSF STATUS,RP1
BSF STATUS,RP0
BTFSC EECON,WR1 ; Esperar a que se complete la escritura anterior
GOTO $-1 ;
BCF STATUS,RP0 ; Banco 2
MOVF ADDRESS,W ; Mover la dirección a W
MOVWF EEADR ; Escribir la dirección
MOVF DATA,W ; Mover los datos a W
MOVWF EEDATA ; Escribir los datos
BSF STATUS,RP0 ; Banco 3
BCF EECON1,EEPGD ;Seleccionar la EEPROM
BSF EECON1,WREN ; Escritura a la EEPROM habilitada
BCF INCON,GIE ; Todas las interrupciones deshabilitadas
BSF INTCON,GIE ; Interrupciones habilitadas
BCF EECON1,WREN ; Escritura a la EEPROM deshabilitada
MOVLW 55h
MOVWF EECON2
MOVLW AAh
MOVWF EECON2
BSF EECON1,WR

La misma secuencia de programa escrita en Basic se parece a lo siguiente:

W = EEPROM_Write(ADDRESS, W)

No hace falta comentar nada.

Vamos a hacerlo en mikroBasic...

' El ejemplo muestra cómo utilizar la librería EEPROM en el compilador mikroBasic PRO for PIC.
program eeprom_test
dim ii as byte ' La variable ii utilizada en el bucle
main:
ANSEL = 0 ' Configuración de los pines AN como E/S digitales
ANSELH = 0
PORTB = 0
PORTC = 0
PORTD = 0
TRISB = 0
TRISC = 0
TRISD = 0

for ii = 0 to 32 step 1 ' Llenar el búfer con los datos
EEPROM_Write(0x80+ii, ii) ' Escribir los datos en la dirección 0x80+ii
next ii

EEPROM_Write(0x02,0xAA) ' Escribir un dato en la dirección 2 de la EEMPROM
EEPROM_Write(0x50,0x55) ' Escribir un dato(número 0x55)en la dirección 0x50 de la EEMPROM
Delay_ms(1000) ' Los diodos en los puertos PORTB y PORTC
PORTB = 0xFF ' parpadean para indicar el comienzo de la lectura   


PORTC = 0xFF
Delay_ms(1000)
PORTB = 0x00
PORTC = 0x00
Delay_ms(1000)
PORTB = EEPROM_Read(0x02) ' Leer el dato de la dirección 2 de la EEPROM
' y visualizarlo en el puerto PORB
PORTC = EEPROM_Read(0x50) ' Leer el dato de la dirección 0x50 de la EEPROM y    
' visualizarlo en el puerto PORC
Delay_ms(1000)

for ii = 0 to 32 step 1 '  Leer el bloque de 32 bytes de la dirección 
PORTD = EEPROM_Read(0x80+ii) ' 0x80 y visualizar el dato en el puerto PORTD
Delay_ms(250)
next ii

end.

3.12 REINICIO! BLACK-OUT, BROWN-OUT O RUIDOS?

A primera vista, basta con encender una fuente de alimentación para hacer funcionar un microcontrolador. A primera vista, basta con apagar una fuente de alimentación para detenerlo. Sólo a primera vista. En realidad, el arranque y el final del funcionamiento son las fases críticas de las que se encarga una señal especial denominada RESET.

Al producirse un reinicio el microcontrolador detiene su funcionamiento inmediatamente y borra sus registros. Una señal de reinicio se puede generar externamente en cualquier momento (nivel lógico bajo en el pin MCLR). Si se necesita, una señal también puede ser generada por la lógica de control interna. Al encender una fuente de alimentación siempre se produce un reinicio. Por muchos eventos de transición que ocurren al encender una fuente de alimentación (centelleos y fogonazos de contactos eléctricos en interruptores, subida de voltaje lenta, estabilización de la frecuencia de señal de reloj graduada etc.) es necesario proporcionar un cierto tiempo muerto antes de que el microcontrolador se ponga a funcionar.  Dos temporizadores internos PWRT y OST se encargan de eso. El PWRT puede estar habilitado/deshabilitado durante el proceso de escribir un programa. Vamos a ver cómo funciona todo.

Temporizador de encendido del oscilador

Cuando el voltaje de la fuente de alimentación alcanza  entre 1.2 y 1.7V, un circuito denominado temporizador de arranque (Power-up timer) mantiene al microcontrolador reiniciado durante unos 72mS. Tan pronto como transcurra el tiempo, otro temporizador denominado temporizador de encendido del oscilador (Oscillator start-up timer) genera otra señal de reinicio durante la duración de 1024 períodos del oscilador de cuarzo. Al expirar el tiempo muerto (marcado con Reset T en la Figura) y al poner a alto el pin MCLR, todas las condiciones se han cumplido y el microcontrolador se pone a ejecutar la primera instrucción en el programa.
Aparte de este reinicio “controlado” que ocurre al encender una fuente de alimentación, hay dos tipos de reinicio denominados Black-out y Brown-out que pueden producirse durante el funcionamiento del microcontrolador así como al apagar una fuente de alimentación.

REINICIO BLACK-OUT

Reincio Black-Out al apagar una fuente

El reinicio black out ocurre al apagar una fuente de alimentación correctamente. El microcontrolador no tiene tiempo para hacer nada imprevisible puesto que el voltaje cae muy rápidamente por debajo de su valor mínimo. En otras palabras, ¡se apaga la luz, las cortinas bajan y el espectáculo ha terminado!

REINICIO BROWN-OUT

Reinicio Brown-Out al caer la alimentación lentamente

Cuando el voltaje de la fuente de alimentación cae lentamente (un ejemplo típico es descarga de baterías, aunque el microcontrolador experimentaría unas caídas mucho más rápidas como un proceso lento) los componentes internos detienen  su funcionamiento gradualmente y ocurre el así llamado reinicio Brown-out. En tal caso, antes de que el microcontrolador detenga su funcionamiento completamente, hay un peligro real de que los circuitos que funcionan a frecuencias altas se pongan a funcionar de forma imprevisible. El reinicio brown-out puede causar cambios fatales en el programa ya que se almacena en la memoria flash incorporada en el chip.

RUIDOS ELÉCTRICOS

Ruidos eléctricos

Es un tipo especial del reinicio Brown-out que ocurre en un ambiente indu-strial cuando voltaje de alimentación “parpadea” por un momento y cae por debajo del valor mínimo. Aunque es corto, este ruido producido en una línea de conducción eléctrica puede afectar desfavorablemente al funcionamiento del dispositivo.

MCLR PIN

Pin MCLR

Un cero lógico (0) al pin MCLR causa un reinicio inmediato y regular. Es recomendable conectarlo de la forma mostrada en la Figura a la derecha. La función de los componentes adicionales es de mantener un uno lógico “puro”  (1) durante el funcionamiento normal. Si estos componentes se configuran de manera que proporcionen un nivel lógico alto (1) en el pin después de que haya transcurrido el tiempo muerto reset T, el microcontrolador se pondrá a funcionar inmediatamente. Esto puede ser muy útil cuando se necesita sincronizar el funcionamiento del microcontrolador con los componentes adicionales o con el funcionamiento de varios microcontroladores.
Para evitar posibles errores al producirse el reinicio Brown-out, el PIC 16F887 tiene un “mecanismo de protección” incorporado. Es un circuito simple, pero eficaz que reacciona cada vez que el voltaje de alimentación cae por debajo de 4V y mantiene este nivel de voltaje por más de 100 microsegundos. Este circuito genera una señal después de que todo el microcontrolador funcionará como si hubiera sido encendido por primera vez.

previous chapter | table of contents | next chapter

Easter 2014
LiveZilla Live Chat Software