Prima cosa un saluto a tutti.
Da un po' di tempo uso Arduino e grazie all'ottima documentazione e topic esistenti sul forum ho risolto tutti i problemi che sorgevano.
Ora però non so che fare.
Ho caricato l'esempio "listfiles" della libreria SD per leggere i file presenti sulla scheda SD e funziona infatti vedo l'elenco dei file (2 file).
Poi ho modificato tale esempio per fare un refresh ogni secondo. Il tutto funziona e mi fa vedere l'elenco dei file per 8 volte ma dalla nona in poi non mi da alcun risultato.
Ho provato col comando "rewindDirectory()" ma niente da fare.
/*
SD card basic file example
This example shows how to create and destroy an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
created Nov 2010
by David A. Mellis
updated 2 Dec 2010
by Tom Igoe
This example code is in the public domain.
*/
#include <SD.h>
File root;
void setup()
{
Serial.begin(9600);
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
root = SD.open("/");
}
void loop()
{
printDirectory(root, 0);
Serial.println("done!");
root.rewindDirectory();
delay(1000);
}
void printDirectory(File dir, int numTabs) {
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
//Serial.println("**nomorefiles**");
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
}
}
5 ) per aiutare chi vi vuole aiutare descrivere:
a ) l'hardware utilizzato nel dettaglio: il tipo di Arduino, i componenti usati
b ) il sistema operativo usato: spesso le cose cambiano da SO a SO, inoltre già si può ricevere aiuto da chi ha lo stesso SO
c ) nel caso di un programma che non funziona, includere sempre lo sketch con i tag specifici (l'icona "#")
d ) nel caso di collegamenti elettrici, riportare sempre lo schema preferibilmente disegnato con Eagle o Kicad, evitare schizzi a mano o Fritzing (va bene per i blog, non va bene per chiedere aiuto)
e ) descrivere bene cos'è che non va e cosa dovrebbe invece accadere. Dire "la seriale non funziona" non significa nulla, bisogna dire cosa si sta facenda con la seriale (spedire un carattere, aspettare un input), cosa succede e cosa invece dovrebbe succedere
Stai usando uno shield SD, una ethernet con SD, IDE 1.0.1 ?
Innanzitutto buongiorno a tutti e grazie dell' eventuale aiuto che mi vorrete fornire :),
sono decisamente nuovo del forum e ho cercato di seguire le regole indicate in http://arduino.cc/forum/index.php/topic,149014.0.html, quindi credo che sia meglio aggiungere il mio problema qui visto che e' uguale a quello descritto in questo topic.
In pratica, dopo il 3' ciclo di esecuzione del programma l'elenco dei files visualizzato si accorcia man mano fino ad azzerarsi.
Ho installato prorpio ieri la versione 1.04 e sto lavorando con un Arduino1 rev 3 e una SD shield (FuturaNet: Il portale per makers ed elettronica by Futura Group)
presa in un negozio qui vicino, il tutto gira su windows XP.
Il programma, preso dall' esempio indicato nelle librerie SD per openNextFile(), e' il seguente :
#include <SD.h>
#include <avr/pgmspace.h>
#include "Tlc5940.h"
#include "showarray.h"
File root;
void setup() {
// You can optionally pass an initial PWM value (0 - 4095) for all channels.
Tlc.init();
// Open serial communications for DEBUG
Serial.begin(9600);
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
// utilizzo il pin 8 x evitare problemi in quanto il pin 10 e' usato dal TLC5940.
// Sulla mia SD shield CS e' selezionabile tramite jumper
if (!SD.begin(8)) {
// inserire segnalazione errore n. 1
Serial.println("initialization failed!");
return;
}
Serial.println(" done.");
root = SD.open("/");
}
void printDirectory(File dir, int numTabs) {
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
Serial.println("**nomorefiles**");
//mancava azzeramento contatore files nell'esempio, preso da versione 1.04,
//necessario visto che printDirectory viene eseguito + volte
[color=red]dir.rewindDirectory();[/color]
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
}
}
void loop() {
unsigned int numframe;
unsigned int channel;
unsigned int temp;
[color=red]printDirectory(root, 0)[/color];
for ( numframe = 0; numframe < SHOW_FRAMES; numframe++ ) {
#ifdef DEBUG
Serial.println( );
Serial.print( numframe );
Serial.print( "-" );
#endif
for ( channel = 0; channel < 16; channel++ ) {
temp = pgm_read_byte_near( showarray + numframe * 16 + channel );
Tlc.set ( channel, 16 * temp );
#ifdef DEBUG
Serial.print( temp );
#endif
}
Tlc.update();
int ritardo = analogRead(0);
delay(ritardo);
}
}
L'output del programma su seriale e' il seguente :
Spero che non si tratti di interferenze con le librerie "TLC5940" perche' non saprei proprio come fare senza di esse, ma visto che succedeva anche all' utente di questo post che non le usava, direi proprio di no.
In attesa di una vostra risposta, cordialmente, Andrea Molteni
ho guardato nell' esempio (http://arduino.cc/en/Reference/FileOpenNextFile) e quelle due righe non le vedo... Comunque, ho provato lo stesso ad aggiungerle nel codice dove + mi sembrava logico e la cosa non e' cambiata.
Ho riscritto il codice comprendendo solo l'esempio e le librerie x Tlc :
#include <SD.h>
#include "Tlc5940.h"
#include <SPI.h>
File root;
void setup() {
// You can optionally pass an initial PWM value (0 - 4095) for all channels.
Tlc.init();
// Open serial communications for DEBUG
Serial.begin(9600);
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(10, OUTPUT);
// utilizzo il pin 8 x evitare problemi in quanto il pin 10 e' usato dal TLC5940.
// Sulla mia SD shield CS e' selezionabile tramite jumper
if (!SD.begin(8)) {
// inserire segnalazione errore n. 1
Serial.println("initialization failed!");
return;
}
Serial.println(" done.");
root = SD.open("/");
}
void printDirectory(File dir, int numTabs) {
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
Serial.println("**nomorefiles**");
//mancava azzeramento contatore files nell'esempio, preso da versione 1.04,
//necessario visto che printDirectory viene eseguito + volte
dir.rewindDirectory();
entry.close();
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
}
}
void loop() {
printDirectory(root, 0);
delay(1000);
}
OK Mod... ho trovato il tasto.
Gia' ke c sono volevo segnalare anke il NON funzionamento del tasto destro del mouse nella finestra Cattura Seriale.
I tasti CTRL+C e CTRL+V invece funzionano regolarmente...
Ciao, Andres
andres26:
Gia' ke c sono volevo segnalare anke il NON funzionamento del tasto destro del mouse nella finestra Cattura Seriale.
I tasti CTRL+C e CTRL+V invece funzionano regolarmente...
Ciao, Andres
Questo si sa, ma non è un bug penso. Siccome il monitor seriale non è un vero terminale ma una semplice finestra, penso che chi ha disegnato quel form semplicemente non ha implementato la gestione dei click del mouse.
ci ho messo un pò per capire che quel loop non era infinito....
edit: il fatto che non chiudi il file, vuol dire che la libreria tiene in memoria il descrittore del file. Puoi avevre un numero limitato di descrittori aperti in una volta sola (limitazione che esiste anche nei PC)
questo è l'esempio che si trova nell'ide 152, ho cambiato il pin 10 in 4 per la mia sheld, e ho aggiunto digitalwrite(4,1), l'ho provato e funziona
/*
SD card basic file example
This example shows how to create and destroy an SD card file
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11
** MISO - pin 12
** CLK - pin 13
** CS - pin 4
created Nov 2010
by David A. Mellis
modified 9 Apr 2012
by Tom Igoe
This example code is in the public domain.
*/
#include <SPI.h>
#include <SD.h>
File root;
void setup()
{
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
Serial.print("Initializing SD card...");
// On the Ethernet Shield, CS is pin 4. It's set as an output by default.
// Note that even if it's not used as the CS pin, the hardware SS pin
// (10 on most Arduino boards, 53 on the Mega) must be left as an output
// or the SD library functions will not work.
pinMode(4, OUTPUT);
digitalWrite(4,1);
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
root = SD.open("/");
printDirectory(root, 0);
Serial.println("done!");
}
void loop()
{
// nothing happens after setup finishes.
}
void printDirectory(File dir, int numTabs) {
while(true) {
File entry = dir.openNextFile();
if (! entry) {
// no more files
//Serial.println("**nomorefiles**");
break;
}
for (uint8_t i=0; i<numTabs; i++) {
Serial.print('\t');
}
Serial.print(entry.name());
if (entry.isDirectory()) {
Serial.println("/");
printDirectory(entry, numTabs+1);
} else {
// files have sizes, directories do not
Serial.print("\t\t");
Serial.println(entry.size(), DEC);
}
entry.close();
}
}
ci ho messo un pò per capire che quel loop non era infinito....
Guarda che non l'ho mica scritto io il codice...
Come c'e' scritto + sopra nelle reply, e' un esempio che ho preso pari pari dalla pagina (SD - Arduino Reference), cioe' Reference -> Libraries -> SD -> openNextFile().