domingo, 24 de enero de 2010

Convertidor A/D del pic 16f876

Se aplica una tensión de 0a 5 Volt a la entrada del convertidor analogico/digital del PIC16f876, la referencia es de 5V, y la salida digital se aplica a un display de leds, donde se ve el valor devuelto por el PIC en codigo binario.



La salida del convertidor analogico digital es de 10 bits, asi que el resultado de la conversion A/D se almacena en dos bytes, uno es la parte alta y otro es la parte baja.

Para simplificar se uso referencia de 5 V lo cual significa que si le aplico de 0 a 1 volt el resultado cabrá en un solo byte, que es la parte baja, este byte se mueve entonces a un puerto del pic para presentarse como un numero binario en un display de leds.



Así Funciona:






VA EL PROGRAMA:

++++++++++++++++inicia programa++++++++++++++++++++++++++++

;PROGRAMA QUE PRUEBA LA CONVERSION AD DEL PIC
;1stentropy
;DICIEMBRE 2 DE 2009  8:39AM

 __config _LVP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF & _BODEN_OFF & _DEBUG_OFF

        list p=16f876
        #include   


cont1        equ        0x21
cont2        equ        0x22

        org        0x00
        GOTO    Inicio



        org     0x04            ;rutina de servicio de interrupciones
Interrupciones
        retfie
 


Inicio   
        BCF        STATUS,RP0         ; Select Bank0
        BCF        STATUS,RP1       
        CLRF      PORTA                   ; limpia el puerto A
        CLRF      PORTB                   ; y el puerto B



        BSF        STATUS,RP0        ; Select Bank1
        CLRF    ADCON1               ; Configure A/D inputs todas las entradas en el puerto A seran entradas analogicas
        BSF        ADCON1,ADFM        ; Se alineara a la derecha los diez digitos del resultado de la conversion A/D

        MOVLW    0x3F             ;Cargo W=b'00111111'
        MOVWF    TRISA            ;y lo paso a trisA. para que los pines funcionen como entradas.
        MOVLW    0x00
        MOVWF    TRISB            ;Configura puerto B como salidas
       


        BCF        STATUS,RP0        ; Select Bank0
        MOVLW     0xC1                 ; Clock 1/32 fosc, Channel RA0 is selected, A/D module is on
        MOVWF    ADCON0          ;
;        BCF        PIR1,ADIF           ; Clear A/D interrupt flag bit
;        BSF        INTCON,PEIE        ; Enable peripheral interrupts
;        BCF        INTCON,GIE         ; Enable all interrupts



Adquiere
        CALL    Espera            ; Ensure that the required sampling time for the selected input
                                             ; channel has elapsed. Then the conversion may be started.
                                             ;
        BSF        ADCON0,GO        ; Start A/D Conversion
                                                      ; The ADIF bit will be set and the GO/DONE
                                                      ; bit is cleared upon completion of the
                                                      ; A/D Conversion.

Conversion
        BTFSC    ADCON0,GO
        GOTO    Conversion

        BSF        STATUS,RP0        ; Select Bank1
        MOVF    ADRESL,W
        BCF        STATUS,RP0        ; Select Bank0
        MOVWF    PORTB


        GOTO    Adquiere




;+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Espera

        CLRF    cont1
;        CLRF    cont2

Retardo
        DECFSZ    cont1,f
        GOTO    Retardo
;        DECFSZ    cont2,f
;        GOTO    Retardo

        RETURN

        END

+++++++++++++++++++++termina programa++++++++++++++++++++++++++

4 comentarios:

  1. SI QUSIERA USAR EL CONVERTIDOR A/D PARA MILIVOLTS SERA POSIBLE?? QUISIERA USAR UN RANGO DE 0 A 1 VOLT

    ResponderEliminar
  2. si, es posible, si el convertidor tiene una resolucion de 10 bits significa que el intervalo de 0 a 5 volts se divide en 1023 partes (0000000000 cuando tenga 0 volt y 1111111111 cuando tenga 5 volt, la mitad del intervalo: 2.5 volt sera 0111111111).
    Si se divide en 1023 partes significa que tienes una resolucion de 0.0048875 V, es decir cada numero binario que cuentas te permite medir en intervalos de 4.88 miliVolt.
    De 0 a 1 Volt se ocuparia contar desde 0 a 204 en decimales o en binarios seria 00000000 para 0 volts y 11001100 para 1 volt.
    uuuuuhhh... espero ser un poco claro en mi explicacion, saludos.

    ResponderEliminar
  3. hola, me gustaria hacer en lenguaje ensamblador un voltimetro.
    utilizaría el pic de tu ejercicio.
    tengo 3 displays conectados a ra0, ra1 y ra2, la lectura llega a traves del puerto b
    me podrias echar un cable?
    mil gracias !! =)

    ResponderEliminar
  4. Ese programa presenta 37 errores muchas gracias por enseñar y educar.

    ResponderEliminar