[Tutorial] y manejo de Proton IDE

Ese retardo de 50 milisegundos, a lo mucho debería ser de 50 microsegundos.
También sería más conveniente promediar dentro de un bucle for.
Ese código no es de lo mejor que he visto :rolleyes: y no entiendo si quiere hacer la conversión a todo lo que dá el micro (50 us) o tomar una muestra cada 50 ms, en cuyo caso el if sería una suerte de protección por si no terminó la conversión o_O
De todas formas, pisa el valor de la variable IN calculada con el resultado de cada nueva conversión... en fin, si es un fragmento del código total debería mostrar algo más para entenderlo, pero YO escribiría de nuevo el programa, por que si lo que queda está así.....huuummmmmm
 
Ese retardo de 50 milisegundos, a lo mucho debería ser de 50 microsegundos.
También sería más conveniente promediar dentro de un bucle for.
OK lo haré de esa manera ... pero lo raro es que esa rutina de conversión la uso en un PIC16F88 y funciona muy bien, haciendo de voltimetro y amperimetro digital. Muchas gracias.
Ese código no es de lo mejor que he visto :rolleyes: y no entiendo si quiere hacer la conversión a todo lo que dá el micro (50 us) o tomar una muestra cada 50 ms, en cuyo caso el if sería una suerte de protección por si no terminó la conversión o_O
De todas formas, pisa el valor de la variable IN calculada con el resultado de cada nueva conversión... en fin, si es un fragmento del código total debería mostrar algo más para entenderlo, pero YO escribiría de nuevo el programa, por que si lo que queda está así.....huuummmmmm
Es que soy novato en programación, por eso pregunto. Gracias. ;)
 
Este sería un código muy sencillo para promediar:
Código:
Device = 12F683
Reminders = Off
Config INTOSCIO, FCMEN_OFF, MCLRE_OFF, PWRTE_ON, WDT_OFF
Reminders = On
Xtal 8MHz

Declare Create_Coff On

Inicio:
    Dim Muestras As Byte
    Dim Promedio As Word
    
    ADCON0bits_ADFM = 1         ; Justificación a la derecha en la conversión AD
    ANSEL = 0b01110001          ; Osc. interno para el ADC y selección de sAN0
    
    SerOut GPIO.5, 84, [0x00]   ; Iniciar RS-232 por software
    DelayMs 100

Programa:
    While 1 = 1
        Promedio = 0
        
        For Muestras = 1 To 10  ; Tomar 10 lecturas
            Promedio = Promedio + ADIn 0
        Next Muestras
        
        Promedio = Promedio / 10
        
        ; Descomentar para depuración:
        ;SerOut GPIO.5, 84, [Dec4 Promedio, 13, 10]
        ;DelayMs 250
    Wend
    
    End
El único retardo sería el que genere la instrucción ADIn que debe esperar hasta que el ADC esté listo.
El retardo después de SerOut es únicamente con fines de depuración.
 
El único retardo sería el que genere la instrucción ADIn que debe esperar hasta que el ADC esté listo.
El retardo después de SerOut es únicamente con fines de depuración.

Probé lo del tiempo 50us pero hace lo mismo, igual con el bit de fin de conversión se asegura leer el ADC en el momento preciso. Haré lo del promedio, gracias por el código.
 
Hola...Lo que veo yo....

El código que subiste esta incompleto y por ejemplo no se ve que coloques a 0 nunca, la variable ACUMESR, una ves que terminas los cálculos y comienzas nuevamente las mediciones.

Al dividir entre 10 el resultado de esta operación, es una fija que te dará algo con coma y tienes definida un Word y no Float

Esta comentado el Endif de las 10 acumulaciones por lo que si te compila así la cosa puede terminar en cualquier lado, sales de esa condición con un Goto no con un Gosub ( esto puede o no ser importante) que permitiría el retorno, no sabemos que pasa en COMP, etc, etc.

Para opinar con mas fundamento al menos a mi me falta mas de lo que muestras.

Saludos.

Ric.
 
Hola...Lo que veo yo....

El código que subiste esta incompleto y por ejemplo no se ve que coloques a 0 nunca, la variable ACUMESR, una ves que terminas los cálculos y comienzas nuevamente las mediciones.

