Pages: [1]   Go Down
Author Topic: eeprom su arduino  (Read 587 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

problema con la libreria eeprom su arduino mega 2650 ho compilato uno sketch di una serratura con keypad funziona al 100%, però se si dimentica il codice non so come fare perche se si riscarica lo sketc su arduino non mi prende il pin di default ma tiene l'ultimo che e stato salvato come posso fare è un problema del arduino o dello sketch? O semplicemente basta che se dimentico il pin faccio un clear della libreria eepron di arduino con l'apposito sketch?
« Last Edit: January 23, 2012, 01:32:26 pm by tizio45 » Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Spiega per bene dove registri il pin di default e dove quello modificato dall'utente.
Logged


Rome (Italy)
Offline Offline
Tesla Member
***
Karma: 120
Posts: 9185
"Il Vero Programmatore ha imparato il C sul K&R, qualunque altro testo è inutile e deviante."
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Non mi pare che Arduino permetta di includere nel .hex anche l'inizializzazione della EEPROM, quindi sei obbligato a cancellarla tramite un apposito sketch dedicato oppure tramite una funzione, contenuta nel tuo sketch, attivabile tramite un codice di sicurezza, non modificabile, che introduci dal tastierino.

Logged

Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

questo e lo sketch

#include <Keypad.h>
#include <EEPROM.h>

char* secretCode = "1234";
int position = 0;
boolean locked = true;

const byte rows = 4;
const byte cols = 3;
char keys[rows][cols] = {
{'1','2','3'},
{'4','5','6'},
{'7','8','9'},
{'*','0','#'}
};

byte rowPins[rows] = {4, 9, 8, 6};
byte colPins[cols] = {5, 3, 7};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);

int redPin = 12;
int greenPin = 11;
int solenoidPin = 10;

void setup()
{
pinMode(redPin, OUTPUT);
pinMode(greenPin, OUTPUT);
loadCode();
flash();
updateOutputs();
}

void loop()
{
  char key = keypad.getKey();
  if (key == '*' && ! locked)
  {
   // unlocked and * pressed so change code
      position = 0;
      getNewCode();
      updateOutputs();
  }
  if (key == '#')
  {
    locked = true;
    position = 0;
    updateOutputs();
  }
  if (key == secretCode[position])
  {
  position ++;
  }
  if (position == 4)
  {
    locked = false;
    updateOutputs();
  }
  delay(100);
 }
 
 void updateOutputs()
{
 if (locked)
 {
  digitalWrite(redPin, HIGH);
  digitalWrite(greenPin, LOW);
  digitalWrite(solenoidPin, HIGH);
 }
 else
 {
 digitalWrite(redPin, LOW);
 digitalWrite(greenPin, HIGH);
 digitalWrite(solenoidPin, LOW);
 }
}
void getNewCode()
{
flash();
for (int i = 0; i < 4; i++ )
{
char key;
key = keypad.getKey();
while (key == 0)
{
key = keypad.getKey();
}
flash();
secretCode = key;
}
saveCode();
flash();flash();
}

void loadCode()
{
if (EEPROM.read(0) == 1)
{
secretCode[0] = EEPROM.read(1);
secretCode[1] = EEPROM.read(2);
secretCode[2] = EEPROM.read(3);
secretCode[3] = EEPROM.read(4);
}
}

void saveCode()
{
EEPROM.write(1, secretCode[0]);
EEPROM.write(2, secretCode[1]);
EEPROM.write(3, secretCode[2]);
EEPROM.write(4, secretCode[3]);
EEPROM.write(0, 1);
}

void flash()
{
digitalWrite(redPin, HIGH);
digitalWrite(greenPin, HIGH);
delay(500);
digitalWrite(redPin, LOW);
digitalWrite(greenPin, LOW);
}

apena si avvia e gia in lock si inserisce il pin "1234" e si sblocca quando e sbloccato si preme * per ribloccare o # per cambiare il pin dato che questo schema lo fatto ancora6-7 mesi fa nn ricordo più come lavora.
ma credo che per resettare il pin bisogni fare il clear della eepron
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 313
Posts: 21624
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

All'avvio ti chiede il pin in memoria per via di questo controllo:

Code:
if (EEPROM.read(0) == 1)
Se trova il byte 1 nella 1a cella della EEPROM, ti chiede il pin memorizzato. Ma è giusto, perché sennò che sicurezza sarebbe, se bastasse staccare l'alimentazione per ritrovarsi il pin di default "1234"?  smiley-wink
Potresti cambiare questo modo di operare mettendo un EEPROM.write(0)=1 nel setup ma così diventa rischioso se la Eeprom è "vergine" e non contiene nessun codice oppure quelle 4 celle di memoria contengono valori a caso.
Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 58
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

a ecco perche avevo sritto quello...mi limitero a non scordare il codice e se lo scordo resetto la eeprom con questo codice (gia nelle librerie di arduino) se e giusto e poi riuplodo lo sketch

/*
 * EEPROM Clear
 *
 * Sets all of the bytes of the EEPROM to 0.
 * This example code is in the public domain.

 */

#include <EEPROM.h>

void setup()
{
  // write a 0 to all 512 bytes of the EEPROM
  for (int i = 0; i < 512; i++)
    EEPROM.write(i, 0);
   
  // turn the LED on when we're done
  digitalWrite(13, HIGH);
}

void loop()
{
}
carico lo scrip e quando rivado a mettere lo sketch mi prendera sempre il pin 1234 che ho impostato come default a inizio sketch giusto?
Logged

0
Offline Offline
Faraday Member
**
Karma: 23
Posts: 2797
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Code:
avrdude -p m328p -c avrispmkii -P usb:40:03 -U eeprom:r:eeprom-328.bin:r

il programma avrdude legge dalla eeprom e scrive il contenuto in un file di nome eeprom-328.bin

La "r" finale significa "raw" la puoi sostituire con "h" per il formato esadecimale ed altre che non ricordo, in pratica scrivendo raw puoi usare un editor binario per vedere il contenuto.

Se non ti serve creare un file cambi il codice così:
Code:
avrdude -p m328p -c avrispmkii -P usb:40:03 -U eeprom:r:-:r

Così scriverà il contenuto della eeprom direttamente a video.

Ovviamente tu devi trovare cosa mettere dopo "-c avrispmkii -P usb:40:03" perchè questo dipende dal programmatore che usi.

Quello che segue è l'ouput in shell bash su GNU/linux:
Code:
[mauro@localhost master-build-desktop]$ avrdude -p m328p -c avrispmkii -P usb:40:03 -U eeprom:r:-:r

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.01s

avrdude: Device signature = 0x1e950f
avrdude: reading eeprom memory:

Reading | ################################################## | 100% 0.19s

avrdude: writing output file "<stdout>"

1: COTONE SPORCO 2-
_��2: COTONE SPORCO 1#P�x3: COTONE/LINOO 1#<�Y4: SINTETICIOO 12�<5: DELICATI 2O 1-�76: DELICATI 1O 1X87: ACRILICI/LANA1(�8: PURA LANA VERGINE�- 9: LINGERIE/RICAMIE� 10: User Program 9E��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
avrdude: safemode: Fuses OK

avrdude done.  Thank you.

[mauro@localhost master-build-desktop]$


Ciao.
Logged

AvrDudeQui front end per avrdude https://gitorious.org/avrdudequi/pages/Home

Pages: [1]   Go Up
Jump to: