Forum: Mikrocontroller und Digitale Elektronik ms430 und flash speicher


von thomas (Gast)


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

von codehamster (Gast)


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

von thomas (Gast)


Lesenswert?

nein ist ein rechtschreibfehler
danke für den tipp
klappt aber dennoch nicht ;)

von codehamster (Gast)


Lesenswert?

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...

von Stefan (Gast)


Lesenswert?

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!

von thomas (Gast)


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

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.