Autor Tema: Conversor AD PIC16F877A (solucionado)  (Leído 4244 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
Conversor AD PIC16F877A (solucionado)
« en: 03 de Septiembre de 2014, 19:59:05 »
Buen dia amigos, me encuentro realizando un proyecto en el cual debo leer multiples sensores, me encuentro haciendo un prototipo para la medicion de peso y pretendo usar un sensor de fuerza.  tengo entendido que el conversor analogico del PIC16F877A es de 10 bits, pero sin embargo cuando pruebo a visualizar los valores de conversion, estos solo varian entre 0 y 255 como si se tratara de un CAD de 8 bits.  el codigo que tengo es este:

definicion de pines para el display LCD
DEFINE LCD_DREG PORTD 'define el puerto a usar para el LCD
DEFINE LCD_DBIT 4     'define el uso de solo 4 bits de direccion 7-6-5-4
DEFINE LCD_RSREG PORTD 'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO D
DEFINE LCD_RSBIT 2    'Define cual pin sera el pin R/s del display
DEFINE LCD_EREG PORTD 'UTILIZAR EL ENABLE EN EL PUERTO D
DEFINE LCD_EBIT 3     'Define Pin del puerto para el Enable del LCD
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2    'Define numero de lineas del Display



Valor VAR WORD
ADCON0=%11000001 'oscilador RC interno  para conversion
ADCON1=%10000000 'justifico a la derecha  (aqui la duda, si dejo justificacion a la derecha en el Display solo me cambia el valor entre 0 y 3 maximo, pero si
' coloco justificacion a la izquierda dejando a 0 el registro ADCON1, entonces si muestra entre 0 y 255)


LOOP

ADCIN 0,Valor
PAUSE 300
 
 
LCDOUT $fe, 1,"Valor: ", DEC Valor
LCDOUT $fe, $C0,"Peso= ",DEC vALOR/10," Kg"  'Operacion ficticia, no he calibrado los valores




GOTO LOOP



no se porque no me muestra los valores correctos, ando medio perdido sobre el uso del ADRESH Y ADRESL, entiendo que si justifico a la derecha los bits mas altos del ADRESH se ponen en 0 y si pongo justificacion a la izquierda, los bit mas bajos del ADRESL se ponen a 0, por eso pretendi medir justificando a la derecha, aunq de igual forma necesito los 8 bits para la resolucion, Ojala pudieran resolver mis dudas.  Les estaré muy agradecido


« Última modificación: 05 de Septiembre de 2014, 00:33:46 por siniestro »
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Conversor AD PIC16F877A
« Respuesta #1 en: 04 de Septiembre de 2014, 16:05:25 »
Lo primero que hay que tener en cuenta es que el modulo ADC siempre hace la lectura a 10Bit  internamente, lo que hay que indicarle es como tiene que mostrar la lectura, a 8bit o a 10bit.
Con el Bit 7 (ADFM) del registro ADCON1 se indica si la lectura será mostrada a 8 bit (ADFM=0) o a 10Bit (ADFM=1).
Si se eligió que el modulo adc muestre la lectura a 8bit, el valor está en el registro ADRESH, por lo tanto ADCIN debería devolver “VALOR = ADRESH”, y si por el  contrario se eligió que la lectura se muestre en 10bit ADCIN debería de devolver “VALOR.HB = ADRESH: VALOR.LB = ADRESL”, siempre teniendo en cuenta que la variable “VALOR” es un Word (16bit).
Otro tema está en la configuración que debería realizar ADCIN:
En teoría tendría que configurar el pin donde se realiza la lectura como “ENTRADA ANALOGICA”  y si la variable que se le asigna, en este caso “VALOR” es de 8bit, tendría que configurar el adc para que muestre la lectura a 8bit, y por el contrario, si es de 16bit tendría que configurar para que la muestre a 10bit de forma automática, tambien debería configurar el canal automaticamente.
Como no utilizo tu lenguaje, pues no se si tu función cumple con lo expuesto. En el caso que no lo cumpla solo te faltaría indicar en el programa que el pin utilizado es de entrada, e indicarle mediante algun comando de configuración como tiene que asignar el resultado a la variable "VALOR" (8bit o 10bit).

Tambien puedes hacer esta prueba, añade en el programa lo siguiente si te lo permite el compilador:

ADCIN 0,Valor
valor.HB = ADRESH
valor.LB = ADRESL
PAUSE 300
« Última modificación: 04 de Septiembre de 2014, 16:23:09 por dogflu66 »
Saludos desde Granada, España.

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
Re: Conversor AD PIC16F877A
« Respuesta #2 en: 04 de Septiembre de 2014, 20:10:42 »
Antes que todo, gracias por tu respuesta..

Citar
Con el Bit 7 (ADFM) del registro ADCON1 se indica si la lectura será mostrada a 8 bit (ADFM=0) o a 10Bit (ADFM=1).

Con respecto a esto, en el caso en que yo configurao el bit 7 del ADCON1 en 1, justificando a la derecha, en ese caso el valor de la conversion solo fluctua entre 0 y 3, por el contrario cuando coloco el bit7 del ADCON1 a 0, justificando a la izquierda el valor en el display si fluctua entre 0 y 255, segun su explicacion si justifico a la derecha deberia obtener el resultado con resolucion de 10 bits, pero en mi caso no sucede asi.

Citar
si por el  contrario se eligió que la lectura se muestre en 10bit ADCIN debería de devolver “VALOR.HB = ADRESH: VALOR.LB = ADRESL”, siempre teniendo en cuenta que la variable “VALOR” es un Word (16bit).

Yo supongo que cuando justifico a la derecha poniendo el bit 7 del ADCON1 a 1, solo me muestra los bits 0 y 1 del ADRESH y no toma en cuenta los 8 bits del ADRESL, la variable "VALOR" es una word  
Código: [Seleccionar]
Valor VAR WORD
Citar
En teoría tendría que configurar el pin donde se realiza la lectura como “ENTRADA ANALOGICA”
La entrada AN0 la configuro como Analogica con el registro ADCON1, bit 5-6: CHS2:CHS0: bits de selección del canal analógico
000 = channel 0 (RA0/AN0)

y en el ADCON1 bit 3-0: PCFG3: PCFG0: bits de control de la configuración de los puertos  000 pone todos los pines del puerto A y del E como analogicos

Citar
ADCIN 0,Valor
valor.HB = ADRESH
valor.LB = ADRESL
PAUSE 300

Uso el MicroCode Studio y no me dejo usar esas instrucciones

**CORRECCION****
Citar
ADCIN 0,Valor
valor.HB = ADRESH
valor.LB = ADRESL
PAUSE 300
no me lo permite el microcode studio pero al final use:

Código: [Seleccionar]
ADCIN 0,vALOR
PAUSE 100
 vALOR.HIGHBYTE=ADRESH
 VALOR.LOWBYTE=ADRESL


Al final el codigo quedo asi:

Código: [Seleccionar]
DEFINE LCD_DREG PORTD 'define el puerto a usar para el LCD
DEFINE LCD_DBIT 4     'define el uso de solo 4 bits de direccion 7-6-5-4
DEFINE LCD_RSREG PORTD'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO D
DEFINE LCD_RSBIT 2    'Define cual pin sera el pin R/s del display
DEFINE LCD_EREG PORTD 'UTILIZAR EL ENABLE EN EL PUERTO D
DEFINE LCD_EBIT 3     'Define Pin del puerto para el Enable del LCD
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2    'Define numero de lineas del Display



Valor VAR WORD
ADCON0=%11000001 'oscilador RC interno  para conversion
ADCON1=%10000000 'justifico a la derecha  (aqui la duda)

PAUSE 200

LOOP

ADCIN 0,vALOR
PAUSE 100
 vALOR.HIGHBYTE=ADRESH
 VALOR.LOWBYTE=ADRESL
 
LCDOUT $fe, 1,"Valor: ", DEC Valor
LCDOUT $fe, $C0,"Peso= ",DEC vALOR/10," Kg"




GOTO LOOP

Gracias dogflu66, no se como poner un post como solucionado, pero lo colocaré entre parentesis en el titulo (lo acepto, no he leido todas las reglas del foro,prometo hacerlo)
« Última modificación: 05 de Septiembre de 2014, 00:33:04 por siniestro »
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Conversor AD PIC16F877A (solucionado)
« Respuesta #3 en: 05 de Septiembre de 2014, 08:09:51 »
Esos registros indican como debe de trabajar la entrada en cuestión cuando sea entrada, y para que sea entrada hay que indicarlo con el registro TRISX, siendo la X el puerto, por ejemplo:
TRISA = %00000001, indica que el pin RA0 (o AN0) trabajará como entrada y heredará todas las configuraciones realizadas anteriormente, el resto de pin como salidas si lo permiten.

Con el registro TRISx  no se especifica si el pin trabajara como digital o analógico, solo se especifica si trabajara como entrada o como salida. Que sea analógica o no dependerá de la configuración de los otros registros.

CHS2:CHS0: Analog Channel Select bits: no selecciona el pin como entrada, lo que está indicando es que cuando se configure como entrada ese pin es el que leerá el ADC, porque al ADC no se le pueden asignar todos los pin al mismo tiempo, para eso se necesitaría un ADC por cada pin y el micro solo tiene un único ADC.

PCFG3:PCFG0: A/D Port Configuration Control bits: no configura el pin como entrada, está indicando de que tipo será el pin cuando se configure como entrada, analógica o digital en este caso analógica.

Seguramente en tu caso por defecto el pin ha quedado como entrada, de lo contrario no funcionaria.

PD. Como el hilo es corto no es necesario especificar si se resolvió, ya que se lee rápidamente, de todas maneras es correcto como lo especificaste.
« Última modificación: 05 de Septiembre de 2014, 08:16:16 por dogflu66 »
Saludos desde Granada, España.

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
Re: Conversor AD PIC16F877A (solucionado)
« Respuesta #4 en: 05 de Septiembre de 2014, 11:17:16 »
Gracias dogflu66
Citar
Esos registros indican como debe de trabajar la entrada en cuestión cuando sea entrada, y para que sea entrada hay que indicarlo con el registro TRISX, siendo la X el puerto, por ejemplo:
TRISA = %00000001, indica que el pin RA0 (o AN0) trabajará como entrada y heredará todas las configuraciones realizadas anteriormente, el resto de pin como salidas si lo permiten.

Tienes mucha razón, en ese codigo olvide manipular el registro TRIS del puerto A, ya lo hice.

Citar
Seguramente en tu caso por defecto el pin ha quedado como entrada, de lo contrario no funcionaria.

Seguramente ese es el caso, por mis primeros ejercicios con este PIC me di cuenta que sin configurarse el CAD, asume la pata AN0/RA0 como entrada analogica.

Decidi estudiar bien los registros ACDON0 y ADCON1 puesto que mi intencion es aprovechar todos lo pines del 16F877A y como no utilizaré todas las entradas de los puertos A y E como analogicas debo comprender bien los registros mencionados  para configurar bien los necesarios como analogos o digitales segun sea el caso.   Gracias a la informacion del foro ya voy bien encaminado.

Gracias
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)


 

anything