Forum: Mikrocontroller und Digitale Elektronik Versions Nummer wohin speichern?


von AVRli (Gast)


Lesenswert?

Hallo,

eigendlich nicht so schwer aber bevor ich was übersehe frage ich leiber 
mal die Leute die sich damit auskennen.

Wo würdet Ihr die Versionsnummer der Software im ATMEL hinterlegen? 
Prgramm, EEProm?
Am liebsten wäre mir "V1.0a" also als String Konstante.

Programm; Gibt es vielleicht Probleme wenn man diese Zeichenkette aus 
dem Bootloader heraus auslesen möchte?

EEProm: bekomme ich die Konstante nicht definiert, also es wird in dem 
EEProm nicht eingeschrieben. Fand den Platz als geeignetsten.

Versucht habe ich es mit...
.eseg
VERSION:  .db "V 1.0a",0

An der Position VERSION ist aber immer FF FF FF FF drin...

Hmm, welchen Weg geht man am besten?

Gruß AVRli...

von Andreas S. (andreas) (Admin) Benutzerseite


Lesenswert?

Ich würde die Versionsnummer in den Programmspeicher schreiben; sie 
gehört ja zum Programm.

Hast du daran gedacht die vom Assembler erzeugte .eep-Datei in den 
Controller zu programmieren?

von Jörg B. (manos)


Lesenswert?

Ich würde die Versionsnummer auf jeden Fall im Programm ablegen da 
ansonsten passieren kann, dass Programm und Versionsnummer im EEPROM 
voneinander abweichen.
Im EEPROM würde ich nur veränderliche Daten ablegen die gespeichert 
bleiben sollen (z.B. Geräte-ID, Max-Werte, etc...)

von AVRli (Gast)


Lesenswert?

Hi!

EEP file habe ich gefunden, steht auch was drin nur wie überträgt man 
das mit dem JTAG... wenn ich einen Breakpoint setze um mal reinzusehen 
was imm EEProm gespeichert ist, ist nur FF FF FF im gesamten EEProm 
drin.

Nutze übrigens AVR Studio und einen ATmega128 (ein Bolide der ehrlich 
gesagt für meine Anwendung etwas overkill ist).



MfG AVRli...

von Karoly Kovacs (Gast)


Lesenswert?

Bei 8051 ASM habe ich immer so gemacht:

  CSEG
  org  PROGSTART+0
  ljmp  reset
  org  PROGSTART+EXT0INT
  reti
Version:db  'Ver1.3'
  org  PROGSTART+T0INT
  reti
Build:  db  '12'
        ...

Bei 8051 wir haben "genug" Platz zwischen zwei Interrup-Vektoren.
Man muss natürlich aufpassen, die Länge der Information "möglichst kurz" 
zu halten, damit die nächste Vektor nicht überschreiben!

Bei anderen Systeme (und/oder anderen Prog.Sprachen) kann man auch 
sicher solche "schöne" Plätze finden.

Gruss aus Wien,
Karoly

von AVRli (Gast)


Lesenswert?

Hi @all... ;-)

also habe dann heute fast den ganzen Tag damit verbracht,
nun endlich eine Lösung gefunden die auch funktionieren sollte.
1
;//////////////////////////////////////////////////////////////////////////////
2
; INTERRUPT EINSPRUNGADRESSEN
3
;//////////////////////////////////////////////////////////////////////////////
4
.cseg
5
.org 0
6
  rjmp  INITIAL    ;RESET
7
.org INT6addr
8
  rjmp  int_INT6  ;Externer Int.
9
.org OVF2addr
10
  rjmp  int_TIMER2  ;T/C2 Überlauf-Int.
11
.org OVF0addr
12
  rjmp  int_TIMER0  ;T/C0 Überlauf-Int.
13
14
;---UART0 - Interrupts -------------------------------------------
15
.org URXC0addr
16
  rjmp  int_USART0_RXC  ;USART0, Rx Complete
17
.org UDRE0addr
18
  rjmp  int_USART0_DRE  ;USART0, Data Register Empty
19
20
;---UART1 - Interrupts ---------------------------------------------
21
.org URXC1addr
22
  rjmp  int_USART1_RXC  ;USART1, Rx Complete
23
.org UDRE1addr
24
  rjmp  int_USART1_DRE  ;USART1, Data Register Empty
25
;--- Zeiger auf das Ende des INT VECTORS setzen -------------------------------
26
.org INT_VECTORS_SIZE
27
28
;=== FIX === Position und Größe darf nie verändert werden =====================
29
;            da der Bootloader auf die Infos zugreift
30
31
          ;1234567890123456789012345678901
32
VER:    .db "0.1a >develop<",0  ;Version maximal 31 Zeichen + 0x00 !
33
.org VER+32
34
VER_DATE:  .db "17.04.2007",0    ;Format DD.MM.YYYY
35
36
;=== FIX-ENDE =================================================================
37
38
ab hier dann der Programmcode...

So kann man die Version recht flexibel gestallten, halt maximal 31 
Zeichn +Nullterminierung. In späteren Firmwareversionen kann man dann 
auch noch alle Einsprungadressen nutzen.

Hoffe ich habe nichts übersehen... ;-)


MfG AVRli...

von Karoly Kovacs (Gast)


Lesenswert?

Aha, es sieht ganz schön aus!

Es gibt noch ein Problem: wie kann man es mit C (oder mit anderer 
Progr.Sprache) machen?

Karoly

von AVRli (Gast)


Lesenswert?

Hi Karoly,

bei anderen Hochsprachen kann ich nicht mitreden, ich habe lediglich mit 
AVR-Studio gearbeitet.

Ich könnte mir aber vorstellen das es dort etwas einfacher ist.


MfG AVRli...

von Matthias (Gast)


Lesenswert?

In C gibts den Befehl PROGMEM:
1
uint8_t version[] PROGMEM = "v1234.5678"; // im "Flash"
2
...
3
4
// Zugriff zB so:
5
// text ist local
6
strcpy_P(text, version);
7
uart_send ( text );

Der String im Flash wird automatisch Nullterminert.

von Matthias (Gast)


Lesenswert?

Die zugehörige Lib:
#include <avr/pgmspace.h>

von Karoly Kovacs (Gast)


Lesenswert?

@Matthias:

Super, danke!

Karoly

von Stinkywinky (Gast)


Lesenswert?

Zurück zur ursprünglichen Frage.
Ohne jetzt Deine Architektur genau zu kennen, folgender Tipp:

Programmversion im Code UND im EEProm.

Falls Du einen Update machst, kann das neue Programm prüfen, ob es mit 
den alten Daten noch zurecht kommt und diese gegebenenfalls automatisch 
umrechnen.

von AVRli (Gast)


Lesenswert?

@Stinkywinky

Ja super, daran habe ich noch nicht gedacht.
Dann werde ich es mir im EEProm nochmal speichern.

Im Moment habe ich die Version nur im PROGRAMMEMORY.

Klappt alles ganz ausgezeichnet wenn man sich an die Regeln hält. ;-)


Danke!

MfG AVRli...

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.