Autor Tema: Registro de números Telefónicos con hyperterminal  (Leído 3450 veces)

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

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Registro de números Telefónicos con hyperterminal
« en: 23 de Agosto de 2016, 13:24:21 »
Un saludo.

Amigos, necesito de su ayuda para el siguiente proyecto.

Tengo que registrar una cantidad de 10 usuarios (que son números telefónicos de 10 dígitos) por medio del hyperterminal y el pic 18F4550.

Ya tengo una parte del code, por ahora lo que me falla un poco es que ingreso el primer usuario y lo guardo en la eeprom, a la hora de leerlo lo lee bien de le eeprom (sin cerrar el proteus). Pero una vez cerrando el proteus y briendolo nuevamente el numero ingresado de 10 dígitos se me altera el primer y últimos 2 dígitos. Podes echarle un vistazo y decirme en que esta fallando o como guardar ese numero que ingreso en la eeprom y como leerlo por si yo lo hago mal.

 Anexo código:

Código: CSS
  1. #include <18F4550.h>
  2.          #device adc=10        
  3.          #FUSES NOWDT,WDT128,PLL1,CPUDIV1,NOUSBDIV,XT,NOBROWNOUT,MCLR,NOLVP,NOXINST            
  4.          #use delay(clock=4000000)        
  5.          #use rs232(baud=9600,parity=N,xmit=PIN_c6,rcv=PIN_c7,bits=8,stream=PC)
  6.          #include <string.h>
  7.  
  8.          void main()
  9.          {
  10.  
  11.          char c;
  12.          char num_1[11]={};  
  13.          int i;
  14.          int clave_eeprom_temp[11]={};
  15.        
  16.          for (i=0; i<10;i++) { clave_eeprom_temp[i]=read_eeprom(i); }
  17.          
  18.          menu:
  19. puts("  **********************************************************************\n\r
  20.                            MENU DE USUARIOS\n\r
  21. **********************************************************************\n\r\n\r
  22.    [1] DAR DE ALTA\n\r
  23.    [2] VER USUARIOS REGISTRADOS\n\r
  24.    [3] ELIMINAR USUARIO\n\r\n\r\n\r\n\r\n\r\n\r
  25.  - Seleccione la opcion [1-3]\n\r
  26. **********************************************************************\r");
  27.         printf("\r\n  Cmd:> ");
  28.                  
  29.          while(TRUE)
  30.          {
  31.          if(kbhit())
  32.          {
  33.          c=getc(); delay_ms(500);
  34.          if(c=='q') { printf("\f"); goto menu; }
  35.          
  36.          switch(c)
  37.          {
  38.          case '1': printf("\f");
  39.                   {
  40.                   puts("\r\n  SELECCIONA EL NUMERO DE OPCION CORRESPONDIENTE\r\n\r\n");
  41.                   puts("  [1] - Primer numero celular");
  42.                   puts("  [2] - Segundo numero celular");
  43.                   puts("  [3] - Tercer numero celular");
  44.                   puts("  [4] - Cuarto numero celular");
  45.                   puts("  [5] - Quinto numero celular\n\r\n\r\n\r");
  46.                   puts("  [q] - Volver al menu");
  47.                   puts(" **********************************************************************\r");                
  48.                   printf("  Cmd:> ");                
  49.                   c=getc();        
  50.                   if(c=='q') { printf("\f"); goto menu; }
  51.                   if(c=='1') { puts("  [1] - Teclea el numero celular\n\r");                  
  52.                   printf("  Cmd:> ");
  53.                  
  54.                   for(i=0;i<10;i++)
  55.                   {
  56.                   num_1[i]=getc(PC);
  57.                   printf("%c",num_1[i]);
  58.                   write_eeprom(i,num_1[i]); delay_ms(100);                
  59.                   }
  60.                   printf("\r\n\r\n ¡ El usuario 1 a quedado registrado !"); delay_ms(2000);  printf("\f"); goto menu;
  61.                   }                                
  62.                   }
  63.                   break;
  64.          
  65.          case '2':
  66.                   printf("Numero_1: %s\r\n", clave_eeprom_temp);                  
  67.                  
  68.                   puts("\n\r\n\r\n\r  [q] - Volver al menu");
  69.                   c=getc();
  70.                   if(c=='q') { printf("\f"); goto menu; }
  71.                   break;
  72.  
  73.          default: puts("\n\r  > La opcion que elejiste no corresponde, presiona [q] para volver al menu\r");
  74.                   }
  75.                   printf("  Cmd:> ");
  76.          }
  77.          }
  78.          }


 En esta  es la parte para gusrdar en la eeprom

                  for(i=0;i<10;i++)
                  {
                  num_1=getc(PC);
                  printf("%c",num_1);
                  write_eeprom(i,num_1); delay_ms(100);               
                  }

Y esta es la parte de la lectura:

  for (i=0; i<10;i++) { clave_eeprom_temp=read_eeprom(i); }


Agrego el .zip para su simulación.
« Última modificación: 23 de Agosto de 2016, 17:02:27 por mariacontenis »

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Registro de números Telefónicos con hyperterminal
« Respuesta #1 en: 30 de Agosto de 2016, 17:54:03 »

Viendo el code, esta es la solución. Un saludo


Código: C++
  1. #include <18F4550.h>
  2.          #device adc=10        
  3.          #FUSES NOWDT,WDT128,PLL1,CPUDIV1,NOUSBDIV,XT,NOBROWNOUT,MCLR,NOLVP,NOXINST            
  4.          #use delay(clock=4000000)        
  5.          #use rs232(baud=9600,parity=N,xmit=PIN_c6,rcv=PIN_c7,bits=8,stream=PC)
  6.          #include <string.h>        
  7.          
  8.          void main()
  9.          {
  10.          int i=0;
  11.          char c;
  12.          char tel_1[11];          
  13.          
  14.          menu:
  15.          for (i=0; i<=9;i++) { tel_1[i]=read_eeprom(i); delay_ms(10); }
  16.          
  17.          puts("  ********************************************************************* ");
  18.          puts("                             MENU DE USUARIOS                           ");
  19.          puts(" ********************************************************************** ");
  20.          puts("    [1] DAR DE ALTA USUARIO                                             ");
  21.          puts("    [2] VER REGISTRO DE USUARIOS                                        ");
  22.          puts("    [3] ELIMINAR USUARIOS\r\n\r\n\r\n                                   ");
  23.          puts("  - Seleccione la opcion [1-3]                                          ");
  24.          puts(" ********************************************************************** ");
  25.          
  26.          printf("\r\n  Cmd:> ");
  27.                  
  28.          while(TRUE)
  29.          {
  30.          if(kbhit())
  31.          {
  32.          c=getc(); delay_ms(50);
  33.          if(c=='q') { printf("\f"); goto menu; }
  34.          
  35.          switch(c)
  36.          {
  37.          case '1': printf("\f");
  38.                   {
  39.                   puts("\r\n  SELECCIONA EL NUMERO DE OPCION CORRESPONDIENTE\r\n\r\n");
  40.                   puts(" > [1] - Primer numero celular");
  41.                   puts(" > [2] - Segundo numero celular");
  42.                   puts(" > [3] - Tercer numero celular");
  43.                   puts(" > [4] - Cuarto numero celular");
  44.                   puts(" > [5] - Quinto numero celular\n\r\n\r\n\r");
  45.                   puts(" > [q] - Volver al menu");
  46.                   puts(" **********************************************************************\r");                
  47.                   printf("  Cmd:> ");                
  48.                  
  49.                   c=getc();        
  50.                   if(c=='q') { printf("\f"); goto menu; }
  51.                  
  52.                   if(c=='1') { puts("  [1] - Teclea el 1er numero celular\n\r");
  53.                   printf("  Cmd:> ");
  54.                  
  55.                   for(i=0;i<=10;i++)
  56.                   {
  57.                   tel_1[i]=getc(PC);
  58.                   printf("%c",tel_1[i]);
  59.                   write_eeprom(i,tel_1[i]); delay_ms(100);  
  60.                   tel_1[i]=read_eeprom(i+0);
  61.                   }
  62.                   printf("\r\n\r\n Has registrado el numero: %s ",tel_1); delay_ms(3000);  printf("\f"); goto menu;
  63.                   }                    
  64.                  
  65.                   }
  66.                   break;
  67.          
  68.          case '2':
  69.                   printf("Usuarios registrados \r\n\r\nNumero_1:%s",tel_1);  
  70.  
  71.                   puts("\n\r\n\r\n\r  [q] - Volver al menu");
  72.                   c=getc();
  73.                   if(c=='q') { printf("\f"); goto menu; }
  74.                   break;
  75.  
  76.          default: puts("\n\r  > La opcion que elejiste no corresponde, presiona [q] para volver al menu\r");
  77.                   }
  78.                   printf("  Cmd:> ");
  79.          }
  80.          }
  81.          }
El señor es mi pastor,  nada me faltará.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:Registro de números Telefónicos con hyperterminal
« Respuesta #2 en: 09 de Septiembre de 2016, 14:13:49 »
Muchas gracias  :-/ ahora si aguarda el número correctamente!!!

 ((:-))
« Última modificación: 09 de Septiembre de 2016, 14:15:50 por mariacontenis »

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:Registro de números Telefónicos con hyperterminal
« Respuesta #3 en: 31 de Enero de 2017, 10:09:26 »
Alguien me podría ayudar a saber si esta es la manera correcta de guardar un dato tipo flotante en la eeprom interna del pic.

Aquí pongo el código, en la lcd si imprime el valor 3032866.24491 de tipo float (resultado demultiplicar a*b)mas no se silo hago correctamente.

Gracias...

Código: CSS
  1. #include <18F4550.h>
  2.          #device adc=10        
  3.          #FUSES NOWDT,WDT128,PLL1,CPUDIV1,NOUSBDIV,XT,NOBROWNOUT,NOMCLR,NOLVP,NOXINST            
  4.          #use delay(clock=4000000)
  5.          #include "lcd4x20.c"
  6.          #include <stdlib.h>             // Para los int y long
  7.          #include <stdio.h>              // Para los float
  8.  
  9.          int t;                                //Contador del for
  10.          float a = 123.45;
  11.          float b = 24567.5678;
  12.          float c;
  13.          int Cadena[21];                 // Definimos cadena que guarda el resultado
  14.          char tel_1[21];
  15.          
  16.          void main()
  17.          {
  18.          set_tris_a(0xFF);
  19.          set_tris_b(0xFF);
  20.          for (t=0; t<=20;t++) { tel_1[t]=read_eeprom(t); delay_ms(10); }
  21.          lcd_init();
  22.          
  23.          while(TRUE)
  24.          {        
  25.          for(t=0;t<20;t++){write_eeprom(t,0);} // Ponemos a cero la EEPROM de Registro 0 a 19
  26.          c = a * b;
  27.          sprintf(Cadena, "%f",c);        // Convierte c a Cadena
  28.          for(t=0;t<20;t++){write_eeprom(t,Cadena[t]);}// Escribimos en EEPRON los 20  valores de Cadena
  29.          lcd_gotoxy(2,2); printf(lcd_putc,"valor: %s",tel_1);
  30.          }
  31.          }

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Registro de números Telefónicos con hyperterminal
« Respuesta #4 en: 31 de Enero de 2017, 12:24:26 »
No lo es, porque involucra el paso de float a string y luego de string a float. Tenes 2 opciones, yo prefiero usar una union y no un casteo directo, pero te dejo las 2. Suponiendo que son de 32bits cada una


Código: C
  1. typedef union My_float {
  2.         float Valorfloat;
  3.         char Valorbytes[4];
  4. } My_float;
  5.  
  6. My_float b;
  7. b.Valorfloat = 24567.5678;
  8.  
  9. void LeerFloatEEPROM(My_float * Flotante, int direccion)
  10. {
  11.         int i;
  12.         for(i=0;i<4;i++)
  13.         {
  14.                 Flotante->Valorbytes[i] = read_eeprom(direccion+i);
  15.         }
  16. }
  17.  
  18. void EscribirFloatEEPROM(My_float * Flotante, int direccion)
  19. {
  20.         int i;
  21.         for(i=0;i<4;i++)
  22.         {
  23.                 write_eeprom(direccion+i,Flotante->Valorbytes[i]);
  24.         }
  25. }
  26.  
  27. //Uso
  28.  
  29. EscribirFloatEEPROM(a,0);
  30. LeerFloatEEPROM(a,0);


No se si tendra o no algun error el codigo anterior, eso lo veras vos. La otra es no usar union:

Código: C
  1. float a = 123.45;
  2. float b = 24567.5678;
  3.  
  4. float LeerFloatEEPROM(int direccion)
  5. {
  6.         int i;
  7.         float resultado
  8.         for(i=0;i<4;i++)
  9.         {
  10.                 *(((int8 *)&resultado) + i) = read_eeprom(direccion + i);
  11.         }
  12.         return resultado;
  13. }
  14.  
  15. void EscribirFloatEEPROM(float Flotante, int direccion)
  16. {
  17.         int i;
  18.         for(i=0;i<4;i++)
  19.         {
  20.                 write_eeprom(direccion+i,*(((int8 *)&resultado) + i));
  21.         }
  22. }
  23.  
  24. // Uso:
  25.  
  26. EscribirFloatEEPROM(a,0);       // Grabo a en la posicion 0 al 3, por que ocupa 4 lugares
  27. a = LeerFloatEEPROM(0);         // Recupero el valor de a

Este ultimo aparece en el manual de CCS


 

anything