TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: hernando2999 en 24 de Enero de 2006, 23:04:00
-
HOLA AMIGOS...
LES CUENTO QUE ESTOY PROGRAMANDO EN ASM CON MPLAB PARA EL PIC 16F873 Y PUES QUE ASI MISMO CON EL CONVERSOR ANALOGO ....UTILIZO UN POT PARA VARIAR LA ENTRADA ANALOGA... BUENO LES CUENTO COMO ESTOY ... LA COMVERSION LA ESTOY HACIENDO A 10BIT EN LA CUAL QUIERO UNA RESOLUCION DE RESOLUCION=VREF/1024 =150/1024 =14.64mV...BUENO ME PASA LO SIGUIENTE... EN LA PARTE DE VISUALIZACION DE VALORES EN LOS DISPLAY ESTA MUY BIEN ... PASO BINARIO A BCD PARA MOSTRAR POR VARRIDO VALORES EN CADA DISPLAY... ESTO OK...
AHORA EL PROBLEMA
RESULTA QUE LLAMO LA CONVERSION Y MUESTRO EL ADRESH Y EL ADRESL EN LOS DISPLAY ... LO MINIMO 0 0 0 0 LO MAX 3 2 5 5 EN LOS DISPLAY... AHORA SE QUE DEBO MUUTIPLICAR EL (ADRESH Y ADRESL) X RESOLUCION OSEA : (ADRESH Y ADRESL) X (VREF/1024) ASI OBTENDRE COMO MINIMO 0 0 0 0 Y COMO MAXIMO 150.0 EN LOS DISPLAY .... OK
BIEN RESULTA QUE ME CONSEGUI UNAS LIBRERIAS DE ARITMETICAS.... Y ESTOY INTENTANDO HACERLO (LO DE LAS MULTIPLICACIONES) PERO RESULTA QUE ESTAS MANEJAN REGISTROS DE HASTA 32BITS.... Y PUES COMO SABRAN QUEDO FRITO YA HE PROGRAMADO Y REPROGRAMADO Y NO DOY CON EL CHISTE ....
ALGUIEN DE USTEDES AH TENIDO ESTA EXPERIENCIA Y LA HA SOLUCIONADO... NECESITO UN EJEMPLO DE COMO PASAR UNA CONVERSION DE 10BIT X RESOLUCION A CUATRO DISPLAY DE SIETE SEGMENTOS....
ESPERO UNA REAL AYUDA ... POR FAVOR NO ME ENREDEN LA PITA...
SALUDOS
-
Hola. Como es esto?
Necesitas multiplicar 10 bits(del ADC) por cuantos bits?? no entendi bien...perdona pero a estas horas ando lento



