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 ) y muchas gracias por su tiempo!
Un abrazo!!