Variable im nichtflüchtigen Speicher

Gast #1453839
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
Gast #1453913
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
}

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