SD Card beschreiben

Heiner NoUser 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 User 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 NoUser 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 User 2010-02-08 15:15:09 Link
Ich habs mit in die S65 Software Lib aufgenommen.

Gruß
Andreas

Antworten

Name
eMail (wird nicht angezeigt)
Betreff (keinen Text nur mit Großbuchstaben; kein HILFE, HELP...)
Text
HTML Tags werden nicht unterstützt und Links werden automatisch erstellt, wenn sie mit http o. ftp beginnen.
Längeren Sourcecode oder Logdateien bitte als Dateianhang einfügen (nur registrierte Benutzer).
Bitte die Zahl eingeben 6077