Autor Tema: Duda construccion Bootloader para ATMEGA16  (Leído 1857 veces)

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

Desconectado Sawmai

  • PIC10
  • *
  • Mensajes: 1
Duda construccion Bootloader para ATMEGA16
« en: 18 de Febrero de 2008, 14:19:02 »
Buenas!!

Mirad, estoy diseñando un bootloader para el micro ATMEGA16 de ATMEl. El Pc envia al micro una trama de x caràcteres donde hay(de principo a fin): num. operacion,longitud de datos,direccion parte alta,direccion parte baja, conjunto de datos(max 128bytes)... y 2 bytes de CRC i el baud rate es de 9600bps i utilizo la funcion Sleep(1) entre envios de Trama(i) i Trama(i+1) (sino utilizo esta funcion solo recibo la mitad de la trama enviando a otro pc). Mi duda es si el codigo que va al micro podra hacer las operacions de recibir un dato i aplicar el update del crc i en el caso de los datos guardar-los en el buffer de la flash page. La freq. del micro que va el micro es de 14Mhz. Aquí os muestro el codigo.


#include <util/crc16.h>
#include <avr/boot.h>

void Iniciali(void)
{   
   //UBRRH = 0;
   UBRRL = 92;
   UCSRB = (1<<TXEN | 1<<RXEN);
   UCSRC = (1 << URSEL | 1 << UCSZ0 | 1 << UCSZ1); //8-bit (011)
}

int Unio(char baix,char alt){
   
      int unit = alt;
      unit = unit<<8;
      unit = unit | baix;
      return unit;
}
char Rebre(){

   while(!(UCSRA & (1 << RXC)));  //Esperar que estigui buit el buffer
         return UDR; // Guardem el contingut del buffer serie a la variable data
}
void Enviar(char dada){

      while(!(UCSRA & (1 << UDRE)));
         UDR=dada;         

}
int main(void)
{
    unsigned int crc;
   unsigned char i = 0;
   Iniciali();
   unsigned char operador = Rebre();
   if (operador == 0x02){
      crc = _crc_ccitt_update(crc,operador);
      //longitud
      unsigned char longitud = Rebre();
      crc = _crc_ccitt_update(crc,longitud);
      //direccio
      unsigned char dirh = Rebre();
      crc = _crc_ccitt_update(crc,dirh);
      
      unsigned char dirl = Rebre();
      crc = _crc_ccitt_update(crc,dirl);
      
      unsigned int direccio = Unio(dirl,dirh);
      
      //Rebem trama de bytes i la carreguem al buffer
      unsigned char Trama[longitud];
      while (i<longitud){
         Trama = Rebre();
         boot_page_fill(direccio+i,Trama);
         crc = _crc_ccitt_update (crc,Trama);
         i=i+1;
      }
      
      unsigned char crch = Rebre();
      unsigned char crcl = Rebre();
      unsigned int crcr = Unio(crcl,crch);
      
      if (crcr == crc){
         Enviar(0x06);
      }else{
         Enviar(0x10);

      }
      crc = 0;
   }
   


}      


Espero haberme explicado con claridad(que cuesta con estos temas :P) y muchas gracias por su tiempo!
Un abrazo!!
« Última modificación: 18 de Febrero de 2008, 14:52:53 por Sawmai »