Autor Tema: Calculadora científica y graficadora 2D/3D con PIC  (Leído 22631 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #15 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. :)
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado jgpeiro06

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 276
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #16 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:

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. }


Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #17 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!
No contesto mensajes privados, las consultas en el foro

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #18 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..
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado NANO1985

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1698
    • Desarrollos Tecnologicos - Tucuman - Argentina
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #19 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
"La inquebrantable voluntad de vencer"
"hay dos cosas infinitas... El universo y la Estupidez humana" Albert Einstein
 "El sabio actua sin anhelos, permanece sosegado,... así no es afectado por el resultado de sus acciones sean éstas el triunfo o el fracaso"
- UNIVERSIDAD TECNOLOGICA NACIONAL - FACULTAD REGIONAL TUCUMAN -

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #20 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!
« Última modificación: 09 de Diciembre de 2009, 12:36:15 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Felixls

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 300
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #21 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), aunque no se si entrará en la memoria...

Felicitaciones!

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #22 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

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #23 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
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #24 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
No contesto mensajes privados, las consultas en el foro

Desconectado Drod

  • PIC16
  • ***
  • Mensajes: 136
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #25 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


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #26 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
« Última modificación: 09 de Diciembre de 2009, 12:59:50 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Felixls

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 300
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #27 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,



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.
« Última modificación: 09 de Diciembre de 2009, 13:27:13 por Felixls »

Desconectado Suky

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #28 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  :(
No contesto mensajes privados, las consultas en el foro

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Calculadora científica y graficadora 2D/3D con PIC
« Respuesta #29 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 de flacoclau o al que había empezado a colores el pollo(SavageChicken).
« Última modificación: 09 de Diciembre de 2009, 13:20:55 por BrunoF »
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.


 

anything