Queridos compañeros...
No suelo escribir en foros porque hoy en día casi la totalidad de los problemas ya los ha tenido otro antes...
El caso es que he buceado a fondo en los foros sobre este problema y aunque dan posibles soluciones, a mi no me han funcionado.
El caso es que me regalaron una ATMega1280 y me gusto el tema, asi que me puse a trastear con ella.
Despues de varios proyectos chorras para jugar me gustó la idea de comprar una shield ethernet con la que conectarme a un servidor para enviar datos. Así que me hice con una.
Vi que traía un puerto para una sd lo cual me gustó.
Cuando me ha llegado lo primero que hice fue probar la ethernet y funcionaba de maravilla, y además casi a la primera (lo mio es mucho de prueba error... uno que es cabezón).
El caso es que despues de estar una hora al menos enredando con el tema ethernet se me ocurrió probar la sd. Vi que admitía varios tamaños (tengo aquí, 1gb, 2gb, 16gb y 32gb) así que eso no era problema, formateo y la meto.
Cargo el programa por defecto de sketch (el de escribir y leer) lo dejo aquí debajo, y grata sorpresa que funciona. O_O
Pues bien, mi siguiente reto era mostrar dos digitos a traves de un par de 74HC595, despues de estar toda una tarde, al final conseguí hacerlo a mi manera. Uso en este caso los Pines digitales 8, 11, 12.
Me propongo lo siguiente, que es que los digitos muestren los datos de un sensor (el que tenía a mano es un DHT11), así que consiguo sin problema mostrar la temperatura y humedad. Uso el Pin digital 2 para obtener los datos del sensor.
Ahora me digo, bueno pues voy a escribir en la sd estos valores y aquí comienza mi tortura. Al juntarlo todo la tarjeta no va. Al cabo de un rato me doy cuenta de que la tarjeta usa los pines 4, 11, 12, 13 (el 13 lo usaba yo también para mostrar un ciclo completo...
)
Me digo, que fácil, cambio los pines del display y listo... pues no... me tiro un rato hasta que digo, voy a probar la tarjeta sola, sin nada más, con su código solamente... y nada, ya no me ha vuelto a funcionar.
Despues de bucear veo que sd y ethernet "no funcionan" juntas o si lo hacen no es recomendable.
También leí que había que poner en alto el pin 10 cuando se usa la sd para evitar conflicto con la ethernet... cosa a mi tarjeta le da lo mismo.
Lo último que he probado es la ethernet y si que va bien, pero la sd no hay manera.
Despues de este rollo (os lo he contado todo por si sirve de algo) el caso es que aunque no esté pensando en utilizar la sd, me sabe mal no saber que está pasando y porque no puedo volver a utilizar la sd.
Muchas gracias a todos por vuestra ayuda.
Dejo aquí los códigos que he utilizado.
PD. también he probado la librería SDFat sin existo.
Este es el código con el HIGH al pin 10.
/*
SD card test
This example shows how use the utility libraries on which the'
SD library is based in order to get info about your SD card.
Very useful for testing a card when you're not sure whether its working or not.
The circuit:
* SD card attached to SPI bus as follows:
** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
** CS - depends on your SD card shield or module.
Pin 4 used here for consistency with other Arduino examples
created 28 Mar 2011
by Limor Fried
modified 9 Apr 2012
by Tom Igoe
*/
// include the SD library:
#include <SD.h>
// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;
// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
const int chipSelect = 4;
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
}
// disable w5100 SPI
pinMode(10,OUTPUT);
digitalWrite(10,HIGH);
Serial.print("\nInitializing SD card...");
// rest of your setup stuff
// we'll use the initialization code from the utility libraries
// since we're just testing if the card is working!
if (!card.init(SPI_HALF_SPEED, chipSelect)) {
Serial.println("initialization failed. Things to check:");
Serial.println("* is a card is inserted?");
Serial.println("* Is your wiring correct?");
Serial.println("* did you change the chipSelect pin to match your shield or module?");
return;
} else {
Serial.println("Wiring is correct and a card is present.");
}
// print the type of card
Serial.print("\nCard type: ");
switch(card.type()) {
case SD_CARD_TYPE_SD1:
Serial.println("SD1");
break;
case SD_CARD_TYPE_SD2:
Serial.println("SD2");
break;
case SD_CARD_TYPE_SDHC:
Serial.println("SDHC");
break;
default:
Serial.println("Unknown");
}
// Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
if (!volume.init(card)) {
Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
return;
}
// print the type and size of the first FAT-type volume
uint32_t volumesize;
Serial.print("\nVolume type is FAT");
Serial.println(volume.fatType(), DEC);
Serial.println();
volumesize = volume.blocksPerCluster(); // clusters are collections of blocks
volumesize *= volume.clusterCount(); // we'll have a lot of clusters
volumesize *= 512; // SD card blocks are always 512 bytes
Serial.print("Volume size (bytes): ");
Serial.println(volumesize);
Serial.print("Volume size (Kbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.print("Volume size (Mbytes): ");
volumesize /= 1024;
Serial.println(volumesize);
Serial.println("\nFiles found on the card (name, date and size in bytes): ");
root.openRoot(volume);
// list all files in the card with date and size
root.ls(LS_R | LS_DATE | LS_SIZE);
}
void loop(void) {
}
Y el que me funcionó al principio es este:
/*
SD card read/write
This example shows how to read and write data to and from 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 myFile;
void setup() {
// Open serial communications and wait for port to open:
Serial.begin(9600);
while (!Serial) {
; // wait for serial port to connect. Needed for native USB port only
}
Serial.print("Initializing SD card...");
if (!SD.begin(4)) {
Serial.println("initialization failed!");
return;
}
Serial.println("initialization done.");
// open the file. note that only one file can be open at a time,
// so you have to close this one before opening another.
myFile = SD.open("test.txt", FILE_WRITE);
// if the file opened okay, write to it:
if (myFile) {
Serial.print("Writing to test.txt...");
myFile.println("testing 1, 2, 3.");
// close the file:
myFile.close();
Serial.println("done.");
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
// re-open the file for reading:
myFile = SD.open("test.txt");
if (myFile) {
Serial.println("test.txt:");
// read from the file until there's nothing else in it:
while (myFile.available()) {
Serial.write(myFile.read());
}
// close the file:
myFile.close();
} else {
// if the file didn't open, print an error:
Serial.println("error opening test.txt");
}
}
void loop() {
// nothing happens after setup
}
Los errores que me salen son:
Initializing SD card...initialization failed. Things to check:
* is a card is inserted?
* Is your wiring correct?
* did you change the chipSelect pin to match your shield or module?
y con el original:
Initializing SD card...initialization failed!
