PIC16F1XXX, microcontroladores PIC16 mejorados (parte 1: reloj)

Usas los PIC16 pero ahora requieres más memoria o velocidad para desarrollar una nueva aplicación, tal vez los PIC16F1 sean la solución. Los PIC16F1XXX son una versión mejorada[Microchip] de los PIC16 y cuentan con más memoria (soportan programas de hasta 32768 instrucciones y tienen hasta aproximadamente 2 KB en la RAM de datos), más modos de direccionamiento, más instrucciones, más …

Para poder hacer pruebas de los temas que iremos tratando, usaremos un PIC16F1938.

RELOJ. Para que puedas comparar, en las figuras 1 y 2 te muestro los diagramas a bloques de las diferentes formas de obtener el reloj para un PIC16F887 y un PIC16F1938. Tal vez la novedad más relevante sea que se pasa de una frecuencia máxima de 20 MHz a una de 32 MHz.

En esta entrada te presento dos ejercicios: el primero, hace trabajar al PIC16F1938 a 32 MHz a partir de su oscilador interno; en el segundo, haremos que el PIC trabaje con su oscilador interno a causa de una falla en el oscilador externo. También comento las instrucciones nuevas que usé en los programas de ejemplo.

Figura 1. Diagrama a bloques de las diferentes formas de obtener el reloj en un PIC16F887. Esta figura pertenece a la hoja de datos del PIC y está en su página 65.
Figura 2. Diagrama a bloques de las diferentes formas de obtener el reloj en un PIC16F1938. Esta figura pertenece a la hoja de datos del PIC y está en su página 60.

EJERCICIO 1, reloj del PIC16F1938 a partir del oscilador interno a 32 MHz. El circuito de prueba está en la figura 3. Al ejecutar el siguiente programa, osc.asm, obtendrás oscilaciones en las terminales 10 y 15.

        #INCLUDE "p16f1938.inc"

; Se puede leer el valor de los bits de configuración si 
; después de construir el proyecto, se observa la ventana
; Configuration bits (menú Window, opción PIC Memory 
; Views, opción Configuration bits).
        __CONFIG    _CONFIG1,0x07E4
        __CONFIG    _CONFIG2,0x1CFF
 
        ORG     0
; Quitar el ; INICIAL de las 4 líneas siguientes
; para configurar oscilador a 32 MHz.
        ;MOVLB	01
        ;MOVLW	0F0
        ;MOVWF	OSCCON
        ;MOVLB	00
        MOVLW   0EF     ; RC4 como salida.
        TRIS    07
CICLO	
        BSF     PORTC,4 ; RC4 a uno.
        NOP             ; Igualar la duración de la 
        NOP             ; instrucción GOTO.
        BCF     PORTC,4	; RC4 a cero.
        GOTO    CICLO   ; Repetir indefinidamente.
        END
Figura 3. Diagrama del circuito para verificar la configuración del oscilador interno.

En la figura 2, puedes ver que la fuente del reloj para los PIC16F1938 se selecciona a través de los bits IRCF<3:0>, SCS<1:0> y FOSC<2:0>. Así que las partes de osc.asm que tienen que ver con establecer la fuente del reloj son: las directivas CONFIG; y las líneas 20 a 23 (que inicialmente están comentadas). El resto del código: configura la terminal 4 del puerto C como salida, y entrega por esa terminal ceros y unos para formar una oscilación cuadrada, cuya frecuencia es 24 veces menor que la frecuencia del oscilador que alimenta el núcleo del PIC. 24 veces porque: 4 periodos del oscilador = un ciclo de máquina; la parte repetitiva del código contiene 4 instrucciones que se ejecutan en 1 ciclo y una, GOTO, que se ejecuta en 2 ciclos.

En la figura 4, puedes ver el valor de los bits de configuración programados a través de las directivas CONFIG. En la figura 5 están la función de los bits del registro OSCCON y su valor al iniciar el PIC. Observa que seleccioné usar el oscilador interno a 500 KHz (valor inicial en OSCCON cuando los bits de configuración ordenan trabajar con el oscilador interno). Las señales que obtuve en los puntos de prueba están en la figura 6.

Figura 4. Captura de pantalla mostrando osc.asm y los valores de los bits configuración que se obtienen a partir de las directivas __CONFIG. Para verlo en tu PC, después de construir el proyecto da clics en: menú Window, opción PIC Memory Views, opción Configuration bits.
Figura 5. Registro OSCCON. Esta figura pertenece a la hoja de datos del PIC y está en su página 73.
Figura 6. Señales al ejecutar osc.asm con las líneas de la 15 a 18 comentadas. PBA1 (pata 10) se muestra en el canal 1 (f = 500 kHz / 4 = 125 kHz), PBA2 (terminal 19) se muestra en el canal 2 (f = 125 kHz / (4+2) = 20.8 kHz).

Al quitar los comentarios de las lineas 20 a 23, podemos decir que simplemente seleccionamos la frecuencia de 32 MHz; o ver, figura 7, que ordenamos: usar el oscilador interno de 500 KHz, multiplicar esa señal con un PLL para obtener 16 MHz, dividirlo con el Postscaler para obtener 8 MHz, y multiplicar con otro PLL para obtener los 32 MHz. Las nuevas señales obtenidas en los puntos de prueba están en la figura 8.

Figura 7. Trayectoria de la oscilación interna del PIC16F1938 para obtener un reloj de 32 MHz.
Figura 8. Señales al ejecutar osc.asm completo. PBA1 se muestra en el canal 1 (f medida = 7.99 MHz), PBA2 se muestra en el canal 2 (f medida = 1.33 MHz).

EJERCICIO 2, oscilador de emergencia. Tal vez una fuente ininterrumpida para PC (no-break) represente el ejemplo más cotidiano de sistemas de respaldo; como todos sabemos, su finalidad es mantener funcionando la computadora cuando hay una falla de energía. Para que un microcontrolador pueda ejecutar su programa, además de energía, requiere de un reloj. De ahí, que varios modelos de PIC pueden usar su oscilador interno cuando hay una falla en el oscilador principal.

Para probar un diseño con oscilador de emergencia usaremos el circuito de la figura 9; para causar la falla retiraremos el cristal mientras el circuito está funcionando. La forma más simple de observar el cambio, sería mediante un osciloscopio o un frecuencímetro; considerando que posiblemente no tengas acceso a esos equipos, enviaremos los mensajes siguientes a una PC:

  • “Ini 8MHz” para el arranque y operación normal del circuito.
  • “Emer 16MHz” para la falla del oscilador principal. Observa que cambiaremos la frecuencia de operación del oscilador; por eso, tendremos que reconfigurar la comunicación serie, haciendo más notorio que el micro trabaja con otro oscilador.
Figura 9. Diagrama del circuito para probar el oscilador de emergencia. Para simular la falla del oscilador principal, retiraremos el cristal X1 durante la operación del circuito.

Observa que usé un convertidor USB a RS232 para establecer la comunicación con la PC, sólo se requieren las terminales de envío y recepción de datos, yo aproveché que se puede obtener energía del módulo y así alimenté al PIC. Para observar los mensajes en la PC usé el programa GtkTerm; hay más información de GtkTerm y de los convertidores USB-serie en la entrada Comunicación RS232 a través del USB. El código de prueba, falla-osc.asm, es:

        #INCLUDE    "p16f1938.inc"

        __CONFIG    _CONFIG1,0x27E2
        __CONFIG    _CONFIG2,0x1CFF
 
        UDATA   020
CONT    RES     01	
 
        ORG     0	
        MOVLW   0EF         ; RC4 como salida.
        TRIS    07
        MOVLB   03          ; Cambia al banco 3.
        BSF     RCSTA,SPEN  ; Configura USART
        BSF     TXSTA,TXEN
        BSF     RCSTA,CREN
        MOVLW   .12         ; 9600bps (FOSC/4)/(16(N+1)).
        MOVWF   SP1BRGL
        MOVLB   00          ; Regresa al banco 0.
 
ESPERA_PC       ; Espera un byte enviado por la PC.
        BTFSS   PIR1,RCIF
        GOTO    ESPERA_PC
        MOVF    RCREG,W
        CALL    M_INICIAL   ; Envía mensaje inicial.
CICLO           ; Ciclo que causa una oscilación en RC4.
        BSF     PORTC,4     ; Poner la terminal 4 a uno.
        BTFSC   PIR2,OSFIF  ; Verifica si falló el
        GOTO    M_EMERGENCIA; oscilador y avisa a la PC.
        BCF     PORTC,4     ; Poner la terminal 4 a cero.
        GOTO    CICLO       ; Repetir indefinidamente.
 
M_INICIAL
        CLRF    CONT        ; Prepara contador.
MI_CICLO
        BTFSS   PIR1,TXIF   ; Espera a que se pueda
        GOTO    MI_CICLO    ; transmitir.
        MOVF    CONT,W
        ADDLW   MI_TABLA
        CALLW               ; Obtiene dato a transmitir
        MOVLB   03
        MOVWF   TXREG       ; Transmite.
        MOVLB   00          ; Controla el número de
        INCF    CONT,F      ; iteraciones para enviar
        MOVLW   .10         ; todo el mensaje.
        XORWF   CONT,W
        BTFSS   STATUS,Z
        GOTO    MI_CICLO
        RETURN
MI_TABLA        ; Mensaje inicial.
        RETLW	'I'
        RETLW	'n'
        RETLW	'i'
        RETLW	' '
        RETLW	'8'
        RETLW	'M'
        RETLW	'H'
        RETLW	'z'
        RETLW	.10
        RETLW	.13
 
