TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: jovan21 en 15 de Noviembre de 2005, 13:11:00
-
Hola mi nombre es Jovan y me gustaria saber si se puede configurar el adc del pic16f877a (10 bits ), a 8 bits, es decir, que cuando realice la conversion del adc
8bits sean igual 5 volts. Agradeceria mucho su respuesta.
-
Hola lo que necesitas es bastante sencillo... te explico un poco... el PIC que usas tiene una resolucion de 10 bits, es decir que los valores a los que puede convertir oscilan entre 0 y (2^10 ) - 1 este valor lo guarda en 2 registros el ADRESH y ADRESL, como sabes la serie 16 esta basada en registros de 8 bits, entonces cada uno de estos registros es de 8 bits. Cuando guarda el valor de la conversion lo puede hacer de 2 maneras (10bits y 8 bits) :
10 bits: ADRESH (contiene los 2 bits mas significativos, poniendo los demas a 0 ) y el ADRESL (contiene los 8 bits menos significativos) por ejemplo: ADRESH = 00000010 y ADRESL= 10001100 lo que nos da un valor de 1010001100 (652 en decimal) con 10bits...
8bits: ADRESH (contiene los 8 bits mas significativos) y el ADRESL (contiene los 2 bits menos significativos, poniendo los demas a 0 ) por ejemplo: ADRESH = 10100011 y ADRESL = 00000000 es decir 1010001100 (652 en decimal), pero si ignoramos los 2 bits menos significativos nos quedan solamente 8 bits que es lo que necesitas, con lo que tendriamos un valor de 10100011 (163 en decimal)
En resumen, si lees solo los 8 bits mas significativos obtienes tu conversion AD. Para configurar en que modo trabajar revisa el PDF del PIC en especial los registros ADCON0 y ADCON1.
Espero haber sido claro... y no confundirte mucho
Nos vemos, un abrazo
-
HOLA
OTRO METODO QUE PUEDES USAR EN CASO DE NECESITAR MAYOR PRECISION ES IMPLEMENTAR UN CAS (ACONDICIONADOR DE SEÑAL), DE TAL FORMA QUE ESCALARIAS LOS RESULTADOS DEL RANGO DE 0 A 5 AL RANGO DE 0 AL VALOR CORRESPONDIENTE A 2^8. EL CAS CONSTA DE UN AMPLIFICADOR INVERSOR Y UN SUMADOR.
-
HOla bueno he leido sus respuestas y las dos son buenas me han solucionado mi duda muchas gracias.
-
Escrito originalmente por Artifox
10 bits: ADRESH (contiene los 2 bits mas significativos, poniendo los demas a 0 ) y el ADRESL (contiene los 8 bits menos significativos) por ejemplo: ADRESH = 00000010 y ADRESL= 10001100 lo que nos da un valor de 1010001100 (652 en decimal) con 10bits...
8bits: ADRESH (contiene los 8 bits mas significativos) y el ADRESL (contiene los 2 bits menos significativos, poniendo los demas a 0 ) por ejemplo: ADRESH = 10100011 y ADRESL = 00000000 es decir 1010001100 (652 en decimal), pero si ignoramos los 2 bits menos significativos nos quedan solamente 8 bits que es lo que necesitas, con lo que tendriamos un valor de 10100011 (163 en decimal)
La explicación está simple pero no has mencionado el tema de Left Justify o Right Justify y aquí está bastante mezclado.
Para aclarar un poco mejor el asunto.
El conversor siempre funciona a 10 ó 12 (en los pics con conversor de 10 y 12 bits), el truco para trabajar a 8 bits, consiste en usar el LEFT JUSTIFY.
Hablando de los de 10 bits (los más comunes) pongamos el siguiente ejemplo:
Rtdo (binario) = 00000010 00110011
Si se utiliza el right justify , es decir ADCON1,ADFM = 1 el resultado quedará
ADRESH = 00000010b
ADRESL = 00110011b
Si se utiliza el left justify , es decir ADCON1,ADFM = 0 el resultado quedará
ADRESH = 10001100b
ADRESL = 11000000b
Si quieres trabajar en 8 bits, pues pones el ADCON1,ADFM en 0, y solo lees y trabajas con el ADRESH.
Si quieres trabajar en 10 bits, pues ambas formas sirven, aunque lo recomendable s usar RIGHT JUSTIFY. Si utilizas LEFT JUSTIFY, deberás tener mayor cuidado y probablemente hacer alguna rotación para guardar los datos si piensas procesarlos normalmente. En muchos casos el A/D se usa para comparar valores y en función de ello tomar decisiones y en estos casos, ambas cosas sirven ya que al final se termina comparando con "constantes" que en assembler sería lo mismo de una forma u otra.
Saludos