.: Código para el Contador
Antes quiero aclarar una cosa, para evitarle problemas a aquellos que no se animan a modificar el archivo P16F84.INC, les muestro una opción, ya que en la red encontrarán otros tutoriales o códigos que utilicen este archivo sin modificaciones.
La idea, es crear una copia de este archivo y renombrarlo, por ejemplo P16F84luis.INC (ponle el nombre que mas te guste...) luego le haces las modificaciones a este archivo.
Bien, ya lo advertí, ahora vamos por el código...
;---------------Encabezado-------------
LIST P=16F84
#include <P16F84luis.INC>
;-------Configuración de puertos-------
ORG 0x00
GOTO inicio
ORG 0x04
GOTO ISR
ORG 0X05
inicio BSF STATUS,RP0 ; configurando puertos
MOVLW 0x10
MOVWF TRISA ; RA0-RA3 = SALIDA
MOVLW 0xFF ; PORTB = ENTRADA
MOVWF TRISB
BCF STATUS,RP0
;-------Habilitación de interrupciones-------
BSF INTCON,GIE ; habilitamos todas las interrupciones
BSF INTCON,INTE ; que sean interrupciones externas
;-------Programa Principal-------
CLRF PORTA
espera SLEEP
GOTO espera ; El micro pasa a bajo consumo
ISR MOVF PORTA,W ; pasamos lo que hay en PORTA a W
XORLW B'1001' ; compara para saber si terminó la cuenta
BTFSC STATUS,Z ; si no terminó salta una linea
GOTO reini ; y si terminó irá a reiniciarla
INCF PORTA,F ; incrementa en 1 PORTA y lo retiene
BCF INTCON,INTF ; borro bandera de interrupción
RETFIE ; regresa al modo SLEEP
reini CLRF PORTA
BCF INTCON,INTF ; borro bandera de interrupción
RETFIE
;------------------------------------------
END
;------------------------------------------
|
|
.: Descripción
Y como siempre, sólo aquello que está en rojo, ya que lo demás lo conocemos desde sus inicios.
#include <P16F84luis.INC>
Respecto a esto no diré nada, ya lo mencioné al comenzar esta sección, vamos por lo otro.
Al configurar TRISA con 0x10 hemos dejado RA4 como entrada, de tal modo que enviemos lo que enviemos al registro PORTA, RA4 no será alterado.
De TRISB, bueno, si bien utilizaré sólo uno de sus pines, configuré todo el puerto B como entrada.
Luego viene la habilitación de interrupciones, la general (GIE), y la que corresponde al pin RB0 (INTE)
Lo siguiente, es limpiar el PORTA, para empezar la cuenta en cero, asi que...
CLRF PORTA
y el Display muestra cero "0".
Luego ponemos al micro en espera de la interrupción, con la instrucción SLEEP
Ahora viene el gran secreto, La ISR o Rutina de Servicio de Interrupciones...
Les recuerdo que nuestro decodificador cuenta sólo hasta 9, es decir que si envían 10 por el puerto A, el Display no mostrará nada, por lo tanto, habrá que reiniciar la cuenta, si el puerto A llega a 9 (B'1001') el próximo pulso deberá enviar cero al display para reiniciar la cuenta.
ISR MOVF PORTA,W ; pasamos lo que hay en PORTA a W
XORLW B'1001' ; compara para saber si terminó la cuenta
BTFSC STATUS,Z ; si no terminó salta una linea
GOTO reini ; y si terminó irá a reiniciarla
INCF PORTA,F ; incrementa en 1 PORTA y lo retiene
BCF INTCON,INTF ; borro bandera de interrupción
RETFIE ; regresa al modo SLEEP
Cuando se presione el pulsador, se generará una interrupción, eso significa que saldrá del modo SLEEP para pasar a este trozo de código.
Teniendo en cuenta lo dicho anteriormente, lo que haremos será pasar lo que hay en PORTA al registro w, y luego compararlo con 1001 (9 en el display). Si aún no llegó a 9 saltamos una línea, incrementamos PORTA (INCF PORTA,F) y lo guardamos en el mismo registro, aquí utilicé F (recuerda que antes lo indicábamos con 0 o con 1, y como estamos utilizando nuestro P16F84luis.INC, pues la cosa se pone más clara), luego borramos la bandera de interrupción y regresamos al modo sleep.
ok. Supongamos ahora, que la cuenta ya terminó...
En este caso, nuestro Display muestra 9, y PORTA está en 00001001, si es así, cuando hagamos xorlw con 00001001, por ser el mismo valor, la bandera de cero Z del registro STATUS, se pondrá en 1, pues bien, eso significa que la cuenta terminó, por lo tanto habrá que reiniciarla, asi que hacemos un GOTO a la etiqueta reini
reini CLRF PORTA
BCF INTCON,INTF ; borro bandera de interrupción
RETFIE
Lo único que tenemos que hacer aquí, es poner PORTA a cero, el decodificador lo tomará y pondrá el display en CERO, luego limpiamos la bandera de interrupción y regresamos al modo SLEEP.
Bien, Respecto a lo de limpiar PORTA cuando se inicia el código, lo hice de tal modo que puedas reiniciar la cuenta cuando lo desees, simplemente presionando el pulsador de RESET, personalmente creo que este pulsador debería estar siempre en todos los circuitos, y además es importante tenerlo en cuenta, aunque no lo estuviera.
Bueno..., Este fue el modo sencillo para enviar datos a un Display
Ahora lo vamos a complicar un poquitin más, te animas...???
R-Luis...
<--Anterior
Introducción
Siguiente -->
Tabla de Referencias
|