TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado 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
-
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.
-
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
-
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
-
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
-
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.