ms430 und flash speicher

Gast #2260112
Lesenswert?

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
Gast #2260153
Lesenswert?

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
Gast #2260367
Lesenswert?

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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren