Forum: Mikrocontroller und Digitale Elektronik Wo befindet sich meine Konstante im HEX-File


von Hilel (Gast)


Lesenswert?

Hallo zusammen.
Ich habe eine kleine Anwendung, in der der uC eine bestimmte Zeit
abwartet (eine Art Warteschleife), dann wird der Rest des Programmes
ausgeführt. Diese Warteschleife kommt oft im Programm vor. Ein
Beispiel:
Steuere Transistor 1
warte 100 ms
Steuere Transistor 2
warte 100 ms
usw.
Diese Zeit von 100 ms ist als Konstante definiert.
Nun möchte ich dem Anwender ein Visual Basic Programm schreiben, in dem
er diese Zeit beliebig zwischen 100 ms und 9000 ms ändern kann. Die
Änderung soll natürlich in der HEX-Datei stattfinden. Dem Anwender
liegt kein Compiler vor und deshalb muss er die HEX-Datei selbst
anpassen, wenn er eine neue Zeit einstellen will und dann den uC neu
programmieren.
2 HEX-Dateien habe ich bereits erzeugt (1000 ms und 2000 ms) und
verglichen. Die Dateien unterscheiden sich nur in einer Zeile und zwar
an 3 hintereinanderfolgenden Bytes und an der Prüfsumme (letztes Byte
einer Zeile). Allerdings finde ich meine Zeitkonstanten nicht mehr. Nun
zu meiner Frage:
Gibt es irgend eine Möglichkeit, die Zeitkonstante so festzulegen, dass
man sie im Programm immer an der selben Stelle wiederfinden kann? Dann
ist die Änderung leichter. Das Visual Basic Programm sieht dann
beispielsweise so aus:
1)Zeit in Millisekunden eingeben (zBsp. 1000)
2)daraus eine 4 stellige HEX-Zahl berechnen (bei 1000ms ist es 03E8)
3)die 2 Bytes (03 und E8) an der richtigen Stelle in die HEX-Datei
eintragen.
4)Die neue Prüfsumme für die veränderte Zeile berechnen und benfalls in
die HEX-Datei eintragen
5)Die neu entstandene HEX-Datei unter einem vom Anwender wählbaren
Namen abspeichern
6) Nun steht der Programmierung des uC mit der neuen Zeit nichts mehr
im Weg
Hoffe ich jedenfalls!!
Ich hoffe, ich habe mich klar ausgedrückt.
Vielen dank für die Bereitschaft und die tolle Unterstützung.

von Marcel (Gast)


Lesenswert?

konstanten im eeprom vom AVR ablegen und dann im eigentlichen programm
einlesen? so bräuchte der anwender nur immer das das eprom neu
beschreiben...

Marcel

von OliverK (Gast)


Lesenswert?

Wie Du es machen willst, ist möglich. Ich selbst habe so etwas ähnliches
schon mal machen müssen, um in einem sicheren System permanent den CRC
des Codespeichers zu prüfen.

Für z.B. einen at90S8515, Assembler

Ganz am Ende des Assemblerlistings wird Platz für Deine Konstante
reserviert.

CODE_END:
.dw 0x0000


Die zwei letzten Zeilen des Hexfiles sehen dann so aus:
Data Record
:0603400061F7AFCE0000E2

ENnd-of-File Record
:00000001FF

Vor E2 im Data Record finden sich wieder die zuvor reservierten
"Nullen".
Diese müssen manipuliert werden. Anschließend muß die Prüfsumme für
diese Zeile neu berechnet werden.


Grüße
Oliver

von Hilel (Gast)


Lesenswert?

Hallo Marcel.
Danke erstmal für die rasche Antwort.
Das EEPROM wird in der Anwendung für Kalibrierdaten gebraucht.
Angenommen ich habe die Zeit in Millisekunden in den Speicherzellen 5
und 6 des EEPROMs. Als Beispiel die 1000 ms (also 03 E8), dann würde
meine EEPROM-Hex-Datei beispielsweise so aussehen:
:1000000FFFFFFFFFF03E8........
Die Prüfsumme muss natürlich neu berechnet werden.
Das Programm im Flash liest dann beide Speicherzellen (5 und 6) aus dem
EEPROM und berechnet die Zeit:
Zeit = 256*Inhalt[5] + Inhalt[6].
Ich probiere es aus und werde versuchen 2 Speicherzellen aus dem EEPROM
dafür zu opfern.

von Hilel (Gast)


Lesenswert?

Hallo Oliver.
Genau so stelle ich mir das vor.
Wie greife ich dann im Programm auf diese Zellen zu?
Hast Du ein Programm geschrieben, um die HEX-Datei anzupassen?
Danke für den Tip.

von OliverK (Gast)


Lesenswert?

Beim AVR (8515) mit dem Befehl LPM. Mußt mal im Datenblatt nachschauen
oder in Deinen schlauen Büchern.

Ja. Ich habe ein Programm geschrieben. Es liest Zeile für Zeile ein,
bis es die vorletzte erwischt hat. Dann wird rumgeprökelt, manipuliert
und wieder korrigiert. Zum Schluß wird der ganze Summs wieder unter
einem anderen Namen abgespeichert.

von Hilel (Gast)


Lesenswert?

@Oliver
Ich arbeite momentan mit einem Basic Compiler, der den AT90S1200
unterstützt. Sonst arbeite ich mit einem C-Compiler. Ich habe alles
mögliche versucht, leider vergeblich. Mein Programm sieht wie folgt
aus:
Variablendefinitionen
Main()
Unterprogramme
ich habe den folgenden Assembler-Code zuerst nach Unterprogramme, dann
nach Main() eingefügt:
ASM
.CSEG
Konst1:
.DW $0000
END

In der HEX-Datei ist dieser reservierte Platz für meine Konstante
nirgens zu finden. Der Compiler gibt auch keine Fehlermeldung.
Kannst Du mir vielleicht helfen.
Danke im voraus

von OliverK (Gast)


Lesenswert?

Morgen Hilel,

aus diesem Grund arbeite ich bei den AVRs nur mit Assembler, da weiss
man, was man hat.

Womöglich hat Dir Dein Compiler den Code wegoptimiert, als er gesehen
hat, daß auf "Konstl:" kein Zugriff stattfindet.

von Hilel (Gast)


Lesenswert?

Guten morgen Oliver.
Laut Befehlssatz des AT90S1200 verfügt dieser nicht über den Befehl
LPM. D.h. Er kann ja keine Flash-Variablen unterstützen.
Ich muss das Problem anderes lösen. Ich versuche 2 Speicherzellen im
EEPROM zu reservieren.
Danke nochmal.

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.