Página de inicio Mi Correo






   » Foro
   » Nuevo Foro
   » Mi Correo
   » Mis Actividades...


--- Novedades ---



    
  » Microcontroladores » Display y Tablas (2 de 9)  

.: 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 -->
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
Tabla de Referencias


    
--| |--