Autor Tema: Actualizar firmware PIC por TCP mediante Tibbo  (Leído 8524 veces)

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

Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #15 en: 05 de Mayo de 2010, 13:46:41 »
Hola!,....el loader.c modificado que genera el Wizard (eligiendo que ponga el bootloader al principio de la memoria) comienza de esta manera:

//bootloader code
// APPLICATION_ISR_VECTOR - Where the compiler is going to put the ISR
#define FIRMWARE_UPGRADE_VECTOR  0          // Bootloader at Start of memory
#define MAX_UPGRADE_AREA         (0x500)    // Space required by bootloader
#define MIN_FIRMWARE_UPGRADE_MEMORY_AREA   (0x20)   // Start of bootloder code
#define MAX_FIRMWARE_UPGRADE_MEMORY_AREA   (MAX_UPGRADE_AREA-1) // End of bootloder code
#define APPLICATION_RESET_VECTOR 0x500     // New RESET Vector
#define APPLICATION_ISR_VECTOR   0x508     // New Interrupt Vector

// Re-vectored RESET vector from 0x0000 to 0x0500
// Re-vectored Interrupt vector from 0x0008 to 0x0508
#build(reset=APPLICATION_RESET_VECTOR, interrupt=APPLICATION_ISR_VECTOR)


#define LOADER_END   MAX_UPGRADE_AREA -1
#define LOADER_ADDR  MIN_FIRMWARE_UPGRADE_MEMORY_AREA


#define BUFFER_LEN_LOD 64

int  buffidx;
char buffer[BUFFER_LEN_LOD];

#define ACKLOD 0x06
#define XON    0x11
#define XOFF   0x13

#SEPARATE
unsigned int atoi_b16(char *s);

