Hallo
Ich versuche, den AVRco-Bootloader auf einem ATmega328P zum Laufen zu bringen. Auf der Hostseite verwende ich das Flashloader-Tool von AVRco. Das Vorgehen und der Treiber-Code für die Schnittstelle zum Bootloader sind bekannt und funktionieren mit anderen ATmegas problemlos.
In der Applikation mit ATmega328P klappt die Kommunikation zwischen Flashloader und Bootloader, der Ladevorgang läuft (aus Sicht des Flashloaders) ohne Fehler durch. Nur am Ende wurde der Flashinhalt des ATmega328P nicht verändert. Wo bin ich blind?
Import SysTick, FlashWrite, SerPort;
// ...
const
DownLoaderID: word = 010213;
BootCheck [$07BFE]: word = $AA55; // last page below bootloader,
{$I boot.inc}
// Im weiteren Programmablauf, nach Benutzereingabe:
FlashDownLoader;
// Datei boot.inc
{$PHASE BootBlock $03E00}
Procedure BootTest;
//--------------------------------------------------------------
// Check if last download successful. Try to download if not.
Begin
ASM;
LDI _ACCCLO, canly_conti.BOOTCHECK AND 0FFh
LDI _ACCCHI, canly_conti.BOOTCHECK SHRB 8
LPM _ACCA, Z+
CPI _ACCA, 055h
BRNE BootTestX
LPM _ACCA, Z+
CPI _ACCA, 0AAh
BRNE BootTestX
// valid signature found: normal program start
JMP 0000h;
BootTestX:
// check failed, try to download
ENDASM;
FlashDownLoader;
end BootTest;
Procedure FlashloaderInit;
//-------------------------------------------------------------
// UBRR = (fosc / 16 * Baud) - 1
Begin
ASM;
LDI _ACCA, 018h ; Rx and Tx enable
STS ucsrb, _ACCA
// Init serial port, 033h for 19200 Baud @16MHz
LDI _ACCA, 033h
STS ubrrl, _ACCA
LDI _ACCA, 0
STS ubrrh, _ACCA
LDI _ACCA, 00Eh // 8 databits, no parity, 2 stopbits
STS ucsrc, _ACCA
ENDASM;
End;
Procedure Flashloaderrecv;
//------------------------------------------------------------
Begin
ASM;
LDS _ACCA, ucsra
SBRS _ACCA, 7 ; Receiver ready?
RJMP canly_conti.FLASHLOADERRECV ; if not
LDS _ACCA, UDR1
ENDASM;
End;
Procedure FlashloaderTransm;
//-------------------------------------------------------------
begin
ASM;
PUSH _ACCA
L1:
LDS _ACCA, ucsra ; Transmitter ready?
SBRS _ACCA, 5
RJMP L1 ; if not
POP _ACCA
STS UDR1, _ACCA
ENDASM;
end;
Procedure FlashloaderExit;
//------------------------------------------------------------------------------
Begin
ASM: Jmp SYSTEM.VectTab;
end;
{$DEPHASE BootBlock}
Danke für einen Hinweis.
Hans
Ich versuche, den AVRco-Bootloader auf einem ATmega328P zum Laufen zu bringen. Auf der Hostseite verwende ich das Flashloader-Tool von AVRco. Das Vorgehen und der Treiber-Code für die Schnittstelle zum Bootloader sind bekannt und funktionieren mit anderen ATmegas problemlos.
In der Applikation mit ATmega328P klappt die Kommunikation zwischen Flashloader und Bootloader, der Ladevorgang läuft (aus Sicht des Flashloaders) ohne Fehler durch. Nur am Ende wurde der Flashinhalt des ATmega328P nicht verändert. Wo bin ich blind?
Code
Import SysTick, FlashWrite, SerPort;
// ...
const
DownLoaderID: word = 010213;
BootCheck [$07BFE]: word = $AA55; // last page below bootloader,
{$I boot.inc}
// Im weiteren Programmablauf, nach Benutzereingabe:
FlashDownLoader;
// Datei boot.inc
{$PHASE BootBlock $03E00}
Procedure BootTest;
//--------------------------------------------------------------
// Check if last download successful. Try to download if not.
Begin
ASM;
LDI _ACCCLO, canly_conti.BOOTCHECK AND 0FFh
LDI _ACCCHI, canly_conti.BOOTCHECK SHRB 8
LPM _ACCA, Z+
CPI _ACCA, 055h
BRNE BootTestX
LPM _ACCA, Z+
CPI _ACCA, 0AAh
BRNE BootTestX
// valid signature found: normal program start
JMP 0000h;
BootTestX:
// check failed, try to download
ENDASM;
FlashDownLoader;
end BootTest;
Procedure FlashloaderInit;
//-------------------------------------------------------------
// UBRR = (fosc / 16 * Baud) - 1
Begin
ASM;
LDI _ACCA, 018h ; Rx and Tx enable
STS ucsrb, _ACCA
// Init serial port, 033h for 19200 Baud @16MHz
LDI _ACCA, 033h
STS ubrrl, _ACCA
LDI _ACCA, 0
STS ubrrh, _ACCA
LDI _ACCA, 00Eh // 8 databits, no parity, 2 stopbits
STS ucsrc, _ACCA
ENDASM;
End;
Procedure Flashloaderrecv;
//------------------------------------------------------------
Begin
ASM;
LDS _ACCA, ucsra
SBRS _ACCA, 7 ; Receiver ready?
RJMP canly_conti.FLASHLOADERRECV ; if not
LDS _ACCA, UDR1
ENDASM;
End;
Procedure FlashloaderTransm;
//-------------------------------------------------------------
begin
ASM;
PUSH _ACCA
L1:
LDS _ACCA, ucsra ; Transmitter ready?
SBRS _ACCA, 5
RJMP L1 ; if not
POP _ACCA
STS UDR1, _ACCA
ENDASM;
end;
Procedure FlashloaderExit;
//------------------------------------------------------------------------------
Begin
ASM: Jmp SYSTEM.VectTab;
end;
{$DEPHASE BootBlock}
Danke für einen Hinweis.
Hans