Y a ver si me explicas ese maximo de 3255 de donde sale
que me perdi algo sino...
Exitos.
-
HOLA GRACIAS POR RESPONDER ....MIRA
SI HAGO LA CONVERSION A 10 BITS TENDRE DOS REGISTROS UNO DE 8BIT Y OTRO DE 2BIT LOS CUALES SON EL ADRESH Y EL ADRESL EN DONDE ESTA EL VALOR DE LA CONVERSION... BUENO COMO SON 10 BIT ENTONCES EL BALOR MAXIMO EN LA CONVERSION ES 1024 QUE ESTA EN LOS MISMOS REGISTROS ADRESH Y ADRESL EN DONDE 3 ES EL VALOR MAS SIGNIFICATIVO Y 255 EL MENOS SIGNIFICATIVOS
11 11111111
3 255
V
1024
RESULTA QUE PARA PASAR EL VALOR DE LA CONVERSION A UN LENGUAJE HUMANO ... OSEA VOLTAJE, CORRIENTE TEMPERATURA....ETC .SE DEBE MULTIPLICAR EL VALOR DE LA CONVERSION POR LA RESOLUCION EN MI CASO 153.7/1024 PARA QUE EN LOS DISPLAY ME APARESCA COMO VALOR MINIMO 000.0 VOLTIOS Y COMO MAXIMO 153.7 VOLTIOS
ENTONCES QUE TENGO...
UNA CONVERSION A 10 BIT... TOTALMENTE FUNCIONANDO
UNA RUTINA EN DONDE ME MUESTRA VALORES POR VARRIDO EN LOS 4 DISPLAY
QUE ME FALTA.....
UNA RUTINA QUE ME PERMITA TRANSFORMAR EL VALOR DE LA CONVERSION A UN LENGUAJE HUMANO....VOLTAJE TEM ...CORRIENTE ...ETC,,,
PIENSO QUE DEBO HACER: MULTIPLICAR EL (ADRESH Y ADRESL)* (153.7/1024) =
VALORES DECIMALES Y FLOTANTES PARA MOSTRAR EN LOS DISPLAY
FAVOR SI NO FUI CLARO DECIRMELO
-
Hola hernando2999.
Pégale un vistazo a este post.
http://miarroba.com/foros/ver.php?foroid=79706&temaid=4623928
Yo lo haría asi:
Si la Vref de mi conversión son 5V. y utilizamos 10 bits para la conversión tenemos una resolución de 5/1024 = 4.8828125*10^-3
Si los límites a representar en el los displays son de 0 a 150 el factor por el que tendremos que multiplicar el valor recibido del AD será:
150/1024 = 0.146484 (redondeamos a 0.15)
Que hago yo en estos casos? Multiplico por 15 despreciando los demas decimales. entonces tenemos:
Límite inferior -> 0*15 = 0 (a representar en el display)
Límite superior -> 1024*15 = 15360 (le quitamos un cero y lo representamos en el display).
No es muy preciso (puesto que las operaciones las hago en 16 bits y nunca podemos exceder el número 65535). Quieres más precisión? Hazlo con rutinas en 24 o 32 bits.
Con 24 bits se quedaría:
El factor por el que multiplicamos es
0.146484 (redondeamos a 0.14648)
Límite inferior -> 0*14648 = 0 (a representar en el display)
Límite superior -> 1024*14648 = 14999552 (nos quedamos con las 3 primeras cifras y las representamos en el display).
Tienes que valorar la precisión de la medida que deseas. Esta forma de trabajar no es exacta pero... si tu aplicación te lo permite, es muy rápda de hacer.
Para los decimales lo mejor es multiplicar o dividir por potencias de 10 y efectuar las operaciones aritméticas de forma normal (teniendo en cuanta siempre que no nos pasamos de los límites de las operaciones.)
Bueno... ya nos comentas.
Un saludo desde Alicante.
-
Hola. Me puse un ratito con hoja y lapiz y programe este codigo...
Cabe destacar que lo programe exclusivamente para TU PROPOSITO. SIEMPRE multiplica por 1537 y divide por 1024.(Te equivocaste, en realidad habia que dividir por 1023 pero ya es demasiado tarde(me di cuenta cuando ya habia terminado), y modificarlo...lindo rollo...

. Lo hice para 1024...lo que produce un pequeño desfasaje de 0.2Volts MAXIMO)
DESTACO: LA ALINEACION DEL RESULTADO DE LA CONVERSION DEBE SER A LA DERECHA.(CREO QUE YA LA ESTABAS USANDO ASI)
NECESITAS DECLARAR ESTOS REGISTROS:
AUX1,AUX2,AUX3,TMP1,TMP2,OUTL,OUTM,OUTH,RESTOL,RESTOH
LA FUNCION REGLA3
RECIBE: ADRESL : LECTURA 8 BITS BAJO PESO CONVERSOR AD
ADRESH : LECTURA 2 BITS ALTO PESO CONVERSOR AD
DEVUELVE:
OUTL: BYTE BAJO PESO RESULTADO
OUTM: BYTE MEDIANO PESO RESULTADO
OUTH: BYTE ALTO PESO RESULTADO
RESTOL:RESTO BAJO PESO RESULTADO
RESTOH:RESTO ALTO PESO RESULTADO
DESTACO:
EL RESTO OBVIAMENTE ESTA DENTRO DEL INTERVALO CERRADO [0;1023]. ESTO SIRVE POR SI QUERES SEGUIR SACANDO MAS DECIMALES DE PRECISION, PODES HACERLO.(SINO PREGUNTAME QUE TE EXPLICO
EL RESULTADO SE ENTREGA EN OUTL Y OUTM Y COMO MAXIMO VA A VALER 0X5FF(SI LA CONVERSION AD ES 0X3FF). POR LO TANTO EL RESULTADO ES MAXIMO 12 BITS, ES DECIR:
PARA MOSTRARLO EN LOS 4 DISPLAYS, VAS A NECESITAR UN CODIGO QUE TE CONVIERTA ESTE RESULTADO A DECIMAS, UNIDADES,DECENAS Y CENTENAS.
UN EJEMPLO:
ADRESL = 0XAA
ADRESH=0X01
DEVUELVE:
OUTL=0X7F
OUTM=0X02
OUTH = SIEMPRE CERO. RECORDALO, PARA DESCARTARLO DIRECTAMENTE...
RESTOL=0XAA
RESTOH=0X00
ENTONCES TENEMOS COMO RESULTADO: 0X27F (ENCADENANDO LOS 2 BYTES)
0X27F = 639
COMO MULTIPLIQUE POR 1537 EN LUGAR DE HACERLO POR 153,7 AHORA TENGO QUE DESPLAZAR LA COMA UN LUGAR PARA LA IZQ. EL RESULTADO QUE DEBE APARECER EN LOS DISPLAYS ES:
0 6 3 9
O LO QUE ES LO MISMO: 63,9
EL CODIGO:
REGLA3 CLRF AUX3
CLRF OUTH
MOVF ADRESH,W
MOVWF AUX2
MOVWF OUTM
BSF STATUS,RP0
MOVF ADRESL,W
BCF STATUS,RP0
MOVWF AUX1
MOVWF OUTL
MOVLW .9
MOVWF TMP1
SIGUEROT CALL ROTAIZQ
DECFSZ TMP1,F
GOTO SIGUEROT
CALL SUMA24
CALL ROTAIZQ
CALL SUMA24
MOVF OUTL,W ;INICIO DIVISION (/1024)
MOVWF RESTOL
CLRF OUTL
MOVF OUTM,W
MOVWF TMP1
CLRF OUTM
MOVF OUTH,W
MOVWF TMP2
CLRF OUTH
;CLRF AUX1
CLRF AUX2
CLRF AUX3
MOVF TMP2,W
BTFSC STATUS,Z
GOTO NOALTO
MOVLW .64
MOVWF AUX1
CALL SUMA24
DECFSZ TMP2,F
GOTO $-2
NOALTO MOVF TMP1,W
BTFSC STATUS,Z
GOTO NOHAYRESTO
OTROM MOVLW .4
MOVWF AUX1
SUBWF TMP1,F
BTFSS STATUS,C
GOTO FILLRESTO
MOVLW .1
MOVWF AUX1
CALL SUMA24
MOVF TMP1,F
BTFSS STATUS,Z
GOTO OTROM
CLRF RESTOH
RETURN
NOHAYRESTO CLRF RESTOH
RETURN
FILLRESTO COMF TMP1,F
INCF TMP1,F
RETURN
ROTAIZQ BCF STATUS,C
RLF AUX1,F
RLF AUX2,F
RLF AUX3,F
RETURN
SUMA24 MOVF AUX1,W
ADDWF OUTL,F
BTFSS STATUS,C
GOTO OKM
INCFSZ OUTM,F
GOTO OKM
INCF OUTH,F
OKM MOVF AUX2,W
ADDWF OUTM,F
BTFSC STATUS,C
INCF OUTH,F
MOVF AUX3,W
ADDWF OUTH,F
RETURN
Ya voy a tener que comenzar a pantentar algoritmos si sigo asi


EXITOS!
-
OK GRACIAS AMIGO VOY A HECHARLE UN VISTAZO
-
hernando, me olvide de pasar al banco 1 para tomar el valor del ADRESL y luego volver al cero. Fijate que modifique el programa mas arriba. Perdona...pequeño error...jaja.
Exitos...
-
Hola foristas, soy yo hernando, me han escrito a mi correo y pues aqui pongo una solucion, para lo que deseaba hacer, lo mejor es que manejes 2 registros o utilizar el adresh, bueno yo anduve por el asm varios años y en un programa donde utilice muchas funciones que fueron casi 3000 lineas de código dure casi 8 meses en perfeccionarlo trabajándole todas las semanas y en las noches, le cuento que ese mismo programa lo hice mejorado en csc y solo gaste 2 dias, no he vuelto a desde entonces a usar el asm, el c me ahorra tiempo y trasnochadas, además se hacen las cosas más rápido y así lo que sobra es tiempo.
Saludos
-
Por si a alguien le interesa, en el hilo siguiente doy una idea para resolver ese problema. Ésta es básicamente utilizar el valor obtenido del ADC para apuntar a una tabla conteniéndo los códigos a utilizar en el display. El link es el siguiente.
http://www.todopic.com.ar/foros/index.php?topic=36247.0
Como menciono en ese hilo esa es la técnica utilizada en la mayoría de los instrumentos comerciales ya que se obtiene mayor velocidad de respuesta además de que permite "linealizar" lecturas de cualquier transductor.
Saludos.