Hallo Elektroniker,
ich habe ein echtes Problem mit den Selbstflashen von Code durch einen BootLoader. Diesen Bootloader habe ich vor einiger Zeit auf einem ATmega128 programmiert (wo er auch fleißig arbeitet) und er sollte eigentlich auch auf kleineren ATmegas laufen und genau das verweigert er sehr hartnäckig. Ich habs jetzt auf ATmega32 und ATmega168 probiert und beide wollen nicht. Der ATmega32 bleibt beim warten auf das löschen der nullten Page hängen (am Label '_ErasePage_Finish' s.u.) und der ATmega168 läuft komplett durch aber der Flashinhalt hat sich nicht geändert. Die Fuse-Bits hab ich auf den CPUs richtig gesetzt, denke ich jedenfalls und hab daher auch etwas damit gespielt aber keine Verbesserung bekommen.
Hat dazu jemand ne Idee was ich noch probieren könnte ??
Ich benutze das aktuelle AVR-Studio mit ServicePack 3 und einen 'JTACK ICE mkII' mit aktueller Firmware zum Debuggen und die 'IAR Embedded Workbench' zum programmieren.
Ich werde jetzt mal mein Problem in ein kleines Assemblerprogramm gießen um das verdeutlichen zu können.
Grüße Erik
Der Code von meinem Assemblermodul das die eigentliche Flash-Arbeit erledigt (für den Compiler von der 'IAR Embedded Workbench') : >>>>>>>>>>>>>>
/** SPM.asm */ #include "..\Common\DEFs.h"
PUBLIC LoadWord PUBLIC ErasePage PUBLIC FlashPage
#define __ENABLE_BIT_DEFINITIONS__
#if defined(__ATmega168__) #include "iom168.h" #define SPMREG SPMCSR #undef __RAMPZ__ #endif #if defined(__ATmega32__) #include "iom32.h" #define SPMREG SPMCR #undef __RAMPZ__ #endif #if defined(__ATmega128__) #include "iom128.h" #define SPMREG SPMCSR #define __RAMPZ__ #endif
//=================================================== // Käse (IAR-Assembler braucht das für die Segmente)
RSEG CODE
Kaas: nop
//============================================================================= // Writes one word (2 bytes) to the temporary page buffer // ( Addr = r19:16 ; DataWord = r21:r20 ) LoadWord: // wait for old action is finished : lds r3,SPMREG sbrc r3,SPMEN rjmp LoadWord
// prepare parameters : movw r1:r0,r21:r20 movw r31:r30,r17:r16 #ifdef __RAMPZ__ out RAMPZ,r18 #endif
// write Data to temporary page buffer : ldi r22,(1