# [Problema] Contador Programacion ASM PIC16F84A



## Scottie (May 23, 2011)

Hola, estoy haciendo un proyecto que me está dando dolores de cabeza, y es que ya no se como  ni donde esta el fallo. Necesito un contador de 0 a 99 y que cuando llegue a 99, de un impulso de salida y el circuito se bloquee para siempre (hasta su reseteo). Tbn va mostrando por donde van los pulsos en dos displays.

hice la programacion pero no se donde está el fallo, el proteus lo simula perfectamente, pero a la hora de cargarlo en la pic solo muestra dos ceros en los displays, y no "se da cuenta" de los pulsos (ya que llegar, llegan). programo con mplab y simulo con proteus.

os dejo la programacion a ver si me podeis ayudar:


```
LIST P=16F84A
                         #INCLUDE <P16F84A.INC>
                     __CONFIG	_CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC  
                        CBLOCK 0X0C
						CONT 
						CONT2				
                        CONTADOR 
                        ENDC
						
						ORG 0
INICIO   
						BSF STATUS, RP0                        	
							CLRF PORTB  	 
                          	BSF PORTA,4   	 
							BCF PORTA,0
							BCF PORTA,1
							BCF PORTA,2
                        BCF STATUS, RP0		 
							CLRF CONT2
							CLRF CONT
                         	CLRF CONTADOR
                          CALL VISUALIZA
ARRIBA               BTFSS PORTA,4   		 
                          GOTO PULSO  		 
                          CALL Retardo_50ms
                          BTFSC PORTA,4   	 
                          GOTO PULSO  		 
                          CALL INCREMENTO 	 
NO_PULSO          CALL VISUALIZA 
							BTFSC PORTA,4   
                          GOTO NO_PULSO 	 

PULSO                 	 CALL VISUALIZA 
						GOTO ARRIBA
INCREMENTO       INCF CONT,F 			 
                         INCF CONTADOR,F
                          MOVLW .99 		 
                          SUBWF CONTADOR,W  	 
                          BTFSC STATUS,C  	 
                          GOTO ESCERO


VISUALIZA     MOVF CONT,W
              CALL DISPLAY 		 
              MOVWF PORTB  		 
			  BCF PORTA,0
			  BSf PORTA,0
			  movf CONT2,W
			  CAll DISPLAY
			  MOVWF PORTB
			  BCF PORTA,1
			  BSF PORTA,1
                          RETURN

ESCERO				MOVLW B'11111'
						
						BSF PORTA,0
						BSF PORTA,1
						BSF PORTA,2
						MOVWF PORTA
						SLEEP

DISPLAY              ADDWF PCL,F  
                           RETLW 0X3F                                     
                           RETLW 0X06                                     
                           RETLW 0X5B                                     
                           RETLW 0X4F                                     
                           RETLW 0X66                                     
                           RETLW 0X6D                                     
                           RETLW 0X7D                                     
                           RETLW 0X07                                     
                           RETLW 0X7F                                     
                           RETLW 0X67
                          
			    CLRF CONT
			    incf CONT2
                             RETLW 0X3F                                     
                              RETURN 
                             INCLUDE "C:\Users\Scottie\Documents\RETARDOS.INC" 
                             END
```

en el archivo rar vienen el circuito en proteus, el .hex y el .asm


----------



## Chico3001 (May 23, 2011)

Me parece que "Arriba", deberia estar mas "arriba" ya que una vez que entras al ciclo nunca mas vuelves a actualizar el display....


----------



## Scottie (May 23, 2011)

nunca mas vuelvo a actualizar los displays? :S

se supone como yo lo "entiendo" que entra en "arriba" comprueba si hay pulso, si hay pulso aumenta y muestra, y si no ha tenido pulso pues esta mostrando constantemente lo que tiene en la memoria.


----------



## Chico3001 (May 23, 2011)

Cierto... lo simule de memoria y no me di cuenta que vuelves a llamar a visualiza debajo..... 

