Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

03/08/2012 #1


Ayuda a programar pic16f876a
Buenas a todos soy novato con el pic16f876a. y quiero realizar un proyectito, pero entre en la confusión les explico:
Necesito 2 entradas analógicas las cuales tendrán conectadas 2 transformadores de corriente no invasivos, es decir me entregaran una salida en tensión correspondiente a la corriente de consumo de la línea, por lo tanto para poder obtener el valor real y mostrarlo en el LCD necesito multiplicar los Bits de los registros ADRESH y ADRESL con la resolución que es de 1 bits * 5 mv y luego multiplicarlo por la razón de transformación que es de 12 veces, es decir:

1 bits * 5 mv * 12 veces = consumo de la línea.

Entonces tengo la duda como realizar las multiplicaciones y luego mostrarlas a un LCD, estaría completamente agradecido si alguien me echa una manito..

Muchas gracias.
03/08/2012 #2

Avatar de Daniel Meza

En la página de microchip viene muchos ejemplos de algoritmos para realizar las multiplicaciónes, que básicamente son sumas sucesivas. Otra opción es implementar el proyecto con la serie 18f, estos traen el multiplicador incorporado en su hardware.
03/08/2012 #3


Pero al ser sumas sucesivas el dato como seria, ya que en el moemnto maximo obtendra el bit 255 del ADRESL y multiplicado por 5 y luego por 12 eso seria: 15300 ese valor calsara una variable o un registro... esa es mi duda.
03/08/2012 #4

Avatar de Daniel Meza

eso lo debes de prever en el algoritmo... busca en el foro, se ha tratado ya este tema, para empezar te dejo el siguiente link

Multiplicacion y division 16f84
03/08/2012 #5


Ok, gracias...

Pero si yo realizo la multiplicacion completa y luego la guardo en un registro XX no tendre problemas por el numero (que en decimal es mas grande)
03/08/2012 #6

Avatar de Daniel Meza

seguramente... lo más conveniente es usar varios registros para almacenar el número, primero tienes que ver cual es la cantidad más grande que se generará resultado de la multiplicación y en base a eso eliges el número de bytes donde se almacenará y también el formato en que los número se guardarán: en binario puro o en código BCD.
Lo más sencillo es hacer el algoritmo para multiplicación con números BCD, es básicamente seguir el proceso que se hace con lápiz y papel e ir generando resultados parciales para a final sumarlos todos y generar el resultado total
16/08/2012 #7


Estimado gracias pero es posible que pueda revisar el programa ...

Código:
		LIST		P=16F876A
		INCLUDE		<P16F876A.INC>

BYTEALTO_1			EQU		0X20
BYTEBAJO_1			EQU		0X21
BYTEALTO_2			EQU		0X22
BYTEBAJO_2			EQU		0X23
BYTEALTO_3			EQU		0X24
BYTEBAJO_3			EQU		0X25
CONTADOR			EQU		0X26
CONSUMO_1			EQU		0X27
CONSUMO_11			EQU		0X28
CONSUMO_2			EQU		0X29
CONSUMO_22			EQU		0X30
CONSUMO_3			EQU		0X31
CONSUMO_33			EQU		0X32

		ORG			0X00
		BCF			STATUS,IRP
		BCF			STATUS,RP1			;BANCO 0 O 1
		BSF			STATUS,RP0			;BANCO 1
		MOVLW		B'10000100'			;JUSTIFICADO A LA DERECHA, RA0,1,3 ANALOGO, VDD, VSS
		MOVWF		ADCON1
		BCF			STATUS,RP0			;BANCO 0	
		MOVLW		B'1000001'			;CANAL 0, MODULO HABILITADO
		MOVWF		ADCON0	
		CALL		DEMORA_20US			; DEMORA DE ADQUISICION
		BSF			ADCON0,GO			; PONE EN MARCHA LA ADQUICICION
		CALL		DATO1
		MOVLW		B'10001001'			;CANAL 1, MODULO HABILITADO
		CALL		DEMORA_20US			; DEMORA DE ADQUSISCION
		BSF			ADCON0,GO			;PONE EN MARCHA LA ADQUSICION
		CALL		DATO2
		MOVLW		B'10011001'			;CANAL3, MODULO HABILITADO
		MOVWF		ADCON0
		CALL		DEMORA_20US			;DEMORA DE ADQUSICION
		BSF			ADCON0,GO			;PONE EN MARCHA LA ADQUISICION
		CALL		DATO3
Mul_1
		DECF		BYTEBAJO_1,1		;DECREMENTA EL VALOR
		CLRW
		ADDLW		B'00011110'			;SUMO 30 QUE ES LA RESOLUCION Y LA RAZON DE TRANSFORMACION
		MOVF		C,CONSUMO_11		;MUEVO EL CARRIE A FINAL DEL VALOR ALTO (error)
		BTFSC		BYTEBAJO_1			; CONSULTA POR SI EL REGISTRO LLEGO A CERO.
		GOTO		Mul_1				; VUELVE A MULTIPLICAR
Mul_2	
		MOVWF		CONSUMO_1			;DESPLAZAMOS LOS VALORES A NUEVO REGISTRO	
		DECF		BYTEALTO_1,1		;DECREMENTA EL VALOR
		CLRW
		ADDLW		B'00011110'			;SE SUMA 30 QUE ES LA RESOLUCION Y LA RAZON DE TRANSFORMACION
		BTFSC		BYTEALTO_1			; CONSULTA POR SI EL REGISTRO LLEGO A CERO
		GOTO		Mul_2
		ADDWF		CONSUMO_11,1		;SUMO EL CARRIE CON LA MULTIPLICACION Y LO GUARDO EN EL REGISTRO.
Mul_3
		DECF		BYTEBAJO_2,1		;DECREMENTA EL VALOR
		CLRW
		ADDLW		B'00011110'			;SUMO 30 QUE ES LA RESOLUCION Y LA RAZON DE TRANSFORMACION
		MOVF		C,CONSUMO_22		;MUEVO EL CARRIE A FINAL DEL VALOR ALTO
		BTFSC		BYTEBAJO_2			; CONSULTA POR SI EL REGISTRO LLEGO A CERO.
		GOTO		Mul_3				; VUELVE A MULTIPLICAR
Mul_4	
		MOVWF		CONSUMO_2			;DESPLAZAMOS LOS VALORES A NUEVO REGISTRO	
		DECF		BYTEALTO_2,1		;DECREMENTA EL VALOR
		CLRW
		ADDLW		B'00011110'			;SE SUMA 30 QUE ES LA RESOLUCION Y LA RAZON DE TRANSFORMACION
		BTFSC		BYTEALTO_2			; CONSULTA POR SI EL REGISTRO LLEGO A CERO
		GOTO		Mul_4
		ADDWF		CONSUMO_22,1		;SUMO EL CARRIE CON LA MULTIPLICACION Y LO GUARDO EN EL REGISTRO.		
Mul_5
		DECF		BYTEBAJO_3,1		;DECREMENTA EL VALOR
		CLRW
		ADDLW		B'00011110'			;SUMO 30 QUE ES LA RESOLUCION Y LA RAZÓN DE TRANSFORMACION
		MOVF		C,CONSUMO_33		;MUEVO EL CARRIE A FINAL DEL VALOR ALTO
		BTFSC		BYTEBAJO_3			; CONSULTA POR SI EL REGISTRO LLEGO A CERO.
		GOTO		Mul_5				; VUELVE A MULTIPLICAR
Mul_6	
		MOVWF		CONSUMO_3			;DESPLAZAMOS LOS VALORES A NUEVO REGISTRO	
		DECF		BYTEALTO_3,1		;DECREMENTA EL VALOR
		CLRW
		ADDLW		B'00011110'			;SE SUMA 30 QUE ES LA RESOLUCION Y LA RAZON DE TRANSFORMACION
		BTFSC		BYTEALTO_3			; CONSULTA POR SI EL REGISTRO LLEGO A CERO
		GOTO		Mul_6
		ADDWF		CONSUMO_33,1		;SUMO EL CARRIE CON LA MULTIPLICACION Y LO GUARDO EN EL REGISTRO.		
DATO1
		BTFSC		ADCON0,GO			;ESPERA QUE TEMINE LA CONVERCION
		GOTO		DATO1
		MOVF		ADRESH,W			;MOVEMOE EL RESULTADO DE LA CONVERCION (ALTO)
		MOVWF		BYTEALTO_1			;SE GUARDA LO OBTENIDO
		BSF			ESTATUS,RP0			;BANCO 1
		MOVF		ADRESL,W			;MOVEMOS EL RESULTADO DE LA CONVERSON (BAJO)
		MOVWF		BYTEBAJO_1			;SE GUARDA LO OBTENIDO
		BCF			ESTATUS,RP0			;BANCO 0
		BSF			ADCON0,ADON			;APAGA EL MODULO DE CONVERCION.
DATO2
		BTFSC		ADCON0,GO			;ESPERA QUE TEMINE LA CONVERCION
		GOTO		DATO2
		MOVF		ADRESH,W			;MOVEMOE EL RESULTADO DE LA CONVERCION (ALTO)
		MOVWF		BYTEALTO_2			;SE GUARDA LO OBTENIDO
		BSF			ESTATUS,RP0			;BANCO 1
		MOVF		ADRESL,W			;MOVEMOS EL RESULTADO DE LA CONVERSON (BAJO)
		MOVWF		BYTEBAJO_2			;SE GUARDA LO OBTENIDO
		BCF			ESTATUS,RP0			;BANCO 0
		BSF			ADCON0,ADON			;APAGA EL MODULO DE CONVERCION.
DATO3
		BTFSC		ADCON0,GO			;ESPERA QUE TEMINE LA CONVERCION
		GOTO		DATO3
		MOVF		ADRESH,W			;MOVEMOE EL RESULTADO DE LA CONVERCION (ALTO)
		MOVWF		BYTEALTO_3			;SE GUARDA LO OBTENIDO
		BSF			ESTATUS,RP0			;BANCO 1
		MOVF		ADRESL,W			;MOVEMOS EL RESULTADO DE LA CONVERSON (BAJO)
		MOVWF		BYTEBAJO_3			;SE GUARDA LO OBTENIDO
		BCF			ESTATUS,RP0			;BANCO 0
		BSF			ADCON0,ADON			;APAGA EL MODULO DE CONVERCION.


Bucle
		goto	Bucle

;**** Demora ****
DEMORA_20US
		movlw 	0x05 ;
		movwf 	Contador ; Iniciamos contador1.-
Repeticion
		decfsz 	Contador,1 ; Decrementa Contador1.-
		goto 	Repeticion ; Si no es cero repetimos ciclo.-
		return 				; Regresa de la subrutina.-

end
me aparece que tengo problemas en ocupar los bancos al compilar porfa ayuda...
17/08/2012 #8

Avatar de Daniel Meza

Me salen varios errores al compilar..
1-El registro "ESTATUS" cámbialo por "STATUS"
2-En la instrucción "BTFSC BYTEALTO_2" se debe de especificar el bit que se va a examinar, por
ejemplo btfsc BYTEALTO_2,.5, esta instrucción es para examinar el estado del bt 5 de ese registro
3-MOVF C,CONSUMO_33, no puedes mover el estado de un solo bit a un registro completo. En tal caso puedes copiar el estado del registro completo STATUS a RAM


Ahora para el mensaje:

Message[302] C:\MPLAB\PIC16F\UNTITLED.ASM 110 : Register in operand not in bank 0. Ensure that bank bits are correct.
coloca delante de cada registro por encima del banco 1 la notación ^0x(inicio del bloque), por ejemplo para el registro ADRESL la sintaxis sería

movwf ADRESL^0x80,W ;La notación ^0x80 declara al registro ADRESL por encima de la dirección 0x80, para el banco 2 seía ^0x100 y así sucesivamente
17/08/2012 #9


Ok, muchas gracias realizare lo sugerido y te comento... ahora bien otra consulta, es sierto que tendre 2 registro, es decir:

Consumo_1 y Consumo_11
Consumo_2 y Consumo_22
Consumo_3 y Consumo_33

Estos registro me muestran el valor en 16 bit, entonces como lo realizao para luego mostrarlo en un LCD de 16x2.... Como concateno estos don valores para poder decir: "El consumo es: 'Consumo_1&Consumo_11'" = EL consumo es: 18000, ya que tendo los siguiente, la razon de transformacion del tranformador es de 6 y 1 bit posee resolucion de 5 mv entonces mi resultado final sera: consumo = Bit * 6 *5 por lo tanto en cada movimiento del programa multiplico por 30 para elevar mi valor entonces mi rango va desde 0 bit a 0 Amp y 1024 bit a 30.720 Amp. como puedo visualizar esto en el LCD.
17/08/2012 #10

Avatar de Daniel Meza

Te recomiendo en este caso convertir el valor que tienes a BCD, de esta manera con solo sumarle 0x30 a cada número obtendrás el código ASCII para cada número y así te será más fácil mostrarlo en el LCD. Una forma de facilitar los cálculos es trabajar directamente las operaciones en BCD
18/08/2012 #11


Pero como realizo la converción en assembler.
18/08/2012 #12


buenas sigo con el programa.... necesito saber si esto esta bien para poder detectar si el valor es menor o mayor al literal....

Código:
SIG	
		MOVF		CONSUMO_1,0			;MUEVO EL VALOR DE CONSUMO A W
		SUBLW		B'10001000'			;SE REALIZA LA RESTA PRIMARIA.
		BTFSC		STATUS,C			;CONSULTO POR CARRIE
		GOTO		NUM_MAYOR			;EL VALOR ES MAYOR
		GOTO		VALOR2				;EL VALOR ES MENOR
VALOR2
		MOVF		CONSUMO_11,0		;MUEVO EL VALOR A W
		SUBLW		B'00010011'			;SE REALIZA LA SEGUNDA RESTA
		BTFSC		STATUS,C			;CONSULTO POR CARRIE
		GOTO		NUM_MAYOR			;EL VALOR ES MAYOR
		GOTO		NUM_MENOR			;EL VALOR ES MENOR
NUM_MENOR
		MOVLW		B'00000001'			;MUEVO A W EL LITERAL
		MOVWF		PORTB				;MUEVO EL LITERAL AL PUERTO B
NUM_MAYOR
		MOVLW		B'00000010'			;MUEVO A W EL LITERAL
		MOVWF		PORTB				;MUEVO EL LITERAL AL PUERTO B	
gracias por la ayuda pero recuerden que el valor corresponde a 2 registros...
Respuesta
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.