Function och eeprom fråga (Arduino)

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Function och eeprom fråga (Arduino)

Inlägg av lillmange »

Hej,

Jag håller på med en timelaps controller till en digitalkamera.

Nu är jag nästan klar och det sista jag ska fixa är att man ska kunna spara inställningar till eeprom.
Men det fungerar inte, jag tror det har någon med saveFunction att göra.
Snälla, kan någon kolla lite på utdragen av min kod och se om ni hittar felet?

Tack!

Kod: Markera allt

if (saveSlot == 1){
          eeprom_addr = 10;                          //set start address
        }
        //Write eeprom (Saveslot 2)
        if (saveSlot == 2){
          eeprom_addr = 50;                          //set start address
        }
        //Write eeprom (Saveslot 3)
        if (saveSlot == 3){
          eeprom_addr = 100;                          //set start address
        }
        void saveFunction();

Kod: Markera allt

//Write eeprom function
void saveFunction(){
  eepromTemp = startdelayH;                  //copy Value to temp storage
  times = 0;                                 // Zero counter
  while(times < 4){                           // do 4 times
    times++;                                  //add 1 to the counter
    if (eepromTemp > 255){                      //check size
      EEPROM.write(eeprom_addr, 255);          //write 255 to eeprom
      eepromTemp = eepromTemp - 255;           //subtract 255 from temp value
    }
    else{                                      //if value lover than 255
      EEPROM.write(eeprom_addr, eepromTemp);   //write value to eeprom
      eepromTemp = 0;                          //Zero temp value
    }
    eeprom_addr++;                            //go to next eeprom_address
    delay(5);                                  //wait for eeprom to be ready for more data
  }

  EEPROM.write(eeprom_addr, startdelayM);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  EEPROM.write(eeprom_addr, startdelayS);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  EEPROM.write(eeprom_addr, shuttertimeM);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  EEPROM.write(eeprom_addr, shuttertimeS);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  eepromTemp = frameIntervalH;                  //copy Value to temp storage
  times = 0;                                 // Zero counter
  while(times < 4){                           // do 4 times
    times++;                                  //add 1 to the counter
    if (eepromTemp > 255){                      //check size
      EEPROM.write(eeprom_addr, 255);          //write 255 to eeprom
      eepromTemp = eepromTemp - 255;           //subtract 255 from temp value
    }
    else{                                      //if value lover than 255
      EEPROM.write(eeprom_addr, eepromTemp);   //write value to eeprom
      eepromTemp = 0;                          //Zero temp value
    }
    eeprom_addr++;
    delay(5);                                  //wait for eeprom to be ready for more data
  }

  EEPROM.write(eeprom_addr, frameIntervalM);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  EEPROM.write(eeprom_addr, frameIntervalS);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  EEPROM.write(eeprom_addr, focustimeS);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  eepromTemp = timelapseH;                  //copy Value to temp storage
  times = 0;                                 // Zero counter
  while(times < 4){                           // do 4 times
    times++;                                  //add 1 to the counter
    if (eepromTemp > 255){                      //check size
      EEPROM.write(eeprom_addr, 255);          //write 255 to eeprom
      eepromTemp = eepromTemp - 255;           //subtract 255 from temp value
    }
    else{                                      //if value lover than 255
      EEPROM.write(eeprom_addr, eepromTemp);   //write value to eeprom
      eepromTemp = 0;                          //Zero temp value
    }
    eeprom_addr++;
    delay(5);                                  //wait for eeprom to be ready for more data
  }

  EEPROM.write(eeprom_addr, timelapseM);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  EEPROM.write(eeprom_addr, timelapseS);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  EEPROM.write(eeprom_addr, focusandshutter);
  eeprom_addr++;
  delay(5);                                  //wait for eeprom to be ready for more data
  eepromTemp = shutterpulse;                  //copy Value to temp storage
  times = 0;                                 // Zero counter
  while(times < 4){                           // do 4 times
    times++;                                  //add 1 to the counter
    if (eepromTemp > 255){                      //check size
      EEPROM.write(eeprom_addr, 255);          //write 255 to eeprom
      eepromTemp = eepromTemp - 255;           //subtract 255 from temp value
    }
    else{                                      //if value lover than 255
      EEPROM.write(eeprom_addr, eepromTemp);   //write value to eeprom
      eepromTemp = 0;                          //Zero temp value
    }
    eeprom_addr++;
    delay(5);                                  //wait for eeprom to be ready for more data
  }
}   //END SAVE FUNCTION
/Magnus G
Användarvisningsbild
Klas-Kenny
Inlägg: 11842
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Function och eeprom fråga (Arduino)

