Pages: [1]   Go Down
Author Topic: [RISOLTO] Rimozione SD e ripristino automatico al reinserimento  (Read 700 times)
0 Members and 1 Guest are viewing this topic.
Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2757
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ciao a tutti
Ho inserito nel progetto una funzione (nello sketch) che controlla ethernet e SD card se sono correttamente funzionanti e un piccolo timer RC esterno che controlla se il micro sta funzionando correttamente o meno segnalando con un led allarme un errore generico.
Ora la domanda è :
perchè quando faccio ripetere le righe di inizializzazione degli shield al di fuori del setup richiamando gli stessi init vengono ignorati? insomma le periferiche non si ripristinano più, c'e' qualche modo per inizializzare di nuovo senza resettare tutto?

In pratica vorrei estrarre la SD leggerla e reinserirla senza dover resettare tutto oppure sostituirla con un altra "in corsa"

grazie
« Last Edit: March 12, 2012, 05:32:53 pm by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 236
Posts: 20281
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

In automatico viene chaiamata una volta la funzione setup() e poi di continuo la funzione loop(). Se non chiami la Tua funzione begin() da una delle due funzioni nominate non verrá mai eseguito.
Il C non é come il HTML, PHP, il basic o un file batch di DOS o LINUX che viene eseguito dal inizio alla fine . il C incomincia con la funzione main(). nella main() di Arduino é scritto dio eseguire 1 volta il setup() e infinite volte il loop().
Ciao Uwe
Logged

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

Credo che pablos voglia dire un'altra cosa.
Cioè che lui ha una funzione che inizializza il modulo SD. Se questa funzione viene chiamata nel setup essa funziona, se viene chiamata in un secondo momento da un altro punto dello sketch non funziona più.

@pablos:
potresti postare il codice di quella funzione e del tuo setup?
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2757
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Credo che pablos voglia dire un'altra cosa.
Cioè che lui ha una funzione che inizializza il modulo SD. Se questa funzione viene chiamata nel setup essa funziona, se viene chiamata in un secondo momento da un altro punto dello sketch non funziona più.

@pablos:
potresti postare il codice di quella funzione e del tuo setup?

esatto ... ok metto insieme i pezzi e posto grazie smiley
Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

In pratica vorrei estrarre la SD leggerla e reinserirla senza dover resettare tutto oppure sostituirla con un altra "in corsa"

Sul connettore della SD hai due segnali aggiuntivi, uno ti dice se è protetta da scrittura, l'altro ti avvisa se è inserita oppure no, questo lo devi usare per verificare se viene estratta e poi reinserita in modo da poter reinizializzare la sua lettura.
Logged

Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2757
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Sul connettore della SD hai due segnali aggiuntivi, uno ti dice se è protetta da scrittura, l'altro ti avvisa se è inserita oppure no, questo lo devi usare per verificare se viene estratta e poi reinserita in modo da poter reinizializzare la sua lettura.

il mio problema non è sapere se è presente o meno, è farla vedere di nuovo
Questo sketch funziona perfettamente fino a quando non la estraggo

Code:
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

const int SD_CS = 4;          // pin 4 is the SPI select pin for the SDcard
const int ETHER_CS = 10;   // pin 10 is the SPI select pin for the Ethernet


byte ip[] = { 192, 168, 2, 177 };                    
byte subnet[] = { 255, 255, 255, 0 };                
byte gateway[] = { 192, 168, 2, 1 };                
byte mac[] = { 0x00, 0x11, 0x22, 0x33, 0xFB, 0x11 };

const int Pin2 = 2; //uscita led errore generico
boolean has_filesystem = true;

void setup()
{
  Serial.begin(9600);
  
   pinMode(Pin2, OUTPUT);  //led errore
  pinMode(SS_PIN, OUTPUT); // set the SS pin as an output(necessary to keep the board as master and not SPI slave)
  digitalWrite(SS_PIN, HIGH); // and ensure SS is high
  // Ensure we are in a consistent state after power-up or a reset
  // button These pins are standard for the Arduino w5100 Rev 3
  // ethernet board They may need to be re-jigged for different boards
  pinMode(ETHER_CS, OUTPUT); // Set the CS pin as an output
  digitalWrite(ETHER_CS, HIGH); // Turn off the W5100 chip! (wait for configuration)
  pinMode(SD_CS, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(SD_CS, HIGH); // Turn off the SD card! (wait for configuration)

  sd_init() ;

  Ethernet.begin(mac, ip);
}

void sd_init()
{  
  if (!card.init(SPI_FULL_SPEED, SD_CS)) { has_filesystem = false; }
  if (!volume.init(&card)) { has_filesystem = false; }
  if (!root.openRoot(&volume)) { has_filesystem = false;}
}  

void loop()
{

  if (!volume.init(&card)) { has_filesystem = false; }  //Se estraggo la scheda SD ottengo un errore immediato
  
  if (!has_filesystem)
  {
    digitalWrite(Pin2, HIGH); // led ERRORE .... che si accende se estraggo la scheda
    sd_init(); // tento un ripristino
  }

..............
..............
..............

}

« Last Edit: March 12, 2012, 03:25:13 pm by UweFederer » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

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

A me viene da suggerirti di copiare tutta la parte di inizializzazione dei pin dentro alla funzione sd_init, togliendola dal setup.
Logged


Genova
Offline Offline
Faraday Member
**
Karma: 17
Posts: 2757
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Con questo possiamo rimuovere la SD visualizzando un errore con un led, al reinserimento, si inizializza nuovamente continuando la scrittura spegnendosi il led. Posso estrarre la scheda leggere i log, modificare i file e reinserirla senza riavviare arduino e tutte le periferiche connesse ..... mi piace!!! smiley

P.S. non si ripristinava perchè  "root.openRoot(&volume)" era già aperto dandomi un errore, perciò prima di tentare l'inizializzazione va chiuso con root.close(); .... ho messo anche file.close(); nel caso venisse estratta mentre sta scrivendo


Code:
#include <SPI.h>
#include <Ethernet.h>
#include <SD.h>

const int SD_CS = 4;  // pin 4 is the SPI select pin for the SDcard
const int ETHER_CS = 10; // pin 10 is the SPI select pin for the Ethernet

byte ip[] = { 192, 168, 2, 177 };                              
byte mac[] = { 0x00, 0x11, 0x22, 0x33, 0xFB, 0x11 };

const int Pin2 = 2; //uscita led errore generico
boolean has_filesystem = true;

void setup()
{
  Serial.begin(9600);
  delay(100);
  
   pinMode(Pin2, OUTPUT);  
  pinMode(SS_PIN, OUTPUT); // set the SS pin as an output(necessary to keep the board as master and not SPI slave)
  digitalWrite(SS_PIN, HIGH); // and ensure SS is high
  // Ensure we are in a consistent state after power-up or a reset
  // button These pins are standard for the Arduino w5100 Rev 3
  // ethernet board They may need to be re-jigged for different boards
  pinMode(ETHER_CS, OUTPUT); // Set the CS pin as an output
  digitalWrite(ETHER_CS, HIGH); // Turn off the W5100 chip! (wait for configuration)
  pinMode(SD_CS, OUTPUT);       // Set the SDcard CS pin as an output
  digitalWrite(SD_CS, HIGH); // Turn off the SD card! (wait for configuration)

  sd_init() ;

  Ethernet.begin(mac, ip);
}

void sd_init()
{  
  has_filesystem = true;
  if (!card.init(SPI_FULL_SPEED, SD_CS)) { has_filesystem = false; }
  if (!volume.init(&card)) { has_filesystem = false; }
  if (!root.openRoot(&volume)) { has_filesystem = false; }
}  

void loop()
{
  if (!volume.init(&card)) { has_filesystem = false; }  //Se estraggo la scheda SD ottengo un errore immediato
  if (!has_filesystem)
  {
    digitalWrite(Pin2, HIGH); // led ERRORE se SD rimossa (si accende)
     file.close();
     root.close();
     sd_init();
   }
  else
  {
    digitalWrite(Pin2, LOW); // led ERRORE rientrato (si spegne)
   }
..............
..............
..............
}

  
« Last Edit: March 12, 2012, 05:53:54 pm by pablos » Logged

Meglio imparare dalle cose inutili piuttosto che non imparare niente.   [Arduino Mega R3 + Ethernet shield W5100 + SD card 8Gb FAT32]

Pages: [1]   Go Up
Jump to: