TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: asafran en 25 de Abril de 2009, 01:00:33
-
Hola a todos! Necesito el archivo fuente con los includes para hacer un voltimetro amperimetro con lcd, encontre lo que necesito pero tengo un problema:
aca les dejo el link de lo que exactamente necesito (http://www.dtforum.net/index.php?topic=57482.0), el problema es que para hacer las descargas tenes que tener un usuario con cierta cantidad de mensajes, y ya encontre una parte del programa que es esta:
;************************************************************************************
; Programa VOLTIMETRO.ASM FECHA: 17-11-2004
;************************************************************************************
;
; Voltímetro y amperímetro digital implementado con PIC16F819
;
; Autor: Alberto Moreno Tejada
; ***********************************************************************************
LIST P=P16F819
INCLUDE <P16F819.inc>
__CONFIG _INTRC_IO & _PWRTE_ON & _WDT_OFF & _LVP_OFF
CBLOCK 0x20 ; la primera posición de la memoria RAM en
ContaC ; la que se escribe es la 0x20
Temporal_1
Dato_H
Dato_L
MilesI
CentenasI
DecenasI
UnidadesI
ADRESH_Suma
ADRESL_Suma
ADRESH_Old
ADRESL_Old
Umbral
ENDC
; ***********************************************************************************
; Programa principal
;
; ***********************************************************************************
org 0x00 ; vector de reset
goto INICIO
ORG 0x05 ; una posición después del vector de
; interrupción
INICIO bsf STATUS,RP0 ; banco 1
movlw b'01000000' ; selecciona 1 MHz como frecuencia de reloj
movwf OSCCON
bcf STATUS,RP0 ; banco 0
clrf ADRESH_Old
clrf ADRESL_Old
call LCD_Inicializa ; se inicializa la pantalla LCD
PRINCIPAL bsf STATUS,RP0 ; banco 1 de registros
movlw b'10000001' ; se configuran las entradas y salidas
movwf ADCON1 ; del puerto A como digitales
movlw b'00111111' ; se configura el puero A como entradas
movwf TRISA
bcf STATUS,RP0 ; banco 0 de registros
movlw b'10001001' ; se selecciona la entrada de intensidad
movwf ADCON0 ;
Call ConversionAD ; Conversión A/D
call Convierte ; Conversión a BCD
movf BCD_Miles,W ; copia el resultado de la conversión a BCD
movwf MilesI ; de la intensidad a unos registros
movf BCD_Centenas,W ; auxiliares para que no se pierda la
movwf CentenasI ; información al hacer la conversión del
movf BCD_Decenas,W ; voltaje
movwf DecenasI
movf BCD_Unidades,W
movwf UnidadesI
movlw b'10100001' ; Se selecciona la entrada de tensión
movwf ADCON0
call ConversionAD ; conversion A/D
call Convierte ; conversion a BCD
call RestaShunt ; le resta al valor de la tensión el valor
; de la tensión que cae en la resistencia
; shunt
call Visualiza ; se visualizan los datos en la pantalla
goto PRINCIPAL
; ***********************************************************************************
; Subrutina ConversionAD: realiza la conversión anañógica-digital
; hace 4 conversiones y halla la media aritmética
; ***********************************************************************************
ConversionAD
clrf ADRESH_Suma ; borra los registros donde se sumarán
clrf ADRESL_Suma ; los resultados de las conversiones
movlw .4 ; carga 4 en contaC
movwf ContaC
MediaAD
call Retardo_20ms ; retardo de 20 ms
bcf PIR1,ADIF ; se borra el FLAG ADIF
bsf ADCON0,GO ; se da la orden de conversion
ADC_Wait btfss PIR1,ADIF ; esperar hasta que se realice la conversión
goto ADC_Wait
bsf STATUS,RP0 ; banco 1 de registros
movf ADRESL,W ; mueve ADRESL a W
bcf STATUS,RP0 ; banco 0 de registros
addwf ADRESL_Suma,F ; suma la conversion al total acumulado
movf ADRESH,W ; mueve ADRESH a W
btfsc STATUS,C ; comprueba si el resultado de la suma fue
; mayor de FF
addlw 0x01 ; si : suma 1 a W
addwf ADRESH_Suma,F ; no : suma normalmente el número al
; acumulado
decfsz ContaC,F ; decrementa contac y si es 0, sale
goto MediaAD
bcf STATUS,C ; banco 1 de registros
rrf ADRESH_Suma,F ; rota el total acumulado dos veces para
rrf ADRESL_Suma,F ; dividir por 4
bcf STATUS,C ; banco 0 de registros
rrf ADRESH_Suma,F ; rota el total acumulado dos veces para
rrf ADRESL_Suma,F ; dividir por 4
return
; ***********************************************************************************
; Subrutina Restashunt: le resta a la tensión el valor de la tensión que cae en la
; resistencia de 1 ohmio.
; como el valor de la tensión es 10 veces superior, resta las
; unidades de V con las decenas de A
; ***********************************************************************************
RestaShunt
movf DecenasI,W ; mueve decenas de intensidad a W
subwf BCD_Unidades,F ; se lo resta a las unidades de V
movf CentenasI,W ; mueve centenas de I a W
btfsc STATUS,C ; comprueba si el resultado de la resta fue
; menor de cero
goto RestaDecenas ; no: continua con la siguiente resta
movlw 0xF6 ; si: le resta F6 al número e incrementa las
subwf BCD_Unidades,F ; centenas de intensidad
incf CentenasI,W
RestaDecenas
subwf BCD_Decenas,F ; le resta las centenas de intensidad a las
; decenas de V
movf MilesI,W ; mueve los millares de intensidad a W
btfsc STATUS,C ; comprueba si el resultado de la resta fue
; menor de cero
goto RestaCentenas ; no: continua con la siguiente resta
movlw 0xF6 ; si: le resta F6 al número e incrementa los
subwf BCD_Decenas,F ; millares de intensidad
incf MilesI,W
RestaCentenas
subwf BCD_Centenas,F ; le resta los millares de intensidad a las
; centenas de V
btfsc STATUS,C ; comprueba si el resultado es menor de cero
return ; no: retorna
clrf BCD_Unidades ; si: la tensión menos la tensión en la
clrf BCD_Decenas ; resistencia nunca puede ser menor que
clrf BCD_Centenas ; cero. si se diera el caso, el valor de
clrf BCD_Miles ; la tensión como mínimo es cero
return ; retorno
; ***********************************************************************************
; Subrutina Convierte: toma el valor resultante de la conversión, lo multiplica
; por el tamaño del escalón del ADC, lo convierte a BCD y lo
; devuelve
;************************************************************************************
Convierte
movf ADRESH_Suma,w ; Mueve la parte alta de la conversion a
movwf DatoB_H ; DatoB_H
movf ADRESL_Suma,w ; Mueve la parte baja de la conversion a
movwf DatoB_L ; DatoB_L
movlw 0x0C ; tension de referencia = 3146 mV. Mueve primero
movwf DatoA_H ; la parte alta a DatoA_H
movlw 0x4A ; mueve la parte baja de la tensiónd de
movwf DatoA_L ; referencia a DatoA_L
call Mul16x16 ; Subrutina que multiplica DatoA por DatoB
movlw .10 ; carga 10 en temporal
movwf Temporal_1
BUCLE_V bcf STATUS,C ; rota a la derecha para dividir por 1024
rrf DatoD_H,F
rrf DatoD_L,F
rrf DatoC_H,F
rrf DatoC_L,F
decfsz Temporal_1,F ; decrementa temporal, y si llega a cero sale
goto BUCLE_V ; del bucle
movf DatoC_H,W ; mueve la parte alta a BCD_High
movwf BCD_High
movf DatoC_L,W ; la parte baja la mueve a W
call BIN_a_BCD ; hace la conversión a BCD
return
; ***********************************************************************************
; Subrutina Visualiza: se encarga de mostrar en el LCD los valores de tension e
; intensidad
; ***********************************************************************************
Visualiza bsf STATUS,RP0 ; banco 1 de registros
movlw b'00000110' ; configura las lineas del puertoA como
movwf ADCON1 ; digitales
bcf TRISA,0 ; RA0 y RA2 las configura como salidas
bcf TRISA,2
bcf STATUS,RP0 ; banco 0 de registros
call Retardo_20ms ; retardo de 20 ms
call LCD_Linea1 ; cursor al principio de la línea 1
; call LCD_UnEspacioBlanco
movf BCD_Miles,W ; comprueba si las decenas de Voltios son
btfsc STATUS,Z ; cero
goto NOMIL ; es cero : va a NOMIL
call LCD_Nibble ; no es cero: presenta las decenas en
; pantalla
goto SIMIL ; va a SIMIL
NOMIL call LCD_UnEspacioBlanco ; en lugar de las decenas pone un espacio
SIMIL movf BCD_Centenas,W ; mueve las unidades de voltio a W
call LCD_Nibble ; envia el caracter a la pantalla
movlw '.' ; representa el punto decimal
call LCD_Caracter
movf BCD_Decenas,W ; representa las décimas de voltio en la
call LCD_Nibble ; pantalla
movf BCD_Unidades,W ; representa las centésimas de voltio en la
call LCD_Nibble ; pantalla
movlw ' ' ; un espacio en blanco
Call LCD_Caracter
movlw 'V' ; símbolo del voltio
Call LCD_Caracter
Call LCD_DosEspaciosBlancos ; dos espacios en blanco para
; separar la intensidad
movf MilesI,W ; representa las unidades de amperios
call LCD_Nibble
movlw '.' ; punto decimal
call LCD_Caracter
movf CentenasI,W ; representa las décimas de amperio
call LCD_Nibble
movf DecenasI,W ; representa las centésimas de amperio
call LCD_Nibble
movf UnidadesI,W ; representa los miliamperios
call LCD_Nibble
call LCD_UnEspacioBlanco ; un espacio en blanco
movlw 'A' ; símbolo del amperio
call LCD_Caracter ; un espacio en blanco
call LCD_UnEspacioBlanco
Call LCD_Linea2 ; Se situa al comienzo de la línea 2
movlw Mensaje0 ; envia al LDC un mensaje personalizable
call LCD_Mensaje ; en la tabla Mensaje0
return
; ***********************************************************************************
Mensajes addwf PCL,F
Mensaje0 DT"Made by Alberto!" ,0x00 ; mensaje personalizable que se
; muestra en al linea 2 del LCD
INCLUDE <LCD_4BIT.INC>
INCLUDE <RETARDOS.INC>
INCLUDE <BIN_BCD_2.INC>
INCLUDE <LCD_MENS.INC>
INCLUDE <PRODUCTO16.INC>
END
; ***********************************************************************************
El problema es que me faltan los includes... este programa dicen que viene de la revista resistor fasciculo 225.
Es exactamente esto lo que preciso: voltimetro amperimetro con lcd 16 x 2 para ponerle a una fuente que armé.
Asi que si alguien se las ingenia para sacar esos archivos de ese tema que puse en el link se lo voy a agradecer eternamente.
muchas gracias a todos espero ayuda con el tema...
-
Hola asafran, mira justo en este link encontraras lo que buscabas creo que sera suficiente para que logres sacar adelante tu proyecto
proyecto (http://www.todopic.com.ar/foros/index.php?action=globalAnnouncements;id=1)
saludos :)
-
nada más necesito descargar los archivos de esa pagina, y como no puedo, le pido a alguien que tenga la posibilidad si me puede subir el zip que está ahi, no que me fabriquen el programa o que me armen el proyecto (porque ya está armado en ese lugar) y creo que no es demasiado esfuerzo ni es pretender que alguien de aca me arme el trabajo.
Serán bienvenidas todas las ironias, pero si alguien tiene la posibilidad de pasarme eso que necesito que esta en ese lugar específico será más bienvenido aún.
-
hola asafran, y a todos en el foro, asafran te suplico el favor de que me envies las subrutinas, PRODUCTO16.INC y la BIN_CD_2.INC, ya que las necesito de manera muy pero muy urgente te garadezco que me las envies lo mas proto posible por favor,
-
buena recomendacion :)
:-/ :-/
-
Saludos...
Tengo una duda, he intentado sin exito aunmentar la resolucion a 10bits, he capturado los registros de AdresH y AdresL y los multiplico por la resolucion a 1023, y solo consigo un voltaje de 0 a 3.2voltios... agradeceria mucho algu tip para solucionar este problema....
Gracias
-
Hola Pupuchin.
Deberías portear el código para poder ayudarte.
-
Saludos...
Gracias Leon Pic
aqui esta el codigo, espero puedan encontar el error..
;----------------------------------------------------------------\\\
LIST P=16F877
INCLUDE <P16F877.INC>
INCLUDE <MACROS.INC>
CBLOCK 0x20
ENDC
ORG 0
call inicio_LCD
CURSOR OFF
mov ADCON0,B'10101001'
; ADCS1:0=10 32Tosc/CH - 5=101/ 0=Go/Done /0=na /ON/ T = 1.6 us
banco 1
mov ADCON1,B'01001000'
banco 0
;ADFM=justificacion a la derecha
;ADCS2=1 , 64Tosc/RA3=Vref+ ,RA2=Vref- y 5 Chanel disponibles
REPITE
bsf ADCON0,GO ;INICIO DE CONVERSION
btfsc ADCON0,GO ;¿FIN?
goto $-1
;ADRESH y ADRESL ;obtiene muestreo a 10bits
;----------------------------------------------
movr AARGB0,ADRESH ;se carga la parte alta
movr AARGB1,ADRESL ;se carga la parte baja
mov BARGB0,B'10111110' ;se carga la parte MSB
mov BARGB1,B'11101100' ;se carga la parte LSB
call MUL16X16_U
;Salida (32): *
; AARGB0 (MSB), AARGB1 , *
; AARGB2 , AARGB3 (LSB) *
; DATOC_H (MSB) - DATOC_L
; DATOB_H - DATOB_L (LSB);
movr DATOC_H,AARGB0;MSB
movr DATOC_L,AARGB1;
movr DATOB_H,AARGB2;
movr DATOB_L,AARGB3; LSB
call BITS32_BCD
call BCD32TOASC
;SALIDA:
; (+) ASCII1,ASCII2,ASCII3,ASCII4,ASCII5
; ,ASCII6,ASCII7,ASCII8,ASCII9,ASCII10(-)
;-----------------------------------
CLS
PUTC 'V'
PUTC '='
PUTC ' '
PUTV ASCII1
PUTC '.'
PUTV ASCII2
PUTV ASCII3
PUTV ASCII4
PUTV ASCII5
PUTV ASCII6
PUTV ASCII7
PUTV ASCII8
PUTV ASCII9
PUTV ASCII10
PUTV ' '
PUTC 'v'
delay_ms .50
goto REPITE
INCLUDE <MATH_877.INC>
INCLUDE <LCD.ASM>
INCLUDE <RETARDO.ASM>
INCLUDE <ARITH.ASM>
END
;-------------------------------------------------------------------
y esta es mi rutina para multiplicar 16x 16
;----------------------------------------------------------------
;**********************************************
; RUTINA DE MULTIPLICACION DE 16X16 SIN SIGNO *
; Entrada(16): *
; Primer Numero: AARGB0 (8) - MSB *
; Primer Número: AARGB1 (8) - LSB *
; Entrada (16): *
; Segundo Número: BARGB0 (8) - MSB *
; Segundo Número: BARGB1 (8) - LSB *
; Salida (32): *
; AARGB0 (MSB), AARGB1 , *
; AARGB2 , AARGB3 (LSB) *
; Llamar: *
; CALL MUL16X16_U *
;**********************************************
UMUL1616L MACRO
MOVLW 0x08
MOVWF LOOPCOUNT
LOOPUM1616A
RRF BARGB1, F
BTFSC STATUS,C
GOTO ALUM1616NAP
DECFSZ LOOPCOUNT, F
GOTO LOOPUM1616A
MOVWF LOOPCOUNT
LOOPUM1616B
RRF BARGB0, F
BTFSC STATUS,C
GOTO BLUM1616NAP
DECFSZ LOOPCOUNT, F
GOTO LOOPUM1616B
CLRF AARGB0
CLRF AARGB1
RETLW 0x00
BLUM1616NAP
BCF STATUS,C
GOTO BLUM1616NA
ALUM1616NAP
BCF STATUS,C
GOTO ALUM1616NA
ALOOPUM1616
RRF BARGB1, F
BTFSS STATUS,C
GOTO ALUM1616NA
MOVF TEMPB1,W
ADDWF AARGB1, F
MOVF TEMPB0,W
BTFSC STATUS,C
INCFSZ TEMPB0,W
ADDWF AARGB0, F
ALUM1616NA
RRF AARGB0, F
RRF AARGB1, F
RRF AARGB2, F
DECFSZ LOOPCOUNT, F
GOTO ALOOPUM1616
MOVLW 0x08
MOVWF LOOPCOUNT
BLOOPUM1616
RRF BARGB0, F
BTFSS STATUS,C
GOTO BLUM1616NA
MOVF TEMPB1,W
ADDWF AARGB1, F
MOVF TEMPB0,W
BTFSC STATUS,C
INCFSZ TEMPB0,W
ADDWF AARGB0, F
BLUM1616NA
RRF AARGB0, F
RRF AARGB1, F
RRF AARGB2, F
RRF AARGB3, F
DECFSZ LOOPCOUNT, F
GOTO BLOOPUM1616
ENDM
MUL16X16_U
CLRF AARGB2
CLRF AARGB3
MOVF AARGB0,W
MOVWF TEMPB0
MOVF AARGB1,W
MOVWF TEMPB1
UMUL1616L
RETLW 0x00
;----------------------------------------------------------------
Gracias