PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Probleme mit Bootloader Beispielquellcode



fuerstfanta
21.11.2005, 15:12
Hallo Freaks,

ich versuche mich gerade an einer Bootloader-Implementierung in Bascom. Habe dazu auch schon ein Posting im MCS-Forum, dort konnte mir aber bisher niemand helfen, deshalb versuche ich es hier nocheinmal.

Ich möchte meinen eigenen Bootloader mit einigen speziellen Features schreiben. Um in das Thema einzusteigen wollte ich die Beispieldatei Bootloader.bas ausprobieren. Also habe ich die passenden Textstellen für den Atmega8 konfigueriert und per AVRISP hochgeladen. Dann wollte ich ein Programm per "MCS Bootloader" uploaden, das hat aber leider nicht funktioniert. Entweder es passierte gar nichts oder BASCOM ist komplett abgestürzt.

Hat jemand ähnliche Erfahrungen mit diesem Quellcodebeispiel gemacht? Was hab ich falsch gemacht oder vergessen?

Vielen Dank vorab für die Hilfe...

Grüße

Christoph

fuerstfanta
21.11.2005, 16:04
Hallo, ich nochmal,

habe gerade noch ein bißchen mit dem Bootloader rumgespielt. Mittlerweile stürtzt BASCOM nicht mehr ab, aber im "Sende"-Fenster des MCS Bootloaders erscheint folgende Meldung:

1. Receiving NAK on sectors
2. Too many errors

Ich habe die UART-Verbindung überprüft, die funktioniert einwandfrei.

Kann mir jemand bei der Lösung des Problems helfen?

Danke

Christoph

chr-mt
21.11.2005, 17:28
Hi,
was hast du denn gemacht, damit Bascom nicht mehr abstürzt ?
Bei dem Punkt bin ich nämlich gerade. :D LOL

Hast du die Baudrate und Quarzfrequenz im Bootprogramm an deine angepasst ?

Gruß
Christopher

Rage_Empire
21.11.2005, 19:34
Von was für einem Bootloadersource habt ihrs? Kenne keinen für Bascom.

hrei
21.11.2005, 19:57
Von was für einem Bootloadersource habt ihrs? Kenne keinen für Bascom.

Vermutlich, wie ich, den in den Samples neuen Bootloader (in der der 1.11.8.0):
BootLoader.bas

Bei mir klappen aber auch nur die Türen. Nix geht (getestet mit M32 und M8). "Drüben" im Forum meldet sich keiner mit Durchblick, das ist ein schlechtes Zeichen. Meist ist es dann ein echter Bug. Wie bei der M168.dat, die immer noch nicht ordentlich mit den Timern umgehen kann, von Clock=Soft ganz zu schweigen.

Ich fürchte, wir müssen uns da in Geduld und nicht in Platin fassen :-(.

Viele Grüße
Henrik

fuerstfanta
22.11.2005, 09:15
Hallo,...

ja, es geht um die Bootloader.bas. Ein Beispielprogramm im Samples-Ordner der neuen Version 1.11.8.0. Ich probiere gerade mit einem Mega8 rum. Von den anderen in der Beispieldatei vorhandenen MCs hab ich gerade keinen da. Hab mich gerade mal durch die Bootloader-Abteilung im Datenblatt gewälzt. Damit konnte ich leider auch nicht soviel anfangen. Aber ich versuche mich mal weiter an dem Problem. Danke schonmal, daß hier wenigstens jemand interesse zeigt. Bei MCS geht wohl gar nix.

@chr-mt: Ich hab nix besonderes gemacht. Beim dritten Anlauf liefs plötzlich :-)

Mal sehen wie es weiter geht, meld mich wenn ich was neues weiß!

ciao

Christoph

Rage_Empire
22.11.2005, 09:41
Ach, neuerung vom 1.11.8.0? Man, is ja klasse, wenn der Bootloader von Bascom unterstützt wird.
Klar, die 1.11.8.0er Version hab ich noch nicht. Wart noch immer auf mein Lic-File.

fuerstfanta
22.11.2005, 10:10
... es wäre klasse, wenn es funktionieren würde :-)

chr-mt
22.11.2005, 10:24
Komisch..
bei mir geht überhaupt nichts.
Nicht mal 'ne Fehlermeldung.
Die Schnittstelle ist aber OK.
Der in Bascom integrierte Programmer sagt nur "Reset Chip", das war's.
Wenn ich den zumache, hakelt Bascom fürchterlich, also läuft noch was im Hintergrund weiter.
Der "Stand-Alone" ( https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=13085) MCS Programmer sagt auch nix außer:
ERROR -1
und beim beenden bekomme ich dann auch eine Windows - Fehlermeldung:
"BootLoader.exe hat ein Problem festgestellt und muss beendet werden."

Ich wäre ja schon froh, wenn ich wenigstens die Fehlermeldungen von
Fuerstfanta bekäme (1. Receiving NAK on sectors,2. Too many errors )
;)

Gruß
Christopher

fuerstfanta
22.11.2005, 10:40
Hi.

Also das Bootloader.bas-Programm, das ich per AVRISP auf dem Mega8 geschossen hab, läuft auf auch, zumindest blinkt die LED wie sie soll. Der Chip resetet sich dann automatisch, wenn er nichts empfängt, die LEd blinkt dann ca alle 2 Sekunden 5 mal auf. Wenn ich nun ein anderes PRogramm per MCS Bootloader aufspielen möchte, drücke ich F4 und dann kommt das "Sende"-Fenster automatisch, egal wie die BOOTRST-Fuse gesetzt ist !?

Irgendwas läuft hier falsch!

LG

Christoph

chr-mt
22.11.2005, 10:59
Hi,
hast du was bestimmtes eingestellt beim AVRISP um in den Bootloader Bereich zu flashen ? Ist das überhaupt nötig ?
Ich finde da nix...
Ich habe das Prog soweit für meinen Mega32 geändert.
Hab'auch die diversen Fuses ausprobiert. (BOOTRST, BOOTSZ)

Frank hat doch laut seinem Beitrag den MCS Bootloader zum laufen gekriegt, also muß es ja irgendwie gehen.



Gruß
Christopher

fuerstfanta
22.11.2005, 11:04
Hi,

ich hab nix Spezielles eingestellt. Der Eintrag dafür ist ja im Bootloader.bas schon drin:

$loader = $0c00
(für den Mega8)

Wenn Du das auskommentierst, dann ändert sich auch die Prozentanzeige beim Compilieren!

LG

Christoph

chr-mt
22.11.2005, 12:54
Hi,
also bei mir funktioniert es jetzt! (Fast ;) )
Irgendwie hatte ich Probleme mit meinem Rechner, der merkwürdige Sachen machte :(
Ich kann jetzt ein Programm in den MEGA 32 laden.
Danach ist allerdings der Bootloader weg. ??
Nach neuem einspielen des Bootloaders per AVRISP kann ich jedesmal genau einmal per RS232 flashen.
Danach geht nix mehr.
Bootloader wieder drauf und es geht wieder. Ein Mal.

Gruß
Christopher

chr-mt
22.11.2005, 13:55
Das Verhalten machte er nur mit dem Eigenständigen Loader
Mit dem in Bascom integrierten Loader klappt es jetzt einwandfrei, wenn ich unter MCS Loader 1024 oder 2048 Byte einstelle!
Ich habe im Beispielprogramm ein paar Warteschleifen und LED-geblinke rausgeschmissen.
Auch die if / Endif Abfrage des Chips habe ich rausgeschmissen.
Bei mir steht statt der Abfrage nur noch:
$loader = $3c00 ' 1024 words
Const Maxwordbit = 6 'Z6 is maximum bit Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

$Crystal habe ich noch geändert, so daß es mit meinem Board passt.

Das war's auch schon.

Gruß
Christopher

chr-mt
22.11.2005, 14:20
Hi,
ich hab' nochmal etwas rumexperimentiert.
Man muß wohl sehr aufpassen, daß man die Programmgröße so beschränkt, daß der Bootloader nicht überschrieben wird.
Der Download eines zu großes Programms führt am Ende zu den von fuerstfanta angesprochenen fehlern:
1. Receiving NAK on sectors
2. Too many errors

Danach ist kein flashen per 232 mehr möglich.
Getestet habe ich das mit einem Mega32 Programm, daß 94% des Flashs beansprucht. Da hat der Bootloader wohl keinen Platz mehr.
Mit kleineren Programmen ging es noch.
Beim Mega8 ist die Grenze natürlich schon sehr viel eher erreicht, bis zu der es funktioniert.

Gruß
Christopher

fuerstfanta
22.11.2005, 14:20
Eine Frage,

hast Du einen seriellen Anschluß an Deinem Rechner oder verwendest Du einen USB-Seriell-Adapter?

Vielleicht leigt hier mein Problem. Kannst Du trotzdem mal den Quellcode komplett posten?

Danke

Christoph

fuerstfanta
22.11.2005, 14:48
Es funktioniert, es funktioniert,


$Crystal habe ich noch geändert, so daß es mit meinem Board passt.

Das hat mich stutzig gemacht. Ich habe die Quarzfrequenz bei mir zwar richtig eingestellt, aber der Bootloader ist ein bißchen empfindlich was die Baudrate angeht. 57600baud bei 16MHZ bedeutet immerhin 2.08% Fehler. Jetzt habe ich die Baudrate testweise auf 4800baud (0.16%Fehler) gestellt und jetzt funktioniert es.

Seh ich es richtig, daß "$loadersize" im Hauptprogramm die Größe des installierten Bootloaders angibt, sodaß dies in die Berechnung der Programmgröße mit einbezogen wird?

LG

Christoph :-b

chr-mt
22.11.2005, 15:02
aber der Bootloader ist ein bißchen empfindlich was die Baudrate angeht. 57600baud bei 16MHZ bedeutet immerhin 2.08% Fehler.
Geht bei mir problemlos mit 16MHzQuartz und 57600.
Vielleicht liegt mein Quartz etwas daneben und es passt deswegen ;)
Ich habe allerdings alle meine Projekte mit 8 oder 16 MHz und serieller Schnittstelle und hatte noch nie Probleme.

Seh ich es richtig, daß "$loadersize" im Hauptprogramm die Größe des installierten Bootloaders angibt, sodaß dies in die Berechnung der Programmgröße mit einbezogen wird?
Sehe ich auch so.
Habe das gerade mal ausprobiert:
Bei meinem 94% Programm sagt er jetzt:
"Program will overwrite bootloader"
Funzt also!

hast Du einen seriellen Anschluß an Deinem Rechner oder verwendest Du einen USB-Seriell-Adapter?
USB nach seriell.

Kannst Du trotzdem mal den Quellcode komplett posten?
Hat sich ja jetzt erübrigt, wenn es bei dir funzt,oder ?

Gruß
Christopher

fuerstfanta
22.11.2005, 15:16
Hat sich ja jetzt erübrigt, wenn es bei dir funzt,oder ?

Ja, hat es, danke!


Ich habe allerdings alle meine Projekte mit 8 oder 16 MHz und serieller Scnittstelle und hatte noch nie Probleme.

Ich benutze eigentlich auch nur 16MHZ-Quarze und hatte auch noch nie Probleme. Das wundert mich nur jetzt, daß Du mit 16MHz und 57600 keine Probleme hast. Bei mir gehts nicht mal 9600, hab ich gerade probiert! Seltsam, oder?

So,.. jetzt muß ich noch ein bißchen am Bootloader rumspielen, möchte das ganze jetzt vom Mega8 auf nen Mega64 portieren und über RS485 laufen lassen. Bin gespannt ob das klappt :-)

LG

Christoph

chr-mt
22.11.2005, 15:24
über RS485 laufen lassen
Laß mich wissen, wenn du das hinkriegst!
Ich hätte Interesse daran ;)

Gruß aus Mainz :D
Christopher

fuerstfanta
22.11.2005, 15:26
.... es liegt wohl aber auch an den USB-Seriell-Adaptern. ICh habe zwei unterschiedliche Fabrikate. Mit dem einen funktioniert der AVRISP nicht richtig (kann Flash schreiben aber nicht verifizieren), dafür funktioniert der Bootloader mit 4800baud. Der andere funktioniert am AVRISP einwandfrei, aber der Bootloader läuft mit dem Ding gar nicht!

Die Teile scheinen mir irgendwie nicht ausgereift zu sein. Hab letztlich auch ewig versucht ein Oszi per RS232 an den Laptop zu hängen. Mußte aufgeben!

Es lebe das Experimentieren!!!

Christoph

chr-mt
22.11.2005, 17:02
So,
ich habe jetzt auch Programmdateien mit Hyperterminal in den Controller geladen!
Dazu muß die Abfrage des Startbytes im Bootloader gegen eine andere (ich habe einfach eine Taste genommen) ersetzt werden.
Im Hyperterminal dann "Datei senden" (Protokoll X-Modem einstellen), .bin-datei auswählen, Starten und beim Controller den Bootloader auslösen (bei mir eben Taste drücken)
Und es geht auch mit Hyperterminal mit 57600 !!!

Das ist COOOOOL :D

EDIT:
Geht auch mit 115200 , ist aber nicht schneller als mit 57600.
Der Mega 32 ist bei 115200 und 57600 in jeweils etwa 14 Sekunden voll.

Gruß
Christopher

hrei
22.11.2005, 18:08
.... es liegt wohl aber auch an den USB-Seriell-Adaptern.

Da lag bei mir der Hund begraben. Unmittelbar am Comport: Keine Probleme. Wobei mein Reichelt einfach RS232->USB ansonsten auch mit hohen Übertragungsraten klaglos funktioniert.

Gleichgültig: Nun läuft es.

Viele Grüße
Henrik

fuerstfanta
22.11.2005, 19:08
Hi Christopher,

sag mal, welches Terminal-Programm benutzt Du denn, in dem man die Xmodem-Übertragung einstellen kann?

LG

Christoph

chr-mt
22.11.2005, 23:30
Hi,
hatte ich doch geschrieben ;)
Hyperterminal (Windows Zubehör).
Dort auf "Übertragung" gehen, dann "Datei senden"
Dann kann man in einer Listbox verschiedene Übertragungsprotokolle auswählen (Xmodem,Xmodem1K, Ymodem,Zmodem, Kermit)
Es sollte aber auch mit anderen Terminalprogrammen gehen, Xmodem beherrschen so ziemlich alle.
Wichtig: die .bin Datei senden, nicht die .Hex-Datei.
Problematisch ist nur, daß es keine Abfrage gibt, ob der Flash schon voll ist.
Wenn man eine Datei sendet die größer ist (zB. die .hex), dann zerschießt man sich den Bootloader.
Das muß ich noch irgendwie im Bootloader abfangen.
Mal sehen, wann ich wieder mal Zeit habe dran zu basteln. ;)

Ich habe für die Tests übrigens auch die Reichelt Wandler benutzt, da mein Comport abgeraucht ist..

Gruß
Christopher

fuerstfanta
23.11.2005, 10:55
Hi,...

hab gerade den dritten USB-Seriell-Adapter getestet! Mit dem funktionierts auch mit 57600! Man glaubt es kaum...

Jetzt funktioniert auch der Bootloader über RS485, fast [-X

Der Sendevorgang wird vollständig und ohne Fehlermeldung ausgeführt, aber das PRogramm startet nicht. Es läuft fröhlich die Bootloader-Routine weiter? Woran könnte das hängen? Jemand ne Idee?

Übringens funktioniert der "Config Print0" entgegen der Behauptung in der History.txt immer noch nicht richtig. Die letzten Bytes des Print-Befehls beim Senden über den RS485-Bus werden vom zu früh zurückgesetzten Enable-Bit abgeschnitten!!!


lg

Christoph

chr-mt
23.11.2005, 13:10
Hi,
hab' jetzt mal eine "Sicherung" eingebaut.
Wenn Page größer 239 ist (für den MEGA 32) sende ich einfach ein paar CANs (cancel transmission) und mache dann goto __reset
Seit dem bricht Hyperterminal bei zu großen Dateien ab und der Bootloder ist geschützt.


If Page > 239 Then
For N = 1 To 15
Print Chr(can);
Next N
Print "MEMORY FULL !!!"
Goto _reset
End If



Man kann natürlich auch die Lockbits für den Bootloader setzen.
Allerdings gibt's dann eben keine Fehlermeldung im Hyperterminal.
Und beim nächsten "chip erase" sind die lockbits ja wieder gelöscht.
Das hat man schnell mal vergessen.

Gruß
Christopher

fuerstfanta
24.11.2005, 10:43
Hi nochmal,

also mit meinem AtMega8 funktioniert es einwandfrei. Aber mit dem Mega64 krieg ich es einfach nicht gebacken. Der Bootloader läuft, das Programm wird hochgeladen, und dann startet der Bootloader wieder??? ICh weiß nicht woran das liegt, vielleicht hab ich im Datenblatt irgendwas übersehen? Sowas wie das "sts rampz" beim Mega128? Kann mir jemand auf die Sprünge helfen?

LG

Christoph

fuerstfanta
26.11.2005, 15:36
Hi,..

hat jemand nen AtMega64 (vielleicht auch 128) zur Hand, der mal ausprobieren könnte, ob die Bootloader-Programme bei ihm funktionieren? Ich denke da ist ein Problem mit der M64Def.dat-Datei! Vielleicht kompiliert der BASCOM das File nicht richtig. Sonst weiß ich echt keinen Rat. Ich komme einfach nicht weiter!!!!

Christoph

chr-mt
28.11.2005, 11:19
Hi
ich habe es mit einem Mega 128 probiert.
$regfile = "m128def.dat"
$loader = $fc00

Ich bekomme allerdings schon beim Kompilieren den Fehler:
Error : 222 Line 129 Illegal character [expected (,got"], in File....
Error : 222 Line 130 Illegal character [expected (,got"], in File....

der Fehler befindet sich in den Zeilen:
Bitwait Spmcsr.selfprgen , Reset
Bitwait Eecr.eepe , Reset


Wenn ich die Zeilen auskommentiere, dann geht's und ich kann den MEGA128 mit Hyperterminal flashen.
Allerdings habe ich das erst nur mit einem recht kleinen Programm versucht.

Gruß
Christopher

fuerstfanta
28.11.2005, 13:41
Hi,...

ich habe gerade mal an Atmel eine email geschrieben, ob die mir vielleicht helfen können. Mal sehen. Hast Du vielleicht eine Adresse von den BASCOM-Jungs (außer info@) ? Dann würde ich die auch mal kontaktieren. Vielleicht liegts ja wirklich an den Mxxdef.dat - Files !?

grüße

Christoph

stupsi
28.12.2005, 13:05
hi jungs,

ich hab mir die BASCOM-Demo 1.11.8.1 installiert und möchte gern den Bootloader für einen ATMEGA8 mit 4 MHz (STK200-Board) und 16 MHz ( Eigenbau-Board) ausprobieren. Das Compilieren des Programms "Bootloader.bas" überschreitet aber die Grenzen der DEMO-Version.

Ist jemand bereit, ein paar Hex-Files für den MEGA8 (4, 8 und 16 MHz) zu kompilieren und zum Download zur Verfügung zu stellen?


Besten Dank im Voraus, Stupsi

fuerstfanta
06.01.2006, 19:21
Hi!

Um den Post mal zu vervollständigen! In der neuen Bascom Version 1.11.8.1 sind die Probleme behoben. Dank des sehr guten Kontaktes mit den BASCOM-Leuten konnte mir und allen anderen mit dem gleichen Problem also geholfen werden!

Danke an alle für die Hilfe!

mfg und schönes Wochenende

Christoph

chr-mt
07.01.2006, 15:52
Hi,
Danke für die Info!

Gruß
Christopher

fuerstfanta
10.02.2006, 14:29
Hallo,

nochmal eine kleine Frage zum Bootloader!

Wenn ich die Erklärungen in den Datenblätter richtig verstehe, dann ist die BOOTRST - Fuse dazu da, dem µC zu sagen, wo er mit der Ausführung des Programms nach einem Power-up beginnen soll! Entweder in der Bootloader-Sektion oder in der Applikation! Ist das so?

Bei mir ändert nämlich die Einstellung dieser Fuse rein garnichts! Der Mega64 beginnt immer mit dem Bootloader, obwohl er das gar nicht soll!

Wer kann mir helfen?

mfg

Christoph

Gento
20.10.2006, 18:55
So ich habe den Bootloader mit dem Mega 32 am Laufen.

Der Code ganz knapp unter 2K Byte mit LCD Anzeige und dem Orginal von MCS
abgewandelt:

$crystal = 16000000
$baud = 38400 'this loader uses serial com
$regfile = "m32def.dat"

Config Portb = Output
Config Lcd = 20 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.6 , Rs = Portb.5
Config Lcdbus = 4

Config Pind.0 = Input 'RxD für RS232
Config Pind.1 = Output 'TxD für Rs232


Const Loaderchip = 32 ' Mega32
$loader = $3c00 '$3800= 2048 word $3c00= 1024 words
Const Maxwordbit = 6 'Z6 is maximum bit '
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Const Maxword =(2 ^ Maxwordbit) * 2 '128
Const Maxwordshift = Maxwordbit + 1

'Dim the used variables
Dim Bstatus As Byte , Bretries As Byte , Bblock As Byte , Bblocklocal As Byte
Dim Bcsum1 As Byte , Bcsum2 As Byte , Buf(128) As Byte , Csum As Byte
Dim J As Byte , Spmcrval As Byte ' self program command byte value

Dim Z As Long 'this is the Z pointer word
Dim Vl As Byte , Vh As Byte ' these bytes are used for the data values
Dim Wrd As Word , Page As Word 'these vars contain the page and word address
Dim Bkind As Byte , Bstarted As Byte



Disable Interrupts 'we do not use ints


'some constants used in serial com
Const Nak = &H15
Const Ack = &H06
Const Can = &H18


$timeout = 200000 'we use a timeout
'When you get LOADER errors during the upload, increase the timeout value
'for example at 16 Mhz, use 200000


Waitms 100
Initlcd
Cls
Cursor Off Noblink
Locate 1 , 1
Lcd "Boote ..... "
Locate 2 , 1
Lcd "...................."
Locate 2 , 1
For J = 0 To 20
Lcd " "
Waitms 150
Bretries = 5 'we try 5 times
Teste_ob_was_kommt:
Bstatus = Waitkey() 'wait for the loader to send a byte

Print Chr(bstatus);
If Bstatus = 123 Then 'did we received value 123 ?
Bkind = 0 'normal flash loader
Goto Loader
Elseif Bstatus = 124 Then ' EEPROM
Bkind = 1 ' EEPROM loader
Goto Loader
Elseif Bstatus <> 0 Then
Decr Bretries
If Bretries <> 0 Then Goto Teste_ob_was_kommt 'we test again
End If
Next J

Goto _reset 'goto the normal reset vector at address 0


'this is the loader routine. It is a Xmodem-checksum reception routine
Loader:
Do
Bstatus = Waitkey()
Loop Until Bstatus = 0


For J = 1 To 3 'this is a simple indication that we start the normal reset vector
Toggle Portb.2 : Waitms 50
Next

If Bkind = 0 Then
Spmcrval = 3 : Gosub Do_spm ' erase the first page
Spmcrval = 17 : Gosub Do_spm ' re-enable page
End If


Bretries = 10 'number of retries

Do
Bstarted = 0 ' we were not started yet
Csum = 0 'checksum is 0 when we start
Print Chr(nak); ' firt time send a nack
Do

Bstatus = Waitkey() 'wait for statuse byte

Select Case Bstatus
Case 1: ' start of heading, PC is ready to send
Incr Bblocklocal 'increase local block count
Csum = 1 'checksum is 1
Bblock = Waitkey() : Csum = Csum + Bblock 'get block
Bcsum1 = Waitkey() : Csum = Csum + Bcsum1 'get checksum first byte
For J = 1 To 128 'get 128 bytes
Buf(j) = Waitkey() : Csum = Csum + Buf(j)
Next
Bcsum2 = Waitkey() 'get second checksum byte
If Bblocklocal = Bblock Then 'are the blocks the same?
If Bcsum2 = Csum Then 'is the checksum the same?
Gosub Writepage 'yes go write the page
Print Chr(ack); 'acknowledge
Else 'no match so send nak
Print Chr(nak);
End If
Else
Print Chr(nak); 'blocks do not match
End If
Case 4: ' end of transmission , file is transmitted
If Wrd > 0 Then 'if there was something left in the page
Wrd = 0 'Z pointer needs wrd to be 0
Spmcrval = 5 : Gosub Do_spm 'write page
Spmcrval = 17 : Gosub Do_spm ' re-enable page
End If
Print Chr(ack); ' send ack and ready

Portb.3 = 0 ' simple indication that we are finished and ok
Waitms 20
Goto _reset ' start new program
Case &H18: ' PC aborts transmission
Goto _reset ' ready
Case 123 : Exit Do 'was probably still in the buffer
Case 124 : Exit Do
Case Else
Exit Do ' no valid data
End Select
Loop
If Bretries > 0 Then 'attempte left?
Waitms 1000
Decr Bretries 'decrease attempts
Else
Goto _reset 'reset chip
End If
Loop



'write one or more pages
Writepage:
If Bkind = 0 Then
For J = 1 To 128 Step 2 'we write 2 bytes into a page
Vl = Buf(j) : Vh = Buf(j + 1) 'get Low and High bytes
lds r0, {vl} 'store them into r0 and r1 registers
lds r1, {vh}
Spmcrval = 1 : Gosub Do_spm 'write value into page at word address
Wrd = Wrd + 2 ' word address increases with 2 because LS bit of Z is not used
If Wrd = Maxword Then ' page is full
Wrd = 0 'Z pointer needs wrd to be 0
Spmcrval = 5 : Gosub Do_spm 'write page
Spmcrval = 17 : Gosub Do_spm ' re-enable page

Page = Page + 1 'next page
Spmcrval = 3 : Gosub Do_spm ' erase next page
Spmcrval = 17 : Gosub Do_spm ' re-enable page
End If
Next

Else 'eeprom
For J = 1 To 128
Writeeeprom Buf(j) , Wrd
Wrd = Wrd + 1
Next
End If
Toggle Portb.2 : Waitms 10 : Toggle Portb.2 'indication that we write
Return


Do_spm:
Bitwait Spmcsr.0 , Reset ' check for previous SPM complete
Bitwait Eecr.1 , Reset 'wait for eeprom

Z = Page 'make equal to page
Shift Z , Left , Maxwordshift 'shift to proper place
Z = Z + Wrd 'add word
lds r30,{Z}
lds r31,{Z+1}


Spmcsr = Spmcrval 'assign register
spm 'this is an asm instruction
nop
nop
Return



Läuft mit 38400 Baud ohne Probleme.
Die Fuseeinstellungen siehe Bild.
Ich habe den Mega 32 auch gegen Auslesen geschützt.
Nun kommtnoch ein Krüptfunction rein :-$

http://www.gento.de/bild_m32.gif
Grüße Gento

darxon69
27.10.2006, 18:18
Ok, ich hatte auch imer das problem, daß ich den Bootloader in meinen Mega8 eingespielt hatte und dann genau 1x diesen benutzen konnte. Nun habe ich den von Gento genommen und für meinen Mega8 umgeschrieben.
Jetzt funktioniert der bootloader zwar so oft ich will, aber das eigentliche Programm startet nicht mehr :-(

Gento
27.10.2006, 22:29
$0c00 eingetragen ?
Das zu Ladende Prog darf nur bei Dir nur max 6K haben.

Gento

darxon69
28.10.2006, 17:47
Inzwischen läuft es. Habe allerdings nichts geändert. Das ist mal wieder so eines der mystischen Dinge, die ich nicht verstehen werde.

m_herr
03.11.2006, 23:28
hat jemand schon mal mit verschlüsselten boot-loader gearbeitet?

Gento
03.11.2006, 23:38
Hab ich .... und sende unter Delphi

Gento

m_herr
04.11.2006, 07:11
uih, kannst du da freundlicherweise sagen was du wie gemacht hast, daß es funktioniert?

Gento
04.11.2006, 12:25
Ohne zu Debuggen bleibt der Code < 1 K Word

Debugen=0 dann ohne LCD Anzeigen zwischendurch


Baud=19200 reicht vom Speed und ist sicherer , wird ja nicht jeden Tag bei Kunden upgedatet.
Bei mir geht jede Baudzahl nach oben auch.

Um mir nicht selbst ins Knie zu schießen habe ich die relevanten stellen geschwärtzt. "****"



' Bootloader für Mega 32


$crystal = 16000000
$baud = 19200 '38400 'this loader uses serial com
$regfile = "m32def.dat"

Config Portb = Output
Config Lcd = 20 * 2
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.6 , Rs = Portb.5
Config Lcdbus = 4

Config Pind.0 = Input 'RxD für RS232
Config Pind.1 = Output 'TxD für Rs232

Const Debugen = 0 'Zu Testzwecke auf 1 setzen


$loader = $3c00 '$3800= 2048 word $3c00= 1024 words


Const Maxwordbit = 6 'Z6 is maximum bit '
Config Com1 = Dummy , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0

Const Maxword = 128 'Nur für Mega 32
Const Maxwordshift = Maxwordbit + 1

'Dim the used variables
Dim Blockstatus As Byte
Dim Fehlerversuche As Byte
Dim Blocknummer As Byte
Dim Blocklocalnummer As Byte
Dim Vor_checksumme_vom_pc As Byte
Dim Checksumme_vom_pc As Byte
Dim Buffer(128) As Byte
Dim Checksumme As Byte
Dim Schleife As Byte
Dim Spmcrval As Byte ' self program command byte value

Dim Zeiger As Long 'this is the Z pointer word
Dim Vl As Byte
Dim Vh As Byte ' these bytes are used for the data values
Dim Wrd As Word
Dim Page As Word 'these vars contain the page and word address
Dim Ladeziel As Byte
Dim Kruept As Byte




Disable Interrupts 'we do not use ints


'some constants used in serial com
Const Nak = &H15
Const Ack = &H06
Const Can = &H18


$timeout = 100000 'we use a timeout
'When you get LOADER errors during the upload, increase the timeout value
'for example at 16 Mhz, use 200000


Waitms 100
Initlcd
Cursor Off Noblink
Cls
Locate 1 , 1
Lcd "Init"
Blocklocalnummer = 0
For Schleife = 0 To 15
#if Debugen = 0
Lcd "."
#endif
#if Debugen = 1
Lcd "?"
#endif

Blockstatus = Waitkey() 'Wartet ob der PC die Ladesequenz beginnt
Print Chr(blockstatus); 'Echo zurück
If Blockstatus = 123 Then 'Wenn Ladesequenz=123 dann wird der normale Flash geladen
Ladeziel = 0 '
Goto Loader
End If
#if Debugen = 1
If Blockstatus = 124 Then 'Wenn Ladesequenz=124 dann wird ind EEPROM geladen
Ladeziel = 1 '
Goto Loader
End If
#endif
Next Schleife

Goto _reset 'Wenn zu lange gewartet dann springe ins normale Program
'################################################# ################################################## #############################
Loader:
Locate 1 , 1
Lcd "Update " 'die eigendliche Laderoute
Do
Blockstatus = Waitkey()
Loop Until Blockstatus = 0



If Ladeziel = 0 Then
Spmcrval = 3 : Gosub Do_spm ' erase the first page
Spmcrval = 17 : Gosub Do_spm ' re-enable page
End If


Fehlerversuche = 10 'number of retries
'###################### Einleseschleife ###############################################
Do
Checksumme = 0 'checksum is 0 when we start
Print Chr(nak); ' firt time send a nack
Do
Blockstatus = Waitkey() 'wait for statuse byte

Select Case Blockstatus
Case 1 To 3: ' 1=normal 2=Invers 3=Krüpt
Incr Blocklocalnummer 'increase local block count
Checksumme = 1 'checksum is 1

Blocknummer = Waitkey() 'hole Block Nr die übertragen werden soll .Start ist 1

Checksumme = Checksumme + Blocknummer 'get block
Vor_checksumme_vom_pc = Waitkey()
Checksumme = Checksumme + Vor_checksumme_vom_pc 'get checksum first byte
For Schleife = 1 To 128 'get 128 bytes
Buffer(schleife) = Waitkey()
Checksumme = Checksumme + Buffer(schleife)
If Blockstatus = 2 Then Buffer(schleife) = Not Buffer(schleife)
If Blockstatus = 3 Then
Kruept = ********
Kruept = Kruept - *****
Buffer(schleife) = Buffer(schleife) ******** Kruept
End If
Next
Checksumme_vom_pc = Waitkey() 'Warte auf Checksumme vom PC
#if Debugen = 1
Locate 1 , 1
Lcd "Uebertrage Block:"
Lcd Blocknummer
Locate 2 , 1
Lcd "Bstatus :"
Lcd Blockstatus
Lcd " "
#endif
If Blocklocalnummer = Blocknummer Then 'are the blocks the same?
If Checksumme_vom_pc = Checksumme Then 'is the checksum the same?
Gosub Schreibe_seite 'yes go write the page
Print Chr(ack); 'acknowledge
Else 'no match so send nak
Print Chr(nak);
End If
Else
Print Chr(nak); 'blocks do not match
End If
Case 4: ' Beendet die Übertragung mit erfolg
If Wrd > 0 Then 'if there was something left in the page
Wrd = 0 'Z pointer needs wrd to be 0
Spmcrval = 5
Gosub Do_spm 'write page
Spmcrval = 17
Gosub Do_spm ' re-enable page
End If
Print Chr(ack);
#if Debugen = 1 ' send ack and ready
Locate 2 , 1
Lcd "Bstatus :"
Lcd Blockstatus
Lcd " "
Locate 1 , 21
Lcd "Update Erfolgreich"
Wait 5
#endif
Goto _reset ' start new program
Case &H18: ' PC aborts transmission
Goto _reset ' ready
Case 123 : Exit Do 'was probably still in the buffer
Case 124 : Exit Do
Case Else
Exit Do ' no valid data
End Select
Loop
' Fehlerübertragungsbehandlung
If Fehlerversuche > 0 Then 'attempte left?
Waitms 1000
Decr Fehlerversuche 'decrease attempts
Else
Goto _reset 'reset chip
End If
Loop
'####################### Ende Einleseschleife #############################
Schreibe_seite: 'Beschreibt eine oder mehr seiten
If Ladeziel = 0 Then
For Schleife = 1 To 128 Step 2 'we write 2 bytes into a page
Vl = Buffer(schleife)
Vh = Buffer(schleife + 1) 'get Low and High bytes
lds r0, {vl} 'store them into r0 and r1 registers
lds r1, {vh}
Spmcrval = 1
Gosub Do_spm 'write value into page at word address
Wrd = Wrd + 2 ' word address increases with 2 because LS bit of Z is not used
If Wrd = Maxword Then ' page is full
Wrd = 0 'Z pointer needs wrd to be 0
Spmcrval = 5
Gosub Do_spm 'write page
Spmcrval = 17
Gosub Do_spm ' re-enable page
Page = Page + 1 'next page
Spmcrval = 3
Gosub Do_spm ' erase next page
Spmcrval = 17
Gosub Do_spm ' re-enable page
End If
Next

#if Debugen = 1
Else 'eeprom
For Schleife = 1 To 128
Writeeeprom Buffer(schleife) , Wrd
Wrd = Wrd + Schleife
Next
#endif
End If

Return
'################################################# ##############################
Do_spm:
Bitwait Spmcsr.0 , Reset ' check for previous SPM complete
Bitwait Eecr.1 , Reset 'wait for eeprom

Zeiger = Page 'make equal to page
Shift Zeiger , Left , Maxwordshift 'shift to proper place
Zeiger = Zeiger + Wrd 'add word
lds r30,{Zeiger}
lds r31,{Zeiger+1}


Spmcsr = Spmcrval 'assign register
spm 'this is an asm instruction
nop
nop
Return
'################################################# ##############################


Gruß Gento