Autor Tema: Convertir arreglo en numero entero  (Leído 6906 veces)

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

Desconectado Alexq

  • PIC10
  • *
  • Mensajes: 9
Convertir arreglo en numero entero
« en: 07 de Junio de 2012, 13:35:09 »
buenas  buenas, tengo un proble al querer realizar un programa para hacer una embobinadora automatica con un teclado matricial y un lcd. logro visualizar los datos ingresados en el lcd,pero el proble surge cuando quiero convertir ese arreglo en un numero entero:
Dato[5]
1.2.3.4.5 esto es lo que almaceno en la variable dato quiero visualizar esos datos en el lcd como un numero entero
12345 no logro hacer esa conversion, lei algo sobre las funciones atol y atoi pero no logro comprender como funciona.. ah soy nuevo en esto de la programacion de pic
desde ya les agradesco

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Convertir arreglo en numero entero
« Respuesta #1 en: 07 de Junio de 2012, 14:45:14 »
Hola Alexq:
Subí el código de lo que hiciste para que entre todos podamos darte una mano. Que compilador de C usas?
Saludos.
  Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Alexq

  • PIC10
  • *
  • Mensajes: 9
Re: Convertir arreglo en numero entero
« Respuesta #2 en: 07 de Junio de 2012, 18:08:08 »
utilizo el ccs compiler, les voy a subir el codigo y la simulacion  de el circuito que quiero hacer

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Convertir arreglo en numero entero
« Respuesta #3 en: 07 de Junio de 2012, 18:26:51 »
Código: [Seleccionar]
char string[6];

for(x=0;x<5;x++) string[x]=Dato[x];
string[5]=0;
printlcd(string);

Desconectado Alexq

  • PIC10
  • *
  • Mensajes: 9
Re: Convertir arreglo en numero entero
« Respuesta #4 en: 08 de Junio de 2012, 11:58:15 »
gracias MerLiNz voy a probar esa instruccion.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Convertir arreglo en numero entero
« Respuesta #5 en: 08 de Junio de 2012, 15:11:20 »
vale, lo he leido y me he confundido en algo, seria:
Código: [Seleccionar]
string[x]=Dato[x]+48; el 48 seria porque en ascii 48=0, 49=1, es decir, si dato=0 entonces 0+48=48 ascii por lo cual te saldria un 0
« Última modificación: 08 de Junio de 2012, 21:55:09 por MerLiNz »

Desconectado Alexq

  • PIC10
  • *
  • Mensajes: 9
ayuda con este programa porfa...!
« Respuesta #6 en: 08 de Junio de 2012, 17:03:39 »
consegui un codigo para hacer un contador de bobinado con teclado matricial +lcd. el que me baje funciona a la perfeccion, lo quise adaptar a un circuito que hice, y funciana asta cierta parte,

 Nueva carpeta3    en simulacion este funciona perfecto
 
p4__  en este tengo problemas al querer hacer la cuante de las pulsaciones
espero que me puedan ayudar desde ya gracias

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Convertir arreglo en numero entero
« Respuesta #7 en: 08 de Junio de 2012, 17:45:07 »
Y cual es el problema que tiene al querer hacer la cuenta de las pulsaciones.?
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Alexq

  • PIC10
  • *
  • Mensajes: 9
Re: Convertir arreglo en numero entero
« Respuesta #8 en: 08 de Junio de 2012, 21:03:33 »
el tema es que quiero armar el circuito con el pic 16f877 y no funciona. la cuenta de pulsaciones como en la otra simulacion

Desconectado Alexq

  • PIC10
  • *
  • Mensajes: 9
Re: Convertir arreglo en numero entero
« Respuesta #9 en: 11 de Junio de 2012, 11:16:56 »
ayuda amigos... con ese circuito de bobinadora automatica...!

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Convertir arreglo en numero entero
« Respuesta #10 en: 11 de Junio de 2012, 12:19:41 »
Alexq:
       reitero, cual es el problema que tiene el programa. Se más preciso. Así entre todos podremos ayudarte.
             Jukinch
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Alexq

  • PIC10
  • *
  • Mensajes: 9
Re: Convertir arreglo en numero entero
« Respuesta #11 en: 11 de Junio de 2012, 12:50:52 »
el problema es en la cuenta de la pulsacion  y que cuando hago una pulsacion en el teclado matricial se lee muy rapido,

Desconectado jukinch

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 608
Re: Convertir arreglo en numero entero
« Respuesta #12 en: 11 de Junio de 2012, 13:04:40 »
Tenés el mismo cristal en la placa física que en la simulación?
"Divide las dificultades que examinas en tantas partes como sea posible para su mejor solución." -René Descartes

Desconectado Alexq

  • PIC10
  • *
  • Mensajes: 9
Re: Convertir arreglo en numero entero
« Respuesta #13 en: 11 de Junio de 2012, 14:18:13 »
si el cristal es de la misma frecuencia. los proyectos estan adjuntos


 
p4__  en este tengo problemas al querer hacer la cuante de las pulsaciones
estos son los  codigos

este funciona el simulacion, nose si esta bien:
Nueva carpeta3    en simulacion este funciona perfecto
Código: [Seleccionar]
// Debe recordarse que las líneas RA0-RA2 actúan ahora como salida de señales de control
// hacia el LCD. Al estar conectadas con sendos interruptores en la MicroPIC Trainer,
// estos deben estar a nivel lógico "1" permanentemente, es decir en la posicion
//marcada como 0 en la placa
//Datos del LCD conectado al puerto B
// Teclado conectado al puerto B: Columna 0,1,2 a B5,B6 y B7. Fila 0,1,2 y 3 a B1, B2,B3 y B4
//RA3 conecto la salida para el motor. En un principi funciona como salida de enable. Se puede
//estudiar posibilidad de implementar un control PWM para la velocidad.
//RA4 entrada para el Timer0

#include <16f628a.h>
#include <stdlib.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT
#use delay(clock=4000000)

#define use_portb_kbd TRUE //

#use fast_io(A)
#use fast_io(B)



#bit puertoA3 = 5.3   //Usado para control on/off motor

void menu1(void);
void menu2 (void);
int16 contar(void);
int16 introducir_valor(void);

char cadena1[]={"\f1-Contar Vuelt\n2-Introd. Vuelt"};
int desbordamiento=0;
int amp=0;

void main()
{

   char caracter;

   port_b_pullups(TRUE);
   lcd_init();
   kbd_init();
   set_tris_a(0x10); //A4 como entrada
   puertoA3=0; //inicializo motor con 0

   //lcd_enviar(LCD_COMANDO,LCD_CURSOR_BLINK); No activo cursor ni blinker

   setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);

   printf (lcd_putc,"Contador de Pulsos\n    By Rober    ",);

   do
     caracter=kbd_getc();
   while (caracter=='\0');

   printf(lcd_putc,"%s",cadena1);

   while (1)
   {
     caracter=kbd_getc();

     switch (caracter)
     {
        case '1':
           desbordamiento=0;
           set_timer0(0);
           menu1();

           printf(lcd_putc,"%s",cadena1);

           break;
        case '2':
           desbordamiento=0;
           set_timer0(0);
           menu2();

           printf(lcd_putc,"%s",cadena1);

           break;
        case '*':
           printf(lcd_putc,"\f BY BY");

           sleep();
     }
   };

}

int16 contar()
{
     int cuenta=0;
     int16 n;


     cuenta=get_timer0();

     if (cuenta==255)
     {
       set_timer0(0);
       desbordamiento++;
     }
     n=256*desbordamiento+cuenta;

     lcd_gotoxy(10,2);

     printf(LCD_PUTC,"%Lu",n);
   //  delay_us(1000);
     return(n);
}



