Programación Específica > Microcontroladores
pic 16f877 convertidor A/D
mbacelis:
holaa, estube armando un programa, para leer la señal analogica del sensor LM35, usando el convertidor A/D del picc16f877, y desplegar la informacion de los 10 bits de los registro ADRESH Y ADRESL tras la convercion en leds, al intentar simularlo en el proteus no hace nada, quisiera que me indicaran si hice algo mal o me faltan cosas por hacer en el programa. gracias... aqui esta el codigoo
--- Código: ASM ---cblock 0chcont endc include "p16f877.inc" org 0 bsf STATUS,RP0 ;JUSTIFICAMOS A LA DERECHAmovlw B'10001110' ;Y CONFIGURAMOS A RA0 COMO ENTRADA ANALOGICAmovwf ADCON1 bsf TRISA,0 ;CONFIGURAMOS COMO ENTRADA EL RA0 clrf TRISD ;CONFIGURAMOS COMO SALIDA EL PUERTO D bcf TRISE,0 ;CONFIGURAMOS EL RE0 Y EL RE1 COMO SALIDAbcf TRISE,1 bcf STATUS,RP0 movlw B'00000001' ;OSCILADOR FOSC/8, CANAL ANALOGICO RA0 movwf ADCON0 ; Y ENCENDEMOS EL CONVERTIDOR iniciar call pausa ; TIEMPO DE ESPERA DE 30 MILISEGUNDOS bsf ADCON0,2 ;INICIA LA VONVERCION espera btfsc ADCON0,2 ;ESPERAMOS A QUE TERMINE LA CONVERCION goto espera movf ADRESL,W ;MANDAMOS EL LOS PRIMEROS 8 BITS AL PORTD movwf PORTD movf ADRESH,W ;MANDAMOS LOS ULTIMOS 2 BITS AL PORTE movwf PORTE goto iniciar pausa movlw 0x23 movwf contrep DECFSZ cont,1 goto repesc returnend
picyo:
Hola!
Bueno, yo no se nada de ensamblador ( realmente aún se usa? Por que no usas C?) solo he programado en C, con los compiladores CCS, C18 y C32. Pero me voy fijando en los pasos que das, y que marcas con comentarios. Bueno yo he realizado alguna vez una conversión A/D con un pic de la família 18, y además en C, que es mucho más fácil, pero realmente los pasos son los mismos. Has elejido que sean entradas analogicas, para ello te sirves de Tris, y la configuración del puerto de conversión es a través de los ADCONx. Yo recuerdo usar la base de tiempos del clock interno RC. Si cojes la otra opción como veo que has hecho . Ahora trato de entender un poco el codigo en ASM que pones :
--- Código: ASM --- bcf STATUS,RP0 movlw B'00000001' ;OSCILADOR FOSC/8, CANAL ANALOGICO RA0 movwf ADCON0 ; Y ENCENDEMOS EL CONVERTIDOR Por lo que entiendo, corrijeme si no es así, el byte 00000001 lo mueves al registro ADCON0, para elejir FOSC/8 y encender el A/D. Primero, estás seguro que puedes hacer las dos cosas de "golpe"? Y otra cosa, que es lo que veo que no esta bien : si vas a ese registro ( tengo el datasheet) vemos esto :
********************REGISTER 11-1: ADCON0 REGISTER (ADDRESS: 1Fh) *********************************
|ADCS1| ADCS0| CHS2| CHS1| CHS0| GO/DONE| — |ADON| , tal como tu lo pones es:
| 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
Con esto se entiende que el tiempo de adquisición, lo derivas de la frecuencia de oscilación del PIC ( supongo que usaras cristales) a modo (tal como indica el datasheet):
ADCS1:ADCS0: A/D Conversion Clock Select bits
00 = FOSC/2 ----> realmente querias esto?? porque en los comentarios pones que es FOSC/8. Si fuera asi, al menos el byte deberias modificarlo como :
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 1 |
Lo peligroso de hacerlo sin el interno es eso, supongo que has dicho que es entre 8 porque has calculado que los tiempos de adquisicion ( Tad) son los correctos. Simplemente te has equivocado al configurarlo en el registro ADCON0. Y si no es así, disculpa, no se nada de ASM, pero trato de seguir los pasos que yo haría con los comentarios que le pones al programa. Espero se solucione!
carlospic:
Buenos dias yo tambien ando intentado hacer un conversor A/D pero tengo una duda con el funcionamiento
Con respecto a que tension el coversor hace la comparacion con 5v o con alguna otra tension de referencia que uno pueda colocarle al pic... gracias saludos....
picyo:
--- Código: Text ---Buenos dias yo tambien ando intentado hacer un conversor A/D pero tengo una duda con el funcionamientoCon respecto a que tension el coversor hace la comparacion con 5v o con alguna otra tension de referencia que uno pueda colocarle al pic... gracias saludos....
Bueno, hay básicamente dos modos de referencia, una interna y otra externa. Voy a abrir algun documento para verlo... De todos modos, es mejor ver en cada caso exactamente la documentación del microprocesador que se usará. Generalmente en pic's es siempre igual, perio vamos allá. No responderé no directamente con la respuesta, sinó cómo llego a ella. En la documentación del pic que sea, el que quieras, ( te la bajas de la pagina http://www.microchip.com) vas al índice en pdf, de las pestañas de la izquierda. Ahí buscas A/D converter. Verás qué pines permiten trabajar con señales analógicas (o qué puertos, más bien).
Una vez llegas al apartado de A/D, verás qué registros debes modificar para su uso ( activar el convertidor, seleccionar canal...). Pero bueno, vamos a la respuesta de la pregunta.
Existe un registro, para los pics 18F, por ejemplo, que es el "ADCON1: A/D CONTROL REGISTER 1". Dentro de ese registro ( que es de tipos byte) hay dos bits que puedes seleccionar:
"VCFG1 y VCFG0". Estos bits son los referentes a "VREF- source" y "VREF+ source" respectivamente ( que traducidos significan fuente de Vref x):
bit 5 VCFG1: Voltage Reference Configuration bit (VREF- source)
1 = VREF- (AN2)
0 = VSS
bit 4 VCFG0: Voltage Reference Configuration bit (VREF+ source)
1 = VREF+ (AN3)
0 = VDD
Pues bien, ahí está contestada el 80 % de la respuesta. Según qué pin quieras poner como referencia y, por ejemplo, teniendo en cuenta que quieres poner una referencia interna con "0V", activas el bit 5 de ese registro a 0. En caso que quieras trabajar con "5V", activas el bit 4 a 0.
Si miras por el docuemnto, probablemente verás un esquema eléctrico donde apreciarás lo dicho, de un modo gráfico más detallado (http://ww1.microchip.com/downloads/en/D ... 39632e.pdf ----paginas 266 y 268 ). Si quieres la referencia externa pues, has de saber que - en este caso- sólo 2 pines lo permiten, que son "AN3 y AN2". Eso si, has de modificar el registro anterior (bits 4 y/o 5) para referenciarlos a estos pines.
picyo:
perdon!! he respondido acerca de otro pic. Peor bueno, el modo de buscar la solucion es exactamente el mismo. ¿ Qué varía?
Esto :
en el pdf http://ww1.microchip.com/downloads/en/d ... 30292c.pdf, pagina 113 vemos que los pines de tensión de referencia externa son RA3/AN3/VREF+ y RA2/AN2/VREF. El procedimiento es casi el mismo :
en el registro "ADCON1 REGISTER (ADDRESS 9Fh)", hay que modificar los bits correspondientes "bit 3-0 PCFG3:PCFG0: A/D Port Configuration Control bits"
Este PIC es mas puñetero en ese aspecto. Con el anterior ( disculpa, me he equivocado) asignar esos bits que interesan es mas facil. Con este, hay una tabla , donde has de poner, ademas , cómo quieres hacer el uso del puerto en cuestión, es decir, te pongo un ejemplo :
**************************************** ADCON1 REGISTER (ADDRESS 9Fh)****************************
ADFM — — — PCFG3 PCFG2 PCFG1 PCFG0-> |pin no involucrado|---|----|-----|1|0|0|0|
¿ Qué hago con esa selección ?
Pues bien, uso en la tabla esto :
PCFG3 a PCFG0 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref-
1000 A A A A VREF+ VREF- A A RA3 RA2
Significa, que modificando esos 4 bits del registro, a "1000", haces que todo el puerto se comporte como analógico ( podrías hacer que pines de él fueran digital I/O). Además, asignas a los pines AN3 y AN2 como pines para referncia externa, donde Vref+ es el pin RA3 y Vref- es el pin RA2.
Una cosa... para modificar este puerto, supongo que si puedes escribir el byte como, por ejemplo :
|1 o 0|no importa|no importa|no importa|1|0|0|0| --> Donde "1o 0" es que es seleccuionable , "no importa" es que esos bits no se usan
en el puerto, por tanto, si pones 1 o 0 no importa.
En caso que no puedas- o no quieras- hacer esa escritura del puerto entero, existe la opcion de cambiar bit a bit. Si miras la página 137, verás que acciones puede hacer el pic. Una de ellas es bit clear y bit set ( estan en assembler por eso...):
Navegación
[#] Página Siguiente
Ir a la versión completa