#ORG LOADER_ADDR+10, LOADER_END auto=0 default
void real_load_program (void)
{
   int1  do_ACKLOD, done=FALSE;
   int8  checksum, line_type;
   int16 l_addr,h_addr=0;

......


y el codigo que funciona con este bootloader pues el ejemplo como ya dije de ex_load.c (ocupan los dos el 20% ). En el momento que pongo un main mas grande y mas rutinas ya casca. Supongo que tiene que ver con la estructura de la memoria o algun solapamiento que hasta ahora no he visto en este codigo que pongo...... Supongo que los primeros 20 bytes que deja el compilador es para hacer un jump al main. Ya en el main se salta al loader cuando se quiera y se reinicia para volver a empezar....

Gracias!

Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #16 en: 05 de Mayo de 2010, 14:18:16 »
Este es el fallo que me da a dia de hoy..;...:

*** Error 71 "Proyecto.c" Line 1390(0,1): Out of ROM, A segment or the program is too large    real_load_program

Es decir, que la rutina del loader no entra en la memoria ni a empujones....

Saludos!
Jesus




Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #17 en: 05 de Mayo de 2010, 18:25:20 »
Ese error indica que la rutina se sale del banco, creo que es un bug del CCS al manejar los bancos de memoria, intenta partir las funciones en bancos independientes con la directiva #ORG, enpezando en la direccion 500-1 como te indica el source,Ten en cuenta que el banco 1 solo alcanza 2k hasta la dirección 7ff , y ahí cambia al 2gundo banco. si el bootloader ocupa 500 todo lo que pase de 2ff colapsa el banco, prueba a establecer la dirección de inicio,en el segundo banco haber que pasa.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #18 en: 06 de Mayo de 2010, 13:59:53 »
Ya parece que encontre el fallo.....Despues de intentar reubicar codigo en la memoria con #ORG 0x800 (gracias franky), de depurar y liberar memoria, de combinar hasta la saciedad esta casi pero no esta. Con el programa + bootloader tengo el 78% ocupado pero me sigue dando un Out of ROM en el loader modificado, exactamente en la instruccion de write_program_memory. Cuando comento esta linea todo compila y se programa (con ICD2), cuando no la comento...Out of ROM....Me parece bastante raro porque el loader tiene su memoria de 512 bytes reservada....he modificado esta reserva pero nada, he variado algunas cosas pero nada, he sacado esta instruccion fuera de la rutina pero nada...........se me acaban las ideas.....

Gracias!
Jesus.


Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #19 en: 06 de Mayo de 2010, 14:46:28 »
Parece que ya esta.....He ampliado (bastante) mas (0x100 bytes mas) para que el bootloader tuviera mas memoria y ya compila todo bien. Ahora que funcione (jajajaja). La modificacion es esta:

#define FIRMWARE_UPGRADE_VECTOR  0          // Bootloader at Start of memory
#define MAX_UPGRADE_AREA         (0x600)    // Space required by bootloader
#define MIN_FIRMWARE_UPGRADE_MEMORY_AREA   (0x20)   // Start of bootloder code
#define MAX_FIRMWARE_UPGRADE_MEMORY_AREA   (MAX_UPGRADE_AREA-1) // End of bootloder code
#define APPLICATION_RESET_VECTOR 0x600     // New RESET Vector
#define APPLICATION_ISR_VECTOR   0x608     // New Interrupt Vector


Gracias. Ya os contare como va....

Saludos!!!

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #20 en: 06 de Mayo de 2010, 19:33:02 »
es un fallo del CCS, segun la pagina de descargas esta solucionado en la 4.106
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18286
    • MicroPIC
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #21 en: 07 de Mayo de 2010, 01:46:18 »
CCS dispone de una utilidad muy práctica para conseguir que todo encaje en su sitio y quepa bien.
Después de compilar, dale a la opción "Statistics". En la página que se te abre vete abajo del todo, a la sección "Segment usage".
Ahí verás la zona ocupada y libre de cada tramo de memoria, y podrás ajustar los valores de tus direcciones de memoria para maximizar la ocupada y minimizar la libre.

Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #22 en: 13 de Mayo de 2010, 06:21:59 »
De nuevo atrancado. Estoy usando la 4.106. Todo compila bien etc, pero de ejecutarse nada de nada, es como si no iniciara. Cuando quito el #include del bootloader, es decir , se queda la aplicacion normal y corriente, entonces si inicia, pero con el codigo del bootloader incluido no inicia.....Ideas?......

Gracias!

Desconectado bmfranky

  • PIC16
  • ***
  • Mensajes: 165
    • La Tienda De Fran
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #23 en: 13 de Mayo de 2010, 15:05:56 »
Bueno, creo que el código de bootloader, solo iniciara si lo programas en un chip que tenga el cargador del bootloader, directamente simularlo no podrás, porque te faltan los saltos que genera el susodicho para funcionar.
Visiten La Tienda De Fran ;-) Aqui. y mi nueva Web Aqui.

Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #24 en: 14 de Mayo de 2010, 07:13:09 »
Gracias por responder franky. Yo incluyo el bootloader en el main . El bootloader ya tiene sus #ORG para poner su codigo en sitios de la ROM determinados y tambien tiene su #build para poner el vector de reset y de interrupcion donde quiera. El main se pone en el resto de la memoria libre y el compilador pone en 0x0000 un salto al main. En el main detecto una determinada condicion para que salte el bootloader y en el bootloader hay un reset_cpu para resetearlo todo y volver a empezar con el nuevo main.....No entiendo que problema hay.......Estoy por pasarme al tiny, estudiarlo y modificarlo para que escuche por un puerto serie diferente al hardware del pic......

Gracias.
Jesus.



Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #25 en: 17 de Mayo de 2010, 13:38:21 »
Aqui estoy de nuevo..parece que ya se va viendo la luz......Despues de peinar el foro de CCS parece claro que la ubicacion del bootloader en el final de la memoria es mejor que ponerlo en el principio por muchas razones (no tener que reubicar el vector de reset ni el de interrupcion, mejor eficiencia de las interrupciones, etc). Con esta premisa y dando muchas vueltas he modificado el bootloader del CCS (si , ese que siempre da error...) como sigue:


//bootloader code
//#ifndef __BOOTLOADER_H__
//#define __BOOTLOADER_H__

//#define __BOOTLOADER_INCLUDED__ TRUE

