Autor Tema: Multiples lecturas analogicas PIC16F877A (solucionado)  (Leído 5483 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
Multiples lecturas analogicas PIC16F877A (solucionado)
« en: 14 de Septiembre de 2014, 23:01:26 »
Buena noche amigos, nuevamento me acerco a este foro con una duda.  Quiero realizar la lectura de 6 señales analogas por medio de un PIC16F877A, las cuales serian

4 para medir la humedad de la tierra,
1 para medir un sensor de fuerza y
1 para medir la luz mediante un sensor en base a un fotodiodo.
(Quiero usar los puetos A y E, en el caso del E solo usar el RE0 y mientras el RE1 y RE2 que sean digitales)

empecé con las 4 primeras lecturas y para ello escribi el siguiente codigo:

Código: [Seleccionar]
DEFINE LCD_DREG PORTD 'define el puerto a usar para el LCD
DEFINE LCD_DBIT 4     'define el uso de solo 4 bits de direccion 7-6-5-4
DEFINE LCD_RSREG PORTD'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO D
DEFINE LCD_RSBIT 2    'Define cual pin sera el pin R/s del display
DEFINE LCD_EREG PORTD 'UTILIZAR EL ENABLE EN EL PUERTO D
DEFINE LCD_EBIT 3     'Define Pin del puerto para el Enable del LCD
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4    'Define numero de lineas del Display

ADCON0=%11000000
ADCON1=%10001001 'bit 0-3 para tener 6 entradas analogas y 2 digitales Es/
'configuracion de RA0 hasta RA5 como entradas
TRISA=%111111 'El puerto A tiene 6 pines no se si ira asi o 00111111

HumT1 VAR word
HumT2 VAR word
HumT3 VAR word
HumT4 VAR word
AvgHT var word

LOOP

ADCIN PORTA.0, Humt1
humt1.highbyte=ADRESH
humt1.lowbyte=ADRESL
pause 10

ADCIN PORTA.1, Humt2
humt2.highbyte=ADRESH
Humt2.lowbyte=ADRESL
pause 10

ADCIN PORTA.2, humt3
humt3.highbyte=ADRESH
humt3.lowbyte=ADRESL
pause 10
  

ADCIN PORTA.3, Humt4
Humt4.highbyte=ADRESH
Humt4.lowbyte=ADRESL
pause 50

AVGHT=0
AvgHT=AVght+HUmt1
AvgHT=AVght+HUmt2
AvgHT=AVght+HUmt3
AvgHT=AVght+HUmt4

LCDOUT $fe, 1,"AN0=",dec humt1
LCDOUT $fe, $C0,"AN1=",dec humt2
LCDOUT $fe, $94,"AN2=",dec humt3
LCDOUT $fe, $D4,"AN3=",dec humt4," AVG=",dec Avght/4
          


PAUSE 1000


GOTO LOOP



Hasta el momento solo lo he simulado en Proteus 8 Y  me muestra el mismo valor analogico para los 4 sensores. Para probar coloque 4 sensores de temperatura LM35 (al fin que lo que necesito son variaciones de tension y un LM35 puede darlas), y si muevo los valores de cada uno, no cambia nada a excepcion de cuando altero el valor del sensor en RA0, cambian los valores pero siguen todos iguales.  Les adjunto el archivo de proteus.
« Última modificación: 15 de Septiembre de 2014, 00:58:51 por siniestro »
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
Re: Multiples lecturas analogicas PIC16F877A
« Respuesta #1 en: 15 de Septiembre de 2014, 00:42:18 »
Lo solucioné, iba a borrar el post por verguenza pero creo que mejor lo comento con la solucion para que otras personas no caigan en el mismo error, yo estaba leyendo los pines asi:

Citar
ADCIN PORTA.1, Humt2

y la manera correcta es indicar el numero de canal analógico, yo mismo ya tenia un ejemplo de lectura con del pin RA0 (AN0), me remití ahi y ahi vi este detalle, igual les dejo el codigo de como quedo al final:
Código: [Seleccionar]
'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2014 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 14/09/2014                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

DEFINE LCD_DREG PORTD 'define el puerto a usar para el LCD
DEFINE LCD_DBIT 4     'define el uso de solo 4 bits de direccion 7-6-5-4
DEFINE LCD_RSREG PORTD'UTILIZAR EL REGISTRO  DE CONTROL/DATOS EN EL PUERTO D
DEFINE LCD_RSBIT 2    'Define cual pin sera el pin R/s del display
DEFINE LCD_EREG PORTD 'UTILIZAR EL ENABLE EN EL PUERTO D
DEFINE LCD_EBIT 3     'Define Pin del puerto para el Enable del LCD
DEFINE LCD_BITS 4
DEFINE LCD_LINES 4    'Define numero de lineas del Display

ADCON0=%11000000
ADCON1=%10001001 'bit 0-3 para tener 6 entradas analogas y 2 digitales Es/
'configuracion de RA0 hasta RA5 como entradas
TRISA=%00111111
TRISE=%00000011 'RE0 Como entrada analogica, RE1 entrada digital, RE2 salida digital
HumT1 VAR word
HumT2 VAR word
HumT3 VAR word
HumT4 VAR word
AvgHT var word

Peso var word
Luz  VAR word


LOOP

ADCIN 0, Humt1
humt1.highbyte=ADRESH
humt1.lowbyte=ADRESL
pause 50
ADRESH=0
ADRESL=0
 
ADCIN 1, Humt2
humt2.highbyte=ADRESH
Humt2.lowbyte=ADRESL
pause 50
ADRESH=0
ADRESL=0

ADCIN 2, humt3
humt3.highbyte=ADRESH
humt3.lowbyte=ADRESL
pause 50
ADRESH=0
ADRESL=0  

ADCIN 3, Humt4
Humt4.highbyte=ADRESH
Humt4.lowbyte=ADRESL
pause 50
ADRESH=0
ADRESL=0

ADCIN 4, Peso
Peso.highbyte=ADRESH
Peso.lowbyte=ADRESL
pause 50
ADRESH=0
ADRESL=0

ADCIN 5, Luz
Luz.highbyte=ADRESH
Luz.lowbyte=ADRESL
pause 50
ADRESH=0
ADRESL=0

IF PORTE.1=1 THEN
   HIGH PORTE.2
   PAUSE 20
   LOW PORTE.2
ENDIF

AVGHT=0
AvgHT=AVght+HUmt1
AvgHT=AVght+HUmt2
AvgHT=AVght+HUmt3
AvgHT=AVght+HUmt4

LCDOUT $fe, 1,"AN0=",dec humt1," AN1=",dec humt2
LCDOUT $fe, $C0,"AN2=",dec humt3," AN3=",dec humt4
LCDOUT $fe, $94,"Peso=",dec Peso," Luz=",dec luz
LCDOUT $fe, $D4," AVG=",dec Avght/4
          


PAUSE 100


GOTO LOOP

En proteus coloqué 6 sensores LM35 para simular los demas sensores y coloque un pulsador y un led en los pines que configuré como E/S digital del puerto E
:D  solo lo he simulado pero he obtenido buenos resultados al llevar las simulaciones a la practica en protoboard.  Les dejo el archivo de proteus por si alguien quiere verlo pero les advierto que esta muy desordenado.  Gracias
« Última modificación: 15 de Septiembre de 2014, 00:45:13 por siniestro »
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Multiples lecturas analogicas PIC16F877A (solucionado)
« Respuesta #2 en: 15 de Septiembre de 2014, 21:10:58 »
No es necesario utilizar siempre las funciones del sistema, la mayoría de las veces las que realiza uno son mejores.
Si tu lenguaje te permite utilizar funciones prueba esta, si el canal que lees es el mismo, la función se acelera porque
no tiene que esperar a que el modulo se configure de nuevo, ya que aprovecha la configuración anterior.

Código: [Seleccionar]
'PIC16F88, PSI v.7.27_02, By DogFlu66
'Practicas con el modulo ADC, lectura en formato de 10Bit
'-------------------------------------------------------------------
Include "_FuncionesPic16F88.bas"
Include "_FuncionesGetADC16F88.bas"
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Ignora los Waitms
'-------------------------------------------------------------------
AllDigital  'Pin como digitales
TRISA = %00000000  'Pin como salidas (si lo permiten)
TRISB = %00000000  'Pin como salidas
'Configuración modulo ADC
Call _setup_adc(_adc_clock_div16, _adc_avdd_avss, _adc_reg_10bit, 10)  'Tad > 1.6uSeg. (lectura lo más rapido posible a 8Mhz)
Call _setup_adc_an0()  'AN0 como entrada analogico
Call _setup_adc_an1()  'AN1 como entrada analogico
Call _setup_adc_an2()  'AN2 como entrada analogico
Call _setup_adc_an3()  'AN3 como entrada analogico
Call _setup_adc_an4()  'AN4 como entrada analogico
Call _set_adc(_on)  'Modulo ADC a On
'Abre puerto serie
Hseropen 4800  'Configura puerto serie harware a 4800baudios
'-------------------------------------------------------------------
WaitMs 10  'Espera se estabilice el estado de los puertos
Dim read_adc As Word  'Lectura ADC
Dim x As Byte  'Canal a leer
'Rutina principal
void_main:
'Los cinco primeros canales del ADC (AN4:0)
For x = 0 To 4
read_adc = _getadc_10b(x)  'Selecciona canal y devuelve lectura con formato 10bit
Hserout #read_adc, CrLf  'Envia la lectura al puErto serie más nueva línea
Next x
Hserout "---------------", CrLf  'Envia cadena y nueva lÍnea al hyperterminal

Goto void_main  'Do it forever
End                                              
'****************************************************************************
'//Funcion lectura de canal ADC (10Bit) (PIC16F88)
Function _getadc_10b(_canal As Byte) As Word
Dim _chan As Byte
'Selecciona el canal (pin) para su lectura
If _chan <> _canal Then
_chan = _canal
ADCON0.CHS0 = _chan.0
ADCON0.CHS1 = _chan.1
ADCON0.CHS2 = _chan.2
WaitUs 10
Endif
'Lectura y asignación ADC
ADCON0.GO = 1  '//Activa lectura
While ADCON0.GO = 1  '//Espera que termine la lectura del módulo ADC
Wend
_getadc_10b.HB = ADRESH  '//Carga valor más significativo del registro del ADC
_getadc_10b.LB = ADRESL  '//Carga valor menos significativo del registro del ADC
End Function                                      
'****************************************************************************

PD: No uso Proteus.
« Última modificación: 15 de Septiembre de 2014, 21:13:10 por dogflu66 »
Saludos desde Granada, España.

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
Re: Multiples lecturas analogicas PIC16F877A (solucionado)
« Respuesta #3 en: 15 de Septiembre de 2014, 23:50:39 »
Gracias por la respuesta dogflu66, yo trabajo con PIC Basic Pro y muchas de las funciones no me las reconoce.  Vi tu codigo y vi que tambien es un dialecto Basic pero es un poco diferente al que yo uso.  Es muy interesante tu ejemplo

Código: [Seleccionar]
Include "_FuncionesGetADC16F88.bas"
Esos archivos que usas en los include son parte del basic o los hiciste vos??
Yo soy principiante, he programado en lenguajes de computadora (C++, Visual Basic, Java, C#) pero nunca programe en Basic y no se si tambien se pueden crear archivos con funciones y luego agragarlos para reutilizar codigo.
Gracias nuevamente.  :o
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Multiples lecturas analogicas PIC16F877A (solucionado)
« Respuesta #4 en: 16 de Septiembre de 2014, 06:07:39 »
Si, las librerías las realizo yo, una vez que tienes una es muy rápido convertirla para otro modelo de micro, incluso familia. Otras ni siguiera necesitan traducción, son exactamente iguales por lo que les pongo un nombre genérico. Si no me he saltado ninguna las librerías deberían de estar publicadas en el hilo especial para Basic del PSI.
La librería lo que hace es configurar los bit de los registros del ADC exactamente como lo haces en tú código.

Lo de utilizar las funciones es como dices, por reutilizar el código de una forma rápida. Y hoy en día las funciones son muy similares en los lenguajes, salvando la sintaxis. Yo trabajo en C y realizar la conversión de la función a C es un momento, solo lleva ligeras diferencias, así que realizar la conversión entre distintos lenguajes Basic tiene que ser mucho más fácil. Lo que ocurre es que no conozco otros lenguajes Basic.
Saludos desde Granada, España.

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
Re: Multiples lecturas analogicas PIC16F877A (solucionado)
« Respuesta #5 en: 16 de Septiembre de 2014, 10:56:31 »
Gracias por la aclaracion, poco a poco iré leyendo mas.  En estos momentos programo en PBP porque en la Universidad ese estamos usando aunque apenas si compramos un libro que trae unos pocos ejemplos y para variar el Ingeniero ni explica nada de nada, me he salvado porque soy Perito en Electronica y se de programacion (el 98% de mis compañeros andan perdidos).  Gracias a este foro he resuelto muchas dudas y estoy muy agradecido con todos.  Mi meta es programar en PBP, C y Assembler (y de ser posible lograr mezclarlos pues segun vi se puede hacer  :-/ ) pues segun he visto cada uno tiene sus fortalezas en diferentes tipos de proyecto.

Gracias.
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Multiples lecturas analogicas PIC16F877A (solucionado)
« Respuesta #6 en: 16 de Septiembre de 2014, 12:08:20 »
He echado un vistazo rápido al manual de PBP y no he visto nada que me haga suponer que permite funciones, solo subrutinas (Gosub/Return) así que tendrá que ser alguien que tenga manejo con el PBP el que aclare el tema.
Saludos desde Granada, España.

Desconectado siniestro

  • PIC10
  • *
  • Mensajes: 44
Re: Multiples lecturas analogicas PIC16F877A (solucionado)
« Respuesta #7 en: 16 de Septiembre de 2014, 15:10:29 »
Citar
He echado un vistazo rápido al manual de PBP y no he visto nada que me haga suponer que permite funciones, solo subrutinas (Gosub/Return) así que tendrá que ser alguien que tenga manejo con el PBP el que aclare el tema.


Voy a seguir leyendo entonces el manual del PBP. .
Saber de todo un poco, sin ser experto en nada (una filosofia extraña)

Desconectado dogflu66

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 3510
Re: Multiples lecturas analogicas PIC16F877A (solucionado)
« Respuesta #8 en: 16 de Septiembre de 2014, 18:00:58 »
Se puede realizar mediante la forma clasica en Basic, mediante subrutinas:

Código: [Seleccionar]
'PIC16F88, PSI v.7.27_02, By DogFlu66
'Practicas con el modulo ADC, lectura en formato de 10Bit
'-------------------------------------------------------------------
Include "_FuncionesPic16F88.bas"
Include "_FuncionesGetADC16F88.bas"
Define CLOCK_FREQUENCY = 8
'Define SIMULATION_WAITMS_VALUE = 1  'Ignora los Waitms
'-------------------------------------------------------------------
AllDigital  'Pin como digitales
TRISA = %00000000  'Pin como salidas (si lo permiten)
TRISB = %00000000  'Pin como salidas
'Configuración modulo ADC
Call _setup_adc(_adc_clock_div16, _adc_avdd_avss, _adc_reg_10bit, 10)  'Tad > 1.6uSeg. (lectura lo más rapido posible a 8Mhz)
Call _setup_adc_an0()  'AN0 como entrada analogico
Call _setup_adc_an1()  'AN1 como entrada analogico
Call _setup_adc_an2()  'AN2 como entrada analogico
Call _setup_adc_an3()  'AN3 como entrada analogico
Call _setup_adc_an4()  'AN4 como entrada analogico
Call _set_adc(_on)  'Modulo ADC a On
'Abre puerto serie
Hseropen 4800  'Configura puerto serie harware a 4800baudios
'-------------------------------------------------------------------
WaitMs 10  'Espera se estabilice el estado de los puertos
Dim read_adc As Word  'Lectura ADC (usada por subrutina "getadc_10b")
Dim canal As Byte  'Canal a leer (usada por subrutina "getadc_10b")
'Rutina principal
void_main:
'Lee canales los cinco primeros canales del ADC (AN4:0)
For canal = 0 To 4
Gosub getadc_10b  'Salto con retorno (rutina lectura ADC)
Hserout #read_adc, CrLf  'Envia la lectura al puErto serie más nueva línea
Next canal
Hserout "---------------", CrLf  'Envia cadena y nueva lÍnea al hyperterminal

Goto void_main  'Do it forever
End                                              
'****************************************************************************
'//Subrutina lectura de canal ADC (10Bit) (PIC16F88)
getadc_10b:
Dim chan As Byte  'Memoriza canal en uso
'Selecciona el canal (pin) para su lectura
If chan <> canal Then
chan = canal
ADCON0.CHS0 = chan.0
ADCON0.CHS1 = chan.1
ADCON0.CHS2 = chan.2
WaitUs 10
Endif
'Lectura y asignación ADC
ADCON0.GO = 1  '//Activa lectura
While ADCON0.GO = 1  '//Espera que termine la lectura del módulo ADC
Wend
read_adc.HB = ADRESH  '//Carga valor más significativo del registro del ADC
read_adc.LB = ADRESL  '//Carga valor menos significativo del registro del ADC
Return                                            
'****************************************************************************

El codigo no es tan transportable ni reutilizable, pero tambien se puede hacer.
« Última modificación: 16 de Septiembre de 2014, 18:03:58 por dogflu66 »
Saludos desde Granada, España.


 

anything