www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik flash beschreiben atmega168


Autor: subguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich poste jetzt doch mal mein Anliegen, obwohl ich glaube, daß mir hier 
keiner weiterhelfen kann. :-(

Folgendes: Ich habe auf einem atmega168 einen funktionierenden avr109 
Bootloader mit dem ich Daten an x-belibiger Stelle im Flash speichern 
und Seitenweise auch wieder löschen kann.

Schreibe ich ein Programm an den Anfang des Flash wird das Programm 
ausgeführt und nach einem Reset komme ich auch wieder in den Bootloader. 
Will ich jetzt Daten mit mehr als 15 Byte Länge an eine Leere Stelle im 
Flash schreiben und ich verlasse dann den Bootloader wieder, dann hängt 
sich der Bootloader auf und ist nicht mehr bedienbar. Das Programm läuft 
dann auch nicht mehr.

Bei weniger als 16Byte klappt das einwandfrei und wenn keine Applikation 
drauf läuft auch über 15Byte. Mache ich das ganze von Hand über ein 
Terminal funktionierts auch. Ich bin irgendwie total überfragt??

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
subguru schrieb:
> ich poste jetzt doch mal mein Anliegen, obwohl ich glaube, daß mir hier
> keiner weiterhelfen kann. :-(

Stimmt, bei so wenig Information ist das unmöglich.

Quellcode des Bootloaders
Fuse-Setting
Wie wird der Bootloader nach nem Reset gestartet?
Quellcode der Applikation
Wie werden die Flash-Daten geschrieben (aus der Applikation heraus)?


Peter

Autor: subguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schon mal im voraus!

Bootloader ist der wie im Applikation Note AVR109 Self Programming von 
Atmel mit ein paar Änderungen:
.
.
void wdt_init(void) __attribute__((naked))_attribute__((section(".init1")));
.
.
// Prolog AVRBOOT to Run Bootloader
   for(temp_int=0;temp_int<2048;temp_int++){
        if(UART_STATUS_REG & (1 << RECEIVE_COMPLETE_BIT)){val=UART_DATA_REG;}
        if (temp_int==1){sendchar('\n');sendname();}
        sendchar(' ');
        sendchar(8);
    }
    
      
    /* Branch to bootloader or application code? */
    if( val=='F' ) 
    {
        /* Main loop */
.
.
 // Page erase.
            else if(val=='W')
            {
                // NOTE: Here we use address as a byte-address, not word-address, for convenience.
                    _WAIT_FOR_SPM();        
#ifdef __ICCAVR__
#pragma diag_suppress=Pe1053 // Suppress warning for conversion from long-type address to flash ptr.
#endif
                    _PAGE_ERASE( (address << 1) ); // Word address to bytes
#ifdef __ICCAVR__
#pragma diag_default=Pe1053 // Back to default.
#endif
                
               sendchar('\r'); // Send OK back.
            }
.
.
void wdt_init(void)
{
    MCUSR = 0;
    wdt_disable();

    return;
}

Das mit dem Watchdog disablen habe ich hinzugefügt, weil ich von der 
Applikation heraus mit folgender Funktion einen Reset mache:
// reset
void reset_wrapper(uint8_t *buf)
{
  _delay_ms(2);
  cli();
  wdt_enable(WDTO_15MS);
  wdt_reset();
    
}

Der Bootloader startet nach einem Exit bei
void (*funcptr)( void ) = 0x0000;

Fuses sind wie folgt: low=C7 high=DF ext=F8

Die Flash Daten schreibe ich über den Bootloader mit der BlockLoad 
Funktion also z.b mit B 00 10 F kann ich per Hand 16Bytes schreiben über 
ein C oder Java Prog geht das nicht mehr, nur bis zu 15Byte.

Unter Java mach ichs z.b. so:
byte[] addr={0x41,0x11,0x00};// Set 'A'ddress to 2200                    
          try {
        outStream.write(addr);
      

byte[] erase={0x57};//  'W' erase                   
          try {
        outStream.write(erase);

byte[] writemacro={  0x42,0x00,0x10,0x46};  // B 00 xx F
                        
          try {
        outStream.write(writemacro);

byte[] dat={0x2f};
          
          try {
        outStream.write(dat); // hier 16x

Der Bootloader quittiert mir das auch alles ordentlich mit 0x0D so wie 
in der AppNote angegeben.Der Bootloader ist nach dem Schreiben der Daten 
noch voll funktionsfähig und hat die Daten auch geschrieben. Nach einem 
'E'xit ists aber dann vorbei. Wie gesagt per Hand über ein Terminal Prog 
funkt.

Autor: subguru (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh Mann, ich habs

ich darf kein '/' also 0x2f als Daten senden.

Kann das irgend jemand nachvollziehen weshalb? Sowas ist irgendwie 
unergründlich.

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.