Forum: Mikrocontroller und Digitale Elektronik Startadresse Programm


von David G. (pronet)


Lesenswert?

Hallo,

Ich habe eine Steuerung mit einem Atmega64-16AU für einen kleinen 
Güterzug bei der so ziemlich alles defekt war. Die Defekte wurde behoben 
und der Atmel auch mit getauscht. Die Firmware, die per Download bereit 
gestellt wird, habe ich auch per ISP geflasht. Allerdings fehlt der 
Bootloader vom Atmel. Dieser wird leider nicht zur Verfügung gestellt. 
Wie bekommt man denn die Einsprungadresse für die Mainloop des 
Hauptprogramms raus und könnte das Hauptprogramm auch ohne Original 
Bootloader laufen?

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Ähmm..

Ist die Startadresse nicht immer auf Null?

Der Bootloader wird doch gar nicht gebraucht, dessen Startadresse liegt 
weit oben im Speicher.

von S. L. (sldt)


Lesenswert?

> Ist die Startadresse nicht immer auf Null?
Sollte man von einem 'neutralen' Bootloader so erwarten, aber 
theoretisch ist im Zusammenspiel Bootloader - Firmware ja sehr viel 
möglich.
  Könnte David G. ja einfach mal ausprobieren, wenn - ja wenn da nicht 
die Angabe der Fuse-Bytes fehlte. Das ist der nächste Stolperstein.

von David G. (pronet)


Lesenswert?

Arduino F. schrieb:
> Ähmm..
>
> Ist die Startadresse nicht immer auf Null?
>
> Der Bootloader wird doch gar nicht gebraucht, dessen Startadresse liegt
> weit oben im Speicher.

Warum muss die Startadresse immer Null sein? In der Firmware stehen am 
Anfang irgendwelche Konfigurationstabellen...

von S. L. (sldt)


Lesenswert?

> In der Firmware stehen am Anfang irgendwelche Konfigurationstabellen...
Unwahrscheinlich; dort müssten die Interruptvektoren der Firmware 
stehen.

von Georg G. (df2au)


Lesenswert?

David G. schrieb:
> Warum muss die Startadresse immer Null sein?

Die Startadresse wird von der Hardware des Prozessors vorgegeben. Bei 
allen mir bekannten ATMega und Co ist das NULL. Zeig doch bitte das 
Hexfile. Nicht immer fängt es bei 0 an und ist ein monolithischer Block. 
Das kann durchaus munter hin und her gehen. Am Anfang jedes Records 
stehen die Ladeadresse und die Länge. Das Brennprogramm sortiert dann 
passend.

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

David G. schrieb:
> In der Firmware stehen am
> Anfang irgendwelche Konfigurationstabellen...
Immer Null!
Da steht der Resetvektor. Meist in Form eines Sprungs.
Das ist im Datenblatt auch nachzulesen.

: Bearbeitet durch User
von S. L. (sldt)


Lesenswert?

> Die Startadresse wird von der Hardware des Prozessors vorgegeben.
> Bei allen mir bekannten ATMega und Co ist das NULL.

Die Startadresse wird durch das Fuse-Bit BOOTRST vorgegeben. 
Anschließend könnte ein Bootloader theoretisch irgendwohin springen.

von David G. (pronet)


Angehängte Dateien:

Lesenswert?

Hallo,

anbei das Firmware.hex file.

Hmm, dann ist es schon komisch das es nicht läuft.
Die Fuse Bits habe ich so gesetzt, das kein Bootloader vorhanden ist...

von S. L. (sldt)


Lesenswert?

> Die Fuse Bits habe ich so gesetzt, das kein Bootloader vorhanden ist...

Schon, nur - sonst gibt es bei den Fuse-Bytes (des Güterzuges) keine 
Abweichungen von denen des Auslieferungszustandes? Zum Beispiel das 
legendäre M103C?

von David G. (pronet)


Lesenswert?

Hallo,

wie meinen sie das?

Ich habe mehrere Varianten probiert, aber irgendwie passiert nichts.
Programmiert habe ich den ATMEGA mit einem BeeProg über ISP.

von Georg G. (df2au)


Lesenswert?

David G. schrieb:
> anbei das Firmware.hex file.

klassischer Aufbau mit Vektortabelle auf 0. Zeig bitte, wie die Fuses 
aussehen.

von S. L. (sldt)


Lesenswert?

> wie meinen sie das?
Im Auslieferungszustand des ATmega64 ist das Fuse-Bit M103C gesetzt, 
d.h. der uC arbeitet als ATmega103.

Also ohne Kenntnis der Fuse-Bytes des Güterzuges wird es jetzt etwas 
schwierig ...

von David G. (pronet)


Angehängte Dateien:

Lesenswert?

Die habe die Fuse Bits gesetzt:
Die Steuerung arbeitet mit einem Quarz mit 15Mhz.

: Bearbeitet durch User
Beitrag #7813909 wurde vom Autor gelöscht.
von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

David G. schrieb:
> Die habe die Fuse Bits gesetzt

Dann startet der Mikrocontroller an Adresse 7E00. Dort liegt 
typischerweise ein Bootloader, und der springt typischerweise nach 
Adresse 0000.

Aber es könnte natürlich ein untypischer Bootloader sein, der woanders 
hin springt. Nur bezweifle ich, dass der dann von Atmel kommt.

Der Bootloader von Arduino (Optiboot) würde dort hin passen, aber der 
springt nach Adresse 0000 und ist somit optional. Dein Projekt hätte 
auch ohne ihn funktioniert.

: Bearbeitet durch User
von Rainer W. (rawi)


Lesenswert?

Arduino F. schrieb:
> Ist die Startadresse nicht immer auf Null?

Der Reset-Vektor steht als erster Eintrag in der Interruptvektortabelle. 
Und da geht der Programmanlauf nach einem Reset los. In diesem ersten 
Eintrag muss dir Startadresse für das Programm stehen. (Datenblatt Reset 
and Interrupt Handling). Dort steht auch wie der Einsprung in den 
Bootloader mit BOOTRST Fuse gesteuert wird.

von S. L. (sldt)


Lesenswert?

>> Die habe die Fuse Bits gesetzt
> Dann startet der Mikrocontroller an Adresse 7E00.

Nanu - da steht doch eindeutig "unprogrammed" bei BOOTRST, und das 
Fuse-High-Byte mit 0xFF bestätigt das: folglich startet der ATmega64 bei 
0.

Aber mir ist noch immer unklar, ob die gezeigten Fuses die des 
Originalzustandes (des Güterzuges) sind.

von David G. (pronet)


Lesenswert?

Rainer W. schrieb:
> Arduino F. schrieb:
>> Ist die Startadresse nicht immer auf Null?
>
> Der Reset-Vektor steht als erster Eintrag in der Interruptvektortabelle.
> Und da geht der Programmanlauf nach einem Reset los. In diesem ersten
> Eintrag muss dir Startadresse für das Programm stehen. (Datenblatt Reset
> and Interrupt Handling). Dort steht auch wie der Einsprung in den
> Bootloader mit BOOTRST Fuse gesteuert wird.

Hi,

Das Problem ist halt,das bei einem defekten Controller keine Fusebits 
mehr auszulesen sind... Wie nun also die Originalen sind bleibt ein 
Rätsel...
Es ist im übrigen ein Güteraufzug... 🤣
Blöde Korrektur...

von Arduino F. (Firma: Gast) (arduinof)


Lesenswert?

Rainer W. schrieb:
> dir

Erklärst du mir das gerade?
Das ist unnötig.

von S. L. (sldt)


Lesenswert?

> keine Fusebits mehr auszulesen sind

Es hätte ja sein können, dass sie mit der Hex-Datei mitgeliefert wurden.
  Dann wäre es wohl einen Versuch wert, die M103C wieder einzuschalten - 
oder gab es einen Grund, sie zu ändern?

(Ich hatte mich schon gefragt, was das wohl für ein Modellzug sein mag 
mit einem solchen Controller ...)

von David G. (pronet)


Lesenswert?

S. L. schrieb:
>> keine Fusebits mehr auszulesen sind
>
> Es hätte ja sein können, dass sie mit der Hex-Datei mitgeliefert wurden.
>   Dann wäre es wohl einen Versuch wert, die M103C wieder einzuschalten -
> oder gab es einen Grund, sie zu ändern?
>
> (Ich hatte mich schon gefragt, was das wohl für ein Modellzug sein mag
> mit einem solchen Controller ...)

Das werde ich morgen mal versuchen.

Gibt es denn die Möglichkeit ein Programm zu schreiben, was die 
Bootloader Daten über RS232 ausgegeben kann, von einer funktionierenden 
Steuerung?

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

Rainer W. schrieb:

> Der Reset-Vektor steht als erster Eintrag in der Interruptvektortabelle.
> Und da geht der Programmanlauf nach einem Reset los.

So weit stimmt das.

> In diesem ersten
> Eintrag muss dir Startadresse für das Programm stehen.

Nein. Dort muss normaler Code stehen. Und der besteht typischerweise aus 
einem Sprung zur tatsächlichen Startadresse des Programmes.

Das ist bei den AVR8 anders als bei den meisten anderen Architekturen, 
bei denen in den diversen Vektoren tatsächlich nur Adressen stehen.

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

S. L. schrieb:
> Nanu - da steht doch eindeutig "unprogrammed" bei BOOTRST

Oh, ich habe nur auf die Zeile darüber geachtet

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

David G. schrieb:
> Gibt es denn die Möglichkeit ein Programm zu schreiben, was die
> Bootloader Daten über RS232 ausgegeben kann, von einer funktionierenden
> Steuerung?

Nein, das müsste dann schon Bestandteil der funktionierenden Steuerung 
sein.

von Ob S. (Firma: 1984now) (observer)


Lesenswert?

David G. schrieb:

> Gibt es denn die Möglichkeit ein Programm zu schreiben, was die
> Bootloader Daten über RS232 ausgegeben kann, von einer funktionierenden
> Steuerung?

Nicht wirklich. Wenn der Controller gelockt ist, kannst du Code nur 
darauf bringen, indem du den vorhandenen löschst (chip erase). Dann gibt 
es aber nichts mehr zum Auslesen.

Ist der Controller hingegen nicht gelockt, brauchst du kein spezielles 
Programm zum Auslesen. Das kannst du dann einfach mit dem Programmer 
machen.

von David G. (pronet)


Lesenswert?

Ob S. schrieb:
> Rainer W. schrieb:
>
>> Der Reset-Vektor steht als erster Eintrag in der Interruptvektortabelle.
>> Und da geht der Programmanlauf nach einem Reset los.
>
> So weit stimmt das.
>
>> In diesem ersten
>> Eintrag muss dir Startadresse für das Programm stehen.
>
> Nein. Dort muss normaler Code stehen. Und der besteht typischerweise aus
> einem Sprung zur tatsächlichen Startadresse des Programmes.
>
> Das ist bei den AVR8 anders als bei den meisten anderen Architekturen,
> bei denen in den diversen Vektoren tatsächlich nur Adressen stehen.

Da steht 0c94 E201
Ist das der Sprung zur Adresse E201?

von Sherlock 🕵🏽‍♂️ (rubbel-die-katz)


Lesenswert?

David G. schrieb:
> Da steht 0c94 E201
> Ist das der Sprung zur Adresse E201?

Ich denke, ja
https://ww1.microchip.com/downloads/en/DeviceDoc/AVR-Instruction-Set-Manual-DS40002198A.pdf

von Peter D. (peda)


Lesenswert?

Die Fusebits müssen auf Quarz >8MHz gestellt werden und der M103 Mode 
auf disabled. JTAG muß auch disabled werden, wenn dessen 4 Portpins 
benutzt werden.

Bezüglich Bootloader war das bei den älteren AVRs clever gelöst, der 
Bootloader wird oberhalb der Applikation abgelegt. Der Bootloader weiß 
also, daß die Applikation immer an 0x0000 startet. Und die Applikation 
muß nicht wissen, ob überhaupt ein Bootloader benutzt wird.

Die neuen AVR128 usw. haben das leider vergessen. Bei denen muß der 
Bootloader gesagt bekommen, wo die Applikation liegt. Und die 
Applikation muß mit einem speziellen Linkerscript hinter den Bootloader 
gelinkt werden.

Weiterhin kann man natürlich die bei den ATtiny gebräuchliche Methode 
verwenden. Der Bootloader sitzt am hinteren Flashende, schnappt sich den 
Sprungeintrag an 0x0000 und ersetzt ihn durch einen Sprung zu sich 
selber. Er kann dann allerdings keine Interrupts benutzen, was aber auch 
nicht nötig sein sollte.

von Dieter S. (ds1)


Lesenswert?

Bei der Firmware.hex Datei sind die Bytes vertauscht, der erste Befehl 
ist "940C 01E2", also "JMP 0x01E2". Wenn die Bytes stimmen sollte 
ziemlich am Anfang das Program-Datum "20130724" sein. Eventuell liegt es 
ja daran.

Der Rest ergibt auf den ersten Blick sinnvollen Code, auch die 
Interrupt-Funktionen liegen an sinnvollen Stellen.

von David G. (pronet)


Lesenswert?

Dieter S. schrieb:
> Bei der Firmware.hex Datei sind die Bytes vertauscht, der erste Befehl
> ist "940C 01E2", also "JMP 0x01E2". Wenn die Bytes stimmen sollte
> ziemlich am Anfang das Program-Datum "20130724" sein. Eventuell liegt es
> ja daran.
>
> Der Rest ergibt auf den ersten Blick sinnvollen Code, auch die
> Interrupt-Funktionen liegen an sinnvollen Stellen.

Ok, soll ich die Bytes alle tauschen und es nochmal versuchen?

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

David G. schrieb:
> Ob S. schrieb:
>> Rainer W. schrieb:
> Da steht 0c94 E201
> Ist das der Sprung zur Adresse E201?

Nein.  Springt zur Word-Adresse 0x1E2, also Byte-Adresse 0x3E4.

von Dieter S. (ds1)


Angehängte Dateien:

Lesenswert?

David G. schrieb:
>
> Ok, soll ich die Bytes alle tauschen und es nochmal versuchen?

Ja, die HEX Datei mit getauschten Bytes ist im Anhang.

Es gibt allerdings im Code einen Sprung an die Adresse 0x7000, also 
vermutlich in den nicht vorhandenen Bootloader. Ich muss mir das noch 
genauer ansehen wann dieser Sprung ausgeführt wird.

Wie sieht es mit dem internen EEPROM aus, gibt es dafür einen Dump?

: Bearbeitet durch User
von David G. (pronet)


Lesenswert?

Hi,

vielen Dank für die geswappten Daten.

Es gibt eine Möglichkeit die Steuerung über RS232 mit einem BT Dongle 
und einer App zu updaten.
Eventuell springt er dann in den Bootloader um die Daten im Flash 
auszutasuchen.
Ein EEPROM Dump liegt leider nicht vor, aber kann im Betrieb auch über 
den BT Dongle mit einer App gespeichert werden. Ich nehme an das es sich 
dann um die Konfiguration der Etagenazahl usw. handelt.

von Dieter S. (ds1)


Lesenswert?

Die Firmware ist ziemlich umfangreich und es erfolgt relativ viel 
Zugriff auf den EEPROM.

Falls die Firmware jetzt startet sollte man das daran erkennen dass 
Daten in den EEPROM geschrieben werden. Auf die Schnelle sieht es so aus 
als ob beim Programmstart ein Teil des EEPROMs initialisiert wird falls 
dort nicht die erwarteten Daten stehen.

von David G. (pronet)


Angehängte Dateien:

Lesenswert?

Dieter S. schrieb:
> Die Firmware ist ziemlich umfangreich und es erfolgt relativ viel
> Zugriff auf den EEPROM.
>
> Falls die Firmware jetzt startet sollte man das daran erkennen dass
> Daten in den EEPROM geschrieben werden. Auf die Schnelle sieht es so aus
> als ob beim Programmstart ein Teil des EEPROMs initialisiert wird falls
> dort nicht die erwarteten Daten stehen.

Also die Steuerung läuft wieder ganz normal, und der EEPROM wurde 
initialisiert.
Wenn man mit dem BT Dongle ein Firmwareupdate anschiebt, geht die Anlage 
aus und startet erneut. Konfigurationen programmieren geht alles 
problemlos.
Ich gehe also davon aus das der Bootloader nur für das Firmwareupdate 
genutzt wird.

Die Kommunikation über RS232 erfolgt mit 9600 Baud und wenn er ein 
Update anstößt, schickt er immer 256Byte Blöcke...

Vielleicht hilft das ja den Bootloader zu identifizieren!!!

: Bearbeitet durch User
von Dieter S. (ds1)


Lesenswert?

Der Bootloader muss ja auch wissen dass er ein Software Update machen 
soll.

Zum einen wird er eine Prüfsumme über das Programm berechnen, bei dem 
Hex File stehen wohl die letzten beiden Bytes im Zusammenhang mit der 
Prüfsumme. Wenn die Prüfsumme passt wird das Programm ab 0x0000 
aufgerufen, wenn nicht wartet der Bootloader auf ein Update.

Zum Anderen gibt es Flags im EEPROM die dem Bootloader signalisieren 
dass er ein Update durchführen soll. Die Software schreibt dabei 
entweder 0x55 oder 0xAA in die EEPROM Adresse 0x001, 0x01 in 0x000 und 
0x55 in 0x01F bevor sie nach 0x7000 springt.

von David G. (pronet)


Lesenswert?

Dieter S. schrieb:
> Der Bootloader muss ja auch wissen dass er ein Software Update machen
> soll.
>
> Zum einen wird er eine Prüfsumme über das Programm berechnen, bei dem
> Hex File stehen wohl die letzten beiden Bytes im Zusammenhang mit der
> Prüfsumme. Wenn die Prüfsumme passt wird das Programm ab 0x0000
> aufgerufen, wenn nicht wartet der Bootloader auf ein Update.
>
> Zum Anderen gibt es Flags im EEPROM die dem Bootloader signalisieren
> dass er ein Update durchführen soll. Die Software schreibt dabei
> entweder 0x55 oder 0xAA in die EEPROM Adresse 0x001, 0x01 in 0x000 und
> 0x55 in 0x01F bevor sie nach 0x7000 springt.

Ok, dann ist das ein spezieller Bootloader und nicht Optiboot oder 
ähnlich...

von Dieter S. (ds1)


Lesenswert?

Der Bootloader lässt sich bestimmt nachbauen. Ob sich der Aufwand lohnt 
ist eine andere Frage, so oft wird es wohl kein Software Update geben.

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
Noch kein Account? Hier anmelden.