Inlägg av Klas-Kenny »

Sådär direkt (har inte läst koden längre än så) så ser jag att du kallar funktionen med "void saveFunction();", void skriver man när man deklarerar en funktion, inte när man kallar på den.

Inte en aning om hur Arduino-kompilatorn hanterar det, men det kan vara så att funktionen aldrig körs.
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Function och eeprom fråga (Arduino)

Inlägg av lillmange »

Hej,

Ja det är troligt att det är problemet.

Men hur gör man när man använder funktioner, hur anropar man dom?
Jag försökte läsa mig till detta men det slutade som i koden ovan....


Tack!

/Magnus
Användarvisningsbild
Klas-Kenny
Inlägg: 11842
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Function och eeprom fråga (Arduino)

Inlägg av Klas-Kenny »

Du kallar på funktionen genom att helt enkelt skriva

Kod: Markera allt

funktionensnamn();
Så körs den. :)
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Function och eeprom fråga (Arduino)

Inlägg av sodjan »

Ta bort "void".
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Function och eeprom fråga (Arduino)

Inlägg av lillmange »

OK, då ska jag testa det...

edit:
Och nu fungerar det!

Nu har man lärt sig det, Tack så mycket!


/Magnus
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Function och eeprom fråga (Arduino)

Inlägg av lillmange »

En lite fråga till ang eeprom:

Jag läste någonstans att man skulle ha 5ms pause mellan varje skrivning till eeprom, behövs verkligen det?
Eller är det bara vissa eeprom behöver det?
Hur gör ni?

/Magnus
Användarvisningsbild
Klas-Kenny
Inlägg: 11842
Blev medlem: 17 maj 2010, 19:06:14
Ort: Växjö/Alvesta

Re: Function och eeprom fråga (Arduino)

Inlägg av Klas-Kenny »

Leta i databladet för processorn så hittar du nog allt du behöver veta om det. :)
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Function och eeprom fråga (Arduino)

Inlägg av lillmange »

OK, :)

/Magnus
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Function och eeprom fråga (Arduino)

Inlägg av sodjan »

Normala EEPROM har en skrivtid på omkring 5 ms.
En del processorer har en intern flagga som man kan testa
för att se om föregående skrivning är klar. En del har ett
interrupt som man kan använda.
Användarvisningsbild
007sweden
Inlägg: 3500
Blev medlem: 3 mars 2005, 20:18:12
Skype: oo7sweden

Re: Function och eeprom fråga (Arduino)

Inlägg av 007sweden »

lillmange skrev: Jag läste någonstans att man skulle ha 5ms pause mellan varje skrivning till eeprom, behövs verkligen det?
Beror på om du har externt eeprom eller inte, verkar som om du beroende på modell på eeprom får pausa ett litet tag mellan varje skrivning om du kör externt. Internt (alltså eepromet som sitter i microprocessorn) så har arduino-IDE'ns inbyggna funktion EEPROM.write(address, value) en kompletteringstid på 3.3ms, antar att funktionen blockerar under den tiden, eftersom dem har detta som exempel:

Kod: Markera allt

  for (int i = 0; i < 512; i++)
    EEPROM.write(i, i);
lillmange
Inlägg: 129
Blev medlem: 30 januari 2007, 14:51:37
Ort: Upplands Väsby
Kontakt:

Re: Function och eeprom fråga (Arduino)

Inlägg av lillmange »

Tack!

Det var något sådant jag trodde dom hade lagt till i arduino men jag var lite osäker.

Nu finns redan 5ms delay vid varje skrivning till eeprom så det får vara så, men nästa gång ska jag prova utan.

/Magnus G
Skriv svar