Al dividir entre 10 el resultado de esta operación, es una fija que te dará algo con coma y tienes definida un Word y no Float

Esta comentado el Endif de las 10 acumulaciones por lo que si te compila así la cosa puede terminar en cualquier lado, sales de esa condición con un Goto no con un Gosub ( esto puede o no ser importante) que permitiría el retorno, no sabemos que pasa en COMP, etc, etc.

Para opinar con mas fundamento al menos a mi me falta mas de lo que muestras.

Saludos.

Ric.

Hola. Si, el programa no esta completo (es muy grande). Las cantidades no tienen punto flotante ... y creo que las variables se actualizan con el nuevo valor que le ingrese, solo tengo que borrar la variable cuentas para hacer un nuevo promedio.
 
¿Que les parece esta forma? no se por que da problema si consulto el bit de finalización del ADC, pero no creo que haya problema si se espera los 50us para leer el ADC. Lo importante es que ya promedia y el circuito ahora es mucho mas estable que antes.

For CUENTAS = 1 To 100
ADCON0.1 = 1
DelayUS 50
IN = ADIn 0
ACUMESR = ACUMESR + IN
Next
ACUMESR = ACUMESR / 100
IN = ACUMESR
CUENTAS = 0
ACUMESR = 0
 
Algo que se tiene que tener en cuenta es que, la variable no se desborde con la suma.
Si es del tipo Word (16 bits) desbordará cuando se supere el valor 65535
O sea que no tiene caso tomar 100 muestras porque habrá un desborde durante el incremento y eso hará que la cuenta se reinicie.
Suponiendo que el ADC esté al máximo: 100 * 1023 = 102300
Por lo tanto, con una variable de 16 bits únicamente se podrán realizar 64 muestras sin que exista desborde. (65535 / 1023 = 64,061)

Otra cosa.
ADIn se encarga de establecer el bit 1 (GO/DONE) de ADCON0 en 1, así que sería conveniente retirar ADCON0.1 = 1, porque es redundar.

Algo importante es tratar de ahorrar memoria, y el uso de una variable para guardar la lectura de ADIn, se puede omitir.
Por eso en mi código hice lo siguiente:
Promedio = Promedio + ADIn 0

Si la variable para guardar el valor de ADIn se piensa usar en otra parte de la rutina o del programa, entonces sí tendría sentido.

PD:
Sigues sin limpiar la variable ACUMESR antes de realizar la suma, recuerda que una variable es acumulativa.
Si la variable se encuentra con datos previos, se le sumarán los nuevos y el desborde ocurrirá de imprevisto, con lo cual el resultado se altera.
 
Algo que se tiene que tener en cuenta es que, la variable no se desborde con la suma.
Si es del tipo Word (16 bits) desbordará cuando se supere el valor 65535
O sea que no tiene caso tomar 100 muestras porque habrá un desborde durante el incremento y eso hará que la cuenta se reinicie.
Suponiendo que el ADC esté al máximo: 100 * 1023 = 102300
Por lo tanto, con una variable de 16 bits únicamente se podrán realizar 64 muestras sin que exista desborde. (65535 / 1023 = 64,061)

Otra cosa.
ADIn se encarga de establecer el bit 1 (GO/DONE) de ADCON0 en 1, así que sería conveniente retirar ADCON0.1 = 1, porque es redundar.

Algo importante es tratar de ahorrar memoria, y el uso de una variable para guardar la lectura de ADIn, se puede omitir.
Por eso en mi código hice lo siguiente:
Promedio = Promedio + ADIn 0

Si la variable para guardar el valor de ADIn se piensa usar en otra parte de la rutina o del programa, entonces sí tendría sentido.

PD:
Sigues sin limpiar la variable ACUMESR antes de realizar la suma, recuerda que una variable es acumulativa.
Si la variable se encuentra con datos previos, se le sumarán los nuevos y el desborde ocurrirá de imprevisto, con lo cual el resultado se altera.

Si, entiendo lo del desborde y el ADC en este caso solo llega hasta 253 aprox. Osea que 253 * 100 = 25300. El bit GO/DONE lo active porque así lo dice en la DATASHEET del 12f683, pero PROTON lo activa automáticamente (no lo sabia). La variable para guardar ADIN si la uso mas adelante ... aunque si podría quitarla, pero el PIC tiene mucho espacio aun.

Si limpio la variable ACUMESR, antes y después de usarla. Estoy haciendo un medidor de ESR digital por eso el nombre de la variable.
ACUMESR = Acumular ESR.

Ahora es sumamente estable al promediar la conversión A/D, pero solo si promedio 100 ... menos de eso sigue inestable.

Muchas Gracias D@rkbytes, sin tu ayuda no lo hubiese logrado. (y)
 
La estabilidad se puede mejorar usando un voltaje de referencia externo para el ADC y no tomando el mismo VDD del microcontrolador.
Algo que yo uso para mejorar notablemente la estabilidad aparte de eso es, usar algún timer para realizar la lectura del ADC
Eso me ha servido en varios casos en donde deseo mostrar voltaje o corriente, no sé si pueda servir para un ESR, aunque supongo que sí.
 
La estabilidad se puede mejorar usando un voltaje de referencia externo para el ADC y no tomando el mismo VDD del microcontrolador.
Algo que yo uso para mejorar notablemente la estabilidad aparte de eso es, usar algún timer para realizar la lectura del ADC
Eso me ha servido en varios casos en donde deseo mostrar voltaje o corriente, no sé si pueda servir para un ESR, aunque supongo que sí.

¡Vaya increíble lo de usar el timer!, pero mis conocimientos no me lo permiten por ahora. El PIC 12F683 funciona con 2.7v y la resolución es buena para este caso (2.6mv) aun usando el VDD como VREF y no me alcanzan los pines para usar VREF externo. Quizás usando un PIC con VREF interno de 1v, pero no se si hay uno de 8 pines, solo lo he visto en uno de 18 pines como el 16F1827. Gracias.
 
Podes publicar tu esquema electrico? Tal vez te sirva utitilizar un TL548C que se comunica via I2C que tal vez ya estes utilizando para mostrar en un display, por lo que no necesitas ningún pin más y te queda uno más disponible
 
Podes publicar tu esquema electrico? Tal vez te sirva utitilizar un TL548C que se comunica via I2C que tal vez ya estes utilizando para mostrar en un display, por lo que no necesitas ningún pin más y te queda uno más disponible

Es que el circuito y PCB ya esta terminado y "no puedo agregar mas componentes". Dejo el diagrama y advierto que soy muy inusual diseñando circuitos y pues a muchos no les gusta.

Es un medidor de ESR con indicación por Leds (solo 3 leds: bueno, regular, malo). La mayoría piensa que no sirve.

ESR-METER-M.png
 
Sin el menor ánimo de desanimarte, pero siendo realista.
Para diseñar un instrumento de medición hay que conocer la naturaleza de lo que se mide.
Quien diseño esto evidencia que no tiene idea de que se mide.
El valor de bueno para los capacitores no es igual para todos, va cambiando de acuerdo a la fama de capacitores
Mira esta escala de uno comercial
1547248376345.png
Si observas por ejemplo para un valor de 7 según la gama de capacitores para unos es bueno, para otra dudosa y para otra mala.
Por eso no sirve que mida con tres led.
Aún los digitales traen una tabla en el frente para cotejar según la capacidad que se trate
Mira, este que es digital, te da la capacidad y el valor ESR, y tiene la tabla impresa en el frente
1547248732146.png
 
Es un medidor de ESR con indicación por Leds (solo 3 leds: bueno, regular, malo)
La mayoría piensa que no sirve.
Soy de esos que piensan lo mismo.

Hace ya algunos años que armé este Medidor de ESR y funciona bastante bien.
En ese tiempo lo hice sobre circuito impreso perforado y hasta ahora sigue ahí.

Posteriormente quise hacerlo con un microcontrolador, pero de saber que ese funcionaba bien, ya no me animé a hacerlo.
 
Soy de esos que piensan lo mismo.

Hace ya algunos años que armé este Medidor de ESR y funciona bastante bien.
En ese tiempo lo hice sobre circuito impreso perforado y hasta ahora sigue ahí.

Posteriormente quise hacerlo con un microcontrolador, pero de saber que ese funcionaba bien, ya no me animé a hacerlo.
Si, la gente desconfía de lo nuevo ...aunque funcione. El medidor de ESR con 3 leds no tiene 3 indicaciones; tiene 8 para el ESR + otra para indicar cortocircuito y otra para indicar batería baja ... osea que tiene 10 indicaciones.

Se basa en el hecho de que si un condensador esta averiado o malo, no hay que saber que tan averiado o malo esta ... esta malo y hay que cambiarlo.

Ya lo he usado con excelentes resultados. :excelente:
 
Conozco como funciona y conozco como de debe medir, he comparado infinidad de medidores y te puedo decir que sirve y que no sirve, y ese circuito si tu quieres hacerlo hazlo, pero te digo algo no me baso en un capricho si no en conocimiento real, no por nada en la universidad tuve una materia que se llama mediciones eléctricas y electrónicas y otra en la que se ve la composición de los materiales de los componentes electrónicos, como se construyen, como están compuestos y como se miden a nivel de los fabricantes.
Tienen una parte teórica y otra práctica esas materias son un colador para avanzar, asi que debes saberlas muy pero muy bien.
Por eso te digo con conocimiento de causa, que queda muy bonito pero no sirve como instrumento, porque lo que te indicará no es real.
Nosotros entre otras cosas, calibramos instrumental de medición y mi hermano que es ingeniero electricista electrónico hace las certificaciones, lo cual implica tener instrumental para llevar a cabo mediciones y comparaciones y por supuesto los patrones necesarios.
Tu has lo que quieras, solo intento ayudarte para que mejores y aprendas más.

Yo utilizaría la misma placa, y el micro para manejar un display y un conversor A/D
 
Conozco como funciona y conozco como de debe medir, he comparado infinidad de medidores y te puedo decir que sirve y que no sirve, y ese circuito si tu quieres hacerlo hazlo, pero te digo algo no me baso en un capricho si no en conocimiento real, no por nada en la universidad tuve una materia que se llama mediciones eléctricas y electrónicas y otra en la que se ve la composición de los materiales de los componentes electrónicos, como se construyen, como están compuestos y como se miden a nivel de los fabricantes.
Tienen una parte teórica y otra práctica esas materias son un colador para avanzar, asi que debes saberlas muy pero muy bien.
Por eso te digo con conocimiento de causa, que queda muy bonito pero no sirve como instrumento, porque lo que te indicará no es real.
Nosotros entre otras cosas, calibramos instrumental de medición y mi hermano que es ingeniero electricista electrónico hace las certificaciones, lo cual implica tener instrumental para llevar a cabo mediciones y comparaciones y por supuesto los patrones necesarios.
Tu has lo que quieras, solo intento ayudarte para que mejores y aprendas más.

Yo utilizaría la misma placa, y el micro para manejar un display y un conversor A/D

No necesito su "ayuda". Mi capricho quedo así:

 
Hola. Esta vez tengo problemas en sumar números con punto flotante; y es que PROTON parece que no hace la suma o no se hacerla.

Estoy haciendo esto:

Dim VOLT As Float
Dim VOLTUP As Float

VOLT = ADIn 0
DelayUS 50
VOLT = VOLT / 204.8
VOLTUP = VOLT + 0.4

Digamos que VOLT/204 tiene como resultado 1.6 y le sumo 0.4 seria igual a VOLTUP = 2.0

Luego hago esto:

If VOLT < VOLTUP Then GoTo STAND_BY
If VOLT > VOLTUP Then GoTo POWER_ON

Como se ve VOLT (1.6) es menor que VOLTUP (2.0) y debería ir a la rutina STAND_BY, pero no lo hace y se va a POWER_ON.

Pero si lo hago así, entonces si funciona:

If VOLT < 2.0 Then GoTo STAND_BY
If VOLT > 2.0 Then GoTo POWER_ON

¿Por que?... de antemano muchas gracias por la ayuda.
 
Atrás
Arriba