Forum: Mikrocontroller und Digitale Elektronik EEPROM Zugriff attiny861


von artur l. (Gast)


Lesenswert?

Hallo,

ich habe ausnahmsweise eine Frage zum Code, der funktioniert:
1
ISR(INT0_vect) //ZUENDUNG, startet EEMEM Sicherung
2
{
3
  if(merker)  //erst nach einschwingzeit > 2s
4
  {
5
    cli();                          //Interrupts aus
6
7
    if(EEMEM_isSet != 1)  //Nur beim ersten Ausführen speichern
8
      eeprom_write_byte(&check_EEMEM, 1);
9
        
10
    //Zähler für Ringpuffer nachstellen
11
    if(cntr_EEMEM_temp < (N_BYTE-1))
12
    {
13
      cntr_EEMEM_temp ++;
14
      eeprom_write_byte(&cntr_EEMEM, cntr_EEMEM_temp);
15
      eeprom_busy_wait();
16
    }
17
    else
18
    {
19
      cntr_EEMEM_temp = 0;  // Counter hat eine weitere Umrundung von 50 Byte hinter sich
20
      eeprom_write_byte(&cntr_EEMEM, 0);
21
      eeprom_busy_wait();
22
    }
23
24
    //Ringpuffer für FAKTOR schreiben
25
    eeprom_write_byte(&array_KF_EEMEM[cntr_EEMEM_temp], Kardan_Faktor);
26
    eeprom_busy_wait();
27
    eeprom_write_byte(&array_UF_EEMEM[cntr_EEMEM_temp], Umfang_Faktor);
28
    eeprom_busy_wait();
29
30
  }
31
}


Ist ein Ringpuffer, der die zu beschreibenden EEPROM Zellen der Reihe 
nach beschreiben soll. Sobald der Zeiger (N_BYTE=50, uint8_t) rum ist, 
Beginn von vorne.

Meine Frage:
cntr_EEMEM_temp wird vor jedem Speichern inkrementiert. Weiß der 
Compiler um wieviel Byte der tatsächliche Zeiger bewegt wird? Denn der 
Wert, den ich abspeichere, ist nicht ein BYTE groß, sondern vier - 
uint32_t.

Vielen Dank
Artur

Beitrag #5083736 wurde von einem Moderator gelöscht.
von artur l. (Gast)


Lesenswert?

Ich merke gerade, dass ich den "Status Buffer" (AVR101: High Endurance 
EEPROM Storage) ja auch mit ziehen muss - sonst macht das ganze wnig 
Sinn))

Dennoch: die Frage besteht noch.

von Oliver S. (oliverso)


Lesenswert?

artur l. schrieb:
> Weiß der
> Compiler um wieviel Byte der tatsächliche Zeiger bewegt wird? Denn der
> Wert, den ich abspeichere, ist nicht ein BYTE groß, sondern vier -
> uint32_t.

passt nicht zu

artur l. schrieb:
> ich habe ausnahmsweise eine Frage zum Code, der funktioniert:

eeprom_write_byte schreibt, wie der Name vermuten lässt, ein einziges 
Byte. Damit landet niemals ein uint32_t komplett im eeprom.

Oliver

von artur l. (Gast)


Lesenswert?

[c]
ISR(INT0_vect) //ZUENDUNG, startet EEMEM Sicherung
{
  if(merker)  //erst nach einschwingzeit > 2s
  {
    cli();                          //Interrupts aus

    writetoDisplay(0, CLEAR);
    writetoDisplay(333, SHOW);

    ACSRA |= (1<<ACD);  //Energie sparen))
    ADCSRA &= ~(1<<ADEN);  //Energie sparen))

    //Leuchtreklame aus

    BLINKER_PORT |= (1<<BLINKER); //LED AUS
//    TACHO_PORT |= (1 << TACHO); //LED AUS

    if(EEMEM_isSet != 1)  //Nur beim ersten Ausführen speichern
      eeprom_write_byte(&check_EEMEM, 1);

    //Zähler für Ringpuffer nachstellen
    if(cntr_EEMEM_temp < (N_BYTE-1))
    {
      cntr_EEMEM_temp ++;
      eeprom_write_byte(&cntr_EEMEM, cntr_EEMEM_temp);
      eeprom_busy_wait();
    }
    else
    {
      cntr_EEMEM_temp = 0;  // Counter hat eine weitere Umrundung von 50 
Byte hinter sich
      eeprom_write_byte(&cntr_EEMEM, 0);
      eeprom_busy_wait();
    }

    //Ringpuffer für km-Staende schreiben
    uint8_t delta_km = 0;

    //auf ganze km runden. sollte sich statistisch mitteln
    if(meter_temp > HALB_km)
      delta_km = 1;

    //Ringpuffer km-Staende schreiben
    eeprom_write_dword(&array_Gesamt_km_EEMEM[cntr_EEMEM_temp], 
Gesamt_km_Stand + delta_km);
    eeprom_busy_wait();
    eeprom_write_dword(&array_Tages_km_EEMEM[cntr_EEMEM_temp], 
Tages_km_Stand + delta_km);
    eeprom_busy_wait();

    //Ringpuffer für FAKTOR schreiben
    eeprom_write_byte(&array_KF_EEMEM[cntr_EEMEM_temp], Kardan_Faktor);
    eeprom_busy_wait();
    eeprom_write_byte(&array_UF_EEMEM[cntr_EEMEM_temp], Umfang_Faktor);
    eeprom_busy_wait();

    //Programmende bei Wegfall der VCC
    uint32_t SpannungWeg = 0;
    uint8_t i_U = 0;

    for(; i_U<5; i_U++)
    {
      for(; SpannungWeg<1000000; SpannungWeg++);
    }

  }
}
[c\]
Sorry, ich habe jetzt die ganze Routine dabei.
Ich schreibe auch 32Bit Werte nach dem gleichen Verfahren.

Das heißt, in meinem Fall würde mit 
eeprom_write_dword(&array_Gesamt_km_EEMEM[cntr_EEMEM_temp], 
Gesamt_km_Stand + delta_km); nur das erste Byte geschrieben?
Zur meiner Verwunderung past es einigermaßen, was ich nach Neustart des 
Programms auslese - es ist zumindest kein unplauisibler Müll.

Beitrag #5084066 wurde von einem Moderator gelöscht.
von Oliver S. (oliverso)


Lesenswert?

eeprom_write_dword schreibt wohl was? Genau...

Allerdings schreibt eeprom_write_dword in deiner Funktion nirgends 
direkt auf den Pointer &cntr_EEMEM_temp, daher ist deine Ausgangsfrage 
hinfällig.

Oliver

von Karl M. (Gast)


Lesenswert?

Hallo artur l.,

Lustig, diese Anweisung " cli(); " und völlig unsinnig.

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.