www.mikrocontroller.net

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


Autor: Mr Bean (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mr Bean (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bastler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles was du brauchst:

1. Variablen aus Page sichern
2. Page löschen
3. Variablen neu speichern
/**************************************************************************
  ucFlashRead
**************************************************************************/

unsigned char ucFlashRead (unsigned int addr)
{
   bit EA_SAVE = EA;                   // Preserve EA
   char code * data pread;             // FLASH read pointer
   unsigned char byte;

   WDT_RESET;

   EA = 0;                             // Disable interrupts

   pread = (char code *) addr;

   byte = *pread;                      // Read the byte

   EA = EA_SAVE;                       // Restore interrupts

   return byte;
}


/**************************************************************************
  vFlashWrite 
**************************************************************************/

void vFlashWrite (unsigned int addr, char byte)
{
   bit EA_SAVE = EA;                   // Preserve EA
   char xdata * data pwrite;           // FLASH write pointer

   WDT_RESET;

   EA = 0;                             // Disable interrupts

   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold

   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source

   pwrite = (char xdata *) addr;

   FLKEY  = 0xA5;                      // Key Sequence 1
   FLKEY  = 0xF1;                      // Key Sequence 2
   PSCTL |= 0x01;                      // PSWE = 1 which enables writes

   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold

   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source

   *pwrite = byte;                     // Write the byte

   PSCTL &= ~0x01;                     // PSWE = 0 which disable writes

   EA = EA_SAVE;                       // Restore interrupts
}


/**************************************************************************
  vFlashPageErase
**************************************************************************/

void vFlashPageErase (unsigned int addr)
{
   bit EA_SAVE = EA;                   // Preserve EA
   char xdata * data pwrite;           // FLASH write pointer

   WDT_RESET;
  
   EA = 0;                             // Disable interrupts

   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold

   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source

   pwrite = (char xdata *) addr;

   FLKEY  = 0xA5;                      // Key Sequence 1
   FLKEY  = 0xF1;                      // Key Sequence 2
   PSCTL |= 0x03;                      // PSWE = 1; PSEE = 1


   VDM0CN = 0xA0;                      // Enable VDD monitor and high threshold

   RSTSRC = 0x02;                      // Enable VDD monitor as a reset source
   *pwrite = 0;                        // Initiate page erase

   PSCTL &= ~0x03;                     // PSWE = 0; PSEE = 0

   EA = EA_SAVE;                       // Restore interrupts
}

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.