Haz una pregunta
  Foros de Electrónica » Temas de Interés » Aportes y documentación
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

14/06/2014 #21
Moderador

Avatar de D@rkbytes

JoaquinFerrero dijo: Ver Mensaje
Esta es otra versión del código escrito en C, dirigida a reducir el tamaño del código final.
Se han eliminado los goto y una variable. Además, retrasar el uso de punto flotante hasta el final.

Lo malo es que no puedo probarlo a ver si funciona...
Saludos Joaquín, siento decirte que el código que expones, no funciona.
Muestra valores que no tienen nada que ver con el programa en Protón, ni con el que fue migrado a C.

Sé que el código en C se puede optimizar, sin embargo esa no fue la intención al haberlo pasado a C.
La verdadera intención fue que sea entendido por las personas que usan este lenguaje, y en PICC de CCS.
También entiendo que el uso de GoTo en C no es bien visto, sin embargo no es una instrucción prohibida.

Traté de hacer una transcripción lo más directa del código en PICBasic y por ese motivo omití los GoTo.

Lo que traté también de demostrar, es como los compiladores afectan a un programa en cuanto al tamaño final cuando se usan variables del tipo Float. (Mis respetos para Proton IDE)

Gracias Joaquín por tomarte el tiempo para reducir el tamaño del código, sé que a muchos les será de ayuda para una mejor comprensión del programa.
15/06/2014 #22

Avatar de JoaquinFerrero

Era obvio que no funcionaría a la primera, ya que voy a ciegas.

Mi objetivo no era tanto eliminar los goto, sino intentar reducir el tamaño del programa una vez compilado, ya que según lo que mostrabas antes, estaba a punto de llenarse la memoria para programas.

Naturalmente, el trabajo con punto flotante es muy oneroso en cuestión de instrucciones a ejecutar. Y por eso, cuando tenemos la memoria limitada, es interesante conocer técnicas para reducir el costo.

Aunque no funcione, sí que tengo curiosidad en saber si el tamaño del programa se ha reducido o no. En el programa lo dejé con dos llamadas para conversión y división a punto flotante. Según lo bueno que fuera el compilador debería haber ahorrado algunos bytes.

Saludos.
17/06/2014 #23
Moderador

Avatar de D@rkbytes

JoaquinFerrero dijo: Ver Mensaje
Era obvio que no funcionaría a la primera, ya que voy a ciegas.
Puedes usar el archivo de simulación en proteus para ver los resultados de la programación.
JoaquinFerrero dijo: Ver Mensaje
Aunque no funcione, sí que tengo curiosidad en saber si el tamaño del programa se ha reducido o no. En el programa lo dejé con dos llamadas para conversión y división a punto flotante. Según lo bueno que fuera el compilador debería haber ahorrado algunos bytes.
Era obvio que el tamaño se redujera, pues se omitieron las variables float.
No muy drásticamente pero si se obtuvo reducción, aunque no buenos resultados.

Tampoco se mejoró el porcentaje de memoria ROM usada con Proton IDE (71.78% Usando variables Float)

Dejo adjuntos los cambios obtenidos.
Imágenes Adjuntas
Tipo de Archivo: jpg General.jpg (54,8 KB (Kilobytes), 26 visitas)
Tipo de Archivo: jpg Functions.jpg (92,3 KB (Kilobytes), 17 visitas)
17/06/2014 #24

Avatar de JoaquinFerrero

Bueno... al menos lo hemos conseguido reducir en 300 bytes...

Me he bajado la simulación y funciona perfectamente con el cof, pero al ejecutarlo con el cof que viene con el fuente en C, no sale nada, y se ve por las señales que está en una especie de bucle sin fin.

No puedo hacer una compilación nueva, porque no tengo el mismo compilador que el tuyo, pero podría adaptarlo al mío (SDCC + GPUtils).
29/06/2014 #25


Hola de nuevo chicos
ayer monté la pcb y funciona muy bien.
estoy pensando como montarla en una cajita o similar para finalizar el montaje.

Una duda que tengo es a la hora de calibrar no llega a cero, a no ser que le ponga las puntas en las manos, ¿hay que conectarle un condensador para esto? si es asi, ¿de que valor?.

Muchas gracias de nuevo Darkbytes.

Os dejo una captura de pantalla de como queda mas o menos la placa, estoy aprendiendo a usar Proteus, asi que disculpad si los packages no están muy bien



29/06/2014 #26
Moderador

Avatar de D@rkbytes

luisdlahuerta dijo: Ver Mensaje
Hola de nuevo chicos
ayer monté la pcb y funciona muy bien.
estoy pensando como montarla en una cajita o similar para finalizar el montaje.

Una duda que tengo es a la hora de calibrar no llega a cero, a no ser que le ponga las puntas en las manos, ¿hay que conectarle un condensador para esto? si es así, ¿de que valor?.

Muchas gracias de nuevo Darkbytes.

Os dejo una captura de pantalla de como queda mas o menos la placa, estoy aprendiendo a usar Proteus, asi que disculpad si los packages no están muy bien
El procedimiento de calibración está en el post #1.
Para calibrar el capacímetro no tiene que tener ningún capacitor conectado en las terminales de prueba.
Se supone que se debe calibrar a 0.00pF.
Revisa bien las conexiones de los transistores, que no estés usando el archivo *.hex de simulación y verifica bien el correcto funcionamiento del preset multivueltas.
También se puede usar un preset normal pero cuesta más trabajo el ajuste y con el tiempo se puede desajustar.

Suerte.
29/06/2014 #27

Avatar de JoaquinFerrero

Darkbytes, ¿has mirado lo que te ponía en mi último mensaje? ¿O es que quizás no funciona el diseño del proteus para los dos .cof publicados?

Gracias.
29/06/2014 #28
Moderador

Avatar de D@rkbytes

JoaquinFerrero dijo: Ver Mensaje
Darkbytes, ¿has mirado lo que te ponía en mi último mensaje? ¿O es que quizás no funciona el diseño del proteus para los dos .cof publicados?

Gracias.
Compilé el código que subiste y lo probé tanto en simulación como físicamente.
En ambos casos muestra valores incorrectos y no se puede lograr la autocalibración.
Se puede decir que tan solo funciona la lectura del capacitor de 47nF.
El capacitor de 470uF lo mide como 24.xxuF. El de 1000uF. como 4.xx y el de 2200uF. como 0.xxuF.

Con el código que subí en C si funciona el *.cof, si se puede lograr la autocalibración y los valores mostrados en simulación y en físico son correctos.

Nota:
Ahora he logrado reducir el código a un 79.8% aún con float y funciona a la perfección.
Imágenes Adjuntas
Tipo de Archivo: jpg General.jpg (62,7 KB (Kilobytes), 294 visitas)
Archivos Adjuntos
Tipo de Archivo: rar 16F628A CapMeter AutoCal PICC II.rar (60,5 KB (Kilobytes), 65 visitas)
29/06/2014 #29

Avatar de JoaquinFerrero

No, no me refiero a mi código, que sabemos que está mal. Se trata del último comentario que hice (#24) sobre que no era capaz de correr uno de tus cof en tu propia simulación del Proteus (los dos publicados antes).

Es decir: el cof que acompaña a la simulación, funciona, pero el cof que acompaña al código C publicado, no. O al menos, en la simulación, no funciona.

Voy a probar este último aporte que has subido.

Gracias.

Edito: ya lo he probado y funciona bien. Como también has subido el código en C, ya puedo intentar mejorarlo (si puedo).

Este es otro intento. Sólo he cambiado un par de cosillas de sitio, así que no creo que haya mucho ahorro. Lo interesante es que funcione igual y el siguiente intento.
Archivos Adjuntos
Tipo de Archivo: rar CapMeter JHD 162A.c.rar (2,1 KB (Kilobytes), 30 visitas)
29/06/2014 #30
Moderador

Avatar de D@rkbytes

JoaquinFerrero dijo: Ver Mensaje
No, no me refiero a mi código, que sabemos que está mal. Se trata del último comentario que hice (#24) sobre que no era capaz de correr uno de tus cof en tu propia simulación del Proteus (los dos publicados antes).

Es decir: el cof que acompaña a la simulación, funciona, pero el cof que acompaña al código C publicado, no. O al menos, en la simulación, no funciona.
Tal vez fue porque utilizaste un archivo de simulación anterior, recuerda que en PICC se tiene que usar el pin RW de la pantalla y en los esquemas anteriores este pin está conectado hacia Vss.
No existe otra razón para que no funcionen los coff, ya que son los que he usado para las simulaciones.
JoaquinFerrero dijo: Ver Mensaje
Este es otro intento. Sólo he cambiado un par de cosillas de sitio, así que no creo que haya mucho ahorro. Lo interesante es que funcione igual y el siguiente intento.
Si funciona bien, no hay ahorro pero ya se ven menos GoTo.
30/06/2014 #31

Avatar de JoaquinFerrero

Siguiente versión. Tampoco hay ahorro de espacio, pero cambiados algunos goto por bucles while o subrutinas.
Archivos Adjuntos
Tipo de Archivo: rar CapMeter JHD 162A.c.rar (2,1 KB (Kilobytes), 29 visitas)
01/07/2014 #32
Moderador

Avatar de D@rkbytes

JoaquinFerrero dijo: Ver Mensaje
Siguiente versión. Tampoco hay ahorro de espacio, pero cambiados algunos goto por bucles while o subrutinas.
Ya está mejor la versión en C y funciona bien
Gracias Joaquín por seguir mejorando esta versión del código.
01/07/2014 #33

Avatar de JoaquinFerrero

Otra versión. Vamos poco a poco, pero al menos vamos seguros de que funciona.

Esta versión tiene más limpieza del código, algún comentario más y algún comentario recortado. También están formateados con tabuladores, que ayuda en la edición de las sentencias que les preceden.

Hay también un par de cambios importantes, que es posible que lo hagan fallar, sobre todo el bucle de la línea 144 a 162.

Se ha sacado aparte el procedimiento de Calibrado.

Si tuviera claro el funcionamiento de esas líneas, creo que se podrían simplificar un poco más.

Si me dices que esta versión funciona, entonces el siguiente paso será quitar el uso de punto flotante, donde se debería apreciar ahorro de bytes.
Archivos Adjuntos
Tipo de Archivo: rar CapMeter JHD 162A.c.rar (2,0 KB (Kilobytes), 36 visitas)
01/07/2014 #34
Moderador

Avatar de D@rkbytes

JoaquinFerrero dijo: Ver Mensaje
Se ha sacado aparte el procedimiento de Calibrado.

Si tuviera claro el funcionamiento de esas líneas, creo que se podrían simplificar un poco más.
Ese procedimiento sirve para no hacer una recalibración cuando Cx = 0.00 pF.
Únicamente ha faltado declarar este procedimiento en la cabecera, pero agregándolo ya se puede compilar.
JoaquinFerrero dijo: Ver Mensaje
Si me dices que esta versión funciona, entonces el siguiente paso será quitar el uso de punto flotante, donde se debería apreciar ahorro de bytes.
Si funciona correctamente y los valores mostrados son correctos.
También se ha mejorado la resolución en la escala baja.
01/07/2014 #35

Avatar de JoaquinFerrero

Otra versión. Y ésta seguro que falla.

Ponme el error que salga.

He comenzado a simplificar código creando más subrutinas.

La duda que tengo es en el paso de valores por las subrutinas. Lo he escrito en C estándar.

¿La librería lcd.c es pública? O mándame un enlace si está por Internet.

¿Cómo se define una variable de 32 bits? ¿long, long int, int32?
Archivos Adjuntos
Tipo de Archivo: rar CapMeter JHD 162A.c.rar (2,0 KB (Kilobytes), 20 visitas)
01/07/2014 #36
Moderador

Avatar de D@rkbytes

JoaquinFerrero dijo: Ver Mensaje
Otra versión. Y ésta seguro que falla.

Ponme el error que salga.
La duda que tengo es en el paso de valores por las subrutinas. Lo he escrito en C estándar.
Aparece error en la rutina void Pinta_Txt (char *Texto)
*** Error 90 "CapMeter JHD 162A.c" Line 81(41,42): Attempt to create a pointer to a constant
Y es porque char acepta únicamente 8 bits (unsigned int8) y no una cadena de caracteres.
JoaquinFerrero dijo: Ver Mensaje
¿La librería lcd.c es pública? O mándame un enlace si está por Internet.
Es la que viene por defecto con el compilador.
JoaquinFerrero dijo: Ver Mensaje
¿Cómo se define una variable de 32 bits? ¿long, long int, int32?
Se define como int32
Adjunto los tipos y la librería actual.
Archivos Adjuntos
Tipo de Archivo: rar Basic and Special types.rar (10,2 KB (Kilobytes), 26 visitas)
01/07/2014 #37

Avatar de JoaquinFerrero

No, eso no es lo que quiere decir el error. Ya sé que char es para 8 bits, lo que he puesto en la declaración de la función Pinta_Txt es char *, que es la forma estándar para definir punteros a cadenas de caracteres.

Lo que dice el mensaje de error es que no se puede crear un puntero a una cadena de caracteres constante.

Entrando en la web de CSS, dice que hay que poner 'const' delante del 'char *' para indicar que se va a apuntar a texto que está en la memoria del programa.

Prueba a poner

const char *

tanto en la declaración de función en la línea 34, como en la definición de función de la línea 179.

Si no funciona, entonces pon esta línea al principio y vuelve a probar:

#device PASS_STRINGS=IN_RAM

y nos cuentas qué tal.

Lo he sacado de aquí: https://www.ccsinfo.com/content.php?...piler-features
01/07/2014 #38
Moderador

Avatar de D@rkbytes

JoaquinFerrero dijo: Ver Mensaje
Prueba a poner

const char *

tanto en la declaración de función en la línea 34, como en la definición de función de la línea 179.

Si no funciona, entonces pon esta línea al principio y vuelve a probar:

#device PASS_STRINGS=IN_RAM

y nos cuentas qué tal.

Lo he sacado de aquí: https://www.ccsinfo.com/content.php?...piler-features
Con poner #device PASS_STRINGS=IN_RAM ya compila.
Pero ahora se ha elevado el consumo de ROM a 93% y el de RAM a un 34%

El nuevo procedimiento Pinta_Txt sigue sin funcionar, muestra una tilde "'" en vez de "*CALIBRACION OK*"
Y un 8 en vez de "!FUERA DE RANGO!"

No lo veo necesario, pero eso es lo que está pasando ahora.

Edit:
También utilicé const char calib[] = "*CALIBRACION OK*"; y pasando esta cadena a la rutina, sin éxito.
02/07/2014 #39

Avatar de JoaquinFerrero

He intentado instalar la demo del compilador, pero no me funciona con el emulador de Windows que tengo.

He dado un paso atrás y he quitado la Pinta_txt() hasta que sepamos cómo abreviarlo.

Aquí hay otra versión, en la que debería desaparecer el código relativo al punto flotante, y notarse más el aumento de velocidad y el ahorro de bytes.
Archivos Adjuntos
Tipo de Archivo: rar CapMeter JHD 162A.c.rar (2,0 KB (Kilobytes), 16 visitas)
02/07/2014 #40
Moderador

Avatar de D@rkbytes

JoaquinFerrero dijo: Ver Mensaje
Aquí hay otra versión, en la que debería desaparecer el código relativo al punto flotante, y notarse más el aumento de velocidad y el ahorro de bytes.
Si disminuyó el uso de ROM a 59% y el de RAM a un 17% pero ahora dejó de funcionar el muestreo bajo.
Los valores leídos inferiores a 47 nF muestran 0.00 pF.

Por ahora de los códigos que has modificado, el que mejor va es el del post #33

Aquí unas fotos de las pruebas del código funcional sobre protoboard.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Buscar más temas sobre:
Lupa Aportes y documentación

Artículos técnicos, notas de aplicación, diagramas circuitales, y demás documentos de interés enviados por nuestra comunidad.

Cerrar
Foros de Electrónica » Temas de Interés » Aportes y documentación

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.