TODOPIC

Microcontroladores PIC => * PROYECTOS * => Mensaje iniciado por: BrunoF en 09 de Diciembre de 2009, 04:44:20

Título: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 04:44:20
El proyecto nace en el foro (http://www.ucontrol.com.ar/forosmf/) de aitopes (http://www.todopic.com.ar/foros/index.php?action=profile;u=4480) hace un tiempo. Ingreso al proyecto para crear el parseador de ecuaciones, necesario para pasar de notacion infija a posfija. Esto me conlleva luego a crear también el evaluador de la notacion posfija. Sólo faltaba un pasito mas para lograr ingresar fórmulas y graficarlas, asi que lo hice. Lamentablemente el hardware fisico no existe, sólo en el simulador pude utilizarlo. Espero poder en algun momento tener los componentes necesarios para poder verlo en la realidad.


Características actuales:

Parseador:


Evaluador:


Graficador:

Cosas por hacer(ToDo List):


Requerimientos:

Consumos actuales:
PIC:Worst case RAM:ROM:Worst case Stack levels:
18F455017%(348 bytes)63%(20640 bytes)5(of 31 avaiable)
18F672213%(434 bytes)16%(20718 bytes)5(of 31 avaiable)

Forma de uso:

Ejemplo:

Finalmente, les dejo algunas capturas de pantalla de diversas superficies con las que he "jugado". Espero les guste.





Ecuación:Gráfica:
(x/4)^2-(y/4)^2(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=10656)
x^2+y^2(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=10658)
sqrt(20-x^2-y^2)(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=10660)
sin(x)cos(y)(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=10662)
Sin3xCos3x(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=17245)
sqrt(5-x^2)-sqrt(9-y^2)(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=17247)
x^2+y^2-2(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=17249)
x+y(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=17251)
x^2+y^2-2(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=17261)
(sqrt(5-x^2)-sqrt(9-y^2))(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=17263)

Sus graficas o ecuaciones son bienvenidas! :D

página del proyecto original:en foro uControl (http://www.ucontrol.com.ar/forosmf/proyectos-con-pic/calculadora-cientifica-grafica-con-pic/)
Repositorio del parseador y evaluador:http://github.com/brunof/PicParser
Repositorio del software de la calculadora/graficadora:http://github.com/brunof/PicCalcGraph
Proyecto con pantalla color(Autor: Suky)Aquí (http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=17265/)
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Nocturno en 09 de Diciembre de 2009, 05:34:30
Me quedo boquiabierto, maestro Bruno. Eres el puto amo.
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: droky en 09 de Diciembre de 2009, 06:23:21
Hola,
Un trabajo impresionante Bruno. Mis felicitaciones.
Salu2
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: jgpeiro06 en 09 de Diciembre de 2009, 06:54:10
Hola BrunoF!

Me gustaría aportar un pequeño código a la calculadora que creo que es muy útil. Se trata de la función nsolve que encuentra valores de una variable que hacen cumplir una ecuación
    nsolve( 3 * x + 5 = 7 , x ) devuelve un 0.666
    nsolve( #e^(x) + x = 10, x ) devuelve 2.070579901
Mi calculadora casio de 20 € la incorpora y te ahorra mucho tiempo ya que no tienes que estar despejando ecuaciones para resolverlas.
El método que utiliza para resolver se llama el Metodo de Newton ( http://es.wikipedia.org/wiki/M%C3%A9todo_de_Newton (http://es.wikipedia.org/wiki/M%C3%A9todo_de_Newton) )
y este necesita de derivadas numéricas que se pueden obtener mediante la definición diff(f(x),x) = lim((f(x+h)-f(x-h))/(2*h),h,0) .

También voy a mirar el parser y el evaluador para ver si se podría añadir operaciones con matrices.
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Drod en 09 de Diciembre de 2009, 07:09:11
Creo que mi Casio de mil años se va a jubilar!  :D
(http://www.i9shop.com.br/media/catalog/product/cache/1/small_image/135x135/5e06319eda06f020e43594a9c230972d/m/r/mrt-2300533-1.jpg)

Felicitaciones! Impresionado!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: stk500 en 09 de Diciembre de 2009, 08:04:21
Joder Bruno  :D :D  no se te quemaron los cable de la cabeza pensando en Formulas  :D :D :D
Muy buen proyectos :mrgreen:
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Suky en 09 de Diciembre de 2009, 09:28:11
Espectacular! Faltaba poquito nomas!  :mrgreen: Esta realizado en un PIC24FJ256GB110 ?Si es así, lo complicado va a ser armar el hardware  :(

Felicitaciones por el logro  :-/


Saludos!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: migsantiago en 09 de Diciembre de 2009, 09:58:00
Es como un mini matlab pero con pic jeje... llamémoslo piclab  :D

Felicidades Bruno.
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 10:23:26
Gracias por los halagos! :D

Hola BrunoF!

Me gustaría aportar un pequeño código a la calculadora que creo que es muy útil. Se trata de la función nsolve que encuentra valores de una variable que hacen cumplir una ecuación
    nsolve( 3 * x + 5 = 7 , x ) devuelve un 0.666
    nsolve( #e^(x) + x = 10, x ) devuelve 2.070579901
Mi calculadora casio de 20 € la incorpora y te ahorra mucho tiempo ya que no tienes que estar despejando ecuaciones para resolverlas.
El método que utiliza para resolver se llama el Metodo de Newton ( http://es.wikipedia.org/wiki/M%C3%A9todo_de_Newton (http://es.wikipedia.org/wiki/M%C3%A9todo_de_Newton) )
y este necesita de derivadas numéricas que se pueden obtener mediante la definición diff(f(x),x) = lim((f(x+h)-f(x-h))/(2*h),h,0) .

También voy a mirar el parser y el evaluador para ver si se podría añadir operaciones con matrices.


Interesantísimo. Yo en mi HP48 también tengo algo parecido. Si necesitás ayuda con alguna parte, no dudes en preguntar...:)

Espectacular! Faltaba poquito nomas!  :mrgreen: Esta realizado en un PIC24FJ256GB110 ?Si es así, lo complicado va a ser armar el hardware  :(

Felicitaciones por el logro  :-/


Saludos!


No, esta realizado con un 18F6722 que es un 18F con 128K de memoria ROM, que es lo que el aparato devora. El código también entra en un 18F4550. Hay una gran parte de la ROM que está siendo consumida por "printf()" innecesarios, que actualmente uso para guiar al usuario durante el proceso de ingresado de los datos...

El circuito electrónico es hiper sencillo. Actualmente sólo consta de la conexión al LCD y 2 pines para la terminar virtual.

Comento lo que ocupa(parser+evaluador+main) en los peores casos:
PIC:Worst case RAM:ROM:Worst case Stack levels:
18F455017%(348 bytes)63%(20640 bytes)5(of 31 avaiable)
18F672221%(434 bytes)16%(20718 bytes)5(of 31 avaiable)

Obviamente el 18F6722 tiene muchísima más ROM que el 18F4450. 128KBytes contra 32KBytes(lo cuadriplica en tamaño) y por eso la diferencia.
En la circuito de Proteus aparecen ambos, pero no se asusten que sólo funciona el de abajo en la simulación... :D

Es como un mini matlab pero con pic jeje... llamémoslo piclab  :D

Felicidades Bruno.

Ja ja! Bueno, por que no? Aunque para llegar a algo parecido a MatLab vamos a necesitar bastante trabajito más... :oops:

La idea es que quien quiera participe el proyecto. Para ello estará el repositorio, y cada uno aportará lo que quiera/pueda.
A mi me ha encantado hacerlo, pero la verdad que uno se va erosionando con cada línea que crea. Ojalá podamos expandirla y dotarla de una interfaz grafica y menúes dígnos, para poder darle un acabado profesional.

Saludos.
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: migsantiago en 09 de Diciembre de 2009, 10:34:19
Oye Bruno, veo el 18f6722 y corre hasta 40MHz, ¿no te convendría el 4550 que corre hasta 48MHz?  :mrgreen:
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: salchig en 09 de Diciembre de 2009, 10:38:03
Wouu  :o excelente trabajo ers un genio. Solo no encontre el comando que hace rotar las graficas entorno al eje z  :lol:
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: aitopes en 09 de Diciembre de 2009, 10:41:09
Terrible pedazo de soft.

Aplausos para vos!!!  :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Seria buenisimo poder hacer el hard. La idea original quedo muy por detrás del soft.

Felicitaciones otra vez.  :)
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 10:44:38
Oye Bruno, veo el 18f6722 y corre hasta 40MHz, ¿no te convendría el 4550 que corre hasta 48MHz?  :mrgreen:

Ja ja! A exprimirlo hasta la última gota, eh? :D.

Mira, para graficar la funcion sen(x)cos(y), tarda @ 40mhz 5.5 segundos. En ese intervalo evalúa 2500 veces la función de entrada. Eso daría un promedio de 450 evaluaciones por segundo.

A 48 mhz tardaría 4.6 segundos. Hay una diferencia. Tal vez en cálculos más pesados, o con mayor cantidad de evaluaciones valga la pena. Actualmente preferí el 18F6722 porque es mas holgado de ROM, que es lo que más ajustado andaba.

Wouu  :o excelente trabajo ers un genio. Solo no encontre el comando que hace rotar las graficas entorno al eje z  :lol:

:D

Aunque suene loco, la idea era poder, en el futuro, y mejor aún si trabaja en ese entonces con matrices, poder desarrollar una vista mediante cuaterniones (http://es.wikipedia.org/wiki/Cuaterni%C3%B3n). Esto nos daría la libertad de poder mirar mejor y donde se nos plazca a las gráficas generadas...

Por otro lado, una gran limitante actual de la graficación, es la pantalla de pobre resolución y monocromática. Me gustaría poder conectarle una pantalla de mayor resolución y colores, o bien conectarlo a un TV generando la señal de video compuesto en una resolución digna y algunos colores.

Terrible pedazo de soft.

Aplausos para vos!!!  :mrgreen: :mrgreen: :mrgreen: :mrgreen: :mrgreen:

Seria buenisimo poder hacer el hard. La idea original quedo muy por detrás del soft.

Felicitaciones otra vez.  :)

Gracias Ariel! Si habremos renegado juntos, eh?  :D

Prometo postearlo pronto en tu foro! ;)
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: cdrpo en 09 de Diciembre de 2009, 10:47:13
el hardware fisico no existe, sólo en el simulador pude utilizarlo.

Que simulador? y como puedo probarlo

Un link de un emulador de la calculadora CASIO PB1000/2000C

http://www.pisi.com.pl/piotr433/pb1000ee.htm
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: PalitroqueZ en 09 de Diciembre de 2009, 10:48:26
te pasaste Bruno  :shock:, Gran Proyecto!!  Felicidades:mrgreen:

Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 10:51:50
el hardware fisico no existe, sólo en el simulador pude utilizarlo.

Que simulador? y como puedo probarlo

Un link de un emulador de la calculadora CASIO PB1000/2000C

http://www.pisi.com.pl/piotr433/pb1000ee.htm

Hola. Necesitás Proteus 7.0 o superior para poder simular el proyecto. Si tenés un  LCD de 128x64 y un 18F4550 conectado a la PC por serie, podrías probarlo en hardware real...(Ojo que el .hex esta generado para otro micro, pero cambiando unas lineas sale andando para el 18F4550).

Saludos.

te pasaste Bruno  :shock:, Gran Proyecto!!  Felicidades:mrgreen:

Gracias Pedro. :)
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: jgpeiro06 en 09 de Diciembre de 2009, 11:26:34
Aquí el código aún sin probar de lo que la implementacino de la funcion nsolve.
No lo he probado, pero es suficiente para hacerse una idea de como funciona.
He utilizado la función scanf() en lugar del bucle do{temp[posicion]=... original asumiendo que cumple la misma función.
En la función strEvaluar() la variable y1 es NULL ya que no se utiliza y se supone que no debe afectar al resultado.
La derivada se calcula para h = 1E-4 asumiendo que h es suficientemente pequeño. Tambien se puede meter en un bucle e ir disminuyendo h hasta tener un error despreciable como se ha realizado en la funcion newton.

Un ejemplo de uso para calcular la tensión que cae en un diodo:
(http://farm3.static.flickr.com/2666/4171201929_c7a49b9e80_o.jpg)

Tenemos el circuito con una fuente de 1V, un R de 1K y un diodo.
La ecuación del circuito seria -V + ID(VD) * R + VD = 0, donde ID(VD) = IS *( #e^(VD/VT) - 1) y IS=1E-14 e VT=0.0258...
Reescribimos la ecuacion utilizando la incognita x:
-1+(1E-14*(#e^(x/0.025)-1))*1000+x=0
introducimos la ecuación y obtenemos x = 0.6294415184 que es con bastante precisión el resultado obtenido con el simulador.



Código: C
  1. /*      Funcion SOLVE numerica basada en el metodo de newton.
  2.  *      Autor Jose Antonio Garcia Peiro.
  3.  *      Basado en el trabajo de Bruno Fascendini       
  4.  */
  5.  
  6. // Más info en http://es.wikipedia.org/wiki/Derivada  
  7. float diff( char *function, float x ){
  8.         float x1 = 0, x2 = 0, h = 1E-4;
  9.  
  10.         x1 = x + h;
  11.         x2 = x - h;
  12.  
  13.         fx1 = *strEvaluar( EquIn, StackNum, &x1, NULL, NULL );
  14.         fx2 = *strEvaluar( EquIn, StackNum, &x2, NULL, NULL );
  15.  
  16.         return ( x1-x2 ) / ( 2*h );
  17. }
  18.  
  19. // Más info en http://es.wikipedia.org/wiki/M%C3%A9todo_de_Newton
  20. float newton( char *function, float x ){
  21.         float tmp = 0, ABSERR = 1E-4;
  22.        
  23.         do{
  24.                 tmp = x;
  25.  
  26.                 fx = *strEvaluar( EquIn, StackNum, &x, NULL, NULL);
  27.                 dfx = diff( EqIn, x );
  28.  
  29.                 x = x - fx / dfx;
  30.         }while( abs( tmp - x ) > ABSERR );
  31.        
  32.         return x;
  33. }
  34.  
  35. int main(){
  36.  
  37.         char EquIn[32];
  38.         float x = 0, soluc = 0;
  39.        
  40.         while( 1 ){
  41.                 scanf( "Introduce la funcion f(x)=0 : %s", EquIn );
  42.  
  43.                 strlwr( EquIn );                                // 1) PASAR EQUACION A MINUSCULAS
  44.                 strCodificar( EquIn );                  // 2) REDUCIR ECUACION PARA OPTIMIZAR PROCESADO POSTERIOR
  45.                 strPosFijar( EquIn ,EquIn );    // 3) Pasar a notación PostFija
  46.  
  47.                 scanf( "\nIntroduce el valor inicial de busqueda: x = %f \n", &x );            
  48.                 soluc = newton( EquIn, x );
  49.                 printf( "La equacion f(x) = %s es 0 para x = %f \n" , EquIn, soluc );
  50.         }
  51.        
  52.         return 0;
  53. }

Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Suky en 09 de Diciembre de 2009, 11:27:40
No, esta realizado con un 18F6722 que es un 18F con 128K de memoria ROM, que es lo que el aparato devora. El código también entra en un 18F4550. Hay una gran parte de la ROM que está siendo consumida por "printf()" innecesarios, que actualmente uso para guiar al usuario durante el proceso de ingresado de los datos...

El circuito electrónico es hiper sencillo. Actualmente sólo consta de la conexión al LCD y 2 pines para la terminar virtual.

Comento lo que ocupa(parser+evaluador+main) en los peores casos:
PIC:Worst case RAM:ROM:Worst case Stack levels:
18F455017%(348 bytes)63%(20640 bytes)5(of 31 avaiable)
18F672221%(434 bytes)16%(20718 bytes)5(of 31 avaiable)

Obviamente el 18F6722 tiene muchísima más ROM que el 18F4450. 128KBytes contra 32KBytes(lo cuadriplica en tamaño) y por eso la diferencia.
En la circuito de Proteus aparecen ambos, pero no se asusten que sólo funciona el de abajo en la simulación... :D
:oops: No había visto el *.rar para descargar, pensé que eran las imágenes  :mrgreen: Estuve probando y es excelente. Falta menos, implementar teclado y las operaciones, que ya es lo de menos, pero.. entrará en 4550? capaz un 4620 que tiene 64k.  ;-)


Saludos!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 11:44:14
Grande jpgeiro!  :-/ :-/ :-/

En un ratito ya la creaste!

Ahora, lo correcto sería agregarla al parseador, no? :)

Gracias por el aporte! En cuanto pueda arranco el repositorio...

No, esta realizado con un 18F6722 que es un 18F con 128K de memoria ROM, que es lo que el aparato devora. El código también entra en un 18F4550. Hay una gran parte de la ROM que está siendo consumida por "printf()" innecesarios, que actualmente uso para guiar al usuario durante el proceso de ingresado de los datos...

El circuito electrónico es hiper sencillo. Actualmente sólo consta de la conexión al LCD y 2 pines para la terminar virtual.

Comento lo que ocupa(parser+evaluador+main) en los peores casos:
PIC:Worst case RAM:ROM:Worst case Stack levels:
18F455017%(348 bytes)63%(20640 bytes)5(of 31 avaiable)
18F672221%(434 bytes)16%(20718 bytes)5(of 31 avaiable)

Obviamente el 18F6722 tiene muchísima más ROM que el 18F4450. 128KBytes contra 32KBytes(lo cuadriplica en tamaño) y por eso la diferencia.
En la circuito de Proteus aparecen ambos, pero no se asusten que sólo funciona el de abajo en la simulación... :D
:oops: No había visto el *.rar para descargar, pensé que eran las imágenes  :mrgreen: Estuve probando y es excelente. Falta menos, implementar teclado y las operaciones, que ya es lo de menos, pero.. entrará en 4550? capaz un 4620 que tiene 64k.  ;-)


Saludos!

:D Suele pasar...Despistado! Ja ja!

Si, yo me fui al máximo de la serie 18F porque tenía miedo...Podríamos pasar a uno mediano.
Se agradece si colaboran con el teclado y los menúes.

Una vez más, va a hacer falta el repositorio para ir versionando el soft con los aportes..
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: NANO1985 en 09 de Diciembre de 2009, 12:00:19
hola! brunoF! te pasaste hermano!!!, yo hago volar pics!  :D , pero vos t fuiste muuuuuy lejos!!
jeje saludos! y mis felicitaciones!
nano
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 12:31:09
Gracias NANO!

He creado los repositorios para poder ir versionando el software.
Pronto agregaré la función nsolve que jpgeiro propuso e implementó.

Gracias!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Felixls en 09 de Diciembre de 2009, 12:42:20
muy buen laburo te tomaste con ese código!  :shock:

 :-/ :-/

Quiero agregarle las funciones estadísticas de mi proyecto (PocketEG (http://sourceforge.net/projects/pocketeg/)), aunque no se si entrará en la memoria...

Felicitaciones!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: migsantiago en 09 de Diciembre de 2009, 12:46:39
Dicho y hecho, ya todos quieren agregar librerías al pobre pic convirtiéndolo en mini matlab  :D  :D
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 12:47:09
Hola Felixls!

Son muy avanzados los cálculos? Yo creo que seguro entra...

Mirá que hay bastante memoria disponible por ahora...:)

Dicho y hecho, ya todos quieren agregar librerías al pobre pic convirtiéndolo en mini matlab  :D  :D

Mejor para todos,no? :D :D :D
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Suky en 09 de Diciembre de 2009, 12:50:53
Dicho y hecho, ya todos quieren agregar librerías al pobre pic convirtiéndolo en mini matlab  :D  :D

 :D :D  Si ahora entra en un 4550 y sus 32k, con 128k hay para divertirse bastante  :D :D
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Drod en 09 de Diciembre de 2009, 12:57:18
 :shock: :shock: :shock: juaaaaa que nivel que nivel!!!  :shock: :shock: :shock:

es demasiado para mi, jajaja  :D

Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 12:57:46
Estuve pensando en poder graficar superficies en f(x,y,z).

Creo que puede hacerse. El parseador y el evaluador actualmente lo soportan. El que no soporta mostrar este tipo de superficies, es el graficador. Obviamente se puede modificar. Sería para poder acceder a graficar casi todas las figuras así(pero no tan lindas como ahí porque no nos da la pantalla :() http://www1-c703.uibk.ac.at/mathematik/project/bildergalerie/gallery.html

Saludos
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Felixls en 09 de Diciembre de 2009, 13:07:23
Son muy avanzados los cálculos? Yo creo que seguro entra...

Mirá que hay bastante memoria disponible por ahora...:)

Algunos son complicados, otros para nada, de la biblioteca Math (de C# en este caso), uso solo estas funciones

Log, Abs, Exp, Sqrt, Floor, Pow, Sin, Cos y PI.

Con estas funciones básicas, se construye por ejemplo la aproximación de la integral para calcular la distribución normal acumulativa,

(http://img7.imageshack.us/img7/714/6c902946bf4de679202468d.png)

y se calcula con la función Gamma:

Código: [Seleccionar]
/// <summary>
/// Gets the cumulative normal distribution function.
/// </summary>
public double ValueOf(double x)
{
x = (x - mean) / (Math.Sqrt(2) * sigma);

double erf = 0.0;

if(x != 0.0)
{
if(double.IsPositiveInfinity(x))
{
erf = 1.0;
}
else if(double.IsNegativeInfinity(x))
{
erf = -1.0;
}
else
{
if(x >= 0.0)
{
erf = IncompleteGamma(0.5, x*x);
}
else
{
erf = - IncompleteGamma(0.5, x*x);
}
}
}

return (erf + 1.0) / 2.0;

}

// Incomplete Gamma Function P(a,x) = integral from zero to x of (exp(-t)t^(a-1))dt
private static double IncompleteGamma(double a, double x)
{
Debug.Assert(a >= 0.0 && x >= 0.0);

double igf = 0.0;

if(x < a + 1.0)
{
// Series representation
igf = IncompleteGammaSer(a, x);
}
else
{
// Continued fraction representation
igf = IncompleteGammaFract(a, x);
}

return igf;
}

// Incomplete Gamma Function P(a,x) = integral from zero to x of (exp(-t)t^(a-1))dt
// Series representation of the function - valid for x < a + 1
private static double IncompleteGammaSer(double a, double x)
{
Debug.Assert(a >= 0.0 && x >= 0.0);
Debug.Assert(x < a + 1.0, "#E00 Continued Fraction Representation.");

int i = 0;
double igf = 0.0D;
bool check = true;

double acopy = a;
double sum = 1.0 / a;
double incr = sum;
double loggamma = LogGamma(a);

while(check)
{
++i;
++a;
incr *= x/a;
sum += incr;
if(Math.Abs(incr) < Math.Abs(sum) * igfeps)
{
igf = sum * Math.Exp(-x + acopy * Math.Log(x)- loggamma);
check = false;
}

if(i >= igfiter)
{
check = false;
igf = sum * Math.Exp(-x + acopy * Math.Log(x)- loggamma);
}
}

return igf;
}


Para otras funciones como la binomial, es más fácil, ya que
  Pb(r/n; p) = ( n )   r       n-r

                    ( p ) p   (1 -p)


Pb es la probabilidad binomial, de r éxitos dada una muestra de n, y una probabilidad p.

(n)
(P) es un número combinatorio

  r
p     es p elevado a la r

     n-r
(1-p)    es (1-p) elevado a n-r.

Mirá los códigos un ratito y vas a ver que son cálculos muy sencillos y que sirven para resuelver problemas estadísticos complejos.
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Suky en 09 de Diciembre de 2009, 13:08:08
Estuve pensando en poder graficar superficies en f(x,y,z).

Creo que puede hacerse. El parseador y el evaluador actualmente lo soportan. El que no soporta mostrar este tipo de superficies, es el graficador. Obviamente se puede modificar. Sería para poder acceder a graficar casi todas las figuras así(pero no tan lindas como ahí porque no nos da la pantalla :() http://www1-c703.uibk.ac.at/mathematik/project/bildergalerie/gallery.html

Saludos
Claro, lo malo que con la pantalla no se va a entender nada o casi nada  :(
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 13:13:42
Algunos son complicados, otros para nada, de la biblioteca Math (de C# en este caso), uso solo estas funciones

Log, Abs, Exp, Sqrt, Floor, Pow, Sin, Cos y PI.

Todas las funciones que comentás, están siendo utilizadas en el evaluador, por lo que no incrementaría en casi nada el tamaño de memoria requerido más allá de las lineas de código que expones...:D



Mirá los códigos un ratito y vas a ver que son cálculos muy sencillos y que sirven para resuelver problemas estadísticos complejos.

Lo voy a mirar detenidamente. Seguro que podemos incorporarlo.

Ahora se nos va a quedar corta la parte de menúes. Esto está empezando a pedir a gritos una interfaz gráfica en la pantalla...;)

Estuve pensando en poder graficar superficies en f(x,y,z).

Creo que puede hacerse. El parseador y el evaluador actualmente lo soportan. El que no soporta mostrar este tipo de superficies, es el graficador. Obviamente se puede modificar. Sería para poder acceder a graficar casi todas las figuras así(pero no tan lindas como ahí porque no nos da la pantalla :() http://www1-c703.uibk.ac.at/mathematik/project/bildergalerie/gallery.html

Saludos
Claro, lo malo que con la pantalla no se va a entender nada o casi nada  :(

Si...:( Pero mientras tengamos ROM, vale la pena. Quien sabe? Por ahi algun día la conectamos al generador de video (http://www.todopic.com.ar/foros/index.php?topic=22424.0;topicseen) de flacoclau (http://www.todopic.com.ar/foros/index.php?action=profile;u=1009) o al que había empezado a colores (http://www.todopic.com.ar/foros/index.php?topic=27239.0) el pollo(SavageChicken (http://www.todopic.com.ar/foros/index.php?action=profile;u=2702)).
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: aitopes en 09 de Diciembre de 2009, 13:47:39
Hola Brunof!

Yo creo que esto amerita laburar para hacer el hard. Hasta me animaria a decirte que si tanteas un poco el terreno, entre los dos foros se pueden juntar.....30 o 40 personas interesadas en construirla, como para hacer los PCB con un costo razonable. Calculo que un PCB en esas cantidades no seria demasiado caro.....y te queda una super calculadora "made in uno mismo" :)
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 09 de Diciembre de 2009, 13:58:07
Hola Brunof!

Yo creo que esto amerita laburar para hacer el hard. Hasta me animaria a decirte que si tanteas un poco el terreno, entre los dos foros se pueden juntar.....30 o 40 personas interesadas en construirla, como para hacer los PCB con un costo razonable. Calculo que un PCB en esas cantidades no seria demasiado caro.....y te queda una super calculadora "made in uno mismo" :)

Hola Ariel!

Buenísima la idea de poder juntar en esto a los foros y poder mandar a hacer una tanda de PCBs para quien quiera construirsela e ir actualizandola...

P.D: Vengo siguiendo el Ordenador basado en un PIC de 40 pines (http://www.ucontrol.com.ar/forosmf/proyectos-con-pic/ordenador-basado-en-un-pic-de-40-pines/msg19193/#msg19193) desde el incio, pero vengo intentando resistirme a participar, porque tengo miedo ya de meterme con otra cosa a la vez...ja ja! Juro que me resulto difícil no meterme más de 10 veces. Igual si necesitás la mano, especialmente si es para programarle algo en assembler o arquitectura(que creo ya está bastante definida), pedimela que ahí voy a estar...;)
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: aitopes en 09 de Diciembre de 2009, 14:35:23

P.D: Vengo siguiendo el Ordenador basado en un PIC de 40 pines (http://www.ucontrol.com.ar/forosmf/proyectos-con-pic/ordenador-basado-en-un-pic-de-40-pines/msg19193/#msg19193) desde el incio, pero vengo intentando resistirme a participar, porque tengo miedo ya de meterme con otra cosa a la vez...ja ja! Juro que me resulto difícil no meterme más de 10 veces. Igual si necesitás la mano, especialmente si es para programarle algo en assembler o arquitectura(que creo ya está bastante definida), pedimela que ahí voy a estar...;)

Yo tengo unas 100000000 "páginas" de documentacion en la cabeza, sin anotar en ningun lado. Eso hace bastante dificil que alguien mas ayude, pero ni bien termine la etapa del hard (15 dias o asi), antes de encarar el "interprete" del ASM del 6502 y eventualmente el del BASIC, prometo tomarme una semana o lo que haga falta para documentar bien todo el hard, asi podemos trabajar juntos en esa parte.

Hoy termino la placa de la SRAM, y luego me faltaria la placa adaptadora para teclado PS/2 y  el LCD.

Salutes!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: flacoclau en 09 de Diciembre de 2009, 22:54:04
Bueno! que trabajo te mandaste Bruno!  :-/ :-/ :-/ :-/
Tengo una idea para utilizar un pic algo más accesible, ¿se puede utilizar una eeprom externa para gran parte del programa?
Quizás sea muy descabellado, pero creo que en algunos se pueden trabajar con direcciones externas.
Te felicito!!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Leon Pic en 10 de Diciembre de 2009, 10:24:37
Está excelente Bruno.
La verdad que me dejaste con la boca abierta.
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: aitopes en 10 de Diciembre de 2009, 10:37:06
Tengo una idea para utilizar un pic algo más accesible, ¿se puede utilizar una eeprom externa para gran parte del programa?
Quizás sea muy descabellado, pero creo que en algunos se pueden trabajar con direcciones externas.

Algo asi es lo que estoy tratando de poner a punto en el proyecto del ordenador basado en un PIC. Pero lo que yo estoy haciendo es almacenar en la memoria externa un programa en ASM del 6502, y el PIC las "interpreta" (o lo hará en algun momento, para ser mas exactos :) ). Quizas un enfoque parecido sirva para lo que queres hacer....no?
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: jgpeiro06 en 10 de Diciembre de 2009, 19:59:27
He encontrado un programa llamado Anagram (http://www.parsifalsoft.com/ (http://www.parsifalsoft.com/)) que permite crear el parser de la calculadora de manera automatica. Primero definimos que secuencias debe entender la calculadora, luego verificamos con una especie de debugger y por ultimo generamos el .c y el .h .
Es menos eficiente que el parser propuesto BrunoF, pero seguramente es más robusto y sencillo de modificar.
Este tipo de programas se usan para generar parsers más complejos que el de una calculadora y puede que el código no quepa en los PIC16/18, pero por lo menos creo que merece la pena tenerlo en cuenta.
Por ejemplo si se pretende añadir a la calculadora las matrices, puede ser complejo modificar el parser actual para que reconozca correctamente sentencias como [1,2;1,2] o [[1,2][1,2]] o puede tener bugs dificiles de detectar.


Este ejemplo que muestro de una calculadora viene con el programa. El .c generado son 1000 lineas y el .h 60 y permite realizar estas operaciones:
Código: [Seleccionar]
/* test.ffc  - test file for ffcalc.syn grammar */
(156.7-8.2+1.5)/3 - 7*7
F=32
C = (5/9)*(F-32)
a=3
a= 10*(10*(10*(a+7)))
m=3
b=9
x=7
y = m*x + b

Este es el codigo que describe el parser:
Código: [Seleccionar]
{/*   FOUR FUNCTION CALCULATOR: FFCALC.SYN           */}

// -- CONFIGURATION SECTION ----------------------------
[
  default token type = double
  disregard white space
  lexeme { real}
]

// -- FOUR FUNCTION CALCULATOR -------------------------
(void) calculator $
 -> [calculation?, '\n']..., eof

(void) calculation
 -> expression:x                      =printf("%g\n",x);
 -> name:n, '=', expression:x                         ={
                  printf("%c = %g\n",n+'A',value[n]=x);}
 -> error

expression
 -> term
 -> expression:x, '+', term:t                     = x+t;
 -> expression:x, '-', term:t                     = x-t;

term
 -> factor
 -> term:t, '*', factor:f                         = t*f;
 -> term:t, '/', factor:f                         = t/f;

factor
 -> name:n                                   = value[n];
 -> real
 -> '(', expression:x, ')'                          = x;
 -> '-', factor:f                                  = -f;

// -- LEXICAL UNITS ------------------------------------
digit   = '0-9'
eof     = -1

(void) white space
 -> ' ' + '\t' + '\r' + '\f' + '\v'
 -> "/*", ~eof?..., "*/"

(int) name
 -> 'a-z' + 'A-Z':c                             = c-'A';

real
 -> integer part:i, '.', fraction part:f          = i+f;
 -> integer part, '.'?
 -> '.', fraction part:f                            = f;

integer part
 -> digit:d                                     = d-'0';
 -> integer part:x, digit:d              = 10*x + d-'0';

fraction part
 -> digit:d                                =(d-'0')/10.;
 -> digit:d, fraction part:f           =(d-'0' + f)/10.;

{ /* -- EMBEDDED C ---------------------------------- */
  double value[64];                      /* registers */
  int main(void) {
    ffcalc();
    return 0;
  }
} /* -- END OF EMBEDDED C ----------------------------*/
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: flacoclau en 11 de Diciembre de 2009, 01:04:49
Algo asi es lo que estoy tratando de poner a punto en el proyecto del ordenador basado en un PIC. Pero lo que yo estoy haciendo es almacenar en la memoria externa un programa en ASM del 6502, y el PIC las "interpreta" (o lo hará en algun momento, para ser mas exactos :) ). Quizas un enfoque parecido sirva para lo que queres hacer....no?

Hola loco que bueno tenerte por acá!!
estuve mirando el hilo que comentás y está espectacular!!
lamentablemente ando como Bruno con muy poco tiempo, sinceramente me gustaría participar en ello.
sin ánimos de desvirtuar el hilo, ACÁ (http://www.todopic.com.ar/foros/index.php?topic=28709.0;topicseen) un forista posteó algo interesante, como para tu consola y más quizás para la consola de video juegos que alguna vez supimos empezar entre todos.


Bruno: Lo de utilizar el emulador de la Glcd se puede hacer sin problemas, el tema es que en el tele se vería con la misma resolución, aunque aumentado en tamaño.

Ahora no tengo más tiempo pero este finde me voy a fijar en algún datasheet de pic para buscar lo del mapeo de memoria.
saludos!!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Suky en 29 de Noviembre de 2011, 19:44:09
Hola! Hoy me acorde de este proyecto y lo interesante que era el tema de realizar una calculadora gráfica con un PIC  :-/ Aprovechando que vengo trabajando con la SkP32 tome el proyecto de Bruno y lo migre a C32, realice una función que gráfica la superficie por medio de una grilla que cambia el color según la posición Z, y cree una función que guarda la pantalla actualmente dibujada en un archivo BMP  :-/
Se adjuntan las imágenes creadas por el microcontrolador, cuando tenga tiempo organizo el código y lo subo  ;-)

Nota: Las imágenes se pasaron a *.jpg por el tamaño, para que puedan ser adjuntadas al mensaje :mrgreen:
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: MLO__ en 29 de Noviembre de 2011, 22:12:38
 :shock: :shock: :shock:

Esta de lujo!!!!

Oye, Alejo ... en diciembre descansa si??  :D :D :D

Saludos
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: gera en 29 de Noviembre de 2011, 23:42:54
Bruno y Suky, son mis IDOLOS!!! :D
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 30 de Noviembre de 2011, 14:14:09
Gracias nuevamente Suky por utilizar las librerías y llevarlas a una nueva vista a color!

P.D. Si te parece bien puedo agregar esas gráficas al 1er post del hilo y si tienes algún lugar donde colgarás el proyecto puedo linkearlo allí también.

Imagino que en un PIC32 la velocidad de dibujado es alta, no?

Gracias una vez más!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Suky en 30 de Noviembre de 2011, 16:22:09
De nada Bruno  ;-) Adjunto proyecto, donde acomode el código en funciones bien organizadas para graficar y guardar, y ahora si dibuja la superficie mediante una grilla  :mrgreen: Actualmente dibuja de esta manera:

(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=17261)(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=28680.0;attach=17263)

Citar
P.D. Si te parece bien puedo agregar esas gráficas al 1er post del hilo y si tienes algún lugar donde colgarás el proyecto puedo linkearlo allí también.

Queda a tu disposición.

Citar
Imagino que en un PIC32 la velocidad de dibujado es alta, no?

Depende de la curva y la cantidad de puntos  :tongue: Por ejemplo la captura 2 (sqrt(5-x^2)-sqrt(9-y^2)) a 20 puntos entre -3,3 y -3,3 es casi instantánea.


Saludos!
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: BrunoF en 03 de Diciembre de 2011, 05:54:32
La verdad es que son muy lindas las gráficas que has logrado...Ojalá pueda concretarse la calculadora!

He agregado la info al primer post. GRACIAS!  :-/
Título: Re: Interfaz Touch para calculadora científica y graficadora 2D/3D con PIC
Publicado por: Suky en 03 de Diciembre de 2011, 16:59:22
Bueno, fui creando una interfaz touch para la calculadora, me enfoque en la parte gráfica 3D que es más divertida  :mrgreen:


(http://)(http://)
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: MGLSOFT en 03 de Diciembre de 2011, 18:29:55
Exquisito !!!  :-/ :-/
Cuando vas a parar de sorprendernos??
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: Nocturno en 04 de Diciembre de 2011, 02:41:14
Joe, qué chulada, macho. Haces tantas virguerías y tan rápidamente que parecen sencillas.
Título: Re: Calculadora científica y graficadora 2D/3D con PIC
Publicado por: fabianjsm en 04 de Diciembre de 2011, 08:37:46
Que grande este proyecto!
Felicitaciones BrunoF y Suky!