pic 16f84a subrutina binario a bcd

Hola como estan, bueno como veran soy nuevo en el foro, y tambien en la electronica. Estoy empezando con el tema de los pics programando el 16f84. tengo un problema y es que no puedo hacer andar una subrutina que convierte un valor binario a un bcd, el problema no es el codigo, de hecho el programa anda, lo que no anda es cuando pego la rutina en un archivo inc y despues la llamo desde mi programa:

se genera problema cuando dentro de la libreria uso las variables de esta forma:

cblock
var1
var2
var3
endc

por lo que tengo entendido y por logica no se pueden direccionar posiciones concretas.

ahora bien, si yo uso cblock y endc la subrutina hace cualquier cosa (en el simulador no se reconocen las variables del bloque y el contador de programa se carga con cualquier valor), y si pego la subrutina en el programa y a esas variables las direcciono directamente el programa anda bien, a que se debe esto? aclaro que en el archivo inc el unico codigo que hay es el del bloque de variables y el codigo, no puse la etiqueta end al final, lo hago en el programa.
espero haber sido claro, saludos.
 
posiblemente estas definiendo una direccion erronea para el cblock, que hace que comienze a asignar variables en localidades ocupadas o que se salga del area de registros generales...
 
hola mira te pego el codigo por favor si ves algo de lo que no me doy cuenta avisame:

Código:
LIST		P=16F84A
INCLUDE	<P16F84A.INC>

__CONFIG	_CP_OFF	&	_WDT_OFF	&	_PWRTE_ON	&	_XT_OSC
			


		bsf	STATUS,RP0	
		movlw	b'00011111'
		movwf	TRISA
		movlw	b'00000000'
		movwf	TRISB
		bcf	STATUS, RP0

	inicio						
		movf	PORTA, 0
		call	BIN_a_BCD   ;llama a subrutina
		movwf	PORTB
		goto	inicio

INCLUDE	<D:\Pic16f84A\librerias\BIN_BCD.INC>

_______________en el archivo inc________________________
                          CBLOCK					
		BCD_Centenas			
		BCD_Decenas		
		BCD_Unidades	
		ENDC


	BIN_a_BCD
		clrf	BCD_Centenas				
		clrf	BCD_Decenas				
		movwf	BCD_Unidades			
	BCD_Resta10
		movlw	d'10'					
		subwf	BCD_Unidades,W		
		btfss	STATUS,C				
		goto 	BIN_BCD_Fin			
	BCD_IncrementaDecenas
		movwf	BCD_Unidades			
		incf	BCD_Decenas,F				
		movlw	d'10'					
		subwf	BCD_Decenas,W		
		btfss	STATUS,C				
		goto	BCD_Resta10			
	BCD_IncrementaCentenas			
		clrf	BCD_Decenas				 
		incf	BCD_Centenas,F			
		goto	BCD_Resta10			
	BIN_BCD_Fin
		swapf	BCD_Decenas,W		
		addwf	BCD_Unidades,W		
		return

donde puede estar el problema?saludo
 
Última edición por un moderador:
EEEfectivamente... en el CBLOCK no estas asignando una direccion de inicio y de seguro el compilador esta mandando las variables a donde se le pega la gana...

En el PIC16F84 la memoria de uso general comienza en la direccion 0x0Ch asi que si no usas otras variables en tu programa princpial debes colocar el CBLOCK de esta forma

CBLOCK 0x0C

Si estas usando mas variables entonces vas a tener que ajustar el CBLOCK para que no interfiera con tus otras variables...

Saludos...
 
Esssooo essss!!. Una consecuencia derivada de usar archivos include con CBLOCKS. La mejor metodologia es empezar los CBLOCKS en el programa principal y dejar los CBLOCKS sin iniciar (como hizo sdel) en los include.

Aunque lo mejor es dejar todo el codigo en un solo programa, asi no pasan estas cosas.
Saludos
 
haaaa k bien gracias o sea que en el programa principal tengo que hacer asi?

CBLOCK 0x0C

ENDC


o esto lo hago en el archivo inc?

gracias tecogirl y chico3001 saludo
 
1. En el principal inicializas CBLOCK, ej CBLOCK 0x0C
2. En los include no los inicializas, solo los declaras, ej:
CBLOCK
var1
var2
....
ENDC

Pero no te hagas un lio, pon todo el codigo en uno solo archivo.
Saludos
 
bien, gracias tecnogirl, si, usando todo en un solo codigo anda bien, lo que pasa es que queria armar una libreria de las funciones que pueda usar en otros programas, saludos y gracias
 
Atrás
Arriba