www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LPM-Befehl aus Bootloaderbereich


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich programmierte mir einen Bootloader der bisjetzt funktioniert. Nun 
möchte ich diesen um einen Verify-Funktion erweitern:
Nach der Übertragung einer Seite in den temp. Seitenspeicher und dem 
Schreiben dieser Seite in den Flash, möchte ich diesen beschriebenen 
Flash speicher auslesen um diesen dann PCseitig mit der übergeben Seite 
zu prüfen und gegebenfalls diese Seite bei einem Fehler erneut zu 
übertragen, ansonsten soll die nächste Seite übergeben werden. Leider 
funktioniert dies nicht und ich erhalte ständig 0xFF durch den 
"lpm"-Befehl.
Ist es nicht möglich aus dem Bootloaderbereich, mit dem lpm-Befehl auf 
das Flash zuzugreifen?
Denn wenn ich die Funktion in mein Anwenderprogramm integriere, lese ich 
eine Seite aus dem Flash und das ganze funktionert wie zu erwarten.

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Ist es nicht möglich aus dem Bootloaderbereich, mit dem lpm-Befehl auf
>>das Flash zuzugreifen?

ja es ist möglich, vorausgesetzt du hast nicht die lock bits gesetzt

>>...ich erhalte ständig 0xFF durch den "lpm"-Befehl.

kann es vielleicht sein das der flash die seite noch nicht komplett 
geschrieben hat?


gruß
flo

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lädst Du den Z-Pointer auf die richtige Adresse? Was ist das für ein 
Controller? Poste mal den Code.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja den Z-Pointer lade ich korrekt, denn die Funktion funktioniert in 
meinem Anwenderprogramm einwandfrei und gibt mit die erste seite aus dem 
Flash zurück.
...
#pragma regalloc-        /* Deaktivierung der automatischen Vergabe von Adressen an Variablen*/
register unsigned int    daten               @0x0002;
register unsigned int    SiteAdress          @0x0004;
register unsigned int    CurrentAdress       @0x0006;
#pragma regalloc+        /* Aktivierung der automatischen Vergabe von Adressen an Variablen*/
...

void CHECK_PAGE(void)
{
     for(i=0;i<128;i++)
     {
          CurrentAdress = SiteAdress * (1<<7) + i;  //CurrenAdress = R6+R7
          #asm
               movw r30,r6;             //CurrentAdress in Z-Register laden  || Kopiere R6+R7 nach R30+R31(Z-Pointer)
               lpm r2,z;                //Programmspeicher[Z_Register] in Daten(R2+R3) gespeichert
          #endasm
          putchar(daten);
     }
}
...

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Atmega16 mit Codevision

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>...kann es vielleicht sein das der flash die seite noch nicht komplett
geschrieben hat?

Wie prüfe ich das nach?
Denn ich prüfe als erstes ob eine SPM-Operation noch ausgeführt wird.
Danach aktiviere ich durch Setzen des RWWSRE-Bit den RWW Bereich.
Nun prüfe ich ob das RWWSB-Bit noch gesetzt ist, um danach den Flash mit 
lpm-Befehl auszulesen. Leider bleibt er beim Prüfen des RWWSB-Bit in 
einer Schleife hängen
...
     #asm
//REENABLE_RWW
          ldi r17,(1<<4) | (1<<1);   //RWWSRE + SPMEnable
//Abfragen ob SPM-Operation noch ausgeführt wird
     WAIT_SPM:
          in   r16,0x37;           //SPMCR in Register r16 einlesen
          sbrc r16,0;              //Skip if Bit in Register is Cleared
          rjmp WAIT_SPM;
//SPM-Operation ausführen mit dem in Register R17 abgelegtem Wert
          out  0x37,r17;           //schreibe in SPMCR-Register und führe aus
          spm;
//Abfragen ob Write oder Erase Page ausgeführt wird
     WAIT_WHILE_WRITE:
          in   r16,0x37;
          sbrc r16,6;
          rjmp WAIT_WHILE_WRITE;     
     #endasm
     for(i=0;i<128;i++)
     {
          CurrentAdress= SiteAdress * (1<<7) + i; //CurrenAdress = R6+R7
          #asm
               movw r30,r6;             //CurrentAdress in Z-Register laden  || Kopiere R6+R7 nach R30+R31
               lpm r2,z;                //Programmspeicher[Z_Register] in Daten gespeichert
          #endasm
          putchar(daten);
     }
...

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Wie prüfe ich das nach?
wie du schon richtig erkannt hast in dem du abfragst ob SPMEN null ist.

wichtig ist auch noch das du den rww bereich bevor du ihn lesen willst 
freigibst, dies geht aber auch nur wenn SPMEN null ist.

>>//REENABLE_RWW
>>          ldi r17,(1<<4) | (1<<1);   //RWWSRE + SPMEnable
sollte eher heissen: ldi r17,(1<<4) | (1<<0);

>>//Abfragen ob Write oder Erase Page ausgeführt wird
kannst dir eingentlich sparen.


gruß
flo

Autor: flo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nachtrag:

>>Leider bleibt er beim Prüfen des RWWSB-Bit in
>>einer Schleife hängen
das RWWSB bit wird nur auf null zurückgesetzt wenn man den rww bereich 
wieder freigibt mit RWWSRE.

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.