Forum: Mikrocontroller und Digitale Elektronik Variable im nichtflüchtigen Speicher


von Mr Bean (Gast)


Lesenswert?

Hallo

Kann mir jemand sagen wie ich, wenn ich einen 8051 Controller 
programmiere, eine Variable im nichtflüchtigen Speicher ablege? Ich 
möchte mir sowas wie einen Betriebsstundenzähler bauen. Und der sollte 
wenn das Gerät AUS und wieder EIN geschaltet wird natürlich nicht 
zurückgesetzt werden.

Vielen Dank im Voraus!

Grüße

Bean

von Peter D. (peda)


Lesenswert?

Mr Bean schrieb:
> Kann mir jemand sagen wie ich, wenn ich einen 8051 Controller
> programmiere, eine Variable im nichtflüchtigen Speicher ablege?

Welcher der über 500 verschiedenen 8051-er (Hersteller, komplette 
Bezeichnung)?



Peter

von Mr Bean (Gast)


Lesenswert?

OK, hatte nicht gedacht dass das einen Unterschied macht. War der 
Meinung das ist von der Programmiersprache abhängig. Soll auf einem F330 
von SiLabs implementiert werden.

Grüße

Bean

von Bastler (Gast)


Lesenswert?

Alles was du brauchst:

1. Variablen aus Page sichern
2. Page löschen
3. Variablen neu speichern
1
/**************************************************************************
2
  ucFlashRead
3
**************************************************************************/
4
5
unsigned char ucFlashRead (unsigned int addr)
6
{
7
   bit EA_SAVE = EA;                   // Preserve EA
8
   char code * data pread;             // FLASH read pointer
9
   unsigned char byte;
10
11
   WDT_RESET;
12
13
   EA = 0;                             // Disable interrupts
14
15
   pread = (char code *) addr;
16
17
   byte = *pread;                      // Read the byte
18
19
   EA = EA_SAVE;                       // Restore interrupts
20
21
   return byte;
22
}
23
24
25
/**************************************************************************
26
  vFlashWrite 
27
**************************************************************************/
28
29
void vFlashWrite (unsigned int addr, char byte)
30
{
31
   bit EA_SAVE = EA;                   // Preserve EA
32
   char xdata * data pwrite;           // FLASH write pointer
33
34
   WDT_RESET;
35
36
   EA = 0;                             // Disable interrupts
37
38
   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold
39
40
   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source
41
42
   pwrite = (char xdata *) addr;
43
44
   FLKEY  = 0xA5;                      // Key Sequence 1
45
   FLKEY  = 0xF1;                      // Key Sequence 2
46
   PSCTL |= 0x01;                      // PSWE = 1 which enables writes
47
48
   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold
49
50
   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source
51
52
   *pwrite = byte;                     // Write the byte
53
54
   PSCTL &= ~0x01;                     // PSWE = 0 which disable writes
55
56
   EA = EA_SAVE;                       // Restore interrupts
57
}
58
59
60
/**************************************************************************
61
  vFlashPageErase
62
**************************************************************************/
63
64
void vFlashPageErase (unsigned int addr)
65
{
66
   bit EA_SAVE = EA;                   // Preserve EA
67
   char xdata * data pwrite;           // FLASH write pointer
68
69
   WDT_RESET;
70
  
71
   EA = 0;                             // Disable interrupts
72
73
   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold
74
75
   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source
76
77
   pwrite = (char xdata *) addr;
78
79
   FLKEY  = 0xA5;                      // Key Sequence 1
80
   FLKEY  = 0xF1;                      // Key Sequence 2
81
   PSCTL |= 0x03;                      // PSWE = 1; PSEE = 1
82
83
84
   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold
85
86
   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source
87
   *pwrite = 0;                        // Initiate page erase
88
89
   PSCTL &= ~0x03;                     // PSWE = 0; PSEE = 0
90
91
   EA = EA_SAVE;                       // Restore interrupts
92
}

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.