Forum: Mikrocontroller und Digitale Elektronik problem mit crc und pgm_read_byte nach flashen bootloader


von lucian (Gast)


Lesenswert?

ich will eine bootloader app schreiben. nach dem flashen soll der flash 
speicher mittles einer crc getestet werden.

hardware: mkII, atmega88, debugbywire
software: avrstudio, winavr

- nach dem schreiben des Flash mittels boot_page_write funktioniert ABER

nach dem flashen kann zeigt AVR Studio den Flash leer also, 0xFF an. 
Nach einem RESET (blauer Pfeil zum Springen zum Programmstart) zeigt 
AVRStudio den richtigen Inhalt an.

- wenn ich die CRC am Programmstart ausführe bekomme ich die richtige 
Checksummer,

- nach dem Flashen gibt pgm_read_byte immer nur 0xff zurück, nach einem 
reset werden jedoch die richtigen werte gelesen

- wird die firmware vom bootloader gestartet läuft sie,

Der Flash ist also programmiert, kann aber nicht nach dem programmieren 
nicht ausgelesen werden. ?!?

Irgendjemand eine Idee?



//---------------------------------------------------------------------- 
-------
// Berechnung der CRC
//---------------------------------------------------------------------- 
-------
//unsigned int CAL_CRC16 (unsigned int CRC, unsigned short c, unsigned 
int mask)
unsigned int CAL_CRC16()
{
volatile unsigned char c,i;
volatile unsigned int addr;
volatile unsigned int CRC;
const unsigned int mask = 0xA001;

    CRC = 0;

  for (addr=0;addr<(64*96);addr++)
    {

    c=pgm_read_byte(addr);

       for (i=0; i<8; i++)
        {
        if ((CRC ^ c)&1)
         {
          CRC=(CRC>>1)^mask;
         }
        else

        CRC>>=1;

        c>>=1;

        }

         }

return (CRC);

}

//write one Flash page
void write_one_page(unsigned int FlashAddr, unsigned char *buf)
{
  unsigned char bufptr, pagptr;
  boot_page_erase(FlashAddr);                  //erase one Flash page
  boot_spm_busy_wait();
  for(pagptr = 0; pagptr < SPM_PAGESIZE; pagptr += 2) //fill data to 
Flash buffer
  {
    boot_page_fill(pagptr, buf[pagptr] | (buf[pagptr + 1] << 8));
  }
  boot_page_write(FlashAddr);                  //write buffer to one 
Flash page
  boot_spm_busy_wait();                        //wait Flash page write 
finish
}

von syn_error (Gast)


Lesenswert?

>Der Flash ist also programmiert, kann aber nicht nach dem programmieren
>nicht ausgelesen werden. ?!?
es wird aber schon der RWW bereich wieder aktiviert?
siehe SPMCR register Bit 4 – RWWSRE.

von syn_error (Gast)


Lesenswert?

edit:
beim atmega88 heißt das register SPMCSR.

von lucian (Gast)


Lesenswert?

hey, super. das wars. vielen dank.

boot_rww_enable(); hat das problem gelöst

warum muss bei avr nur immer alles so kompliziert sein ....

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.