Quinta y última publicación sobre Microcontroladores Programables PIC, en la que veremos las interrupciones y el "Watchdog", con aplicaciones prácticas.
INTERRUPCIONES.
Si recordamos el direccionamiento del PIC, hay un registro llamado INTCON, y su dirección es la 0Bh. Dentro de este registro hay 8 bits que pueden ser habilitados o deshabilitados. Interrupciones Global"). Poniendo este bit a 1 le decimos al PIC que vamos a usar una interrupción.
El bit 4 de INTCON es llamado INTE ("INT Enable", o "Habilita INT"), o dicho de otro modo, que utilizaremos el pin 6 con su función INT, no como RB0. Poniendo este bit a 1 le estamos diciendo al PIC, que RB0 será un pin de interrupción.
Poniendo a 1 el bit 3 de INTCON, llamado RBIE, decimos al PIC que usaremos los bits del 4 al 7 del puerto B como interrupciones.
En este punto el PIC sabe que cuando uno de estos pines cambia a nivel alto o cambia nivel bajo, tiene que parar lo que esté haciendo e ir a una rutina de interrupción.
Flag de Interrupción.
Posición de Memoria.
ORG 0000h ; El PIC comienza aqui al oncender o reiniciar.
GOTO Inicio ; Al al principio del programa principal.
ORG 0004h ; El PIC viene aquí cuando hay una interrupción.
: ; Esta en nuerstra rutoina de interrupción.
: ; con lo que eueramos que haga el PIC.
: ; cuando reciba una interrupción.
RETFIE ; Fin de la rutina de interrupción.
Inicio
Principal
Lo segundo es que tiene que existir un retardo entre que ocurre una interrupción y que pueda ocurrir la siguiente. Como sabes, el PIC tiene un reloj externo que puede ser, o bien un Cristal, o bien una red RC (resistencia-condensador). Independientemente de la frecuencia de reloj, el PIC la divide entre 4 y la utiliza para su reloj interno. Por ejemplo, si usas un cristal de 4MHz, el PIC llevará a cabo las instrucciones a 1MHz. A este tiempo interno se le llama Ciclo de Instrucción. Pues según la hoja de características (datasheet), se debe dejar que pasen de 3 a 4 ciclos de instrucción entre interrupciones.
org 0x00 ; Aquí apunta el PIC al encender o reiniciar.
goto Principal ; Va al principio del programa principal.
org 0x04 ; comienzo de la rutina de interrupción.
retfie ; Esto indica al PIC el fin de la rutina de interrupción.
; Y el PC volvera a apuntar al programa Principal.
Principal ; Cominenzo del Programa Principal.
;
bsf INTCON,7 ; GIE - Global Interrupt Enable (1= Habiliatdo)
bsf INTCON,4 ; INTE - RB0 Interrupt Enable (1= Habilitado).
;
;
bcf INTCON,1 ; INTF a 0, por si acaso.
;
bsf STATUS,5 ; Cambiamos al Banco 1.
movlw 0x01 ;
movwf TRISB ; Establecemos RB0 como entrada.
movlw 0x10 ;
movwf TRISA ; Los 4 primeros pines del Puerto A como Salida.
bcf STATUS,5 ; Vuelve al Banco 0.
;
Bucle
movlw CONTADOR,0 ; Movemos los contenidos de CONTADOR a W.
movwf PORTA ; Ahora lo movemos al Puerto A.
goto Bucle ; y continuamos haciendo esto.
end
;
movwf TEMPORAL ; Almacenamos W en una posición temporal.
;
;
incf CONTADOR ; Incrementamos CONTADOR en 1 y ponemos
; el resultado de vuelta en CONTADOR.
;
movlw 0x0A ; Ponemos 10 en W
subwf CONTADOR,0 ; Restamos W a CONTADOR y ponemos el resultado en W.
;
btfss STATUS,0 ; Comprueba el flag de CARRY. Se activará si
; CONTADOR es igual o mayor que W.
; Y se activará como resultado de
; la instrucción subwf.
Ahora ya sabemos si el valor de CONTADOR es 9 o más. Así que, si
CONTADOR es mayor que 9, lo ponemos de nuevo a 0, y de otro modo
vuelve al programa principal para que podamos enviarlo al
PORTA.
La instrucción BFTSS, se saltará la siguiente instrucción si el flag de CARRY se pone a 1:
;
goto continua ; Si CONTADOR es < 10, continua...
goto limpiar ; Si CONTADOR es > 9, lo ponemos a 0.
continua
bcf INTCON,0x01 ; Ponemos a 0 este flas para permitir más interrupciones.
movfw TEMPORAL ; Restaura W el valor de antes de la interrupción.
retfie ; Salir de la rutina de interrupción.
limpiar
clrf CONTADOR ; Ponemos el CONTADOR a 0.
bcf INTCON,1 ; Ponemos a 0 este flag para permitir mas interrupciones.
retfie ; Salir de la rutina de interrupción.
Con esto ya tenemos todo lo que necesitamos. Vamos a ponerlo todo junto y a definir los valores de nuestras constantes, justo al principio de nuestro programa. Seguidamente mostramos el listado completo y el esquema del circuito:
;**********************************************************;
; PROGRAMA INTERRUPCION.asm FECHA: XX XXXXX 2022 ;
; Programa para contar de 0 a 9 y mostrar en LEDS binario. ;
; Usa el puerto RB0 (Pin 6) y RA (pines 17, 18, 1 y 2) ;
; Revisión: 1.0 Programa para PIC16F48A ;
; Velocidad de Reloj: XTAL externo 4Mhz (1Mhz=1us) ;
; WatchDog = OFF Tipo Reloj: Cristal ;
; Autor: XMG Por: XANUR2001/ ACME 2022 ;
; Compilado en : MPLAB X IDE v2.05 (MICROCHIP) ;
; *********************************************************;
org 0x00 ; Aquí apunta al encender o reset
;*****Establecimiento de constantes *******
INTCON EQU 0x0B ; Registro Control de Interrupciones.
PORTB EQU 0x06 ; Dirección del puerto B.
PORTA EQU 0x05 ; Dirección del Puerto A.
TRISB EQU 0x86 ; Dirección del registro Puerto B.
.
TRISA EQU 0x85 ; Dirección del registro Puerto A.
STATUS EQU 0X03 ; Dirección del registro STATUS.
CONTADOR EQU 0x0d ; Variable para nuestro Contador.
TEMPORAL EQU 0x0d ; Almacén temporal para el registro W;
;
goto Principal ; Va al programa principal
; saltándose dirección interrupción.
;
;***************RUTINA DE INTERRUPCION*************************** después vuelve
org 0x04 ; Aquí comienza rutina interrupción.
movwf TEMPORAL ; Almacenamos W en posición temporal.
incf CONTADOR,1 ; Incrementamos CONTADOR en 1 y
; ponemos resultado en CONTADOR.
movlw 0x0A ; Ponemos 10 en W.
subwf CONTADOR,0 ; Restamos W a CONTADOR y ponemos
; el resultado en W.
btfss STATUS,0 ; Comprueba flag CARRY. Se activará si
; CONTADOR es igual o mayor que w,
; y activará como resultado subwf.
goto continua ; Si CONTADOR es <10, continua.
goto limpiar ; Si CONTADOR es >9, ponemos a 0
continua
bcf INTCON,0x01 ; Poner a 0 el flag para
; permitir más interrupciones.
movfw TEMPORAL ; Restaura W al valor de antes.
; de la interrupción.
retfie ; Salir de la rutina de interrupción.
limpiar
clrf CONTADOR ; Pon CONTADOR otra vez a 0.
bcf INTCON,1 ; Poner a 0 el flag para
; permitir más interrupciones.
retfie ; Salir de la rutina de interrupción.;
;
;***************FIN RUTINA DE INTERRUPCION*************************
;
;
;***************PROGRAMA PRINCIPAL***********************************
Principal ; Comienzo del programa principal.
;
;****************Configura los Registros de Interrupción*************
bsf INTCON,7 ; GIE enable (1=habilitado)
bsf INTCON,4 ; INTE RB0 (1=habilitado)
bcf INTCON,1 ; INTF - A 0 por si acaso.
;
;****************Configura los puertos*******************************
bsf STATUS,5 ; Cambia al banco 1.
movwf TRISB ; Establece RB0 como entrada
movlw 0x10 ;
movwf TRISA ; Pone los 4 primeros pines del
; puerto A como salida
bcf STATUS,5 ; Vuelve al banco 0.
;
;****************Ahora envía el valor de CONTADOR al PORTA***********
Bucle
movf CONTADOR,0 ; Movemos contenidos de CONTADOR a W.
movwf PORTA ; Ahora lo movemos al puerto A.
goto Bucle ; Continuamos haciendo esto.
;
;;**** Fin del Programa****
end
; Algunos compiladores necesitan esta instrucción,
; O por si nos olvidamos poner la instrucción 'goto'.
Este "anti-rebote", también se puede realizar mediante código.
WTCHDOG
- Cuanto tiempo tenemos antes de tener que hacer un reinicio al WDT.
- Como lo ponemos a cero.
- Tenemos que habilitar el WDT dentro del PIC.
Tiempos de WDT
movlw b’101’ ; En hexadecimal sería 0x05.;
movwf 81h ; Y este es el registro OPTION.
- Tenemos que reiniciar el temporizador o contador (TMR0) y ponerlo a 0.
- Luego cambiar al banco 1 para asignar el prescaler al WDT y configurar el tiempo.
- Y después volver al banco 0.
Bcf STATUS,0 ; Nos aseguramos de que estamos en el banco 0
clrf 01h ; Dirección del temporizador TMR0. puesta a 0.
bsf STATUS,0 ; Cambiamos al banco 1.
clrwdt ; reiniciamos el WDT y el prescaler
movlw b’1101’ ; Seleccionamos el valor del nuevo preescaler a 576ms(bits 0 al 2)
; ; y lo asignamos al WDT(ver bit 3 puesto a 1).
movwf OPTION ; y se lo asignamos al WDT
bcf STATUS,0 ; Vuelve al banco 0
Temporización de las instrucciones
También hemos visto que algunas instrucciones necesitan un solo ciclo de instrucción para ejecutarlas (1μs), mientras que otras emplearán dos ciclos en ser ejecutadas (2μs).
movlw 02
movwf CONTADOR
Bucle decfsz CONTADOR
goto Bucle
end
La siguiente instrucción es similar, mueve los contenidos del registro W a CONTADOR. De nuevo, esto tardará 1 ciclo.
Ahora, la siguiente instrucción primero decrementa CONTADOR en 1. Esto es 1 ciclo. Después hará una comprobación para ver que CONTADOR es igual a 0. En este momento no lo es, por tanto vamos a la siguiente instrucción.
La siguiente instrucción es una de "goto", y por tanto tarda 2 ciclos.
Volvemos a nuestra instrucción DECFSZ, la que decrementa CONTADOR en 1 de nuevo. Esto tarda otro ciclo. Hace una comprobación para ver si CONTADOR es igual a 0. Esta vez lo es, y por tanto se salta la siguiente instrucción. Para saltarse la siguiente instrucción se requiere otro ciclo. Alcanzamos el final del programa.
Así que en total, con el valor de 02 para CONTADOR, este programa tarda 7 ciclos en total. Si estamos usando un cristal de 4MHz para nuestro reloj, entonces el programa tarda:
SOFTWARE PROGRAMADOR.
En la estructura del PIC, hay unos elementos llamados "Fuses”, que podríamos traducirlos como fusibles. No tienen nada que ver con los fusibles eléctricos que conocemos, sino que podríamos denominarlos como conmutadores electrónicos que se pueden "fundir" o establecer por el programador.
Uno de estos fusibles, es el que corresponde al WDT para que pueda operar.
Para hacerlo efectivo, tenemos dos formas posibles:
Una es escribiendo unas líneas al comienzo del programa, para configurar en el software programador del PIC la habilitación o deshabilitación de una serie de "fusibles".
; **** INICIO PROGRAMA ****
LIST p=16F84A ; indicamos el PIC vamos a usar
INCLUDE <p16f84a.inc> ; y la librería de instrucciones
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
; habilitación/deshabilitación de los fusibles del PIC
- LP o “Low Power Crystal”, usa un cristal de baja potencia, de consumo optimizando.
- XT o “Crystal/Resonator”, que usa un cristal resonante.
- HS o “High Speed Crystal/Resonator”, usa un cristal resonante de alta velocidad.
- RC o “Resistor/Capacitor”, el cual usa un oscilador Condensador-Resistencia.
ENLACES.
© Se permite reproducción total o parcial de este contenido, siempre y cuando se reconozca la fuente de información utilizada y se incluya el enlace a este artículo.
Equipo Xanur©2022.
No hay comentarios:
Publicar un comentario