//#if defined(__PCM__)
   #define LOADER_SIZE   0x1FF //antes 0x1FF
//#elif defined(__PCH__)
  // #define LOADER_SIZE   0x3FF
//#endif
//#endif
//BOOTLOADER AT END
// LOADER_END - This is the end of the general purpose bootload code.
//#ifndef LOADER_END
#define LOADER_END      getenv("PROGRAM_MEMORY")-1
#define LOADER_ADDR LOADER_END-LOADER_SIZE
//#endif

// For 16F88


#define BUFFER_LEN_LOD 64

#define ACKLOD 0x06
#define XON    0x11
#define XOFF   0x13
#define OK      0x14


int  buffidx;
char buffer[BUFFER_LEN_LOD];
  int1  do_ACKLOD, done=FALSE;
   int8  checksum, line_type;
   int16 l_addr,h_addr=0;
   int32 addr;
   #if getenv("FLASH_ERASE_SIZE")>2
      int32 next_addr;
   #endif
   int8  dataidx, i, count;
   int8  data[32];



#SEPARATE
unsigned int atoi_b16(char *s);


#SEPARATE
void escribe(){
 // Loops through all of the data and stores it in data
                  // The last 2 bytes are the check sum, hence buffidx-3
                  for (i = 9,dataidx=0; i < buffidx-3; i += 2)
                     data[dataidx++]=atoi_b16(&buffer);
            
                  #if getenv("FLASH_ERASE_SIZE") > getenv("FLASH_WRITE_SIZE")   // 32-word > 4-word
                     #if defined(__PCM__)
                        if ((addr!=next_addr)&&(addr&(getenv("FLASH_ERASE_SIZE")-1)!=0))
                     #else
                        if ((addr!=next_addr)&&(addr&(getenv("FLASH_ERASE_SIZE")/2-1)!=0))
                     #endif
                           erase_program_eeprom(addr);
                     next_addr = addr + 1;
                  #endif
               
                  write_program_memory(addr, data, count);

}



#ORG LOADER_ADDR+10, LOADER_END auto=0 default
void real_load_program (void)
{
 
   
  #use rs232(baud=9600, xmit=PIN_B4, rcv=PIN_B5,PARITY=E,ERRORS)
           
   while (!done)  // Loop until the entire program is downloaded
   {
      buffidx = 0;  // Read into the buffer until 0x0D ('\r') is received or the buffer is full
      do {
         buffer[buffidx] = getc();
      } while ( (buffer[buffidx++] != 0x0D) && (buffidx <= BUFFER_LEN_LOD) );

      //putchar (XOFF);  // Suspend sender

      do_ACKLOD = TRUE;

      // Only process data blocks that start with ':'

      if (buffer[0] == ':') {
         count = atoi_b16 (&buffer[1]);  // Get the number of bytes from the buffer

         // Get the lower 16 bits of address
         l_addr = make16(atoi_b16(&buffer[3]),atoi_b16(&buffer[5]));

         line_type = atoi_b16 (&buffer[7]);

         addr = make32(h_addr,l_addr);

         #if defined(__PCM__)  // PIC16 uses word addresses
            addr /= 2;
         #endif

         // If the line type is 1, then data is done being sent
         if (line_type == 1) {
            done = TRUE;
         #if defined(__PCM__)
         } else if ((addr < LOADER_ADDR || addr > LOADER_END) && addr < 0x2000){
         #elif defined(__PCH__)
         } else if ((addr < LOADER_ADDR || addr > LOADER_END) && addr < 0x300000){
         #endif
            checksum = 0;  // Sum the bytes to find the check sum value
            for (i=1; i<(buffidx-3); i+=2)
               checksum += atoi_b16 (&buffer);
            checksum = 0xFF - checksum + 1;

            if (checksum != atoi_b16 (&buffer[buffidx-3]))
             do_ACKLOD = FALSE;

            else   {
               if (line_type == 0) {
                 escribe();
               }
               else if (line_type == 4)
                  h_addr = make16(atoi_b16(&buffer[9]), atoi_b16(&buffer[11]));
            }

         }
      }

      if (do_ACKLOD)
            putchar ('.');   // Linea OK
            else
               putchar ('_');   // Linea chunga

         putchar('\r');
         putchar('\n');

      //putchar (ACKLOD);
         //putchar(XON);

   }
   putchar(OK);
   //putchar (ACKLOD);
   //putchar(XON);
   #ifndef _bootloader
   reset_cpu();
   #endif

}

