- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 6 von 6

Thema: 1KB EEPROM im Prozessor

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von SlyD
    Registriert seit
    27.11.2003
    Ort
    Paderborn
    Alter
    40
    Beiträge
    1.516
    Hallo,

    hab noch nie einen Compiler automatisch Daten in ein EEPROM legen lassen - das mache ich per Hand. Für die paar Datenbereiche ist das ja kein großer Aufwand.
    Sonst ändert man irgendwas am Programm, fügt Variablen hinzu oder sowas oder nimmt ne neue Compiler Version und evtl. liegen die Daten dann doch wieder an einer ganz anderen Stelle im EEPROM und die da bereits (schon von der letzten Programmversion) gespeicherten Werte sind ungültig...


    > wie man die ersten Bytes blockt/reserviert damit GCC nicht die Daten auf EEPROM Adresse 0x0000 legt.
    >

    Man kann sicher die eeprom section umlegen - muss man dem Linker sagen.
    (such mal im Makefile nach "section" und ".eeprom")



    > Auf der M256 zerschiesst man sich vermutlich damit die (Wlan-Netzwerk?)-Einstellungen
    >


    Nö (die Netzwerkeinstellungen werden im Flash ROM des WLAN Funkmoduls gespeichert), nur die Einstellungen die den Mikrocontroller und den Bootloader bzw. (optionalen) 2nd stage Bootloader betreffen. Und wie gesagt, das bekommt der Bootloader mit wenn man da dran rumpfuscht und überschreibt dass dann wieder mit den Standardwerten also passiert nix schlimmes dabei
    Die LED/LCD Steuerung ist nur LEDs an/aus. Man kann z.B. auch die WLAN Baudrate anpassen und da es im EEPROM liegt, bekommt das auch die M256 Lib mit - so können Bootloader und Hauptprogramm die gleiche Baudrate (fürs WLAN Modul) verwenden und man kann das direkt im RobotLoader umstellen.



    MfG,
    SlyD

  2. #2
    Erfahrener Benutzer Roboter-Spezialist Avatar von RolfD
    Registriert seit
    07.02.2011
    Beiträge
    414
    Ja unsere Posts haben sich überschnitten, Lösung im Nachtrag letzter Post von mir Mittels "section".
    Die geänderte Fassung welche sich nicht an der Linearadresse stört liefer ich noch nach. <-[erledigt]

    hab noch nie einen Compiler automatisch Daten in ein EEPROM legen lassen - das mache ich per Hand.
    Naja bisher war das auch schwierig wegen der Adressen die vom Bootloader überschrieben werden aber mit dem Wissen kriegst Du das jetzt auch hin

    Ok wenn man weiss das eeprom-Bytes vom Bootloader "verseucht" sind kann man natürlich einfach ein genulltes Array an den Anfang von EEMEM setzen und das Array eben im Programm einfach nicht nutzen. Du sagst ja das es im Prinzip dann aufs neu setzen der Werte vom Bootloader im eeprom hinaus läuft nachdem ein eep File geschrieben wurde. Das muss jeder selbst wissen aber mir gefällt die Lösung mit der Section ohne überschreiben der Bootloaderdaten besser.
    In meinem Prozessor herrscht Ordnung!
    Gruß

    NACHTRAG:
    Was bei mir sehr gut klappt ist die Nutzung des EPP / PROGMEM über ein #define umschaltbar zu machen.
    So ist zu Testzwecken das normale Flashmemory nutzbar und wenn man eine epp Version bauen will, reicht es die defines umzukommentieren.
    Es erspart also die Notwendigkeit wärend der Entwicklung dauernd das epp-file hochladen zu müssen. (War als Kritikpunkt für epp ja angesprochen.)
    Code:
    // Speicherconfig: in der RP6CONTROLLIB.H einfügen
    
    #define MEMORY 0 /*0=PROGMEM,1=EEPMEM,2=EEMEM*/
    
    #if MEMORY==0
    #define MEM PROGMEM
    #elif MEMORY==1
    #define EEPMEM __attribute__((section(".realeep")))
    #define MEM EEPMEM
    #elif MEMORY==2
    #define MEM EEMEM
    #endif
    ----3<---
    // im Programm irgendwo nutzen...
    const char lcd_wheelchar[] MEM = ".,oO0*0Oo,. "; // sinnvoll wäre auch noch const char wheel[] = "0123456789ABCDEF";
    const uint8_t LCDLineAdr[] MEM = {LCD_START_LINE1, LCD_START_LINE2, LCD_START_LINE3, LCD_START_LINE4};
    ----3<---
    //in der Init Funktion in RP6CONTROLLIB.C einfügen
        UART_Mode(UART_INIT);
    #if    MEMORY!=0
    #ifndef WENEEDASCII //// damit xon/off im Ascii mode meiner uartLib funktioniert auch wenn sie nicht configuriert ist 
    #define WENEEDASCII 1
    #endif
    #ifndef WENEEDTXXONOFF
    #define WENEEDTXXONOFF 1
    #endif
    #ifndef WENEEDRXXONOFF
    #define WENEEDRXXONOFF 1
    #endif
    #ifndef WENEED7BIT
    #define WENEED7BIT 1
    #endif
    #ifndef WENEEDCRLF
    #define WENEEDCRLF 1
    #endif
        UART_Mode(UART_ASCII);
        puts_P(PSTR("load epp...[x]"));
        if (import_epp()) puts_P(PSTR("ok")); else {
            puts_P(PSTR("ERROR"));
            while(1);
        }
        UART_Mode(UART_RP6);
    #endif
    ----3<---
    // in der import_epp() , liegt bei mir derzeit in der uartlib
        while (true) {
            c = getchar();
            if (c=='x') return true; // <- die Zeile neu einfügen
            switch(parser_state) {
    ----3<---
    //verarbeiten kann man die Daten z.B. so
    #if MEMORY==0        
            eeval = pgm_read_byte(&chrdata[i]);
    #else
            eeval = eeprom_read_byte(&chrdata[i]);
    #endif
    Man kann die import_epp() Funktion übrigends auch gut aus dem Init der Unit nach der Initialisierung von stdio aufrufen und den Import mit Prüfung auf ein esscape char abbrechen wenn man das eeprom nicht neu beschreiben möchte (ändert sich ja nicht dauernd was).
    Wenn man dann auch noch über Preprozessorbefehle testet ob überhaupt EE(P)MEM genutzt wird und ggf. den Import_epp Code ausschließt, hat man alles beisammen um flüssig mit EPP zu arbeiten, aber keinen zusätzlichen Code bei Nutzung von PROGMEM. Damit wird bei Programmstart & Nutzung von EEPROM immer erst das abbrechbare Laden des epp angeboten.
    Da die Importfunkton nicht größer 1kb ist, hat man allein durch auslagern von Strings in jedem Fall ein Platzgewinn und wenn man die Importfunktion nicht mehr braucht kann man sie auskommentieren. Wie am Codebeispiel oben zu sehen, alles mit einer einzigen Ziffer (0,1,2) einstellbar. Also 1 KB mehr Platz für Constanten bzw. Code letztlich ohne eine einzige Zeile Code mehr! Eigene.. "händisch" verwaltete Daten (deren Verwaltung sicher Codezeilen kosten!!) kann man zudem in der Adressierung als Topdown Model anlegen.. also "von oben runter". Dann besteht auch kaum die Gefahr das sich die Compilervars und die eigenen im Speicher begegnen da der Compiler die Daten als Bottomup ablegt.
    Geändert von RolfD (21.05.2014 um 17:26 Uhr)
    Sind Sie auch ambivalent?

Ähnliche Themen

  1. [ERLEDIGT] EEPROM - leer / .eep Datei ins EEPROM schreiben
    Von dj_cyborg im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 25.08.2013, 19:50
  2. Prozessor
    Von grizzly im Forum Elektronik
    Antworten: 17
    Letzter Beitrag: 23.06.2010, 15:12
  3. Neuer Prozessor
    Von frank1210 im Forum Asuro
    Antworten: 6
    Letzter Beitrag: 30.12.2009, 17:30
  4. Prozessor
    Von letori im Forum Robby CCRP5
    Antworten: 1
    Letzter Beitrag: 16.03.2008, 17:20
  5. ATmega8 aus dem EEPROM lesen und ins EEPROM Schreiben
    Von melowtrax im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 20.02.2006, 22:32

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests