TODOPIC

Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: mbacelis en 29 de Abril de 2010, 15:52:32

Título: pic 16f877 uso del convertidor A/D
Publicado por: mbacelis en 29 de Abril de 2010, 15:52:32
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

cblock  0ch
cont
 
    endc
 
include "p16f877.inc"
 
org 0
 
 
 
bsf STATUS,RP0 ;JUSTIFICAMOS A LA DERECHA
movlw B'10001110' ;Y CONFIGURAMOS A RA0 COMO ENTRADA ANALOGICA
movwf 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 SALIDA
bcf 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 cont
rep     DECFSZ cont,1
        goto rep
esc     return
end
Título: Re: pic 16f877 uso del convertidor A/D
Publicado por: alekspm en 15 de Mayo de 2010, 21:52:21
Hola, espero te sirva este code, esta realizado en MicroCodeStudio v3.0.0.5
El LM35 lo conecto al PIN 2 del 16F877 y un LCD conectado en el puerto C a 4 bits, el prog solo lee el pn AN0 y muestra la lectura en el LCD.

DEFINE OSC 4    'Velocidad del XT= 4.000000 Mhz.

DEFINE LCD_DREG PORTC   'Configura el puerto C para datos del LCD
DEFINE LCD_DBIT 0       'Bit de inicio 0 o 4 para bus de datos, RC0 this case
DEFINE LCD_RSREG PORTC  'Configura el Register Select en el puerto C
DEFINE LCD_RSBIT 5      'Configura RC5 para habilitar el RS del LCD
DEFINE LCD_EREG PORTC   'Configura el Enable Register en el puerto C
DEFINE LCD_EBIT 4       'Configura RC4 para habilitar el E (Enable) del LCD
DEFINE LCD_BITS 4       'Configura el numero de bits del bus de datos del LCD
DEFINE LCD_LINES 2      'Numero de lineas del LCD
DEFINE LCD_COMMANDUS 2000   'Configura tiempo de espera para comando en uSeg
DEFINE LCD_DATAUS 50        'Configura tiempo de espera de datos en uSeg

DEFINE ADC_BITS 8       'Configura el numero de bits para el resultado
DEFINE ADC_CLOCK 3      ' Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 30  'Configura el muestreo en microseconds

CONVERT VAR BYTE

TRISA= 255  'Inicializa puerto A como entradas
ADCON1= 0   'Puerto A como analogico

CICLO:
    ADCIN 0, CONVERT    ' Lee el voltage en el pin 2 y lo guarda
    PAUSE 10

    'Muestra en el LCD el valor de CONVERT en decimal y binario
    LCDOUT $FE, 1, DEC CONVERT, "    ", bin CONVERT
    PAUSE 10
GOTO CICLO

Saludos. Alekspm. Bye.
Título: Re: pic 16f877 uso del convertidor A/D
Publicado por: elensamblador en 03 de Enero de 2011, 05:31:27
Hola, espero te sirva este code, esta realizado en MicroCodeStudio v3.0.0.5
El LM35 lo conecto al PIN 2 del 16F877 y un LCD conectado en el puerto C a 4 bits, el prog solo lee el pn AN0 y muestra la lectura en el LCD.

DEFINE OSC 4    'Velocidad del XT= 4.000000 Mhz.

DEFINE LCD_DREG PORTC   'Configura el puerto C para datos del LCD
DEFINE LCD_DBIT 0       'Bit de inicio 0 o 4 para bus de datos, RC0 this case
DEFINE LCD_RSREG PORTC  'Configura el Register Select en el puerto C
DEFINE LCD_RSBIT 5      'Configura RC5 para habilitar el RS del LCD
DEFINE LCD_EREG PORTC   'Configura el Enable Register en el puerto C
DEFINE LCD_EBIT 4       'Configura RC4 para habilitar el E (Enable) del LCD
DEFINE LCD_BITS 4       'Configura el numero de bits del bus de datos del LCD
DEFINE LCD_LINES 2      'Numero de lineas del LCD
DEFINE LCD_COMMANDUS 2000   'Configura tiempo de espera para comando en uSeg
DEFINE LCD_DATAUS 50        'Configura tiempo de espera de datos en uSeg

DEFINE ADC_BITS 8       'Configura el numero de bits para el resultado
DEFINE ADC_CLOCK 3      ' Set clock source (rc = 3)
DEFINE ADC_SAMPLEUS 30  'Configura el muestreo en microseconds

CONVERT VAR BYTE

TRISA= 255  'Inicializa puerto A como entradas
ADCON1= 0   'Puerto A como analogico

CICLO:
    ADCIN 0, CONVERT    ' Lee el voltage en el pin 2 y lo guarda
    PAUSE 10

    'Muestra en el LCD el valor de CONVERT en decimal y binario
    LCDOUT $FE, 1, DEC CONVERT, "    ", bin CONVERT
    PAUSE 10
GOTO CICLO

Saludos. Alekspm. Bye.



pues muy bueno, pero pero pero esas malditas librerias podrias hacer un copy and paste de las mismas
Título: Re: pic 16f877 uso del convertidor A/D
Publicado por: elensamblador en 03 de Enero de 2011, 05:44:43
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

cblock  0ch
cont
 
    endc
 
include "p16f877.inc"
 
org 0
 
 
 
bsf STATUS,RP0 ;JUSTIFICAMOS A LA DERECHA
movlw B'10001110' ;Y CONFIGURAMOS A RA0 COMO ENTRADA ANALOGICA
movwf 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 SALIDA
bcf 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 cont
rep     DECFSZ cont,1
        goto rep
