Hallo Zusammen, ich bin auf der Suche nach einem Bootloader für den AtXMega128A1. Die AppNote von Atmel (AVR1316: XMEGA Self-programming) kenne ich; das alles funktioniert aus der Application Section heraus auch wunderbar mit Flash lesen/schreiben. Interrupts habe ich ebenfalls aus dem 8k Bootflash zum Laufen bekommen - auch wenn ich den Bootloaderbereich anspringe. (LDFLAGS += W1,-section-start=.text=0x20000) Es gibt ein paar Hinweise im Forum, dass die Xmegas nicht den Bootbereich anspringen. (Errata Rev. G Bootflash is nonfunctional...) Ich verwende die Rev. H des Chips, die lt. Atmel das Problem behoben hat. Was der Chip macht / nicht macht: via SPI fülle ich den Puffer (funzt alles), dann rufe ich die Funktion WriteApplicationPage auf; allerdings ist der Flash nach der vermeintlichen Schreibaktion leer. Hat schon jemand Erfahrungen gemacht mit den XMegas bzw. Bootloader? Gruß Helmut
Gutes neues Jahr! Jetzt läuft der dumme Bootloader. Ist eine mühselige Angelegehheit gewesen - das STK600 hat meiner Meinung nach noch ein paar (SW)Schwächen - das hat mich fast wahnsinnig gemacht, dass Aref1 und Aref2 immer wieder auf 0V stehen, obwohl sie programmiert sind/waren. Dann läuft der XMega nicht mehr, geschweige von Debuggen über JTAG. (rote Led blinkt) Aus den Atmel AppNotes und viel lesen/lesen/lesen/probieren/schimpfen hats jetzt geklappt. (naja, Alltag für unsereins) Euch (ebenfalls) viel Kraft, Geduld; aber auch Freude an Eurem Hobby/Beruf! Grüßle von Helmut
Schön, freut mich. Letztendlich geht alles so, wie die Datenblätter schreiben?
ja, in etwa... :-) Tja, peinlich; ich hatte SP_LoadFlashWord(..) aus der der LoadAppTableWord(..) Funktion ohne die Pause herauskopiert. ==> NVM Controller kam anscheinend nicht nach. Ansonsten sehe ich keinen weiteren Unterschied bzw. ExamDiffPro sieht keine weiteren Änderungen. Da ich meinen SPI-Stream zu Wörtern geklebt habe und die Fkt. kopiert - ist mir die Pause entgangen.
Kleiner Nachtrag für alle die ebenfalls einen Bootloader zusammenbauen: die Flash Schreibroutine aus der Datei sp_driver.s geht nur bis 64k. Ich habe die Funktion SP_LoadFlashPage ein bisschen aufgebohrt; wenn RAMPZ (Bits 16..24) ebenfalls adressiert wird ist die zweite Hälfte vom Flash auch beschreibbar. Gruß Helmut
Hast du vielleicht ein Beispiel zu deinem Bootloader? Ich würde gerne selber einen dazuschreiben, allerdings habe ich bisher keine Angaben gefunden, wie ich die Boot-Section schreiben kann?! bzw. mit welchem Programm. Wie hast du das gemacht? Vielen Dank, und Gruss Severin
Hallo Severin, Du findest eine ganze Menge in den Atmel AppNotes. AVR1316: XMEGA Self-programming ist für das Bootflash. Ich habe keine PC Software, sondern bekomme von einem anderen Gerät das HexFile via SPI durchgereicht ==> habe Routinen für Check etc des SPI Verkehrs. Ich denke wenn Du den PC benutzt und z.B. über RS232 kommunizierst, so dürfte es PC-seitig vom ATTiny bis zum ATMega genügend SW geben. Schreiben der Bootsection siehe Appnote. Du musst die BL-SW in den Speicherbereich ab 0x20000 schieben + ein Handling haben was Du gerade anspringst (Bootloader, Applikation) Viel Erfolg, Gruß Helmut
Hi, Ich würde eben gerne einen Bootloader für mein Board (http://tuneX.aoh.ch) schreiben, der sollte über USB oder RS232 (UART) mit dem PC kommunizieren können, und somit das Programm downloaden. Aber leider habe ich keine Erfahrung mit Bootloadern. Hättest du denn irgendeinen Ansatz, wie und wo ich am besten beginne? Das Datenblatt habe ich schon durchgelesen, aber leider nicht herausgefunden, wie ich den Bootloader hineinlade. Vielen Dank und Gruss Severin
Hallo Severin, Anhaltspunkte die ich Dir geben kann: wenn Du auf den Seiten z.B. eines AtMega128 nach Bootloader guckst; da ist das ganze Procedere beschrieben. (Da ist auch der Code beschrieben, lauffähige Funktionen) Der größte Unterschied (das X im Namen) ist u.a. der NVM Controller des XMEGA. Den musst Du Ansprechen für Eeprom und Flash -Zugriffe --- aber das ist in den Appnotes von Atmel beschrieben. Sehr gute Adresse für Bootloader (für AVR AT-iiiiii - ohne X): Peter Dannegger, Benedikt Sauter etc etc bzw. Forumssuche Bootloader. Gruß Helmut
Hallo Helmut Vielen Dank für deine Antwort! Aber es ist ja schwierig ein geeignetes Programm zu finden um den Bootloader zu downloaden, oder? Bisher stiess ich auf PonyProg, aber das funktioniert nicht, da es noch nicht für X-Mega ausgelegt ist. Hast du da eine spezielle Software verwendet? Gruss Severin
Hallo sdz55, hmmm.... Wenn Ponyprog nicht die Signature Bytes ausliest, dann wäre es eigentlich möglich einen XMega-Code zu laden, indem Du den Programmer auf ATMEga128 stellst. Ponyprog wird das HExfile weiterleiten - Du brauchst aber noch eine SW im Bootbereich, die Dir das ganze entgegennimmt.... Ich denke aber eher, dass eine Mail an den Autor hilfreich ist. Dieser muss nicht soviel mehr neu schreiben (die Routinen bleiben gleich - nur hat der XMega andere Signature Bytes und hat noch weitere (geniale) Fusebytes, die andere AVRs nicht haben) Also ich habe ein STK600 und einen JTAG Ice MkII. Damit kann ich derzeit alles ändern was notwendig ist - später geht das dann auch über PC RS232 und PDI. Gruß Helmut
Helmut Ru wrote: > Hallo sdz55, > > hmmm.... > Wenn Ponyprog nicht die Signature Bytes ausliest, dann wäre es > eigentlich möglich einen XMega-Code zu laden, indem Du den Programmer > auf ATMEga128 stellst. Das würde mich aber wundern. Immerhin benutzt der XMega ein völlig anderes Programmierinterface, sodass nicht nur eine neue Software fällig wird, sondern auch neue Hardware.
Wie soll das denn gehen? Ich muss das JTAGmkII zuerst mit PonyProg erkennen können (funktioniert nicht!). Danach sollte ich die Device erkennen (kann ich nicht)?! Helmut Ru wrote: >Ponyprog wird das HExfile weiterleiten - Du brauchst aber noch eine SW >im Bootbereich, die Dir das ganze entgegennimmt.... Ich spreche ja auch vom Bootloader, nicht von der Applikation! Das heisst ich suche ein Programm mit welchem ich meinen Bootloader in den Boot-Bereich brennen kann! Danke & Gruss Severin
Hallo Severin, jetzt haben wir aneinander vorbeigeredet... Gegenfrage: wie programmierst Du den XMEga bis jetzt? Hast Du Zugriff auf den Flash Bereich? Gruß Helmut
Ok, über JTAG ist es leicht möglich, ein Programm in den Bootbereich des Controllers zu laden. Die Fuse auf Boot Loader Reset und fertig. Was anderes kenne ich (bis jetzt) auch nicht. Gruß Helmut
Aber wenn ich die Fuse doch auf Bootloader-Reset setze, schreibt mir avr-Studio trotzdem in den App-Bereich.
Siehe oben in Thread: (LDFLAGS += W1,-section-start=.text=0x20000) im Makefile und Du bist im Bootbereich Gruß Helmut
Ist denn 0x20000 die Boot-Adresse? Vielen Dank! Und damit wird der Bootloader also hineingeladen?
Severin Z. wrote: > Ist denn 0x20000 die Boot-Adresse? > Vielen Dank! Ah, ok diese Frage habe ich mir selber beantwortet. Aber konkret, von welchem Bootloader gehst du denn aus? Welche URL?
Hallo Severin, Du findest für den AVR Tiny .., Mega genügend Bootloader in Assembler und C hier in diesem Forum -- Suchfkt. 'Bootloader'; sogar ein eigener Artikel. http://www.mikrocontroller.net/articles/Bootloader Das was Du selber machen musst - die Codeschnipsel des XMega nehmen und einen kompletten BL von irgendeinem AVR ..Mega umschreiben. Diese Arbeit kann Dir keiner abnehmen - ich selber hab ja ebenfalls gesucht (siehe Thread erster Eintrag) - inzwischen bin ich ein Stück weiter. Der (fast) einzigen Unterschied Mega/XMega: Loadflashpage muss anders ausfallen. Mein uBL nterscheidet sich von vielen, da ich über SPI Daten bekomme (die vom PC über einige Geräte durchgereicht werden). Wenn Du die Direktverbindung zum PC willst, kannst Du z.B. über RS232 Dein Hex schicken; kleines C# Programm o.ä. bzw. vorhandene PC-SW anpassen. Den BL programmieren geht über JTAG ICE mkII. (oder PDI) Das muss einmalig sein. Ich hoffe ich konnte Dir weiterhelfen. Bei weiteren Fragen melde Dich einfach Gruß Helmut
Hi Helmut Danke für deine Antwort! Ich werde mich nächstes Wochenende mal dahinter setzen und programmieren ^^ Dann gebe ich dir Bescheid sobald ich fertig bin. gruss Severin
>Hab leider nur ChipRev.G
Wie bekommt man denn heraus welche Revision man hat ?
Steht drauf. Die Revision G erhielt zusätzlich den Vermerk "ES" wie 'Evaluation Sample'.
Hi, Ich bins nochmal! ^^ Ich habe ein Problem wenn ich die AppNote von Atmel nehme und versuche zu Flashen, gibt er mir immer ca. 13 Fehler, undefined reference to 'SP_ReadByte' oder undefined reference to 'SP_WaitForSPM' Er kann die Funktionen nicht finden! Wo bekomme ich die SPM funktionen her? Kann mir schnell jemand helfen? Vielen Dank & Gruss Severin
Hallo Severin, Deine Headerdatei muss richtig eingebunden sein, klingt seehr danach dass diese nicht richtig eingebunden wurde. Nächster (kleiner) Fallstrick: Im Makefile musst Du die .s Datei mitcompiliren/linken Viel Spass Gruss Helmut
Anmerkung an Travel Rec: Es heisst IMHO "Engineering Sample". Aber das sind Spitzfindigkeiten. Eine Neuigkeit habe ich: Ab Chiprev. Version H geht der Bootloader in der TQFP und BGA Variante. Leider hat Atmel keine Zuordnung Errata <---> Chipmarking. Welche Version ist was? Vielleicht habe ich es auf der Homepage nicht gefunden und es ist da? Über Hinweise freue ich mich.
Ach doch, jetzt gings fast, nur noch 1 Fehler: Cannot find sp_driver ??? Was kann ich da tun? ich habe auch schon versucht dieses File einzubinden, aber leider ohne erfolg
So, auch dieses Problem habe ich nun behoben. Irgendwie meldet der jetzt so an die hundert Fehler: Error constant value required ? Was hat das zu bedeuten? oder was kann ich dagegen tun?
Hallo Severin, poste mal bitte Deinen Code, denn ich weiss net was bei Dir schiefgelaufen ist. Die (in anderen Posts) vielerwähnte Kristallkugel dient bei mir nur als Briefbeschwerer; ansonsten ist das Glas etwas trübe... ;-) Gruß Helmut
Der Code ist der von Atmel Application Note 1316 oder so einfach die self programming. Danke
Hallo Severin, was auch immer bei Dir passiert ist; keine Ahnung. Ohne Code (oder extrakte davon) und genaue Beschreibung können die anderen Dir nicht helfen. Deswegen also anbei der compilierte Code von App 1316. Du solltest Deine Versionen kontrollieren: AVR Studio: 4.15 Build 623 AVR GCC: 4.3.2 Wenn Du mit der Ice Dir nach Ablauf den Flash ansiehst, müssen mehrere Einträge vorhanden sein, u.a. "This is the user signature row." als ASCII Abbildung. Viel Spass, ich hoffe es hilft Dir soweit mal weiter. Gruß Helmut
Hallo Helmut Ich habe gerade gesehen, dass ich die falschen Versionen des AVR-Studios verwende. Ich werde mal schauen ob ich die neue Version bekomme. Danke & Gruss Severin PS: Der Code ist das example der app-note self-programming
So ich habe jetzt mal dein Code-Example genommen und es hat tatsächlich funktioniert. Nur wie kannst du eine andere Flashpage schreiben als Page 0? Egal welchen wert ich für writeapptablepage() eingebe es wird immer page 0 geschrieben.
Hallo Severin, Du musst erst EraseAppTable(n) aufrufen, dann den Puffer beschreiben, den Du dann ins Flash schreibst.
hi helmut leider funktioniert es immer noch nicht. Ebenfalls wird das Programm gar nicht an stelle 0x20000 geschrieben. Woran könnte das liegen? gruss Severin
Hallo Severin, ich war leider krank (knock knock - no response...) Also erstmal: schade, dass der Code immer noch nicht geht. Aus dem Sample Code kannst Du eigentlich die grundlegende Funktion entnehmen. Nun die Frage: ich verstehe, wenn Du nicht Deinen ganzen Code posten willst. Kannst Du aber das makefile und das Gerüst doch als Zip packen und mir persönlich mailen oder ins Forum stellen? Dann kann ich Dir auch eher helfen. Warum z. B. nicht an Stelle 0x20000 lokatiert wird kann ich nur raten... Gruß Helmut
Hi Helmut Es geht mir nicht darum, meinen Code zu schützen. Aber es ergibt keinen Sinn, wenn ich dir den Code schicke, welchen du eh schon hast ^^ Ich habe bloss die Zeilen EraseAppTablePage(0) und WriteAppTablePage(0) in EraseAppTablePage(1) und WriteAppTablePage(1)geändert. Aber bei mir schreibt er immer noch nicht an die richtige Stelle. Wäre es denn nicht möglich, dass du mir deinen Bootloader zusendest, denn ich werde ihn nicht veröffentlichen, sondern nur an meine Bedürfnisse anpassen. Vielen Dank. Gruss Severin
Hallo Severin, mir geht es aber darum meinen Code zu schützen... Ich verwende den Code nicht persönlich, sondern beruflich. ==> Ich kann Dir nicht das komplette Projekt zusenden; aber immer funktionierende und getestete Codeschnipsel. Die Funktionen rundherum sind Kinderfasching (Timeouts, entgegennehmen von Daten, etc) - das bekommst Du selber hin - der Knackpunkt ist aber die Funktion der Flashprogrammierung, dass Daten auch wirklich ins Flash geschrieben werden. Das was Du nicht geschrieben hast: an welche Stelle des Flash schreibt er denn die Daten? Welche Daten schickst Du? Wichtig(ste) Frage: welche Version des AtXMegas hast Du? Letzte Zeile des Chipmarkings: 35953 X ES Das X verrät Dir die Version. Bin gespannt auf Deine Antwort.... Gruß Helmut
Hi Helmut! Danke für deine Antwort! Ach so, na dann haben wir die Grauzone mal geklärt ;-) Bei mir wird immer nur die AppTableSection geschrieben, aber das ist ja nicht das was man erreichen sollte oder? Irgendwie eigenartig, bei meinem Chip steht: ATXMEGA128A1 AU 0832 Kannst du damit etwas anfangen? Ja genau das ist der Knackpunkt. Ich habe eigentlich schon alles darauf vorbereitet. Die einzige Funktion die ich noch brauche wäre das mit dem Flashen. Ich würde nämlich gerne einen Bootloader zur UART-Übertragung nutzen. Ich arbeite übrigens halb-privat/halb-geschäftlich daran. -->Es ist ein Lehrlingsprojekt. Gruss Severin
Hallo Severin, Lehrlingsprojekt? Respekt. Du hast Dir eine ziemliche Kanone als Chip herausgesucht. Also: bei Dir wird die AppTableSection geschrieben. Grund einen Luftsprung zu machen? Ja. Dann funktionierts doch! Du scheinst das Funktionsprinzip noch nicht ganz verstanden zu haben. Also, ich probiers mal: In der 8k Bootloader Section ist nur der Code, der Dir dafür sorgt, dass Daten entgegengenommen werden (z.B. über RS232) und mit einer CRC überprüft werden; dann werden diese Daten ab Flash Adresse 0x000000 geschrieben und ein Neustart durchgezogen. Der Controller springt wieder den Bootloader bereich ab 0x20000 (das ist mit den Fuses fest eingestellt) an und Du brauchst eine Logik, die ausliest, ob das OS schon geschrieben wurde, wenn ja, soll er die IntVects umbiegen und von der AppTableSection beginnen (->das User Programm läuft) Im User Programm brauchst Du eine Kennung über RS232, die ihn wieder in den Bootloader springen lässt- zum Entgegennehmen eines anderen OS. ==> Du schreibst zwei Programme. Das eine ist der Bootloader - der Code, der ab 0x20000 residiert und ein OS, das beginnt ab 0x000000. Schau Dir bitte die fertigen Codes für einen ATmega-irgendwas an! Das hat mir (damals) auch weitergeholfen. Gruß Helmut
Hi Helmut! Danke für deine Antwort. Ich glaub ich weiss was du jetzt denkst: "oh nicht doch, ein kleiner Junge der sich an einer Diplomarbeit versucht". Ich kann dich von daher beruhigen. Ich bin im 2ten Lehrjahr und wollte etwas neues machen. Dabei suchte ich mir eine interessante Arbeit aus und stiess auf den XMEGA. Ich habe schon etliche Programmier- wie auch Hardwareerfahrung, wie z.B. Timer, Schnittstellen, ADC, DAC usw. Leider habe ich bisher noch gar nichts mit Flash oder Speicher gemacht. Und ersuche dich daher um Hilfe ^^. Ehm das mit der AppTableSection ist eben ein Problem, denn ich habe ja noch nicht mein Programm hinein geladen sondern nur den Beispiel-Buffer wie in der AppNote und dabei habe ich nichts getan ausser dem File compiliert und geflasht. Aber wie funktioniert den das genau? sry wenn ich nicht ganz mitkomme ;-) Ist es denn beim Xmega nicht so wie z.B. bei einem ATMega32, wo der Bootloader nach einem Chip-Reset zuerst startet? Meine Anwendung: Mir geht es eigentlich darum, dass ich einen Bootloader habe, der nach dem Reset (wie schon erwähnt) startet, ein Zeichen über USB sendet und während 200ms wartet, ob irgendein Zeichen zurückkommt, welches bedeutet dass er neue Software erhält, diese Flasht und danach das Programm ausführt. Oder sobald der Timeout erreicht ist soll er das Programm ausführen. Kannst du mir dazu evtl. die Programmteile beschreiben, welche ich brauche und was beim XMega gegenüber eines ATMegas anders ist, erklären? Bereits vorhandene Software: USART Kommunikation (USB), delays, etc. Vielen Dank & Gruss Severin
Hi Severin, >Ich glaub ich weiss was du jetzt denkst: "oh nicht doch, ein kleiner >Junge der sich an einer Diplomarbeit versucht". Ich kann dich von daher >beruhigen. Ich bin im 2ten Lehrjahr und wollte etwas neues machen. Dabei >suchte ich mir eine interessante Arbeit aus und stiess auf den XMEGA. ich glaube Du glaubst ganz falsch.... Auch ich habe eine Ausbildung gemacht bevor ich weiterstudiert habe. Dabei hab ich eines gelernt: nicht hochnäsig auf andere zu gucken. Wenn das bei Dir falsch rübergekommen ist: tut mir leid. Manche Dinge bereiten mir beim XMega auch einiges Kopfzerbrechen; z.B. gerade der ADC, warum der nicht 8 Kanäle ohne große Umstellerei samplen kann; etc etc. Das Thema Bootloader ist alles mögliche; aber nicht trivial; Deine Aufgabe - egal ob in Assembler oder C oder C++ oder was auch immer: Du brauchst drei Teile: * Du brauchst ein Programm auf dem PC- egal in welcher Sprache, das Dir die .hex File Deines OS häppchenweise über RS232 an den Mikrocontroller reicht. Dazu kommt evtl. eine Kommunikation mit Timeouts auf beiden Seiten; CRC Checks ob alles richtig übertragen wurde; * Dein OS beinhaltet z.B. in der Main-Loop einen Teil, in der es den Bootloader über Reset anspringen kann. Ansonsten ist das gute am OS, das es wachsen und wachsen kann - der Bootloader schaufelt das an die richtige Stelle. * Dein Bootloader: der sitzt in dem Speicherbereich, der nach dem Reset des µCs immer angesprungen wird. Du brauchst eine Kennung im µC, dass der BL ein leeres System oder ein Bl + OS auf dem Controller ist. Diese Kennung kannst Du z.B. ins EEProm schreiben. Oder wie Dein Vorschlag: Timer wartet auf Eingang des neuen Os, ansonsten kommt ein Reset (auch wieder mit Merker) auf den alten OS-Bereich. Ein Unterschied (von einigen) zwischen Mega und XMega ist der unterschiedliche Zugriff auf Flash und EEProm. Du hast einen NVM Controller, über den Du das Handling des Speichers laufen lassen musst. Deine Aufgaben sind nur in einzelnen Schritten zu bewältigen: Du brauchst das PC Programm, das Dir erst mal ohne Checks auf Zeit und Richtigkeit Zeichen liefert, die Du über RS232 im µC entgegennimmst und dann ab 0x000000 in den Flash schreibst. Wenn Du das hast - dann hast Du eine ganze Menge... Danach brauchst Du wie oben beschrieben ein System, bei dem Du weisst wo Du bist: Bootloader ohne OS, BL mit gechrashtem OS, BL mit funktionierendem OS. Klingt blöd, hilft viel: zeichne mal die Situationen auf bevor Du loslegst. Dann folgt der Code auch einfacher nach. Als nächstes kommt die Absicherung mit Timeouts, CRC, Wiederholung von Blöcken etc. Du hast nun ohne das PC Programm schon einige Blöcke für den µC; jetzt bist Du dran weiterzumachen. Gruß Helmut
Hi Helmut Vielen Dank. Das mit der Datenübertragung (häppchenweise), würde das mit dem H-Terminal hinhauen? (http://der-hammer.info/) Ich habe leider noch nicht viele Informationen darüber gefunden. Vielleicht kennst du die Software und weisst gerade darüber Bescheid, ansonsten frage ich den Entwickler mal an. Gruss Severin PS: Das "Blockschaltbild" habe ich nun gezeichnet.
Hallo Severin, Du musst selber dafür sorgen, dass Deine Datei Os.hex (oder wie immer Du sie nennst) übertragen wird. Dabei wirst Du CRC und Timing benötigen. Ob das ein fertiges Programm fertigbringt, Dir eine Datei zu lesen in 128 Byte Happen glaube ich fast nicht. ==> Do it yourself. Dazu kommt noch ein bisschen die Auseinandersetzung mit dem Intel HexFile Format... Gruß Helmut
Hi Helmut Ich blicke einfach noch nicht durch ^^ Was bedeuten die einzelnen Bereiche des Speichers genau? Im Datenblatt steht unter AppTableFlashSection, this is a section where data can be stored. heisst das diese Sektion wird gar nicht wirklich gebraucht? Und dann die AppFlashSection=AppTableSection? Das ist doch der Block in dem mein UserProgramm läuft, oder? Hingegen die BootloaderSection ist mir wieder klar. Und werden die Daten, welche per UART ankommen direkt ins Flash (AppFlashSection) geschrieben? Danke und Gruss Severin
Hallo Severin, der AppTablebereich ist wie ich es verstanden habe der gleiche Bereich wie der AppFlashsection. Du kannst in den Tablebereich eben wie der Name sagt Tabellen hinterlegen - also erst mal uninteressant. >Und werden die Daten, welche per UART ankommen direkt ins Flash >(AppFlashSection) geschrieben? genau. Eine Idee für das Protokoll ist z.B. ATMEL Application Note 350. Das kannst Du auf PC Seite und µC Seite realisieren. Gruß Helmut
Hi Helmut Danke für deine Antwort. Ich werde mir das Beispiel Morgen mal anschauen. Gruss Severin
So, jetzt habe ich noch mal mit dem Flashen nachgesehen. Leider wird immer noch nur AppTable 0 geschrieben, und zwar nur mit 255 Bytes. Kann ich das irgendwie umstellen, oder was könnte falsch sein?
EDIT: Ich habe herausgefunden was welcher Bereich ist und wozu man ihn brauchen kann. AppTableFlashSection: Variablenspeicher für Globale Variablen und Arrays AppFlashSection: Programmspeicher ab 0x000000 Das Problem war, dass ich zu Beginn die APPTABLE_SECTION_START Adresse auf 0x000000 hatte, deshalb hat er mir immer Page 0 überschrieben, welche im Minimum 255 Bytes sein muss. Ich werde nun noch ein wenig herumexperimentieren. Noch eine Frage: Wie biege ich die Startvektoren um? Danke im voraus! Gruss Severin
Hallo Severin, Vektoren knicken: dazu gibts zwei Funktionen, die Du zum Thema brauchst. AppNote 1305 verrät Dir mehr... Das ist wie beim Geocachen / Multi: Du musst über viele Stationen zum Ziel... ;-) Gruß Helmut
Interrupts im bootloader ... machen den Prozess viel komplizierter als noetig. Ich wuerd mal ohne beginnen. Was du benoetigst : Buffer fuer die empfangenen Bytes, denn das Limitierende wird das Schreiben des Flash sein.
Hi all, Ich bins mal wieder... Ich habe da noch eine Frage zum AVR Studio: Und zwar habe ich noch einmal die Daten von Helmut geöffnet und danach geflasht. Nur schreibt der mir, das der Programm-Counter immer im Bereich von 0x100 - 0x200 ist. das heisst die vermeintliche Bootloader software wird an Adresse 0x100 geschrieben (entspricht App-Section) Was mache ich falsch, oder besser wo sollte sich der Bootloader befinden, denn 0x20000 befindet sich nicht im internen SRAM, besser Flash. Wo kann ich überprüfen ob der Bootloader drinn ist, und wo finde ich eine Beschreibung zu den einzelnen Speicher-Sections? Habe jetzt neue XMegas und wäre daher sehr froh über eine schnelle antwort! Danke & gruss Severin
Ja super!!! danke hat mir jetzt echt weitergeholfen... Solche Antworten kann man sich auch sparen. Wenn es im Datenblatt stehen würde hätte ich es schon längst gefunden!
Hallo Severin, Gruesse aus England. Kann gerade nicht recht antworten - hole ich nach. ~Gruesse von Helmut
hi helmut warst du das vorhin? Wenn ja sorry! dachte es wäre irgendso ein Foren-Spammer. Habe im Datenblatt nachgeschaut aber werde immer noch nicht schlau daraus. gruss Severin
Hallo Severin, nein, ich bin das wirklich. Habe gerade wieder 3 Min Netzugang< helfe Dir wenn ich wieder in Deutschland bin. Verbringe gerade Urlaub in SuedWestEngland. Mehr von mir in 5 Tagen Gruss Helmut
Hallo Severin, so, jetzt bin ich wohlbehalten zurück. Also: Der BootloaderBereich ist ab 0x20000 im Flash. Der Flashbereich der Applikation beginnt ab 0x00000. Du kannst überprüfen, wo was im Flash steht wenn Du den kompletten Flash ausliest. Hast Du eine JTAG-ICE mk II? Wenn ja, kannst Du den kompletten Chip betrachten - das hilft schon mal viel für den Bootloader. Du hast zwei Programme: Das Bootloader-Programm für den AVR ist im Bereich ab 0x20000 im Flash. DAs Verschieben des Programms dahin mit: (LDFLAGS += W1,-section-start=.text=0x20000) Wenn Du Interrupts benutzt, musst Du die Intvecs umbiegen. Das OS-Programm beginnt ab Flash 0x00000. Dieses Makefile musst Du nicht mit .text = ... verschieben. MitHilfe des Bootloaders, den Du per PDI oder JTAG einspielst, kannst Du dann später das OS- Programm über eine Schnittstelle in den XMEga senden. Das OS (also die .HEX Datei) versendest Du über ein selbergeschriebenes Programm des PCs, z.B. über RS232. Wenn das OS geschrieben ist benötigst Du eine Routine (bzw. Funktion) die (z.B. aus dem EEprom) ein Flag setzt, dass ein gültiges OS geschrieben wurde. Wenn das OS gültig ist, kannst Du ein SW-Reset durchführen. Das OS wird ausgeführt, benötigt aber eine Funktion zur Erkennung, ob ein neueres OS geschrieben werden will. Hoffe ich konnte Dir weiterhelfen. Die Fragen, die Du gestellt hast sind für mich nicht ganz klar wo es jetzt hakt. Kannst Du das bitte Umformulieren oder anders/ genauer beschreiben was Du gemacht hast, wo und warum. (Will net aneinander vorbeireden) Die Flashbeschreibung findest Du im Datenblatt (das 444 Seiten Pdf Rev F0209, S. 19) Gruß Helmut
Hi Helmut Danke für deine Antwort! Mein Problem ist, dass ich mit dem neuen uC dein Programm (welches du mir als zip zur Verfügung gestellt hast) nicht korrekt ausführen kann. Er springt bei mir immer gleich in die endlosschlaufe "fail". Aber ich habe keine Ahnung warum. Und dann habe ich vor kurzem mal nachgesehen wo, dass das programm sich wirklich drinn befindet. Dazu habe ich ein kleines Programm geschrieben das irgendwelche Ports initialisiert etc. und dabei sah ich, dass der ProgrammCounter erst bei 0x100 beginnt, heisst das, der Programmbereich beginnt erst da? Und dann noch etwas: Ist es möglich den Bootloaderbereich zu debuggen? Ich habe ihn schon im Speicher gesucht aber nirgends gefunden. Denn mein Speicher geht bis max. 0x10000 oder so. Danke Gruss Severin
Hallo Severin, kannst Du mir Dein Programm als .zip senden? So kann ich keine Aussage treffen, weil ich nicht weiss was Du programmiert hast. Hast Du KDiff3? So wäre es möglich, dass ich Dir evtl. den Code ändere und zusende und Du den Unterschied der Versionen gleich siehst? (sofern ich den Fehler finde) Zu den Fragen: Den Bootloader zu debuggen geht: wenn Du an den Portpins wackelst und Dir das mit einem geeigneten Werkzeug betrachtest. So habe ich die logische Abfolge des Bootloaders mit dem Oszi (16 Kanal digital) betrachtet und wusste, dass die Reihenfolge der Abarbeitung stimmt. Für das OS hatte ich zum BL verschiedene Ports, so dass ich wusste wo sich der µC gerade befindet. Die Abfolge muss sich mit dem decken, was Du Dir als Struktogramm o.ä. vorher überlegt hast. Was geht: mit der JTAG ICE kannst Du den BL debuggen (Du siehst alles als C Code, wunderbar; aber nach dem SW-Reset und dem Sprung ins OS siehst Du im Disassembler Asm-Code. Das kann dann kein C mehr sein, da der Debugger da nicht mitkommt den aufgelösten Code anzuzeigen. Wenn Du jedoch in Asm fit bist, siehst Du was sich tut. Für mich war lediglich wichtig, die Einsprungadresse zu kontrollieren. 0x100 ist der SRam Bereich. Wenn Du von Speicher schreibst, schreibe bitte immer welcher gemeint ist. Du hast die Wahl zwischen SRAM, EEPROM, FLash... Gruß Helmut
Hi Helmut Ich sende dir zuerst noch ein Bild, damit du weisst was ich meine. Du siehst da eine ComboBox wo "Data" ausgewählt ist. Beim Xmega gibts ja folgende auswählbare: - EEPROM - FLASH - Extended EEPROM (bin ich nicht sicher) - Extended SRAM - SRAM - Data Wenn ich diese Bereiche durchchecke, dann sehe ich, dass das FLASH nur von 0x00000 bis 0x10000 geht, da ist gar kein Platz für einen Bootloader. Das heisst, wo finde ich den Bootloader-Speicherplatz? Im Data gibts den ja auch nicht, ebensowenig wie im EEPROM oder SRAM. Im extended SRAM ist der vorhanden (allerdings leer, da ich gar keinen externen Speicher angeschlossen habe), aber sonst nirgendwo. Ich meine, kann man diesen Bereich überhaupt im Speicher finden und so anzeigen, oder gibts den nicht? Nun noch zum Xmega, kann es sein das Rev H kein Bootloader unterstützt oder was mache ich falsch? Gruss Severin
Hier sende ich dir noch meine ProgrammDaten, sollten dir sehr bekannt vorkommen da du mir sie geschickt hast. Gruss Severin
Hallo Severin, das Prg. hättest Du mir nicht senden brauchen - ich habe es bereits. Ich dachte Du sendest ein auf Deine belange angepasstes Programm. Das Memory Fenster ist ein bisschen unhandlich; ich habe zum Auslesen immer direkt das Flash ausgelesen mit dem JTag Programmer in der AVR Studio Umgebung. Ich weiss nicht was Du geändert hast. Hab ich Dich recht verstanden: geänderte HW und der µC ist in der Fail Schleife? Du kannst Deinen Code senden, gerne auch privat bzw. deren Teile die nicht funktionieren. Gruß Helmut
Hi Helmut Ja ich habe nur das Programm geladen. Dabei springt er dauernd in die false schleife. wie liest du denn das flash aus? einfach über "Connect to Target"? gruss Severin
Hallo Severin, ja, connect to target schreibt nicht nur die Speicherbereiche, sondern liest sie auch. Einfach auf "Read gehen" und den Bereich als .hex speichern und mit einem Texteditor oder Hexeditor (z.B. Hex Workshop) betrachten. Üblicherweise lese ich EEPROM und Flash Daten auf diese Weise aus. Gruß Helmut
Hi Helmut Vielen Dank! Werd ich gleich mal ausprobieren! Ich dachte du liest das ganze Zeug immer per MemoryView aus ^^ Das hat mir sehr geholfen. Aber mit der Rev H müsste es schon funktionieren oder? Gruss Severin
Hi Helmut! Endlich hat es funktioniert. Nun kann ich die Pages von 0 bis 15 schreiben. Allerdings noch nicht von 0x000 + Offset. Weisst du, wie ich das machen muss? Ich komme da einfach noch nicht draus?! ^^ Was ich jetzt begriffen habe ist, dass das OS dann immer von unten (BootloaderStartAdresse - PageSize * PageToWrite) geschrieben wird. Beim compilen steht da immer Data 100% Full (8192 Bytes) ist das richtig so, oder schreibt der jetzt gar nicht in den Programmbereich sondern füllt bloss den Datenbereich? Danke und Gruss Severin
Hab jetzt gemerkt, wie du oben sagtest, dass da nur 64k beschreibbar sind. Kannst du mir erklären wie ich die oberen 64k schreibe? Vielen Dank Gruss Severin
Hallo Severin, ich habe mal bei Atmel 'whats changed' nachgelesen: inzwischen haben die den Bootloader samt Doku nochmals refurbished (neudeutsch für: den alten Kram aufgewärmt) Hatte noch keine Zeit so richtig drüberzugucken - für Dich könnte das Ding aber interessant sein. Gruß Helmut
Hallo Helmut Das sind ja mal gute Neuigkeiten!! Schaue mir das mal an. Danke und Gruss Severin
Hier gibts einen seriellen Bootloader basierend auf den ANs, gleich nach gcc geportet und von mir für avrdude angepaßt: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=79592 Gruß!
Man muß angemeldet sein um dort files aus dem Forum laden zu können. Hier meine Version mit kleinen Patches bzgl. avrdude: http://busware.de/tiki-download_file.php?fileId=22
Hi! Hat irgendjemand schonmal einen bootloader bei nem xmega64 benutzt ? Ich hab rev H und wenn ich den Bootloader ins flash ab 0x10000 kopiere und fuse2 auf 0xBF (bootloader reset) aktiviere startet der bootloader nicht. Weiss jetzt aber nicht ob es an meinen linkersettings etc liegt oder an meinem gehackten avrdude um den bootbereich zu flashen: avrdude mit -U boot:w:main.hex gelinkt ab 0x10000 testweise in der avrdude.conf bootsize auf 0x1FFFF gesetzt (ich glaub in der stk500v2.c müsste der offset für den bootbereich anders gesetzt werden) programm landet in 0x10000-X (mit -U flash:w:main.hex kann man nur 0x00000-0x0FFF beschreiben, mit -U boot:w:main.hex den bootbereich) Ich glaub ich muss mir Dienstag mal nen Windows PC und debugger schnappen... Bin da ratlos... Oder ist der xmega64a1 evtl buggy im bootbereich ? Ist zwar Rev H aber im Datasheet is nur ne Errata für den 128er :( Gruss
Hi alle! So, nun läuft mein erster Bootloader doch noch... Ich danke euch vielmals für euren tollen Support! Und vor allem dir, Helmut, möchte ich danken, da du nicht an mir verzweifelt bist! =) Gruss Severin
Hallo Severin, da freu ich mich mit. Warum sollte ich an Dir verzweifeln? Ich finde cool, dass DU * nicht aufgegeben hast * das hingebracht hast * Dich da reingebissen hast (das brauchst Du immer wieder) Das Forum ist ja dazu da, sich gegenseitig zu Helfen; die Nöler, Gröler und Besserwisser und Trolls einfach nicht beachten... :-) mit sonnigen Grüßen aus dem Muschterländle, Helmut
Hi Helmut Jetzt noch eine kurze Frage.. Kennst du gerade, oder sonst wer, ein geeignetes Tutorial für C++ wo man ein eigenes Terminal schreiben kann. Oder besser eine Erlkärung der Kommandos/Befehle für die Serial Ports? Ich würde nämlich noch gerne ein Terminal für meinen Bootloader haben. Danke und Gruss Severin
Hallo Severin, das ist das große Kapitel "PC Programmierung"... Aber auch kein Problem - das kriegst Du auch hin: z.B. Beitrag "Frischling braucht Hilfe mit C#/Serielle Schnittstelle" für C# oder Beitrag "Visual Studio C++ COM-Port / Seriell: 8Bit in einem Byte direkt übertragen" für C++. Hängt sehr davon ab welche Hochsprache Du mit welchen Libs nutzen willst. (.NET ?) oder oder oder Beispiele/Tutorials gibts zuhauf im Netz, mit Google bekommst Du jede Menge Treffer. Gruß Helmut
Da sage ich nur: Danke Schön! Und werde mich mal hinter diese Bespiele setzen und schauen was ich davon brauchen kann. Danke und Gruss Severin
Hi, ich versuche gerade, den Bootloader hier zum Laufen zu bekommen, aber es rührt sich nichts. Hab keine Ahnung, wieso. Ich habe den Eindruck, dass der Xmega gar nicht in den Bootbereich springt, weil ein normales Programm an $0000 angesprungen wird, obwohl ich die Fuse auf Boot Loader Reset umgestellt hab. Muss man noch mehr umstellen?
Welche ChipRevision hast Du? Alle unter H hatten ein Problem mit der Bootsektion. Ansonsten muß natürlich der Bootloader auch bei 0x020000 stehen. Umgestellt werden muß lediglich die Boot-Reset-Fuse. Falls Du Interrupts benuzt, muß die Vektorentabelle ebenfalls im oberen Flash vorhanden sein und die CPU darauf hin verschoben werden.
Inzwischen funktioniert der Bootloader ... fast. Ich kann mit avrdude zwar ein Programm an den Controller schicken, aber dann kommt ein Verify Error und ich lande wieder im Bootloader Was mich verwirrt ist: wenn ich den Bootloader programmiert habe funktioniert er. Wenn ich im AVR Studio Erase Boot Section auswähle wird er nicht gelöscht. Wohl aber, wenn ich Erase Application auswähle. Also liegt der Bootloader wohl nicht in der Boot Section sondern ab Adresse $0000. Da funktioniert logischerweise Self Programming nicht. Ich vermute, dass dem AVR Studio die Information fehlt, das Programm nicht ab $0000 zu compilieren sondern ab der Adresse der Bootloader Section. nur wo und wie muss ich die angeben? Und muss nicht auch im Code irgendwo die Page angegeben werden? Ich arbeite mit der AppNote von Atmel. Da fehlt das leider alles
Travel Rec. schrieb: > Welche ChipRevision hast Du? Alle unter H hatten ein Problem mit der > Bootsektion. Kann man die Controller Revision irgendwie abfragen? Ich bin mir eigentlich sicher, dass es Rev H ist, weil alle anderen auch H sind. Aber ich kann natürlich nicht mehr schauen, weil er eingelötet ist. > Ansonsten muß natürlich der Bootloader auch bei 0x020000 > stehen. Ich habe jetzt in den Memory Settings im AVR Studio folgendes eingetragen:
1 | Memory Type: Flash - Name: .text - Address: 0x10000 |
Beim compilieren erzeugt er folgendes
1 | avr-gcc -mmcu=atxmega128a1 -Wl,-Map=xmmbl.map -Wl,-section-start=.text=0x20000 sp_driver.o eeprom_driver.o main.o usart_driver.o -o xmmbl.elf |
Jetzt habe ich aber das Problem, dass sich er Bootloader nicht mehr rührt. BOOTRST steht definitiv auf Boot Loader Reset. Wenn ich eine normale Application ins Flash lade wird diese gestartet. Entweder wird trotz gesetztem Fusebit an Adresse $0000 gesprungen oder er springt in den Bootloader, hängt sich da irgendwie auf und soringt an $0000. Ich vermute ersteres. Das Hex File fängt mit
1 | :020000022000DC |
an. Sollte also alles stimmen Was läuft da nur falsch? Inzwischen bin ich mit meiner Weisheit am Ende
Sorry das ich spamme. Ich hab jetzt mal auf blöd statt dem *.hex File das *.elf File hochgeladen. Damit funktioniert es plötzlich. Kann mir jemand erklären, warum?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.