www.mikrocontroller.net

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


Autor: lucian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
}

Autor: syn_error (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: syn_error (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
edit:
beim atmega88 heißt das register SPMCSR.

Autor: lucian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ....

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.