Necesitaria instalar el MPLAB para poder realizarle la simulacion completa y ver por que no esta jalando...


----------



## Scottie (May 24, 2011)

me harías un gran favor ^^


----------



## monoturrea (Mar 20, 2013)

Hola estoy haciendo un programita de un contador con pulsador en base a uno publicado en estos foros :



```
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 
LIST P=PIC16F84A
INCLUDE<P16F84A.INC>
 
ORG 0
 
CONTADOR EQU 0CH
RETARDO EQU 0DH
 
Inicio 
bsf STATUS,RP0
clrf TRISB
movlw b'11111111'
movwf TRISA
bcf STATUS,RP0
 
Config_7Seg 
movlw .0
call Binario_7Seg
movwf PORTB
 
Principal
btfss PORTA,0
goto Sumar
 
goto Principal
 
Sumar
btfss PORTA,0
goto Sumar 
incf CONTADOR
movf CONTADOR,W
andlw b'00001111'
call Binario_7Seg
movwf PORTB
goto Principal
 
Binario_7Seg
 
addwf PCL,F
Tabla retlw 3fh
retlw 06h
retlw 5bh
retlw 4fh
retlw 66h
retlw 6dh
retlw 7dh
retlw 07h
retlw 7fh
retlw 67h
retlw 77h
retlw 7ch
retlw 39h
retlw 5eh
retlw 79h
retlw 71h
 
end
```
y quisiera saber cual es la función y para que se usa:
CONTADOR EQU 0CH
RETARDO EQU 0DH
por*-*fa*vor* ayuda es mi parcial de micro


----------



## D@rkbytes (Mar 20, 2013)

monoturrea dijo:


> quisiera saber cual es la función y para que se usa:
> CONTADOR EQU 0CH
> RETARDO EQU 0DH


Son variables usadas por el programa.
Para el PIC16F84A pueden iniciar desde 0x0C
También se pueden declarar así...

CBLOCK 0x0C
CONTADOR
RETARDO
Otra_Variable1
Otra_Variable2
Etc.
ENDC

Ó así...

CBLOCK 0X0C
CONTADOR,RETARDO,Otra_Variable1,Otra_Variable2,Etc.
ENDC

La variable RETARDO no está siendo usada en ese programa y se puede eliminar.
Te sugiero que leas este tema para que aprendas sobre el lenguaje ensamblador para PIC.
*ASM desde 0* (ASM desde cero)


----------



## monoturrea (Mar 20, 2013)

pero.. eso quiero decir que trabaja en ese espacio de memoria en ese caso OCH ?


----------



## D@rkbytes (Mar 20, 2013)

monoturrea dijo:


> pero.. eso quiero decir que trabaja en ese espacio de memoria en ese caso OCH ?


¿Podrías explicarte mejor?. ¿Cual es el problema, ó que requieres saber?


----------



## monoturrea (Mar 20, 2013)

Ya entendi gracias  solo una duda 

aqui:

Principal
btfss PORTA,0
goto Sumar

goto Principal

y que me explices esta parte y ya no molesto mas 

btfss PORTA,0 
goto Sumar 
incf CONTADOR 
movf CONTADOR,W 
andlw b'00001111'
call Binario_7Seg
movwf PORTB
goto Principal


----------



## D@rkbytes (Mar 20, 2013)

Hace esto...

```
Sumar
btfss    PORTA,0            ; Se comprueba si RA0 es 1 ó 0
goto    Sumar            ; Si es 0, regresa a etiqueta Sumar
incf    CONTADOR        ; Si es 1, incrementa la variable CONTADOR
movf    CONTADOR,W        ; Mueve el valor de CONTADOR a W
andlw    b'00001111'        ; Hace una operación AND con el valor de W y b'1111'
call    Binario_7Seg    ; Va a la subrutina de conversión a 7 segmentos 
movwf    PORTB            ; Mueve el valor de la conversión al puerto B
goto    Principal        ; Hace un bucle hasta la etiqueta Principal
```
Suerte.


----------

