SD Card beschreiben

Heiner 2010-02-07 21:25:10 Link
Ich bekomme es nicht hin, auf die Sd card zu schreiben. Lesen kann, dir
anzeigen, geht alles.

Was mache ich falsch?

Auf der console sehe das mount mit result = 0 endet, also ok. Dann geht es
aber nicht weiter.

Hier mein Code:

#include <SDcard.h>
#include <S65Display.h>

//#define _USE_STRFUNC 1

SDcard sd;
S65Display lcd;

char text[] = "123";

ISR(TIMER2_OVF_vect)
{
  static uint8_t count=1;

  TCNT2 -= 250; //1000 Hz

  if(--count == 0) //100 Hz
  {
    count = 10;
    sd.service();
  }
}

void schreib(){
    Serial.println("Function schreib");
    FATFS fs[1];
    FIL fdst;
    //    BYTE buffer[4096];
    FRESULT res;
    UINT bw;
    



    // Register a work area for logical drive 0
    res = f_mount(0, &fs[1]);
    Serial.print("res: ");
    Serial.println(res);
    Serial.println("mount");

    // Create destination file
    Serial.println("Vor open");
    res = f_open(&fdst, "0:dstfile.dat", FA_CREATE_ALWAYS | FA_WRITE);
    Serial.println("open");

    int res_p = f_puts(text, &fdst);
    Serial.println("put");
        
    f_close(&fdst);
    Serial.println("close");

    // Unregister a work area before discard it
    f_mount(0, NULL);
    Serial.println("end fuction");
}


void setup(){
  Serial.begin(9600);
  
  //init SD-Card
  sd.init(2); //spi-clk = Fcpu/4

  //init LCD
  lcd.init(4); //spi-clk = Fcpu/4
  lcd.clear(RGB(0,0,0));

}

void loop (){
  for (int z=0;z<20;z++) {
    schreib();
    Serial.print(z);
    Serial.print(" * geschrieben");
    Serial.println();
    delay(10000);
  }
}

Andreas Watterott 2010-02-07 22:23:41 Link
Hallo,

da sind einige Fehler im Code. Hier ein Bsp:

#include <S65Display.h>
#include <SDcard.h>

S65Display lcd;
SDcard sd;


ISR(TIMER2_OVF_vect)
{
  static uint8_t count=1;

  TCNT2 -= 250; //1000 Hz

  if(--count == 0) //100 Hz
  {
    count = 10;
    sd.service();
  }
}


void write_something(void)
{
  FIL fdst;     //file objects
  FRESULT res;  //result code
  UINT wr;      //file R/W count
  char data[16];

  res = f_open(&fdst, "xxx.txt", FA_CREATE_ALWAYS | FA_WRITE);
  if(res == FR_OK)
  {
    strcpy(data, "test 123");
    res = f_write(&fdst, data, strlen(data), &wr);
    f_close(&fdst);
  }
}


void setup()
{
  //init LCD
  lcd.init(4); //spi-clk = Fcpu/4

  //init SD-Card
  sd.init(4); //spi-clk = Fcpu/4

  //init Timer2
  TCCR2B  = (1<<CS22); //clk=F_CPU/64
  TCNT2   = 0x00;
  TIMSK2 |= (1<<TOIE2); //enable overflow interupt
  
  //interrupts on
  sei();

  if(sd.mount() == 0)
  {
    write_something();
    sd.unmount();
  }
}


void loop()
{

}

Heiner 2010-02-08 14:32:29 Link
Herzlichen Dank Andreas, (mal wieder prompte Antwort)
ich hatte mir das aus dem Beispiel in der Docu zur sd-card-lib unter dem
Befehl f_open herauskopiert und modifiziert.

Verbesserungsvorschlag für Anfänger wie mich: ein Beispielsketch für Daten
schreiben in deine Lib. 

Vielleicht wollen ja noch mehr dau's z.B. Daten zwischenspieichern um sie
dann anzuzeigen. Ich bastele am Aufzeichnen meiner Strom- und Gasverbräuche
(hab ich zur Zeit im eeprom) auf der sd-card. Mit einem Menue möchte ich
dann das Tages- Wochen- oder Jahresprofil auf dem s65 anzeigen.

Andreas Watterott 2010-02-08 15:15:09 Link
Ich habs mit in die S65 Software Lib aufgenommen.

Gruß
Andreas

Reply

Name
eMail (not visible)
Subject (no text only in upper case; no HELP, URGENT...)
Text
HTML tags are not supported and links are generated automatically if they start with http or ftp.
Please submit long source code or log files as attachment (only registered users).
Please enter the number 9244