• Jueves 28 de Marzo de 2024, 17:33

Autor Tema:  pic 16f877 convertidor A/D  (Leído 10726 veces)

mbacelis

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
pic 16f877 convertidor A/D
« en: Jueves 29 de Abril de 2010, 03:22 »
0
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
  1. cblock  0ch
  2. cont
  3.  
  4.     endc
  5.  
  6. include "p16f877.inc"
  7.  
  8. org 0
  9.  
  10.  
  11.  
  12. bsf STATUS,RP0 ;JUSTIFICAMOS A LA DERECHA
  13. movlw B'10001110' ;Y CONFIGURAMOS A RA0 COMO ENTRADA ANALOGICA
  14. movwf ADCON1
  15.  
  16.  
  17. bsf TRISA,0 ;CONFIGURAMOS COMO ENTRADA EL RA0
  18.  
  19.  
  20.  
  21. clrf TRISD ;CONFIGURAMOS COMO SALIDA EL PUERTO D
  22.  
  23.  
  24. bcf TRISE,0  ;CONFIGURAMOS EL RE0 Y EL RE1 COMO SALIDA
  25. bcf TRISE,1
  26.            
  27.             bcf STATUS,RP0
  28.                 movlw B'00000001' ;OSCILADOR FOSC/8, CANAL ANALOGICO RA0
  29.                 movwf ADCON0  ; Y ENCENDEMOS EL CONVERTIDOR
  30.                
  31. iniciar             call pausa ; TIEMPO DE ESPERA DE 30 MILISEGUNDOS
  32.                    
  33.                 bsf ADCON0,2 ;INICIA LA VONVERCION
  34.  
  35. espera  btfsc ADCON0,2 ;ESPERAMOS A QUE TERMINE LA CONVERCION
  36.         goto espera
  37.         movf ADRESL,W ;MANDAMOS EL LOS PRIMEROS 8 BITS AL PORTD
  38.         movwf PORTD
  39.         movf ADRESH,W ;MANDAMOS LOS ULTIMOS 2 BITS AL PORTE
  40.         movwf PORTE
  41.         goto iniciar
  42.  
  43. pausa   movlw 0x23
  44.         movwf cont
  45. rep     DECFSZ cont,1
  46.         goto rep
  47. esc     return
  48. end
  49.  

picyo

  • Visitante
Re: pic 16f877 convertidor A/D
« Respuesta #1 en: Lunes 17 de Mayo de 2010, 16:36 »
0
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
  1.  
  2.  bcf STATUS,RP0
  3.                movlw B'00000001' ;OSCILADOR FOSC/8, CANAL ANALOGICO RA0
  4.                movwf ADCON0  ; Y ENCENDEMOS EL CONVERTIDOR
  5.  
  6.  
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

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: pic 16f877 convertidor A/D
« Respuesta #2 en: Jueves 2 de Septiembre de 2010, 16:38 »
0
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

  • Visitante
Re: pic 16f877 convertidor A/D
« Respuesta #3 en: Viernes 3 de Septiembre de 2010, 12:42 »
0
Código: Text
  1. Buenos dias yo tambien ando intentado hacer un conversor A/D pero tengo una duda con el funcionamiento
  2. 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....
  3.  

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

  • Visitante
Re: pic 16f877 convertidor A/D
« Respuesta #4 en: Viernes 3 de Septiembre de 2010, 13:17 »
0
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...):

carlospic

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: pic 16f877 convertidor A/D
« Respuesta #5 en: Viernes 3 de Septiembre de 2010, 18:31 »
0
muchas gracias  por tomarse un tiempo en responderme picyo... me es muy util tu respuesta... saludos...

soymoe

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: pic 16f877 convertidor A/D
« Respuesta #6 en: Martes 4 de Enero de 2011, 14:20 »
0
Lo que veo es que te falta algo fundamental que es configurar el oscilador con OSCCON Y OSCTUNE, ademas deberias desactivar los comparadores oescribiendo el COMCON. ademas te faltan algunos movwf. si lees el datasheet, tiene una guia de inicializacion del conversor y un ejemplo de toma de muestra. los datos no los vas a poder mostrar en leds ya que van de 0 a 1024, necesitas un display o lago asi. Aqui va el codigo que yo hice:
InicializeAD
         clrf  ADRESH;Borro los resultados anteriores
            clrf  ADRESL;
           bsf STATUS,RP0;Selecciono banco 1
         movlw b'10000000';ver
         movwf ADCON1; selecciono vref y formato de resultado
         clrf INTCON; DESHABILITO LAS INTERRUPCIONES
            bcf STATUS,RP0;banco 0
            movlw b'01000001';ver
            movwf ADCON0;seleciono frec conversion y canal
         goto fin   
Conversion  call  RETARDO30microS;Espera Time adquisicion   
            bsf ADCON0,2; empiezo conversion
loop      btfsc ADCON0,2; si done sigo
            goto loop
         MOVF ADRESH,W
         MOVWF binH; MUEVO LOS VALORES DEL CONVERSOR A binH
           MOVF ADRESL,W
         MOVWF binL; MUEVO LOS VALORES DEL CONVERSOR A binL
         call  RETARDO30microS;Retardo antes de volver a convertir
fin         return

           
         
Secuencia para llamar:
  CALL InicializeAD
  CALL conversion