PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Bootloader



Duesentrieb7
02.10.2007, 09:41
Hallo,

ich möchte den "alten" Bootloader, der noch in Assembler
geschrieben war, mit der aktuellen Version des
Compilers übersetzen.

Leider funktioniert das nicht mehr :(
Ich bekomme die Fehlermeldung:
No more space for Bit [SPMCSR]

Als CPU verwende ich eine ATmega128.

Mit einer alten Version (1.11.6.7) des Compilers war der gleiche Code
ohne Probleme zu übersetzen und funktionierte perfekt.
Leider hat die einen Fehler in der Speicherverwaltung bei der
64k-Grenze. Da bin ich weit drüber.

Ich benötige den "alten" Bootloader, da ich ein VB-Programm
dafür habe, das nicht geändert werden kann.

Kennt jemand das Problem und hat eine Lösung dafür?

Für eine funktionierende Lösung wäre ich
mehr als dankbar.... [-o<

Gruß,
Frank

chr-mt
02.10.2007, 10:16
Hi,
welchen Bootloader meinst du denn genau ?
Was ist an dem anders, als an dem neuen ?
(Ausser daß der Neue teilweise in Basic ist)
Soweit ich weiß, ist die Methode seit längerem gleich.
(123 zum aktivieren, dann Xmodem Protokoll zum übertragen)


Du kannst den neuen Bootloader auch per Taste starten und
einfach Hyperterminal zum Flashen nehmen, wenn nix anderes geht.

Gruß
Christopher

Duesentrieb7
02.10.2007, 10:50
Hallo Christopher,

das ist der ganz alte Bootloader, der nicht mit
dem XModem Protokoll arbeitet. Code unten.
Ja, das gab es mal und funktionierte sogar
perfekt...

Dafür habe ich ein VB-Programm schreiben
lassen, dass dem Kunden recht komfortabel
die Möglichkeit bietet, die Firmware in seinem
Gerät zu aktualisieren (mit Menüführung und
Hinweistexten etc.). Dies kann ich in absehbarer
Zeit nicht neu erstellen lassen. :(

Kann keinem Kunden zumuten, mit dem
HyperTerminal zu kaspern.
Der MCS-Bootloader ist in der vom Compiler
losgelösten Version eine Möglichkeit, aber
nicht für kommerziellen Einsatz zugelassen.

Danke und Gruß,
Frank



' Bootloader angepasst
' Taste S2 und S3 liegen hier auf PG1 und PG2
'_________________________________________________ ______________________________
'Bootloader
'Standard Intel hex file can be sent
':10 0000 00 0C 94 2400189500001895000018950000 25
':00 0000 01 FF
' size , address,record type, data, checksum


'anderes Beispiel-File
' .-- Size (im Beispiel: 10=16 Stellen / 0A=10 Stellen)
' ' .-- Adresse
' ' ' .--Record type
' ' ' ' .-- Data
' ' ' ' ' .--Checksum
' ' ' ' ' '
' ' ' ' 0 1 2 3 4 5 6 7 8 9 A B C D E F
':10 0000 00 0C944600189500001895000018950000 03
':10 0010 00 18950000189500001895000018950000 2C
':10 0020 00 18950000189500001895000018950000 1C
'...
':10 0240 00 0f920024facf426f6f742d5465737420 9f
':10 0250 00 2E2E2E2E2E2E00004765687420212121 7F
':0A 0260 00 21202020202020200000 93
':00 0000 01 FF

'The same baudrate is used as the main program is using
'but we can change it here when we like. Just unremark the next line and/or change it
'But take in mind that the bootloader sender must use the same baud rate !!!


'#if M128boot = 1


$asm

$boot = $fe00



Ldi R24,$FF ; hardware stack pointer
!Out SPL,R24
Ldi R24,$10
!Out SPH,R24

'no interrupts are allowed during bootloader programming
Disable Interrupts
Ldi _temp1,&B00011000 ; enable TX and RX
!Out UCR,_temp1
Ldi r24,6
Sts $95,r24

$end Asm
Baud = 19200
$asm

lds r24,$63 ; port g einlesen / PING = $63
andi r24,&B00000110 ; g1 und g2 ausfiltern / S2+S3 Taste
cpi r24,0 ; port hat das richtige bitmuster ?
breq Bootloaderbasic ; ja

jmp $0000 ; start the normal program


' Programmteil vom MCS-electronic

Bootloaderbasic:

'jmp $0000 ; start the normal program


clr r18 ; word counter for written data
clr r22 ; page counter LSB
clr r23 ; page counter MSB


_read_lines:
rcall _rec_line ; get line into SRAM pointed by X
ldi r26,$01 ; point to start of line
ldi r27,$01
ld r24,x+ ; get char in r24
rcall _hex2number ; convert result in r17
ld r24,x+
rcall _hex2number2 ; convert second char , r17 holds the number of hex pairs to get
mov r19,r17 ; number of entries
! sub r16,r17 ; checksum
tst r19
brne _readnext ; not the end record
rjmp _write_last_page ; final line so write the last page

_readnext:
ldi r25,3
_docheck:
ld r24,x+ ; get char in r24
rcall _hex2number ; convert result in r17
ld r24,x+
rcall _hex2number2 ; convert second char , r17 holds the data
!sub r16,r17
dec r25
brne _docheck

' adiw xl,6 ; point to first pair
_readnextpair:
ld r24,x+ ; get char in r24
rcall _hex2number ; convert result in r17
ld r24,x+
rcall _hex2number2 ; convert second char , r17 holds the data
mov r0,r17 ; save in r0
! sub r16,r17 ; checksum
dec r19 ; adjust pair data counter
ld r24,x+ ; get char in r24
rcall _hex2number ; convert result in r17
ld r24,x+
rcall _hex2number2 ; convert second char , r17 holds the data
mov r1,r17 ; save data
! sub r16,r17 ; checksum
rcall _write_page ; write into page buffer
cpi r18,128 ; page is 256 bytes is 128 words
breq _writeit ; write page since it is full
_lbl1:
dec r19 ; adjust data pair
brne _readnextpair ; more data
' ----------------checksum checkining ---------------
ld r24,x+ ; get char in r24
rcall _hex2number ; convert result in r17
ld r24,x+
rcall _hex2number2 ; convert second char , r17 holds the data
cp r16,r17 ; checksum ok?
breq _checkok ; yes
_lbl2:
sbis usr,5
rjmp _lbl2
ldi r24, asc("!") ; load !
!out udr,r24 ; show ! so we know there is an error
' note that you only get an indication something wend wrong,there is no error recovery !!!

_checkok:
rjmp _read_lines ; next line

_writeit:
rcall _erase_page ; erase next page
rcall _save_page ; save page
Rjmp _lbl1 ; continue

_write_last_page:
rcall _erase_page
rcall _save_page ; save last page
_exit_page:
jmp $0000 ; exit needs a reset

' get 1 byte from serial port and store in R24
_recbyte:
Sbis USR, 7 ; Wait for character
rjmp _recbyte
in r24, UDR ; get byte
Ret

'get one line from the serial port and store in location pointed by X
_rec_line:
ldi r26,$00 ; point to first location in SRAM
ldi r27,$01
clr r16
_rec_line5:
sbis usr,5
rjmp _rec_line5
ldi r24, 63 ; ?
!out udr,r24 ; show ? so we know we can send next line
_rec_line1:
rcall _recbyte ; get byte
cpi r24,13 ; enter?
breq _rec_line2 ; yes ready
st x+,r24 ; no so store in sram buffer
rjmp _rec_line1 ; next byte
_rec_line2:
clr r24 ; string terminator
st x,r24
ret

' convert HEX byte in r24 into bin value , on exit byte in r17
_hex2number:
clr r17
_hex2number4:
Subi R24,65 ; subtract 65
Brcc _hex2number3 ; in case carry was cleared
Subi R24,249 ; not
_hex2number3:
Subi R24,246
Add R17,R24 ; add to accu
ret

';called for the second byte
_hex2number2:
Lsl R17 ; shift data
Lsl R17
Lsl R17
Lsl R17
rjmp _hex2number4 ; handle the conversion



_enable_page:
rcall _wait_spm
ldi r24,17 ; reenable page
sts {Spmcsr} , R24
spm
nop
nop
ret
'rjmp _wait_spm

'page address in z7-z13
_erase_page:
' rcall _wait_spm
mov r31,r22 ; page address z8-z15
! out rampz,r23 ; bit 9 of pageaddress goes into Z16
clr r30
ldi r24,3 ; page erase command
sts {Spmcsr} , R24
spm
nop
nop
rcall _wait_spm
' rcall _enable_page
ret

_write_page:
'rcall _wait_spm
mov r31,r22 ; page address z8-z15
! out rampz,r23 ; bit 9 of page address goes into Z16(bit 0 of rampz)
mov r30,r18 ; word address buffer counter
lsl r30
ldi r24,1 ; buffer fill
sts {Spmcsr} , R24
spm
nop
nop
rcall _wait_spm
inc r18 ; next word address
ret


_save_page:
'z0-z6 must be 0
'z7-z13 is the page address
'r0 and r1 are ignored
' rcall _wait_spm
mov r31,r22 ; LSB of page counter
! out rampz,r23 ; bit nine goes into bit 0 of rampz
clr r30
ldi r24,5 ; write page
sts {Spmcsr} , R24
spm
nop
nop
rcall _wait_spm

rcall _enable_page
clr r18 ; page word address counter
subi r22,-1 ; increment page counter
sbci r23,255
ret

_wait_spm:
LDS R25,{Spmcsr}
SBRC R25,0
RJMP _WAIT_SPM ; Wait for SPMEN flag cleared
RET


$end Asm


'#endif
[/code]

chr-mt
02.10.2007, 11:15
Hi,


Der MCS-Bootloader ist in der vom Compiler
losgelösten Version eine Möglichkeit, aber
nicht für kommerziellen Einsatz zugelassen.

Klar ist er für kommerzielle Anwendungen zugelassen.
Allerdings musst du für jede Kopie Geld an MCS bezahlen.
(ich glaube das war 10€ oder so)
Ich weiß ja nicht, wie viele Kunden du hast, die selber Updaten, aber wenn's nur wenige sind, wäre das eine Alternative.

Es gibt auch auf Anfrage ein Bootloader-SDK bestehend aus einer dll und Beispielcodes, mit der man sehr einfach ein VB Programm schreiben kann.
Kostet nix, aber die kommerzielle Verwendung damit erstellter Programme kostet eben wieder die erwähnten 10€.

Im Prinzip brauchst du dann nur noch im VB Programm den Bootloader aufzurufen mit :
Call ShowLoader(App.hInstance, 1, 38400, Text, Filename)
(wobei die "1,38400" hier für COM1 steht, Text für den Text, der in deinem Formular angezeigt werden soll, und Filename für das zu ladende File.)
Wenn du dann noch ein paar Zeilen drumrumschreibst, (Com-Schnittstelle auswählen, File auswählen) hast du auch die Funktionalität des Bascom Bootloaders.


Ich hab' für unsere Kunden aber doch lieber einen eigenen VB-Bootloader geschrieben, der mit dem Bootloader-Sample-Code zusammenarbeitet.

Gruß
Christopher

Duesentrieb7
02.10.2007, 12:18
Danke Christopher,

vielen Dank für die Infos.

Wusste nicht, dass es die Möglichkeit gibt,
gegen Lizens das Nötige zu bekommen, um
selber zu stricken, bzw. den fertigen zu bekommen.

Die 10Bucks pro Kunden würden aber richtig
ins Geld gehen! Wenn ich allein an die bestehenden
Kunden denke, wird mir schwarz vor Augen...

Daher muss ich versuchen, den Alten wieder
flott zu machen.

Nochmals besten Dank für die Infos.

Hat jemand anders eine Idee???

Gruß,
Frank

Andun
02.10.2007, 12:48
Vielleicht lädst du dir mal ne alte Version vom Compiler runter. Vielleicht lässt es sich ja damit compilieren und dann musst du nur schauen, bzw. fragen, was sich im Compiler geändert hat.

mfg
Andun

Duesentrieb7
02.10.2007, 15:13
Sorry,

aber das habe ich alles schon hinter mir.

Die älteren Versionen habe leider die eine oder
andere Macke, die mir anderweitig in die Quere
kommt. Die schlimmste ist die Speicherverwaltung
bei der 64k-page-Grenze.

Eine Anfrage bei Mark Alberts zu diesem Thema hat
kein wirkliches Ergebnis erzielt, da er nur seinen
neuen Bootloader favorisiert.
Und nur er kann mir sagen, was er an seinem Compiler
geändert hat, damit es jetzt nicht mehr funzt...

Ich schlage mich jetzt schon seit geraumer Zeit mit
diesem Problem herum und benötige ich jetzt eine
dringend eine Lösung. :evil:

Gruß,
Frank

Duesentrieb7
09.10.2007, 10:46
Hallo Christopher,

basiert Dein BootLoader auf der MCS.dll oder hast Du selber
Hand angelegt?
Wenn Du selber Hand angelegt hast, könntest Du mir ein
paar Tipps zum Start geben?
Ich denke, der "Dreh und Angelpunkt" ist das Xmodem-
Protokoll, oder?

Habe mich jetzt entschlossen, selbst in VB einzuarbeiten und
einen eigenen zu schrauben...

Danke und Gruß,
Frank

chr-mt
09.10.2007, 16:04
Habe mich jetzt entschlossen, selbst in VB einzuarbeiten und
einen eigenen zu schrauben...

Gute Idee.
Ich hab' meinen selber geschrieben.
Ist aber eine Weile her und der Code ist ziemlich ähm... chaotisch....


Wenn Du selber Hand angelegt hast, könntest Du mir ein
paar Tipps zum Start geben?
Ja, dauert nur etwas, muß mir das aus dem Code zusammensuchen, wie gesagt, der Code ist chaotisch :)

Im Prinzip sendest du 123 zum Controller und wartest, bis der Controller eine 123 zurücksendet.
Der Rest ist dann XMODEM


Ich denke, der "Dreh und Angelpunkt" ist das Xmodem-
Protokoll, oder?
Genau.
Ich hatte irgendwo mal eine gute Seite dazu gefunden, finde die aber gerade nicht mehr :(


Gruß
Christopher

Gento
09.10.2007, 22:51
Anmerkung am Rande: Wenn man den Bootloader im AVR versteht oder geschrieben hat ..... sollte der Dialog wohl klar sein.

Das sind im Grunde keine 50 Zeilen wirklicher Code in Delphi incl Kypten.

Gento

Duesentrieb7
11.10.2007, 11:04
@Gento:
Da ich bisher keine Windows-Programmierung gemacht macht habe, können 50 Zeilen Code schon eine ganze Menge Schweiß bedeuten. Und das nicht nur, weil es eine andere Umgebung ist. Ich muss das Ganze ja auch so verpacken, dass auch der dümmste Kunde damit fertig wird. Habe da ja generell keine Angst davor, mich in etwas neues einzuarbeiten. Das Problem ist, dass ich dafür keine Zeit zur Verfügung gestellt bekomme und es in meiner (nicht vorhandenen) Freizeit machen muß. Daher bin in für jede "Starthilfe" dankbar.
Da bei uns im Hause in VB bzw. .Net programmiert wird, werde ich garantiert nicht mit Delphi anfangen um den Einstieg in eine neue Welt zu bekommen. Werde mit VB-Express 2005 einsteigen, da kann ich die Experten hier fragen kann, wenn ich nicht weiter komme.

@Christopher:
Wäre schön, wenn Du mir mit etwas, auch wenn es noch so chaotisch ist, beim Start unter die Arme greifen kannst. Bin für jeden Tipp dankbar ;)
Hat auch Zeit.
Werde für das aktuelle Gerät den MCS-Bootloader mitgeben, auch wenn das nicht so wirklich "astrein" ist. Muss jetzt "die Kuh vom Eis bekommen", sonst gits' großen Mecker von Eckhardt.

Danke und Gruß,
Frank

Gento
12.10.2007, 23:24
Dein Bootloader im 128 basiert auf dem 'Standard Intel hex Fprmat'
Den kann der neue(?!) Win Bootloader vom MCS auch nicht.

So ersehe zwei Probleme .....

Die Tage müste ich selbst ein 128 Modul bekommen.
Ich berichte dann.

Gento

Duesentrieb7
13.10.2007, 11:11
Hallo Gento,

ich bin mir im Moment nicht sicher, ob wir von der gleichen Sache sprechen.
Der BootLoader braucht ja zwei Teile:
1. im Controller (mit Bascom / Assembler geschrieben)
2. im PC zur Übertragung in den Controller

Das Ganze funktioniert bei mir mit der mega128 und mega2561 prima.

Teil1 ist ja bei den Samples von Bascom dabei und braucht nur an die
jeweilige Hardware angepasst werden (CPU/Quarzfrequenz/BaudRate).
Wobei ich jetzt die "neue" Variante (in Basic geschrieben) verwenden muß.

Der Punkt ist, dass ich für Teil 2 jetzt den stand-alone MCS BootLoader
verwende.
Diesen darf ich aber nicht weitergeben, ohne, pro geliefertem Gerät, einen
Obulus von 9,95€ an MCS zu zahlen. Kostet zu teuer :(
Des Weiteren ist der MCS BootLoader nicht nach dem Standard, wie unser
bisheriges Programm (Bedienkomfort).
Der alte hatte noch einen Vorteil; er ließ sich direkt mit Bascom in das
Hex-File einbinden. So dass man nur einmal in die CPU übertragen muß.
Jetzt schreibe ich erst den BootLoader mit PonyProg in die CPU und lade
dann die Firmware mit dem BootLoader. Ist Umständlich.

Ergo, ich muß den Teil 2 neu basteln...

Das Ganze hatten wir für den "alten" Teil1 (der in Assembler) perfekt am
Laufen. Leider lässt sich der "alte" nicht mehr mit der aktellen Version
von Bascom compiliern. Fehlermeldung: No more space for Bit [SPMCSR]
Hierzu kann mir scheinbar selbst Mark Alberts nicht sagen, was da der
Grund ist... ?!?

Gruß,
Frank

Gento
13.10.2007, 12:28
Ich habe Dein Problem schon erkannt.

Mein Mega32 Bootloader kennt nur einen Knopf. > Updaten

Sogar die zu übertragende 'Datei' liegt als Array im Program.

Soll Deine neue 'VB' Soft nur für Deine neuen Bootloader sein ?

Gento

chr-mt
15.10.2007, 12:24
Frank, du has Post...

Gruß
Christopher

repi64
21.10.2007, 23:24
Hallo,
um jetzt noch was anderes in den Raum zu werfen, kennst du den Megaload von Microsyl.com? Ist evtl. auch interessant.

Wenn es zu umständlich ist zunächst den Bootloader mit Ponnyprog und dann die eigentliche Firmware zu übertragen, so mach das doch nur ein mal, setzte zunächst keine Lockbits, lade die Firmware über den Bootloader und lies dann z.B. mit Ponnyprog den Controler wieder aus.
Dann hast du deine Firmware und Bootloader in einem File und brauchst dann auch nur ein mal übertragen und kannst auch wieder die Lockbits setzten.

Gento
21.10.2007, 23:46
Wenn einmal der Bootloader eingespielt wurde können die Fuse gesetzt werden,auch Automatisch bei der Bascomübertragung .

Es soll wohl Leute geben die verhindern wollen das der Chip ausgelesen werden kann.
Drum werden im Bootloader auch immer Prüfsummen ermittelt und das Übertragene Programm wird erst gültig wenn die Übertragung komplett I.O. war.
Gento