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...
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?
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...)
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...
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
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...
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
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...
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.
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.
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.