mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mega64 Bootloader schreibt nur erste Seite.


Autor: Christoph S. (mcseven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi*,

habe mir einen BL angepaßt, aber der schreibt nur die erste Seite.
Bei größeren Adressen als 254 werden nur xFFFF Bytes zurückgelesen.
Ich vermute, es liegt am ASM-Teil, aber daran hatte ich nichts geändert.
BL-Größe ist 4k, also keine RWW-Sektion.
Weiß jemand, wo der Fehler liegt?
/*
register unsigned int Pagedata @2;
register unsigned int PageAddress @4;
register unsigned int CurrentAddress @6;
register unsigned char k @8;
register char spmcrval @10;
*/

//rx_buffer[0]-[1] = PageNumber --> PageAdress
//rx_buffer[2]-[257] = PageData

for (i=0;i<256;i+=2) {
  Pagedata=rx_buffer1[i+2]+(rx_buffer1[i+3]<<8);
  while (SPMCR&1); //wait for spm complete
  CurrentAddress=(PageAddress*256)+i; 
  spmcrval=1;
  #asm 
  movw r30, r6;       //move CurrentAddress to Z pointer   
  mov r1, r3;         //move Pagedata MSB reg 1
  mov r0, r2;         //move Pagedata LSB reg 1  
  sts SpmcrAddr, r10; //move spmcrval to SPM control register
  spm;                //store program memory
  #endasm
}    

while (SPMCR&1);    //wait for spm complete
spmcrval=3;         //erase page
#asm 
movw r30, r4;       //move PageAddress to Z pointer
sts SpmcrAddr, r10; //move spmcrval to SPM control register              
spm;                //erase page
#endasm

while (SPMCR&1);    //wait for spm complete
spmcrval=5;         //write page
#asm 
movw r30, r4;       //move PageAddress to Z pointer
sts SpmcrAddr, r10; //move spmcrval to SPM control register              
spm;                //write page
#endasm
while (SPMCR&1);    // wait for spm complete
spmcrval=0x11;      // enableRWW  see mega8 datasheet for explanation
                    // P. 212 Section "Prevent reading the RWW section
                    // during self-programming
#asm 
sts SpmcrAddr, r10; //move spmcrval to SPMCR              
spm;
#endasm

for (j=0;j<256;j+=2) {
  CurrentAddress=(PageAddress*256)+j; 
  #asm
  movw r30, r6; //move  CurrentAddress to Z pointer  
  lpm r2, Z+;   //read LSB
  lpm r3, Z;    //read MSB
  #endasm    
  Checkdata = rx_buffer1[j+2] +(rx_buffer1[j+3]<<8);
  // PAGEDATA HAS BEEN FILLED BY ASM PART ABOVE!
  // Verify schlägt ab PageNumber 1 / CurrentAddress=256 fehl,
  // es werden immer 0xFFFF zurückgelesen.
  if (Pagedata != Checkdata) { 
    //ERROR
  }
}

Danke,
Christoph

Autor: 2921 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ich mich erinnere, muss man nach dem Schreiben die Seite jeweils 
wieder freigeben.

Autor: Christoph S. (mcseven)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke für Deine Antwort, aber das Problem war simpel:
AVR Bootloading geht vereinfacht so:
1. Seite in den Flash füttern
2. Adresse eingeben, wo diese Seite hinsoll
3. Diese seite löschen
4. Den Speichervorgang anstoßen
5. Optional RWW aktivieren, bei 4k BL aber sowieso irrelevant

Da der Z-Pointer nur ein Byte groß ist, kann ich auch nur 256 Seiten 
speichern. Für den Mega64 reicht das, da sinds sogar noch weniger, weil 
ja der BL noch 4k haben will. Ich hatte nur vergessen, aus meiner 
Seitennummer in INT (000-255) ein BYTE zu machen, welches in den 
Z-Pointer kommt. Ich hatte mit obigem Quelltext immer nur das High-Byte 
von PAGENUMBER (immer 0) in den Z-Pointer geschrieben, und deswegen wars 
immer 0.

Man verändere obigen Source wie folgt:
1. Ganz oben einfügen: "PageAddress <<= 8;"
2. 2x ersetzen "PageAddress*256" durch "PageAddress"

Sieheda, es geht ;)

Danke, Christoph

Autor: Wolfgang Horn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,  Christoph,

freut mich, daß Deion Bootloader läuft.
Aber Deine Beschreibung ist falsch.

AVR Bootloading geht vereinfacht so:
1. Seite in den Flash füttern
2. Adresse eingeben, wo diese Seite hinsoll
3. Diese seite löschen
4. Den Speichervorgang anstoßen
5. Optional RWW aktivieren, bei 4k BL aber sowieso irrelevant

zu 1: nicht in das Flash, sondern in die Bootloader Page.
zu 2: ja.
zu 3: mit boot_page_write (page) bootloader page in flash schreiben, 
dies stößt den Schreibvorgang an.


ciao
Wolfgang Horn

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.