esc     return
end




no se si sera muy tarde pero buen a o lo mejor le sirve para algun viajero que tenga la inquietud.
Acordate de que para que puedas tener una conversion deves respetar los tiempos de cada bloque
1_tiempo de adquisision no menor a 19.72 microsegundos
2_ tiempo de conversion despues de que habilita adcon0,2 que no deve ser menor a 1.6 mili segundos
3- sacar resultado de los venditos adres l-h
ademas de que nunca se pondra a cero el adcon0,2 ya que se hace por programa cuando vos nsesitas hacer otra lectura,en tu codigo esperas indefinidamente que eso ocurra y eso no pasara solo.
Tendrias que esperar los 1.6 leer el registro adres y alli meter un bcf adcon0,2 para hacer una nueva conversion.


saludos

pd:  jaj son re malos me pusieron pic 10 jaj
Título: Re: pic 16f877 uso del convertidor A/D
Publicado por: Santherberg en 12 de Enero de 2011, 08:04:10
Buenos dias FORER@S,

Necesito consultaros algo por si podeis echarme una mano.
Estoy tratando de desarrollar una tarjeta de adquisicion de datos ANALOGICA-DIGITAL que transmita las señales por puerto serie a un PC. (sin muchas complicaciones)

Al simular en PROTEUS, tengo un problema con el CAD y es que introduzco una señal por NA0 y por el puerto serie entrega un valor que no corresponde con esa señal. Creo que no hace correctamente la conversion.

He usado dos opciones diferentes pero basadas en el mismo calculo.
OPCION 1.

    uso 8 bits de conversion (256 cuentas) y 5 V de ref.

        introduciendo 0.6V en AN0

    0.6V*(256cuentas/5V)= 30.72 cuentas (aprox 31 cuentas). El CAD entrega otra cosa.

Con la opcion 1, y usando un LM35 de 0.01V/ºC pierdo informacion [resolucion=Vref/2^n = 5/256= 0.01953 (aprox. 0,02)] Puede que ese sea el fallo. Por ello llego a la opcion 2.

OPCION 2.

    uso 8 bits de conversion (256 cuentas) y 2.56 V de ref.

        introduciendo 0.6V en AN0

    0.6V*(256cuentas/2.56V)= 60 cuentas

Con la opcion 2, no deberia perder informacion pero el CAD sigue entregando un valor erroneo y no se si es fallo de programacion o que. Lo cierto es que necesitaría un poco de ayuda para retomar "EL CAMINO".

Os dejo el codigo por si podeis echarle un ojo. UN MILLON DE GRACIAS POR VUESTRO TIEMPO.


__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
list p=16f877
include <p16f877.inc>

ADDR_L equ 0x20
DATA_L equ 0x21
contador

org 0x00
nop
nop

bcf STATUS,RP0 ; ir al banco 0
bcf STATUS,RP1

movlw b'10000001' ; A/D conversion a Fosc/8
movwf ADCON0

bsf STATUS,RP0 ; ir al banco 1
bcf STATUS,RP1

clrf TRISA ;Configuracion de puertos.
clrf TRISB
clrf TRISC
clrf TRISD
clrf TRISE
bsf TRISA,0 ; configuracion de AN0 como entrada
bcf TRISC,6 ; RC6/TX/DT como salida.


movlw b'00001000' ; A/D port AN0/RA0 b'01001110'
movwf ADCON1

movlw d'12' ;2400 baudios para cristal de 4MHz.
movwf SPBRG
bcf TXSTA,BRGH ; BRGH=0 baja velocidad
bcf TXSTA, SYNC ; Modo asincrono.

bcf STATUS,RP0 ; ir al banco 0
bcf STATUS,RP1

bsf RCSTA,SPEN ; habilita el puerto serie.

bsf STATUS,RP0 ; ir al banco 1
bcf STATUS,RP1

bcf TXSTA,TX9 ; TX9=0 9 bit de transferecia no habiliado.
bsf TXSTA,TXEN ; TXEN=1 activacion de la transmision serie.

bcf STATUS,RP0 ; ir al banco 0
bcf STATUS,RP1


_adc
bsf ADCON0,GO ; habilita la conversion.
_espera
btfsc ADCON0,GO ; ¿ha finalizado la conversion?
goto _espera ; si no ha finalizado vuelve a _adc
movf ADRESH,W ; si ha finalizado guarda el valor de ADRESH en W
movwf TXREG ;cargael registro TXREG con W
movwf PORTC ;saca el valor de w por el puerto C
_esperatx
btfss PIR1,TXIF ; comprueba si se ha vaciado el registro de transmision TSR. Entonces habrá acabado la transmision.
goto _esperatx ; si no se ha vaciado aun está transmitiendo. Espera.
; goto _adc ; si ha finalizado inicia el ciclo convirtendo otro valor.

_delay
movlw .10000
movwf contador
_zcero
decf contador,F
btfss STATUS,Z
goto _zcero
goto _adc


end
Título: Re: pic 16f877 uso del convertidor A/D
Publicado por: soymoe en 12 de Enero de 2011, 21:20:38
Lo que tendrias que hacer es verificar que este convirtiendo bien. Podrias sacar el valor de la conversion por el puerto  y verificar si coincide con el esperado, colocando a la entrada 0v y 5V. Luego verifica la rutina de envio de informacion al PC.