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
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.