M_EMERGENCIA                ; Aquí porque se detectó 
        MOVLB   01          ; falla en el oscilador.
        MOVLW   078         ; Para hacer más notorio el
        MOVWF   OSCCON      ; problema, establece 
        MOVLB   03          ; frecuencia de 16 MHz.
        MOVLW   .25         ; Actualiza registro para
        MOVWF   SP1BRGL     ; mantener 9600 bps.
        MOVLB   00
        CLRF    CONT
ME_TX
        BTFSS   PIR1,TXIF
        GOTO    ME_TX
        MOVF    CONT,W
        ADDLW   ME_TABLA    ; Envía mensaje de falla.
        CALLW
        MOVLB   03
        MOVWF   TXREG
        MOVLB   00
        INCF    CONT,F
        MOVLW   .12
        XORWF   CONT,W
        BTFSS   STATUS,Z
        GOTO    ME_TX
ME_OSC
        BSF     PORTC,4     ; Poner la terminal 4 a uno.
        NOP
        NOP
        BCF     PORTC,4     ; Poner la terminal 4 a cero.
        GOTO    ME_OSC
ME_TABLA        ; Mensaje de falla.
        RETLW   'E'
        RETLW   'm'
        RETLW   'e'
        RETLW   'r'
        RETLW   ' '
        RETLW   '1'
        RETLW   '6'
        RETLW   'M'
        RETLW   'H'
        RETLW   'z'
        RETLW   .10
        RETLW   .13
        END

A grandes rasgos lo que falla-osc.asm hace es:

  • Configurar el PIC16F1938 para usar un cristal como parte del oscilador principal y habilitar el cambio a oscilador interno – líneas 9 y 10.
  • Configurar RC4 y la USART (transmisión asíncrona a 9600 bps) – líneas de la 16 a la 24.
  • Esperar a recibir un byte desde la PC para asegurar que ya está funcionando y configurado GtkTerm – líneas 26 a 29.
  • Enviar el mensaje inicial informando que se trabaja a 8 MHz – la llamada a subrutina está en la línea 30.
  • Establecer un ciclo indefinido en el que se cambia el valor de RC4 y se verifica si el PIC ha cambiado a oscilador de emergencia (bandera OSFIF en el registro PIR2) – líneas de la 31 a la 36.
  • En caso de que la bandera OSFIF esté en uno, se rompe el ciclo anterior, se reconfiguran las velocidades del oscilador y de la USART (líneas 67 a 74), se envía el mensaje por falla del oscilador (líneas 75 a 89), y finalmente se entra a otro ciclo indefinido que hace oscilar RC4 (90 a 95).

La figura 10 muestra una captura de pantalla durante la prueba. Conecté el PIC a la PC a través del convertidor USB-RS232. Ejecuté y configuré GtkTerm. Oprimí una tecla para enviar un byte al PIC. Recibí el mensaje “Ini 8MHz”.  Saqué el cristal del circuito de prueba. Recibí el mensaje “Emer 16MHz”.

Figura 10. Captura de pantalla al ejecutar la prueba. Configuré GtkTerm para usar el puerto ttyUSB0 a 9600 bps.

INSTRUCCIONES NUEVAS. En los ejemplos anteriores usé 3 instrucciones nuevas con las que cuenta el PIC16F1938: TRIS, MOVLB y CALLW.

La instrucción TRIS almacena el contenido del registro de trabajo en el registro TRIS indicado por su operando: cuando el operando vale 5 es TRISA quien se usa, 6 para TRISB y 7 para TRISC.

Para ordenar que la terminal 4 del puerto C funcione como salida en el PIC16F1938 usé:

  MOVLW     0EF
  TRIS      07

En un PIC16F887 hubiera usado:

  BSF  STATUS,RP0 ; Cambia al banco 1 a partir del banco 0.
  BCF  TRISC,4    ; También es posible usar MUVLW y MOVWF.
  BCF  STATUS,RP0 ; Regresa al banco 0.

Sin embargo, será necesario que consideres que la instrucción TRIS está descrita en la hoja de datos del PIC16F1938 (página 376), pero NO está en el documento PIC1XF1XXX Software Migration, y que además el MPLAB X produce un warning indicando que no es recomendable el uso de esta instrucción.

MOVLB copia su operando al registro selector de banco (BSR, Bank Select Register), es decir sirve para cambiar de banco.

En un PIC16F1XXX:

  MOVLB  00  ; Cambia al banco 0.
  MOVLB  01  ; cambia al banco 1.
  MOVLB  03  ; Cambia al banco 3.

En un PIC16:

  BSF STATUS,RP0 ; Estando en el banco 0, cambia al banco 1.
  BCF STATUS,RP0 ; Regresa al banco 0.

CALLW llama a una subrutina, pero el contenido del registro de trabajo se usa para llegar a una instrucción de dicha subrutina que no necesariamente es la primera. Profundizaré más en el uso de CALLW en una entrada posterior, dedicada a la estructura de las memorias en los PIC16F1XXX. También escribiré otra entrada referente a las nuevas instrucciones, pero por el momento me despido, gracias.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos necesarios están marcados *