Esta es la tercera versión del contador de eventos con el picaxe18M2+, pero esta vez usando interrupciones. Cabe resaltar varios puntos importantes:
*Las interrupciones están por default en el puerto C (revisen el manual para más detalles).
*No se pueden usar interrupciones con multitareas.
*La rutina de interrupción debe de tener el nombre de "interrupt:".
*Asegurarse de habilitar las interrupciones antes del programa principal.
*Los puertos de interrupción son muy pocos, en este microcontrolador me parece que tiene solo dos (el C.0 y el C.2), pero verifiquen ustedes mismos.
Por esto mismo modifiqué el programa y el diagrama en algunas cosas:
Diagrama:
Programa:
;***********************************************************************************************
; CONFIGURACION DE LOS PUERTOS
;***********************************************************************************************
let dirsB = %11111111 ;Puerto B como salidas digitales
let dirsC = %11001110 ;C.0, C.4 y C.5 como entradas digitales
;***********************************************************************************************
; INICIALIZACION DE VARIABLES
;***********************************************************************************************
let b1=0
let b2=0
let b3=0
let b4=0
let b5=0
let b6=0
;***********************************************************************************************
; VECTOR DE INTERRUPCION
;***********************************************************************************************
setint $00000001,00000001
;***********************************************************************************************
; PROGRAMA PRINCIPAL
;***********************************************************************************************
main:
let pinsB=b6
pulsout B.7,100 ;Se activa solo el transistor de las centenas de millar
let pinsB=b5
pulsout C.1,100 ;Se activa solo el transistor de las decenas de millar
let pinsB=b4
pulsout C.2,100 ;Se activa solo el transistor de las unidades de millar
let pinsB=b3
pulsout C.3,100 ;Se activa solo el transistor de las centenas
let pinsB=b2
pulsout C.6,100 ;Se activa solo el transistor de las decenas
let pinsB=b1
pulsout C.7,100 ;Se activa solo el transistor de las unidades
goto main
;***********************************************************************************************
; RUTINA DE INTERRUPCION
;***********************************************************************************************
interrupt:
let pinsB=b6
pulsout B.7,100 ;Se activa solo el transistor de las centenas de millar
let pinsB=b5
pulsout C.1,100 ;Se activa solo el transistor de las decenas de millar
let pinsB=b4
pulsout C.2,100 ;Se activa solo el transistor de las unidades de millar
let pinsB=b3
pulsout C.3,100 ;Se activa solo el transistor de las centenas
let pinsB=b2
pulsout C.6,100 ;Se activa solo el transistor de las decenas
let pinsB=b1
pulsout C.7,100 ;Se activa solo el transistor de las unidades
if pinC.0 = 1 then interrupt
setint $00000001,00000001 ;Activamos una vez más la interrupción
inc b1 ; Se incrementa el contador de unidades en 1
if b1=10 then
let b1=0
inc b2
endif
if b2>9 then
let b2=0
inc b3
endif
if b3>9 then
let b3=0
inc b4
endif
if b4>9 then
let b4=0
inc b5
endif
if b5>9 then
let b5=0
inc b6
endif
if b6>9 then
let b6=0
endif
return
Video: