Autor Tema: Itoa y atoi en ccs  (Leído 22374 veces)

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

Desconectado El_Coach

  • PIC12
  • **
  • Mensajes: 79
RE: Itoa y atoi en ccs
« Respuesta #15 en: 10 de Enero de 2006, 06:42:00 »
Hola, para convertir en char un número te puede servir esto:

caracter = "0" + numero;

Esto suma tu número al valor correspondiente al cero en ASCII.
Entonces ahora carácter tiene el valor ASCII de tu número.

Espero que te sirva.


Un saludo Giño
"Hazlo o no lo hagas, pero nunca lo intentes"

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Itoa y atoi en ccs
« Respuesta #16 en: 10 de Enero de 2006, 11:25:00 »
Bien, supongamos que quieres representar el 134,45

- Primero multiplicalo por 100. Resultado 13445

- Pasa este número a cadena con itoa ó con sprintf

- Pasa cada caracter del número a entero, empleando punteros:

*cadena4=cadena[4];
*cadena3=cadena[3];
*cadena2=cadena[2];
*cadena1=cadena[1];
*cadena0=cadena[0];

uni=atoi(cadena4);
dec=atoi(cadena3);
cen=atoi(cadena2);
unim=atoi(cadena1);
decm=atoi(cadena0);

- Ahora mediante if averigua donde poner el punto decimal.

Esta es una de las formas en que puedes trocear el número. Se puede hacer de otras muchas formas como te comente en un mensaje anterior.

Espero te sirva.

Un saludo


Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Itoa y atoi en ccs
« Respuesta #17 en: 10 de Enero de 2006, 11:31:00 »
Lo pruebo esta noche y ya te comento, si no pegare todo el fichero
Muchas gracias

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Itoa y atoi en ccs
« Respuesta #18 en: 11 de Enero de 2006, 06:19:00 »
TE envio por mail lo que tengo hecho, ya me comentas si no te importa, sigue sin funcionar

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Itoa y atoi en ccs
« Respuesta #19 en: 11 de Enero de 2006, 11:07:00 »
Gracias tio eres un genio, ya vi lo que estaba mal, tu ejemplo funciona de lujo.
Cuando este terminado lo publico con tu permiso por si sirve para algo
ME gusta hacer montajes que sirvan para multiples usos, ya tengo hechas algunas librerias para eso.
Saludos y gracias de nuevo

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Itoa y atoi en ccs
« Respuesta #20 en: 11 de Enero de 2006, 13:53:00 »
BIen continuo en el tema, he modificado algo la rutina para que sea mas "elegante" y eliminar variables y queda de la siguiente forma
//   Conexiones:
//         · RD0 -> Display 1º 7seg
//         · RD1 -> Display 2º 7seg
//         · RD2 -> Display 3º 7seg
//         · RD3 -> Display 4º 7seg
//         · RD4 -> Display 5º 7seg
//         · RD5 -> Display 6º 7seg
//         · RD6 -> Display 7º 7seg
//         · RD7 -> Display 8º 7seg
//         · RB0 -> a 7seg
//         · RB1 -> b 7seg
//         · RB2 -> c 7seg
//         · RB3 -> d 7seg
//         · RB4 -> e 7seg
//         · RB5 -> f 7seg
//         · RB6 -> g 7seg
///////////////////////////////////

#include <16f877a.h>
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT
#use delay (clock=4000000)
#use fast_io(B)
#use fast_io(D)

visualizar_display(int32 x)
{
   char cadena[9];
   char cadena7[2]={0};
   char cadena6[2]={0};
   char cadena5[2]={0};
   char cadena4[2]={0};
   char cadena3[2]={0};
   char cadena2[2]={0};
   char cadena1[2]={0};
   char cadena0[2]={0};


    // tabla de salidas de excitacion de siete segmentos

   //   int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67};   //  7seg hex 0-9 catodo comun
   int tab7seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98};   //  7seg hex 0-9 anodo comun

     // para hacer el barrido de los 8 displays
     int muestra_digito[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};           //  Seleccion del display a visualizar

   // pasa el entero a cadena
 
   itoa(x,10,cadena);

   // Pasa cada cada caracter del número a entero, empleando punteros:

   *cadena7=cadena[7];
   *cadena6=cadena[6];
   *cadena5=cadena[5];
   *cadena4=cadena[4];
   *cadena3=cadena[3];
   *cadena2=cadena[2];
   *cadena1=cadena[1];
   *cadena0=cadena[0];

    // pone el caracter en la salida
    // activa el display correspondiente

    output_b(tab7seg[atoi(cadena0)]);               //...1erº 7seg
    output_d(muestra_digito[7]);
    delay_ms(1);

    //continua con cada digito

    output_b(tab7seg[atoi(cadena1)]);
    output_d(muestra_digito[6]);
    delay_ms(1);


    output_b(tab7seg[atoi(cadena2)]);
    output_d(muestra_digito[5]);
    delay_ms(1);


    output_b(tab7seg[atoi(cadena3)]);
    output_d(muestra_digito[4]);
    delay_ms(1);


    output_b(tab7seg[atoi(cadena4)]);
    output_d(muestra_digito[3]);
     delay_ms(1);

    output_b(tab7seg[atoi(cadena5)]);
    output_d(muestra_digito[2]);
    delay_ms(1);

    output_b(tab7seg[atoi(cadena6)]);
    output_d(muestra_digito[1]);
     delay_ms(1);

    output_b(tab7seg[atoi(cadena7)]);
    output_d(muestra_digito[0]);
    delay_ms(1);

   }


   main()
   {
   int32 y;
   set_tris_b(0x00);
   set_tris_d(0x00);
   do{
      visualizar_display(y);
      y++;
          }while(1);
   }
 Funciona bien con int32 salvo que empieza a contar por la izda sin tener en cuenta los ceros de la derecha, lo cual es un problema, ademas no consigo trasladar la rutina a funcionamiento con float que es como realmente deberia funcionar.
Si te molestas en mirarla veras que lo que te digo es asi, espero que no hayas borrado el motajito de proteus.
Se que doy la lata pero de veras que ando atascado con esto.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Itoa y atoi en ccs
« Respuesta #21 en: 13 de Enero de 2006, 00:24:00 »
Ya lo tengo casi resuelto. Ayer por la tarde le estuve dando vueltas.

La verdad que al usar las funciones atoi e itoa y necesitar punteros para cada caracter individual se complica la cosa. Hay algo que no entiendo relativo al uso de punteros con atoi, pero para esto abriré un tema nuevo.

Lo dicho esta tarde te pego la solución.

Un saludo


Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Itoa y atoi en ccs
« Respuesta #22 en: 13 de Enero de 2006, 02:37:00 »
Gracias por todo
Veras mi idea de hacer la funcion totalmente flexible es usarla en todos los sitios que necesite visualizar un float con displays.
Con lcd es simple pero los displays dan problemas en la posicion de los digitos y en el punto decimal. TRato de hacer una funcion estandar como la que tengo de teclado y de LCD, asi crear una libreria que usar para cada programa y limitarme a hacer el soft correspondiente, como para hacer un frecuencimetro contador, o lo que sea.
Se que te estoy dando trabajo, pero sigo estancado
De nuevo mi agradecimiento

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Itoa y atoi en ccs
« Respuesta #23 en: 13 de Enero de 2006, 13:38:00 »
Te pego lo que tengo. Representa de 1 a 8 dígitos pero sin usar decimales.

Cuando le mandas representar un solo dígito no se enciende, habrá que depurar ese error, las demás combinaciones de 2 a 8 dígitos van bien.

Como te comenté el hacerlo con estas funciones y tener que usar punteros me ha complicado la existencia. Hubiera sido más sencillo hacerlo con caracteres (sin atoi ni itoa) en lugar de con enteros.

Este es el código:

Codigo:

// Conexiones:
// · RD0 -> Display 1º 7seg
// · RD1 -> Display 2º 7seg
// · RD2 -> Display 3º 7seg
// · RD3 -> Display 4º 7seg
// · RD4 -> Display 5º 7seg
// · RD5 -> Display 6º 7seg
// · RD6 -> Display 7º 7seg
// · RD7 -> Display 8º 7seg
// · RB0 -> a 7seg
// · RB1 -> b 7seg
// · RB2 -> c 7seg
// · RB3 -> d 7seg
// · RB4 -> e 7seg
// · RB5 -> f 7seg
// · RB6 -> g 7seg
///////////////////////////////////

#include <16f877a.h>
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT
#use delay (clock=4000000)
#use fast_io(B)
#use fast_io(D)


visualizar_display(int32 x)
{
   int n=5,a;
   char cadena[9];

   //char *pcadena;

   //char *psal=cadena;

   char cadena7[2]={0};
   char cadena6[2]={0};
   char cadena5[2]={0};
   char cadena4[2]={0};
   char cadena3[2]={0};
   char cadena2[2]={0};
   char cadena1[2]={0};
   char cadena0[2]={0};

// tabla de salidas de excitacion de siete segmentos

// int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; // 7seg hex 0-9 catodo comun
   int tab7seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98}; // 7seg hex 0-9 anodo comun

   // para hacer el barrido de los 8 displays
   int muestra_digito[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; // Seleccion del display a visualizar

   // pasa el entero a cadena

   itoa(x,10,cadena);
   //sprintf(cadena,"%lu",x);

   //pcadena=cadena;            //O también pcadena=&cadena[0];

   // Pasa cada cada caracter del número a entero, empleando punteros:

   *cadena7=cadena[7];
   *cadena6=cadena[6];
   *cadena5=cadena[5];
   *cadena4=cadena[4];
   *cadena3=cadena[3];
   *cadena2=cadena[2];
   *cadena1=cadena[1];
   *cadena0=cadena[0];

   // pone el caracter en la salida
   // activa el display correspondiente

   output_b(tab7seg[atoi(cadena0)]);
   output_d(muestra_digito[n-1]);
   delay_ms(1);
   if (n==1)
      return;

   output_b(tab7seg[atoi(cadena1)]);
   output_d(muestra_digito[n-2]);
   delay_ms(1);
   if (n==2)
      return;

   output_b(tab7seg[atoi(cadena2)]);
   output_d(muestra_digito[n-3]);
   delay_ms(1);
   if (n==3)
      return;
   
   output_b(tab7seg[atoi(cadena3)]);
   output_d(muestra_digito[n-4]);
   delay_ms(1);
   if (n==4)
      return;
   
   output_b(tab7seg[atoi(cadena4)]);
   output_d(muestra_digito[n-5]);
   delay_ms(1);
   if (n==5)
      return;

   output_b(tab7seg[atoi(cadena5)]);
   output_d(muestra_digito[n-6]);
   delay_ms(1);
   if (n==6)
      return;

   output_b(tab7seg[atoi(cadena6)]);      //Decenas
   output_d(muestra_digito[n-7]);
   delay_ms(1);
   if (n==7)
      return;

   output_b(tab7seg[atoi(cadena7)]);       //Unidades
   output_d(muestra_digito[n-8]);
   delay_ms(1);      
   if (n==8)
      return;
   

/*
for(a=1;a<=n;a++)
{
   //output_b(tab7seg[atoi(*pcadena)]);
   //output_b(tab7seg[atoi(psal)]);
   output_d(muestra_digito[n-a]);
   delay_ms(1);
}
*/

}


main()
{
int32 y=76543210;
set_tris_b(0x00);
set_tris_d(0x00);
do{
visualizar_display(y);
//y++;
}while(1);
}


Prueba y me comentas.

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Itoa y atoi en ccs
« Respuesta #24 en: 14 de Enero de 2006, 14:05:00 »
Ya funciona con 1 caracter nada mas, ademas de hacerle algun arreglillo mas:
Te pego el codigo.-
// Conexiones:
// · RD0 -> Display 1º 7seg
// · RD1 -> Display 2º 7seg
// · RD2 -> Display 3º 7seg
// · RD3 -> Display 4º 7seg
// · RD4 -> Display 5º 7seg
// · RD5 -> Display 6º 7seg
// · RD6 -> Display 7º 7seg
// · RD7 -> Display 8º 7seg
// · RB0 -> a 7seg
// · RB1 -> b 7seg
// · RB2 -> c 7seg
// · RB3 -> d 7seg
// · RB4 -> e 7seg
// · RB5 -> f 7seg
// · RB6 -> g 7seg
///////////////////////////////////

#include <16f877.h>
#include <stdlib.h>
#fuses XT,NOWDT,NOPROTECT
#use fast_io(B)
#use fast_io(D)
#use delay (clock=40000000)




visualizar_display(int32 x)
{
   int n=0;
   int tiempo =1;
   char cadena[11];
   char cadena8[2];
   char cadena7[2];
   char cadena6[2];
   char cadena5[2];
   char cadena4[2];
   char cadena3[2];
   char cadena2[2];
   char cadena1[2];
   char cadena0[2];

// tabla de salidas de excitacion de siete segmentos



// para hacer el barrido de los 8 displays
   int muestra_digito[9]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; // Seleccion del display a visualizar

// int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; // 7seg hex 0-9 catodo comun
   int tab7seg[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98}; // 7seg hex 0-9 anodo comun

   // pasa el entero a cadena

    itoa(x,10,cadena);
   n=strlen(cadena);

   // Pasa cada cada caracter del número a entero, empleando punteros:


   *cadena7=cadena[7]; // Unidades
   *cadena6=cadena[6]; // Decenas
   *cadena5=cadena[5]; // Centenas
   *cadena4=cadena[4]; //.....
   *cadena3=cadena[3];
   *cadena2=cadena[2];
   *cadena1=cadena[1];
   *cadena0=cadena[0];




   // pone el caracter en la salida
   // activa el display correspondiente



   output_b(tab7seg[atoi(cadena0)]);
   output_d(muestra_digito[n-1]);
   delay_ms(tiempo);
   if (n==0)
      return;

   output_b(tab7seg[atoi(cadena1)]);
   output_d(muestra_digito[n-2]);
   delay_ms(tiempo);
   if (n==1)
      return;

   output_b(tab7seg[atoi(cadena2)]);
   output_d(muestra_digito[n-3]);
   delay_ms(tiempo);
   if (n==2)
      return;

   output_b(tab7seg[atoi(cadena3)]);
   output_d(muestra_digito[n-4]);
   delay_ms(tiempo);
   if (n==3)
      return;

   output_b(tab7seg[atoi(cadena4)]);
   output_d(muestra_digito[n-5]);
   delay_ms(tiempo);
   if (n==4)
      return;
   output_b(tab7seg[atoi(cadena5)]);      // Centenas
   output_d(muestra_digito[n-6]);
   delay_ms(tiempo);
   if (n==5)
     return;

   output_b(tab7seg[atoi(cadena6)]);      //Decenas
   output_d(muestra_digito[n-7]);
   delay_ms(tiempo);
   if (n==6)
      return;

   output_b(tab7seg[atoi(cadena7)]); //Unidades, este se tiene que imprimir el primero para que no salga 7 al empezar ¿?
   output_d(muestra_digito[n-8]);
   delay_ms(tiempo);
   if (n==7)
      return;

  }
int32 y=0;

#int_RTCC
pulse()
{
      visualizar_display(y);
      visualizar_display(y);
      visualizar_display(y);
     
       set_rtcc(220);
}

main()
   {
   setup_counters(RTCC_INTERNAL, RTCC_DIV_256);
                enable_interrupts(INT_RTCC);
                enable_interrupts(GLOBAL);
                set_rtcc(220);
  set_tris_b(0x00);
  set_tris_d(0x00);

// ejemplo de funcionamiento
  delay_ms(100);
   y++;
  delay_ms(100);
   y++;
  delay_ms(100);
   y=y+2;
  delay_ms(100);
   y=y+2;
  delay_ms(100);
   y=y+23;
  do{
        y=y+33;
        delay_ms(100);
    }while(1);
  }


De todas formas veras que lo hice funcionar por interrupcion asi el display se refresca cada cierto tiempo independientemente del programa.

Otra cuestion es que la primera vez que se ejecuta la rutina dibuija un 7
¿¿¿¿¿??????? no tengo ni P I del porque
Tambien me dan problemas el tamaño de las cadenas y no encuentro la forma de eliminar las intermedias con redireccionamiento de punteros tipo &cadena o algo asi
No me gusta usar muchas variables

UNa cosa mas, el siguiente paso es FLOATS que es lo que realmente queria yo hacer, asi que seguire y si me ayudas te estare muy agradecido
Sigo en lo mismo, si necesitas tu algo no dudes en decirlo

Desconectado RedPic

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 5552
    • Picmania by Redraven
RE: Itoa y atoi en ccs
« Respuesta #25 en: 14 de Enero de 2006, 14:52:00 »
Amigo Algec:

Te ruego que justo delante de tu código coloques la directiva code (entre corchetes) y justo donde acabe coloques la directiva /code (entre corchetes) tal como hace el maestro Pocher.

Así tu código queda mucho mas bonito y, sobre todo, mucho mas legible para todos. Es un detalle que a todos nos han tenido que recordar y que es muy útil en este tipo de foros en los que estamos colocando constantemente código fuente de programas.

Gracias.

Contra la estupidez los propios dioses luchan en vano. Schiller
Mi Güeb : Picmania

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Itoa y atoi en ccs
« Respuesta #26 en: 15 de Enero de 2006, 08:03:00 »
Perdonad por no haberlo incluido pero no sabia que era tan util, a partir de ahora lo tendre en cuenta.
LA rutina con float ya esta casi casi lista a falta de unos retoques, funciona muy bien, si puedo esta misma tarde la pego.
Estoy terminando de configurarla para displays de anodo comun y catodo comun.

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Itoa y atoi en ccs
« Respuesta #27 en: 15 de Enero de 2006, 10:20:00 »
En el anterior programa que envié y que decía que había un error al no representar el caso de un solo dígito, pués bien, estoy casi convencido que es culpa del PROTEUS. Le he puesto un VTERM al circuito y por el PORTB y PORTD salen los números que tienen que salir para representación de un solo dígito, pero el PROTEUS no lo dibuja en pantalla.

En fín este es el precio que hay que pagar con el PROTEUS, has de perder tiempo (en ocasiones demasiado) para saber si es culpa tuya o del programa (o del compilador). No siempre se puede disponer de circuitos reales...

Otra cosa que también me ha hecho perder tiempo es el parpadeo de los números. En un programa no parpadeaban y en el mismo programa (sin tocar nada) pero con más (o menos, no me acuerdo) líneas de comentarios los números parpadeaban. Dirás que no puede ser pero te aseguro que es cierto.

Me imagino que estas cosas que me han pasado a mí, también te habran sucedido.

Un saludo

Desconectado Algec

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 974
RE: Itoa y atoi en ccs
« Respuesta #28 en: 15 de Enero de 2006, 13:21:00 »
Ya he resuelto casi todo, sale el digito y ademas funciona para floats con coma flotante.
VEras te pego el codigo con varios ejemplos.
Como dices el Proteus tiene esas cosas, pero se le perdonan.
Codigo:

Codigo:--------------------------------------------------------------------------------
// Conexiones:
// · RD0 -> Display 1º 7seg
// · RD1 -> Display 2º 7seg
// · RD2 -> Display 3º 7seg
// · RD3 -> Display 4º 7seg
// · RD4 -> Display 5º 7seg
// · RD5 -> Display 6º 7seg
// · RD6 -> Display 7º 7seg
// · RD7 -> Display 8º 7seg
// · RB0 -> a 7seg
// · RB1 -> b 7seg
// · RB2 -> c 7seg
// · RB3 -> d 7seg
// · RB4 -> e 7seg
// · RB5 -> f 7seg
// · RB6 -> g 7seg
// · RB7 -> Punto 7seg
///////////////////////////////////

#include <16f877.h>
#include <stdlib.h>
#include <math.h>


#fuses XT,NOWDT,NOPROTECT
#use fast_io(B)
#use fast_io(D)
#use delay (clock=1000000)




visualizar_display(float f, int numero_total_digitos, int numero_de_decimales)
{
   int32 x=0;
   float f1;
   int n=0;
   int c=0;
   int tiempo =10;
   char cadena[10];
   char cadena8[4];
   char cadena7[4];
   char cadena6[4];
   char cadena5[4];
   char cadena4[4];
   char cadena3[4];
   char cadena2[4];
   char cadena1[4];
   char cadena0[4];


// para hacer el barrido de los 8 displays
   int muestra_digito[9]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01}; // Selecciona el display a visualizar

// tabla de salidas de excitacion de siete segmentos
// Cambiar la tabla segun se vaya a usar uno u otro tipo de display
//(0,1,2,3,4,5,6,7,8,9,Punto,E.)

// int tab7seg[10]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x67}; // 7seg hex 0-9 catodo comun
   int tab7seg[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xf8,0x80,0x98,0x7f}; // 7seg hex 0-9 anodo comun
   
   // en funcion del numero de decimales que queremos visualizar lo va a convertir
   // en entero y para no perder la parte decimal lo multiplica antes por el valor
   // correspondiente


   if(numero_de_decimales ==1)
      f1=f*10;
   if(numero_de_decimales ==2)
      f1=f*100;
   if(numero_de_decimales ==3)
      f1=f*1000;
   if(numero_de_decimales ==4)
      f1=f*10000;
   if(numero_de_decimales ==5)
      f1=f*100000;
   if(numero_de_decimales ==6)
      f1=f*1000000;
   if(numero_de_decimales ==7)
      f1=f*10000000;

   // redondea por arriba el float una vez multiplicado

   x=ceil(f1);

   // Si el tamaño del numero a visualizar excede de la longitud del display visualiza  E.


   // pasa el entero a cadena


    itoa(x,10,cadena);

   // calcula la longitud de la cadena

   n=strlen(cadena);

   // Pasa cada cada caracter del número a entero, empleando punteros:

   *cadena7=cadena[7]; // Unidades
   *cadena6=cadena[6]; // Decenas
   *cadena5=cadena[5]; // Centenas
   *cadena4=cadena[4]; //.....
   *cadena3=cadena[3];
   *cadena2=cadena[2];
   *cadena1=cadena[1];
   *cadena0=cadena[0];


   // si excede  el numero de digitos del visualizador dibuja una E. en este

   if(n>numero_total_digitos)
      {
      output_b(tab7seg[10]);        // Visualiza E. en el display si se produce saturacion y sale de la rutina
        output_d(muestra_digito[0]);
      delay_ms(tiempo);
      return;
      }


   // Si el valor es menor que 1, para que visualice el cero anterior y los posteriores a  la coma
   
  if(f<1)
      {
         // Visualiza 0. en el display en su lugar correspondiente
         output_b(tab7seg[0]);        
          output_d(muestra_digito[numero_de_decimales]);
         delay_ms(tiempo);

         // Visualiza tantos ceros como sean necesarios en el display en su
         // lugar correspondiente despues de la coma
       
         for(c=numero_total_digitos-n;c>n;c--)
            {
            output_b(tab7seg[0]);      
              output_d(muestra_digito[c-1]);
            delay_ms(tiempo);
            }
         }
   
   

   // coloca el punto decimal en su lugar

   output_b(0x7f);
   output_d(muestra_digito[numero_de_decimales]);
   delay_ms(tiempo);


   // las siguientes lineas ponen cada caracter en la salida
   // y activan el display correspondiente

   output_b(tab7seg[atoi(cadena0)]);
   output_d(muestra_digito[n-1]);
   delay_ms(tiempo);
   if (n==0)
      return;


   output_b(tab7seg[atoi(cadena1)]);
   output_d(muestra_digito[n-2]);
   delay_ms(tiempo);
   if (n==1)
      return;


   output_b(tab7seg[atoi(cadena2)]);
   output_d(muestra_digito[n-3]);
   delay_ms(tiempo);
   if (n==2)
      return;


    output_b(tab7seg[atoi(cadena3)]);
   output_d(muestra_digito[n-4]);
   delay_ms(tiempo);
   if (n==3)
      return;


   output_b(tab7seg[atoi(cadena4)]);
   output_d(muestra_digito[n-5]);
   delay_ms(tiempo);
   if (n==4)
      return;


   output_b(tab7seg[atoi(cadena5)]);      // Centenas
   output_d(muestra_digito[n-6]);
   delay_ms(tiempo);
   if (n==5)
     return;


   output_b(tab7seg[atoi(cadena6)]);      //Decenas
   output_d(muestra_digito[n-7]);
   delay_ms(tiempo);
   if (n==6)
      return;

   output_b(tab7seg[atoi(cadena7)]);      //Unidades
   output_d(muestra_digito[n-8]);
   delay_ms(tiempo);
   if (n==7)
      return;

  }

float y=0;

// rutina de interrupcion por desbordamiento

#int_RTCC

pulse()
{
      visualizar_display(y,6,3);
      set_rtcc(256);
}


// Programa Principal

main()
   {
   setup_counters(RTCC_INTERNAL, RTCC_DIV_8);
   enable_interrupts(INT_RTCC);
   enable_interrupts(GLOBAL);
   set_rtcc(256);
   set_tris_b(0x00);
   set_tris_d(0x00);

   // necesario inicializar las salidas para que en el primer barrido no salgan caracteres raros

   output_b(0x00);
   output_d(0x00);

   // ejemplo de funcionamiento

  do{
    y=0;
    delay_ms(5000);
    y=14.023;  
    delay_ms(5000);
    y=104.23;  
    delay_ms(5000);
    y=104.3;  
    delay_ms(5000);

    for(y=0;y<10;y=y+0.005)
       delay_ms(100);
    for(y=0;y<50;y=y+1)
       delay_ms(100);
    for(y=0;y<500;y=y+10)
       delay_ms(100);
    for(y=0;y<9999;y=y+100)
       delay_ms(100);
   
    }while(1);
  }

 --------------------------------------------------------------------------------


Hay varias cosas que quiero consultarte que no comprendo porque pasan


Te enumero
1.- Si las cadenas que se usan para los punteros se cambian a menos caracteres de 5 da problemas ¿?
¿Ves alguna forma de trabajar sin estas cadenas intermedias? la verdad es me gustan poco, aunque funcione
2.- Al visualizar valor CERO me dibuja un cero de mas
3.- No van bien los tiempos de las interrupciones pero eso supongo que sera el Proteus


Por lo demas creo que trabaja bien, compruebalo como quieras

Ademas al compilar pasa algo raro, si aumento la tab7seg[11] a tab7seg [12] para incluir el punto decimal el compilador me da error de RAM cuando sin incluirlo tiene un 14% de uso ¿?

Si ves algun error mas dimelo, voy a hacer ahora la de catodo comun

Muchas gracias

Muchas gracias tio

Desconectado pocher

  • Moderador Local
  • DsPIC30
  • *****
  • Mensajes: 2569
RE: Itoa y atoi en ccs
« Respuesta #29 en: 17 de Enero de 2006, 11:19:00 »
Lo he estado provando, ahora que tengo un poco de tiempo y va bastante bien. Falta depurar un poco más, pero ya casi lo tienes.

- Los ceros a la derecha del punto decimal no aparecen. O es culpa del PROTEUS o del bucle for:

Codigo:

      for(c=numero_total_digitos-n;c>n;c--)
     {
           output_b(tab7seg[0]);      
              output_d(muestra_digito[c-1]);
               delay_ms(tiempo);
     }



Estos ceros aparecen un pequeño instante y luego se borran.

- tab7seg[12] a mí no me dá error.

- Los tiempos quiza no te salgan según quieres por la fosc=1Mhz que empleas. La has tenido en cuenta a la hora de hacer los números, o los has hecho con fosc=4 Mhz?

A ver si solucionas lo poco que te queda. Un saludo