Autor Tema: PROBLEMA Leer/Escribir con USART PIC16f877a  (Leído 1360 veces)

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

Desconectado octaviosurco94

  • PIC10
  • *
  • Mensajes: 2
PROBLEMA Leer/Escribir con USART PIC16f877a
« en: 13 de Marzo de 2017, 12:32:01 »
Buenos dias es mi primera publicación en el foro, soy nuevo con todo esto de los pics. Estoy usando un pic16f877a para una aplicacion en intersecciones semaforicas y quiero leer y escribir datos en su eeprom interna mediante USART, puedo ver los cambios que se efectuan sin problemas mediante la USART pero al momento de ver los tiempos que almacene tengo problemas y peor para reescrbirlos, aqui mi codigo
Copiare algunas partes que creo importantes
AQUI LEO LOS TIEMPOS Y LOS ESCRIBO EN LA EEPROM
eeprom_write(0X00, 2);   
              eeprom_write(0X01, 2);   
               eeprom_write(0X02, 3);   
                eeprom_write(0X03, 3);   
                eeprom_write(0X04, 3); 
ESTE ES EL PROGRAMA DE LA USART PARA LEER Y MODIFICAR LOS TIEMPOS
/////////LOOP PRINCIPAL///////////////
          while(1)
          {
               uint8_t n= USARTDataAvailable();
               ////VERIFICACION DE DATOS EN LA USART////
               //Si hay datos en la USART
               if(n!=0)
                {
                      //Leerlos
                      char data=USARTReadData();
                      ///SI SE PRESIONO ENTER, INICIA LA PROGRAMACION DE NUEVOS TIEMPOS////
                      if (data=='\r')
                                           {
                          USARTGotoNewLine();
                          USARTWriteLine("<MODO DE PROGRAMACION>");
                          USARTGotoNewLine();
                          uint8_t j;
                          USARTWriteLine("TIEMPOS ACTUALES");
                          USARTGotoNewLine();
                          for (j=0;j<15;j++){
                              USARTWriteChar(eeprom_read(0X00+j));
                          }
                          USARTWriteLine("INTRODUZCA LOS NUEVOS TIEMPOS");
                          USARTGotoNewLine();
                          ambar(1);
                          ambar(2);
                          ambar(3);
                        uint8_t  k=0;
                          while(1){
                              uint8_t m= USARTDataAvailable();
                              //Si hay datos presentes
                              if(m!=0){
                                  //Leerlos
                                  char data=USARTReadData();
                                  //Si hay un Enter Salir del modo de programacion.
                                  if (data=='\r'){
                                      USARTGotoNewLine();
                                      USARTWriteLine("<FIN DE LA PROGRAMACION>");
                                      cont2=0;
                                      goto INICIO;
                                  }
                                  //Caso contrario escribir el eeprom con los datos ingresados
                                  else
                               { USARTWriteChar(data);
                                    eeprom_write(0X00+k,data);
                                  k+++;}}}}}
                             

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:PROBLEMA Leer/Escribir con USART PIC16f877a
« Respuesta #1 en: 13 de Marzo de 2017, 14:20:23 »
Si podrias por lo menos decir que hacen las funciones:

USARTGotoNewLine
USARTWriteChar

Al principio lo podes simplificar... de esta forma:

Código: C
  1. if(USARTDataAvailable())
  2. {
  3.         //Leerlos
  4.         char data=USARTReadData();
  5.         ///SI SE PRESIONO ENTER, INICIA LA PROGRAMACION DE NUEVOS TIEMPOS////
  6.         if (data=='\r')
  7.         {
  8.                 USARTGotoNewLine();
  9.                 USARTWriteLine("<MODO DE PROGRAMACION>");
  10.                 USARTGotoNewLine();
  11.                 uint8_t j;
  12.                 USARTWriteLine("TIEMPOS ACTUALES");
  13.                 USARTGotoNewLine();
  14.                 for (j=0;j<15;j++){
  15.                         USARTWriteChar(eeprom_read(0X00+j));
  16.                 }
  17.                 USARTWriteLine("INTRODUZCA LOS NUEVOS TIEMPOS");
  18.                 USARTGotoNewLine();
  19.                 ambar(1);
  20.                 ambar(2);
  21.                 ambar(3);
  22.                 uint8_t  k=0;
  23.                 while(1){
  24.                         //Si hay datos presentes
  25.                         if(USARTDataAvailable()){
  26.                                 //Leerlos
  27.                                 data = USARTReadData();
  28.                                 //Si hay un Enter Salir del modo de programacion.
  29.                                 if (data=='\r'){
  30.                                         USARTGotoNewLine();
  31.                                         USARTWriteLine("<FIN DE LA PROGRAMACION>");
  32.                                         cont2=0;
  33.                                         break;
  34.                                 }
  35.                                 //Caso contrario escribir el eeprom con los datos ingresados
  36.                                 else {
  37.                                         USARTWriteChar(data);
  38.                                         eeprom_write(0X00+k,data);
  39.                                         k++;
  40.                                 }
  41.                         }
  42.                 }
  43.         }
  44. }

Cambie las condiciones de los if, para no tener que usar una variable mas para eso.
Le quite un + a la k, por que decia k+++
Quite el GOTO y lo reemplaze por un break, el cual saldria del while(1)

Desconectado octaviosurco94

  • PIC10
  • *
  • Mensajes: 2
Re:PROBLEMA Leer/Escribir con USART PIC16f877a
« Respuesta #2 en: 14 de Marzo de 2017, 11:27:37 »
La primera funcion la utilizo para ir a una nueva linea en el terminal virtual, la segunda es la que uso para escribir un caracter en el terminal de la usart pero es esto que tengo el problema, lo que no estoy muy seguro es de que forma usar USART para comunicarme con la eeprom interna quiero escrbir en ella y leerla, cualquier codigo me ayudaria.


 

anything