Contador MM:SS con pic 16f84a

#1
Buenas!

tengo una consulta de un trabajo, el problema es el siguiente: tengo que hacer tipo reloj que muestre las dos cifras de los segundos y por lo menos una cifra de los minutos pero para empezar tengo que hacer que cuente solo hasta 59 seg, una vez hecho esto paso a agregar el siguiente display de los minutos pero logro hacer que las cifras de los minutos se mantenga encendida, el tiempo si lo se hacer pero mi prioridad es mantener encendido los numeros sin que se apaguen
Bueno la idea no es que me hagan la tarea sino que tiren un par de palos para ver mas o menos como voy o que es lo que falta hacer
gracias

este es mi codigo


PHP:
_CONFIG_CP_OFFAND_WDT_OFFAND_PWRTE_ONAND_XT_OSC
       
LIST       P=16F84A		
INCLUDE  <P16F84A.INC>	
PORTA 	EQU 0x05
PORTB	EQU	0x06
ContA	EQU 0x0C
ContB	EQU	0x0D		
ContC	EQU	0x0E		
R_ContA	   EQU	0x0C
R_ContB	   EQU	0x0D
R_ContC    EQU	0x0E
ORG		0
	

Inicio
		bsf		STATUS,RP0
		clrf	PORTB
		clrf	PORTA
		bcf		STATUS,RP0			

;COMIENZA UNIDADES DE SEGUNDOS

principal   
		movlw	0x3F ;CERO
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo

		movlw	0x06 ;UNO
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo

		movlw	0x5B ;DOS
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo

		movlw	0x4F ;TRES
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo

		movlw	0x66 ;CUATRO
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo

		movlw	0x6D ;CINCO
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo

		movlw	0x7D ;SEIS
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo

		movlw	0x07 ;SIETE
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo

		movlw	0x7F ;OCHO
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo

		movlw	0x67 ;NUEVE
		movwf	PORTB
		movlw	b'00000100'
		movwf	PORTA
		call	retardo



;CONTINUA DECENAS DE SEGUNDOS

		movlw	0x3F ;CERO
		movwf	PORTB
		movlw	b'00000010'
		movwf	PORTA     	
		call 	retardo2


		movlw	0x06 ;UNO
		movwf	PORTB
		movlw	b'00000010'
		movwf	PORTA
		call	retardo2


		movlw	0x5B ;DOS
		movwf	PORTB
		movlw	b'000000010'
		movwf	PORTA     	
		call 	retardo2


		movlw	0x4F ;TRES
		movwf	PORTB
		movlw	b'000000010'
		movwf	PORTA     	
		call 	retardo2


		movlw	0x66 ;CUATRO
		movwf	PORTB
		movlw	b'000000010'
		movwf	PORTA     	
		call 	retardo2


		movlw	0x6D ;CINCO
		movwf	PORTB
		movlw	b'000000010'
		movwf	PORTA     	
		call 	retardo2


;CONTINUA DECENAS DE SEGUNDOS


		movlw	0x3F
		movwf	PORTB
		movlw	b'0000001'
		movwf	PORTA     	
		call 	retardo2


		movlw	0x06
		movwf	PORTB
		movlw	b'0000001'
		movwf	PORTA
		call	retardo2


		movlw	0x5B
		movwf	PORTB
		movlw	b'0000001'
		movwf	PORTA     	
		call 	retardo2


		movlw	0x4F 
		movwf	PORTB
		movlw	b'0000001'
		movwf	PORTA     	
		call 	retardo2


		movlw	0x66
		movwf	PORTB
		movlw	b'0000001'
		movwf	PORTA     	
		call 	retardo2


		movlw	0x6D
		movwf	PORTB
		movlw	b'0000001'
		movwf	PORTA     	
		call 	retardo2


		movlw	0x7D
		movwf	PORTB
		movlw	b'0000001'
		movwf	PORTA     	
		call 	retardo2




		goto	principal		



retardo		;RETARDO 1 SEGUNDO

		   movlw	  d'10'
		   goto		  Retardo_1Decima
Retardo_1Decima
		   movwf	  R_ContC
R1Decima_BucleExterno2
		   movlw	  d'100'
		   movwf	  R_ContB
R1Decima_BucleExterno
		   movlw	  d'249'
		   movwf	  R_ContA
R1Decima_BucleInterno
           nop
           decfsz     R_ContA,F
           goto		  R1Decima_BucleInterno
		   decfsz	  R_ContB,F
		   goto		  R1Decima_BucleExterno
		   decfsz	  R_ContC,F
		   goto		  R1Decima_BucleExterno2
		   return



retardo2		;RETARDO 1 MINUTO

		   movlw	  d'10'
		   goto		  Retardo_1Decima
Retardo_1Decimal
		   movwf	  R_ContC
R1Decima_BucleExtern
		   movlw	  d'249'
		   movwf	  R_ContA
R1Decima_BucleIntern
           nop
           decfsz     R_ContA,F
           goto		  R1Decima_BucleInterno
		   decfsz	  R_ContB,F
		   goto		  R1Decima_BucleExterno
		   decfsz	  R_ContC,F
		   goto		  R1Decima_BucleExterno2
		   return


 END
salutes :) ^^
espero que puedan ayudarme
 
Última edición por un moderador:
#2
a ver si entiendo , tu problema es que se te apaga los digitos que te representan los seg? y se mantiene el de minutos?. podrías indicarme sobre que estas escribiendo , si es un display o un LCD , detalla un poco mas lo que haces en ASM y yo te doy una mano.
 
#3
presumo que es display en led (no veo libreria de lcd ni rutina para ello), tiene que tener en cuenta que hay que refrescarlo, unas 20 a 26 veces por segundo pero resta presicion al tiempo, tons deberia manejarlo por interrupcion que en asm es otro cuento...
 
#4
gracias por la respuesta.

primero soy hiper novato en esto jajaj recien estamos entrando en tema. es un display de 7 segmentos anodo comun.
como recien estamos empezando lo que tengo qe hacer es que cuente hasta 60 segundos y con lo que me explicaron pude llegar hasta aqu, el problema es que luego de llegar al 9 sigue el 10 es decir que se usa un display mas (queda 1 sin usar de los 3) pero el no se visualiza el 10 sino solo el 1 en el segundo y el cero que tendria que verse en el otro display no aparece
si necesitan mas detalle les cuento todo jejej
saludos!
 
#5
ps no me acurdop mucho de asm, pero no deberia setear trisa y trisb como salidas?
algo asi?
start movlw 0x00 ; load W with 0x00 make port B output (p. 45) tris myPortB ; copy W tristate, port B outputs (p. 58)
 
#6
Clau , primero y principal , para controlar los puertos debes configurar los tris , TRISA y TRISB , cosa que no haces ( vos pones esto , y realmente es TRISA y TRISB)
bsf STATUS,RP0
clrf PORTB
clrf PORTA
bcf STATUS,RP0
luego , en la temporizacion , usas las mismas direcciones de memorias para los registros registros , debes cambiarlos. Usa una direccion distinta para cada registro. Lo mejor que podes hacer es utilizar el comando
CBLOCK , para asignar las direcciones a los registros. y mi consejo es que refresques los display antes de cada segundo , ya que si no vas a notar sutilmente las variaciones de tension en el display
 
#7
gracias por la respuesta.

primero soy hiper novato en esto jajaj recien estamos entrando en tema. es un display de 7 segmentos anodo comun.
como recien estamos empezando lo que tengo qe hacer es que cuente hasta 60 segundos y con lo que me explicaron pude llegar hasta aqu, el problema es que luego de llegar al 9 sigue el 10 es decir que se usa un display mas (queda 1 sin usar de los 3) pero el no se visualiza el 10 sino solo el 1 en el segundo y el cero que tendria que verse en el otro display no aparece
si necesitan mas detalle les cuento todo jejej
saludos!
Hola Amigo, bueno para empezar te diria que, falta declarar los puertos como salida, ademas no es necesario refrescar el puerto A despues de cada RETURN, hazlo una unica vez cuando actualices el sig. digito. El programa es muy extenso a causa de la repetitividad, para ello usa una rutina de "tablas", en el cual declaras una linea tras otra el digito a mostrar segun el valor del registro de "cuentas", usa la instruccion PCL para ello y ademas los registros INDF y FSR. EXitos.-
 
Última edición:
Arriba