unsigned int atoi_b16(char *s) {  // Convert two hex characters to a int8
   unsigned int result = 0;
   int i;

   for (i=0; i<2; i++,s++)  {
      if (*s >= 'A')
         result = 16*result + (*s) - 'A' + 10;
      else
         result = 16*result + (*s) - '0';
   }

   return(result);

}

#ORG default

#ORG LOADER_ADDR, LOADER_ADDR+9
void load_program(void)
{
   real_load_program();
}





De esta manera no da el maldito error de "Out of ROM". Por otra parte el "#ORG default" es imprescindible para que el compilador siga poniendo el codigo del Main al principio de la ROM. La funcion load_program tambien es imprescindible para que puedan hacerse los saltos entre el main y el bootloader. De momento estoy haciendo la aplicacion del PC para volcar el Hex pero pinta muy bien. Por lo menos compila e inicia que no es poco.

Espero que esto le sirva alguien, estoy seguro de que si.. Ya os contare.

Saludos!!....
Jesus.



Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #26 en: 21 de Junio de 2010, 06:20:56 »
Sigo con esto....me he encontrado con otro problema...el bootloader en principio funcionaba bien, pero ha llegado un momento (80% memoria ocupada del PIC) que al cargar un nuevo firmware, en el proceso se para y se bloquea....parece como si se corrompiera una parte del bootloader (he leido en foros que el bootloader del CCS no es autocontenido, es decir, que llama a funciones como getc o write_program_memory que no estan dentro del bootloader, y al ser estas funciones externas al bootloader se corrompen al ser sobreescritas.......estoy tratando de poner el getc en asm dentro del bootloader pero no se si esto es como digo exactamente.......alguien con experiencia sobre esto?....estoy harto de ver los foros pero nadie ha encontrado una solucion.....

Muchas gracias
Jesus.


Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #27 en: 21 de Junio de 2010, 08:57:24 »
Me parece que lo he resuelto.......tenia en los fuses NOWRT, MAL!!!........debe estar en WRT, de esta manera parece que no falla........

Gracias por leer.
Saludos

Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #28 en: 22 de Junio de 2010, 06:00:12 »
Estaba equivocado.......debe estar en NOWRT......Si reservo la parte de interrupcion con #ORG 0x4, 0x06 {} me deja grabar pero al final no reinicia bien...por aqui debe andar la solucion pero no doy con la tecla....alguien ha trasteado con todo esto?,...Os recuerdo que estoy tratando que funcione el bootloader de CCS en un 16f88, cuando el main llama a la rutina de bootloader comienza bien pero se para. La direccion donde se para es 0x150, mirando el .lst del compilador en esta direccion hay un delay del programa principal. En el bootloader he probado ha hacer muchos #inline para hacer al bootloader autocontenido, sin llamadas, pero nada de nada....se me acaban las ideas.....alguna idea????

Muchas gracias
Jesus.

Desconectado jesconsa

  • PIC10
  • *
  • Mensajes: 23
Re: Actualizar firmware PIC por TCP mediante Tibbo
« Respuesta #29 en: 22 de Junio de 2010, 08:19:53 »
Por fin, ahora si!!!...El problema es que el CCS se arma el taco si se sobreescribe en la zona del vector de interrupcion, esto no esta documentado en ninguna parte....En mi programa no tengo interrupciones pero igualmente debo reservar la zona del vector:


#ORG default
#org 0x0004, 0x00028 {}    

Este codigo debe ir al inicio del programa principal.      
Ademas se deben reservar como veis unos bytes mas. Total, que asi funciona el dichoso bootloader con el CCS, ni os digo la de prueba-error que he hecho.

Saludos!!.
Jesus.