Circuitos Digitales - Ayuda con assembler en pic

 
Vista:
Imágen de perfil de Chriska

Ayuda con assembler en pic

Publicado por Chriska (1 intervención) el 29/09/2015 01:31:08
Hola, estoy haciendo un contador de 00 a 99, con un pulsador conectado a la patita rb0 y los displays en ra0, cuando ra0 es 1 muestra unidad y cuando es 0 muestra decena. Compila perfectamente en mplab, pero en proteus me muestra la siguiente simulación:

proteuss

Codigo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
org		0x00
		goto	INICIO
		org		0x04
INTERRUPCION:
		btfss	INTCON,1 ;Chequea el bit 1 de INTCON
		retfie
CONTAR:
		incf	ContUnidad ;Incremento el contador
		movlw	d'10' ;Le asigno 10 a w
		subwf	ContUnidad,W ;Hago una resta entre el contador y lo que hay en W.
		btfsc	STATUS,Z ;z=0 salta, z=1 limpia el contador.
		goto	FLAG
		goto 	LIMPIAR_UNIDAD ;Va a reiniciar el contador de unidad.
CONTAR_DECENA:
		incf	ContDecena,F ;Incremento el contador de decena.
		movlw	d'10' ;Le asigno 10 a w
		subwf	ContDecena,W ;Realiza una resta.
		btfsc	STATUS,Z ; z=0 salta, z=1 limpia el contador.
		goto	FLAG
		clrf	ContDecena ;Limpia contador decena.
		goto	FLAG
LIMPIAR_UNIDAD:
		clrf 	ContUnidad ;Limpia el contador de unidad.
		goto 	CONTAR_DECENA ;Va a la subrutina del contador de decena.
FLAG:
		bcf		INTCON,1 ;Pone en cero el flag del pin RB0
		retfie ;y sale de la rutina de interrupción.
;-------------------------------------------
INICIO:
		Banco1
		bsf		OPTION_REG,7 ;Se activa el pull-up
		bcf		OPTION_REG,6 ;Se pone en 0 el bit 6 del reg. Option eligiendo flanco ascendente
							 ;para la interrupción del pin RB0.
		movlw 	0x07
		movwf 	CMCON
		movlw	0x01 ;Inidicamos que el puerto 0 de trisa y trisb será de salida
		movwf	TRISA
		movwf	TRISB
		Banco0
		bsf		INTCON,7 ;Se pone a 1 el bit 7 del registro intcon que activa las interrupciones
						 ;globales.
		bsf		INTCON,4 ;Se pone a 1 el bit 4 del reg, Intcon activando las interrupciones
						 ;por pin RB0.
		clrf	ContUnidad ;Inicia contador unidad en cero.
		clrf	ContDecena ;Inicia contador unidad en cero.
 
;--------------------------------------------------
PROGRAMA:
		movf 	ContUnidad,W ;Mueve lo que hay en ContUnidad a w.
		call 	TABLA_VALORES ;Busca el valor de W en la tabla.
		movwf 	PORTB ;Lo muestra en el puerto b.
		DisplayUni ;Pone a RA0 en 1
		call 	RETARDO ;Realiza un retardo
SALIDA1:
		movf	ContDecena,W
		call 	TABLA_VALORES
		movwf 	PORTB
		DisplayDec ;Pone a RA0 en 0
		call	RETARDO2
;-----------------------------------------------------
TABLA_VALORES:
		addwf	PCL,W
		retlw 	b'1111110' ;0
		retlw 	b'0110000' ;1
		retlw 	b'1101101' ;2
		retlw 	b'1111001' ;3
		retlw 	b'0110011' ;4
		retlw 	b'1011011' ;5
		retlw 	b'1011111' ;6
		retlw 	b'1110000' ;7
		retlw 	b'1111111' ;8
		retlw 	b'1110111' ;9
;---------------------------------------------------

NECESITO AYUDA, por favor!!
Y GRACIAS.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
1
Responder
Imágen de perfil de Alejandro

Implementación de un contador de 00 a 99 con PIC 16F88 y problemas de simulación en Proteus

Publicado por Alejandro (117 intervenciones) el 29/08/2023 18:10:55
Veo que estás intentando implementar un contador de 00 a 99 utilizando un PIC 16F88. Tu código parece estar bien estructurado, pero es posible que el problema que estás enfrentando en Proteus se deba a configuraciones o detalles en la simulación.

Dado que ya tienes experiencia en programación y has proporcionado un código completo, aquí hay algunas sugerencias para revisar y verificar:

1. Configuración de temporizadores: Puede que necesites configurar temporizadores en tu código para lograr los intervalos de tiempo deseados para cambiar entre las unidades y las decenas. Verifica que tus temporizadores estén configurados correctamente y estén generando las interrupciones necesarias para controlar el cambio de unidades y decenas.

2. Configuración del oscilador: Asegúrate de que la configuración del oscilador en tu código esté ajustada correctamente para la frecuencia en la que estás trabajando.

3. Conexiones en Proteus: Verifica que las conexiones entre los componentes en Proteus estén configuradas correctamente. Asegúrate de que los pines del PIC y los displays estén conectados adecuadamente y que las entradas/salidas coincidan con las definiciones en tu código.

4. Retardos: En tu código, veo que utilizas las subrutinas RETARDO y RETARDO2. Asegúrate de que estos retardos estén configurados de manera adecuada para generar los intervalos de tiempo deseados.

5. Simulación: Cuando estás simulando en Proteus, asegúrate de que los botones y las señales de entrada se estén controlando de manera adecuada para simular el flujo de ejecución de tu programa.

6. Instrucciones de display: Verifica que las instrucciones en las subrutinas DisplayUni y DisplayDec estén controlando adecuadamente los pines del display y estén reflejadas en la simulación.

7. Pulsador: Asegúrate de que el pulsador en Proteus esté configurado correctamente para generar interrupciones en el pin RB0.

Si después de revisar estos aspectos aún tienes problemas en la simulación, te recomiendo hacer pruebas más detalladas en Proteus, utilizando trazas y depuración, para identificar el punto exacto donde podría estar ocurriendo el problema. También podrías buscar ejemplos específicos de configuración para el PIC 16F88 en Proteus para asegurarte de que las configuraciones estén ajustadas correctamente.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar