hallo forumsgemeine,
ich habe den ez430-rf2500 und im demoprogramm Sensor-Monitor wird in der
datei demo_AP.c und auch in der demo_ED.c als korrektur für dem
temperaturoffset die adresse 0x10F4 im Flashspeicher benannt. darin
sollen sich dann die korrekturdaten befinden:
__no_init volatile int tempOffset @ 0x10F4; // Temperature offset set at
production
nun habe ich 4 targetboards und 2 davon haben wenn man denn offset
dazuaddiert eine recht genaue temperaturausgabe. bei den beiden anderen
sind die abweichungen auch mit dem dazuaddieren des offset ca. 7°C
daneben.
nun wollte ich einfach mit den vorhandenen Beispielanwendungen einfach
die korrigierten zahlen in den Flashspeicher eintragen. das programm
läuft auch fehlerfrei ab. ändern tut sich der wert in der Adresse 0x10F4
nicht.
der code:
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
BCSCTL1 = CALBC1_1MHZ; // Set DCO to 1MHz
DCOCTL = CALDCO_1MHZ;
FCTL2 = FWKEY + FSSEL0 + FN1; // MCLK/3 for Flash Timing
Generator
char *Flash_ptrA; // Flash pointer
unsigned int i;
char value;
Flash_ptrA = (char *)0x10F4; // Initialize Flash pointer
FCTL3 = FWKEY; // Clear Lock bit
FCTL1 = FWKEY + ERASE + EEI; // Set Erase bit, allow
interrupts
*Flash_ptr = 0; // Dummy write to erase
Flash seg
FCTL2 = FWKEY + FSSEL0 + FN1; // MCLK/3 for Flash Timing
Generator
FCTL1 = FWKEY + ERASE; // Set Erase bit
FCTL3 = FWKEY + LOCKA; // Clear LOCK & LOCKA bits
// Dummy write to erase Flash seg A
Flash_ptrA = (char *)0x10F4; // Point to beginning of cal
consts
static int diff= -12;
staic char upperdiff, lowerdiff;
lowerdiff= diff;
upperdiff= diff>>8;
*Flash_ptr = lowerdiff;
*Flash_ptr++ = lowerdiff;
_NOP();
}
hat jemand eine idee wo mein fehler liegt?
vielen dank im vorraus
thomas
thomas schrieb: > static int diff= -12; > staic char upperdiff, lowerdiff; > > lowerdiff= diff; > upperdiff= diff>>8; > > *Flash_ptr = lowerdiff; > *Flash_ptr++ = lowerdiff; 1. Du verwendest deine upperdiff nicht, sondern 2x deine lowerdiff? ist das so gewollt? wenn ich mich recht entsinne, wird von rechts nach links aufgelöst, somit wird zuerst zugewiesen und dann der Pointer inkrementiert. (bin mir da aber nicht ganz sicher. MFG
nein ist ein rechtschreibfehler danke für den tipp klappt aber dennoch nicht ;)
bin nicht mehr so fit in sachen flash-manipulationen. Aber guck doch mal über die Suche ob du was ähnliches findest. Beitrag "msp430 flash löschen bevor schreiben?" MFG codehamster noch etwas... *Flash_ptr = 0; // Dummy write to erase soll diese Zeile das vorherige Löschen bewirken? dann müsste das doch der *Flash_ptrA sein...
User Guide lesen und Code Beispiele angucken! Vor dem Dummy Write zum löschen ist A-Segment noch gelockt! Vor der Schreiben ist WRT nicht gesetzt!
hallo, ich dämel hatte einfach fragmente der beispielcodes von ti zusammengebastelt und dabei übersehen dass die variaben anders sin usw... ich habe jetzt eine Funktion geschrieben zum beschreiben und zum auslesen der Flashadressen:
1 | void writeCHAR2flash(char value, unsigned int adress){ |
2 | char *Flash_ptr; // Flash pointer |
3 | |
4 | |
5 | FCTL1 = FWKEY + ERASE; // Set Erase bit |
6 | FCTL2 = FWKEY + FSSEL0 + FN1; // MCLK/3 for Flash Timing Generator |
7 | FCTL3 = FWKEY + LOCKA ; // Clear Lock bit |
8 | |
9 | Flash_ptr = (char *) adress; // Initialize Flash pointer |
10 | |
11 | *Flash_ptr = 0; // Dummy write to erase Flash seg |
12 | |
13 | FCTL1 = FWKEY + WRT; // Set WRT bit for write operation |
14 | *Flash_ptr = value; // Write value to flash |
15 | |
16 | FCTL1 = FWKEY; // Clear WRT bit |
17 | FCTL3 = FWKEY + LOCK; // Set LOCK bit |
18 | }
|
wenn man nicht das segment A beschreiben möchte reicht auch statt
1 | FCTL3 = FWKEY + LOCKA auch nur FCTL3 = FWKEY |
und zum auslesen:
1 | char readCHARfromflash(unsigned int adress){ |
2 | char *Flash_ptr; |
3 | Flash_ptr = (char *) adress; |
4 | return *Flash_ptr; |
5 | }
|
6 | |
7 | int readINTfromflash(unsigned int adress){ |
8 | int *Flash_ptr; |
9 | Flash_ptr = (int *) adress; |
10 | return *Flash_ptr; |
11 | }
|
ich hoffe die fertigen funktionen helfen anderen und echt vielen dank für die ganzen ratschläge, sonst würde ich morgen noch davor sitzen. mfg thomas
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.