Domingo 22 de Diciembre de 2024, 17:12
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación Específica
»
Microcontroladores
(Moderador:
© Jonathan ©
) »
pic 16f877 convertidor A/D
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: pic 16f877 convertidor A/D (Leído 10937 veces)
mbacelis
Nuevo Miembro
Mensajes: 2
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
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
Tweet
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
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
Nuevo Miembro
Mensajes: 2
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
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....
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
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
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
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación Específica
»
Microcontroladores
(Moderador:
© Jonathan ©
) »
pic 16f877 convertidor A/D