void menu1()
{
  char caracter;
  int contador_parcial=0;
  int motor_off=1;
  int tecla_enter=0;  //control de la tecla asterisco pulsada primera vez=1, pulsada otra vez =0

  printf(lcd_putc,"\f* Motor On/off\n# salir");

  do
  {
    caracter=kbd_getc();

    switch (caracter)
    {
       case '*':
          if (tecla_enter==0)
          {

             printf(lcd_putc,"\fMotor ON\n cuenta:");

             set_timer0(contador_parcial);
             tecla_enter=1;
             motor_off=0;
             set_tris_a(0x10);
             puertoA3=1; //activo motor
          }
          else
          {
            lcd_gotoxy(1,1);
            contador_parcial=get_timer0();

            printf(lcd_putc,"Motor OFF");

            motor_off=1;
            tecla_enter=0;
            set_tris_a(0x10);
            puertoA3=0;  // motor apagado
          }
          break;
       case '#':
          tecla_enter=0;
          motor_off=1;
          set_tris_a(0x10);
          puertoA3=0;
          break;
    }

    if (tecla_enter)
        contar();
  }while (caracter!='#');
}

int16 introducir_valor()
{
  char caracter;
  char numeros[6];
  int contador_caracter=0;
  int16 vueltas;

  printf(lcd_putc,"\fN. Vueltas (4cifras)\n  ");


  lcd_enviar(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker

  do
  {

    caracter=kbd_getc();

    if (caracter!='\0')
    {

       printf(lcd_putc,"%c",caracter); // aqui faltaba la coma antes de la palabra caracter

       numeros[contador_caracter]=caracter;
       contador_caracter++;
    }
  }
//while (caracter!='#'&amp,&amp;contador_caracter<=4); //Cambiar los punto y coma por coma como en la siguiente linea
  while (caracter!='#'&amp,&amp,contador_caracter<=4);
  numeros[contador_caracter]='\0';
  vueltas=atol(numeros);

  lcd_enviar(LCD_COMANDO,LCD_CLEAR);

  lcd_enviar(LCD_COMANDO,LCD_HOME);

  printf(lcd_putc,"\f* Motor On/off\n# salir");

  return (vueltas);
}


void menu2()
{
  char caracter;
  int16 vueltas;
  int motor_off=1;
  int tecla_enter=0;  //*es la tecla enter y asi controlo si la he pulsado 1 o ninguna vez

  int16 n;

  vueltas=introducir_valor();

  do
  {
    caracter=kbd_getc();

    switch (caracter)
    {
       case '*':
          if (tecla_enter==0)
          {
             tecla_enter=1;
             motor_off=0;

             printf(lcd_putc,"\fON Fin: %Lu\ncuenta:",vueltas);

             set_tris_a(0x10);
            puertoA3=1; //Activo motor
          }
          else
          {

             lcd_gotoxy(1,1);
             printf(lcd_putc,"Off Fin: %Lu\n cuenta:",vueltas);

             motor_off=1;
             tecla_enter=0;
             set_tris_a(0x10);
             puertoA3=0; //motor apagado
          }
          break;
       case '#':
          tecla_enter=0;
          motor_off=1;
          set_tris_a(0x10);
         puertoA3=0; //motor apagado
          break;
    }

    if (tecla_enter)
    {
       n=contar();

       if (vueltas==n) /*debo parar motor*/
       {
           motor_off=2; /*Usado para salir de la función*/
           set_tris_a(0x10);
           puertoA3=0; //apago motor
       }
    }
}

  while (caracter!='#'&amp,&amp,motor_off!=2);
  if (motor_off==2)
  {
    printf(lcd_putc,"\fSe han Bobinado: \n  %Lu Vueltas",n);

    do
      caracter=kbd_getc();
    while (caracter=='\0');
  }
}


 este es mi codigo que no funciona
p4__  en este tengo problemas al querer hacer la cuante de las pulsaciones
estos son los  codigos

Código: [Seleccionar]
#include <16F877.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT,NOCPD,NOWRT
#use delay (clock=4000000)

#include <stdlib.h>
#include <lcd.c>

#byte   port_b = 0x06
#use fast_io(a)
#use fast_io(b)



void delay(){// retardo, antirrebotes
   delay_ms(50);
}

char kbd_getc(){// función que explora todo el teclado matricial
   //verifica columna 1
   port_b=0b11111110;
   if(bit_test(port_b,1)==0){//bit_test verifica que el bit n la posicion 5 sea 1 o 0
      delay();// antirrebotes
      return ('1');// si se presiono el uno devuelve codigo ASCII de 1
   }
   if(bit_test(port_b,3)==0){
      delay();
      return ('4');// si se presiono el cuatro devuelve codigo ASCII de 4
   }
   if(bit_test(port_b,5)==0){
      delay();
      return ('7');// si se presiono el siete devuelve codigo ASCII de 7
   }
   if(bit_test(port_b,7)==0){
      delay();
      return ('*');// si se presiono el * devuelve codigo ASCII de *
   }
   //verifica columna 2
   port_b=0b11111011;
   if(bit_test(port_b,1)==0){
      delay();
      return ('2');}// si se presiono el dos devuelve codigo ASCII de 2
   if(bit_test(port_b,3)==0){
      delay();
      return ('5');// si se presiono el cinco devuelve codigo ASCII de 5
   }
   if(bit_test(port_b,5)==0){
      delay();
      return ('8');// si se presiono el ocho devuelve codigo ASCII de 8
   }
   if(bit_test(port_b,7)==0){
      delay();
      return ('0');// si se presiono el cero devuelve codigo ASCII de 0
   }
   // verifica columna 3
   port_b=0b11101111;
   if(bit_test(port_b,1)==0){
      delay();
      return ('3');// si se presiono el tres devuelve codigo ASCII de 3
   }
   if(bit_test(port_b,3)==0){
      delay();
      return ('6');// si se presiono el seis devuelve codigo ASCII de 6
   }
   if(bit_test(port_b,5)==0){
      delay();
      return ('9');// si se presiono el nueve devuelve codigo ASCII de 9
   }

 if(bit_test(port_b,7)==0){
      delay();
      return('#');
     // si se presiono el # devuelve codigo ASCII de #
   }   // verifica columna 4
   port_b=0b10111111;
   if(bit_test(port_b,1)==0){
      delay();
      return ('A');// si se presiono la C devuelve codigo ASCII de A
   }
   if(bit_test(port_b,3)==0){
      delay();
      return ('B');// si se presiono la D devuelve codigo ASCII de B
   }
   if(bit_test(port_b,5)==0){
      delay();
      return ('C');// si se presiono la E devuelve codigo ASCII de C
   }
   if(bit_test(port_b,7)==0){
      delay();
      return ('D');// si se presiono la F devuelve codigo ASCII de D
   }
   return(0);// retorna 0 si no retornó nada antes
}

#bit puertoA3 = 5.3   //Usado para control on/off motor

void menu1(void);
void menu2 (void);
int16 contar(void);
int16 introducir_valor(void);

char cadena1[]={"\f1-Contar Vuelt\n2-Introd. Vuelt"};
int desbordamiento=0;
int amp=0;

void main(void){
char caracter;
lcd_init();
    port_b_pullups(true);//activa pull up del puerto b, no hará falta conectar resistencias, para teclado
  set_tris_b(0xAA);//10101010// seteo de salidas entradas para el teclado
 setup_timer_0(RTCC_EXT_L_TO_H|RTCC_DIV_1);

   printf (lcd_putc,"Ingrese\n tecla",);

do caracter=kbd_getc();

   while (caracter=='\0');
   printf(lcd_putc,"%s",cadena1);
 while (TRUE)
   {
     caracter=kbd_getc();

     switch (caracter)
     {
        case '1':
           desbordamiento=0;
           set_timer0(0);
           menu1();

           printf(lcd_putc,"%s",cadena1);

           break;
        case '2':
           desbordamiento=0;
           set_timer0(0);
           menu2();

           printf(lcd_putc,"%s",cadena1);

           break;
        case '*':
           printf(lcd_putc,"\fFIN DE BOBINADO");

           sleep();
     }
   };

}

int16 contar()
{
     int cuenta=0;
     int16 n;


     cuenta=get_timer0();

     if (cuenta==255)
     {
       set_timer0(0);
       desbordamiento++;
     }
     n=256*desbordamiento+cuenta;

     lcd_gotoxy(10,2);

     printf(LCD_PUTC,"%Lu",n);
     delay_us(1000);
     return(n);
}



void menu1()
{
  char caracter;
  int contador_parcial=0;
  int motor_off=1;
  int tecla_enter=0;  //control de la tecla asterisco pulsada primera vez=1, pulsada otra vez =0

  printf(lcd_putc,"\f* Motor On/off\n# salir");

  do
  {
    caracter=kbd_getc();

    switch (caracter)
    {
       case '*':
          if (tecla_enter==0)
          {

             printf(lcd_putc,"\fMotor ON\n cuenta:");

             set_timer0(contador_parcial);
             tecla_enter=1;
             motor_off=0;
             set_tris_a(0x10);
             puertoA3=1; //activo motor
          }
          else
          {
            lcd_gotoxy(1,1);
            contador_parcial=get_timer0();

            printf(lcd_putc,"Motor OFF");

            motor_off=1;
            tecla_enter=0;
            set_tris_a(0x10);
            puertoA3=0;  // motor apagado
          }
          break;
       case '#':
          tecla_enter=0;
          motor_off=1;
          set_tris_a(0x10);
          puertoA3=0;
          break;
    }

    if (tecla_enter)
        contar();
  }while (caracter!='#');
}

int16 introducir_valor()
{
  char caracter;
  char numeros[6];
  int contador_caracter=0;
  int16 vueltas;

  printf(lcd_putc,"\fN. Vueltas (4cifras)\n  ");


  //lcd_enviar(LCD_COMANDO,LCD_CURSOR_ON); // activo cursor y blinker

  do
  {

    caracter=kbd_getc();

    if (caracter!='\0')
    {

       printf(lcd_putc,"%c",caracter); // aqui faltaba la coma antes de la palabra caracter

       numeros[contador_caracter]=caracter;
       contador_caracter++;
    }
  }
  while (caracter!='#'&amp,&amp,contador_caracter<=4);
  numeros[contador_caracter]='\0';
  vueltas=atol(numeros);

  //lcd_enviar(LCD_COMANDO,LCD_CLEAR);

  //lcd_enviar(LCD_COMANDO,LCD_HOME);

  printf(lcd_putc,"\f* Motor On/off\n# salir");

  return (vueltas);
}


void menu2()
{
  char caracter;
  int16 vueltas;
  int motor_off=1;
  int tecla_enter=0;  //*es la tecla enter y asi controlo si la he pulsado 1 o ninguna vez

  int16 n;

  vueltas=introducir_valor();

  do
  {
    caracter=kbd_getc();

    switch (caracter)
    {
       case '*':
          if (tecla_enter==0)
          {
             tecla_enter=1;
             motor_off=0;

             printf(lcd_putc,"\fON Fin: %Lu\ncuenta:",vueltas);

             set_tris_a(0x10);
            puertoA3=1; //Activo motor
          }
          else
          {

             lcd_gotoxy(1,1);
             printf(lcd_putc,"Off Fin: %Lu\n cuenta:",vueltas);

             motor_off=1;
             tecla_enter=0;
             set_tris_a(0x10);
             puertoA3=0; //motor apagado
          }
          break;
       case '#':
          tecla_enter=0;
          motor_off=1;
          set_tris_a(0x10);
         puertoA3=0; //motor apagado
          break;
    }

    if (tecla_enter)
    {
       n=contar();

       if (vueltas==n) /*debo parar motor*/
       {
           motor_off=2; /*Usado para salir de la función*/
           set_tris_a(0x10);
           puertoA3=0; //apago motor
       }
    }
}

  while (caracter!='#'&amp,&amp,motor_off!=2);
  if (motor_off==2)
  {
    printf(lcd_putc,"\fSe han Bobinado: \n  %Lu Vueltas",n);

    do
      caracter=kbd_getc();
    while (caracter=='\0');
  }
}



 

anything