• Welcome to LusoRobótica - Robótica em Português.
 

Gravar no sd card

Started by Alentejo, 28 de July de 2009, 12:15

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

Alentejo

Ola bom dia!! eu gostaria que me podesem dar uma ajuda! Eu tou a tentar gravar um ficheiro no sd card e nesse ficheiro ter lá "Bom dia" e dps o consiga ver no hiperterminal!! Agradeço desde ja a vossa atensão!!abraços


Alentejo

Obrigado Ricardo!!Ja consigo escrever no cartao e ler atraves do hiperterminal!!Abraços

ricard0g0mes

Quote from: Alentejo on 28 de July de 2009, 16:18
Obrigado Ricardo!!Ja consigo escrever no cartao e ler atraves do hiperterminal!!Abraços

naquilo que puder ir ajudando ;)

Alentejo

Ricardo sera possivel nós fazermos um ficheiro sem termos de o escrever no cartao? Isto é eu tou a utilizar o arduino onde tenho o sd card ligado a ele e queria por la ficheiros sem ter que os escrever no cartao!Obrigado

ricard0g0mes

Quote from: Alentejo on 29 de July de 2009, 10:49
Ricardo sera possivel nós fazermos um ficheiro sem termos de o escrever no cartao? Isto é eu tou a utilizar o arduino onde tenho o sd card ligado a ele e queria por la ficheiros sem ter que os escrever no cartao!Obrigado

não entendi a pergunta...
queres por ficheiros no cartao sem ter de os escrever... nao entendo.
explica-te melhor...

Alentejo

As paginas que você me indicou eu consegui escrever e ler o conteudo de um ficheiro!!Mas esse ficheiro foi inserido por mim no proprio cartao do sd card!! O que eu pertendia era agora programar de modo a fazer ficheiros no sd card!! Percebeu?

iMartins87

Fiz esta montagem com o seguinte código:

Quote
#include <sd-reader_config.h>
#include <sd_raw.h>
#include <sd_raw_config.h>

int print_disk_info();
int sample();
int readDisk();

byte incomingByte;
void printWelcome();
long int address;
byte tempBytes[2];


void setup()
{

 Serial.begin(9600);
 delay(1000);

 printWelcome();
 if(!sd_raw_init())
 {
    Serial.println("MMC/SD initialization failed");
 }
 print_disk_info();
}



void loop()
{
   int i;

   if(Serial.available()>0)
   {
      incomingByte=Serial.read();

    switch(incomingByte)
    {
        case 114:
            readDisk();
            break;
        case 115:
            sample();
            break;
        default:
            break;
    }
   }
}

int sample()
{
   int i,j;
   int temp;
   byte low;
   byte high;
   byte inByte;

   Serial.println();
   Serial.println();
   Serial.println("Sampling..");
   for(i=0;i<500;i=i+2)
   {
     if(Serial.available()>0)
     {
      inByte=Serial.read();
      if(inByte==113) return 0;
     }
     temp=analogRead(0);
     Serial.print(temp,DEC);
     Serial.print(" ");

     //Convert int to 2 bytes
     low=temp&0xFF;
     high=temp>>8;
    // Serial.print(temp,DEC);
     //Serial.print(low,DEC);
     //Serial.print(high,DEC);

     tempBytes[0]=low;
     tempBytes[1]=high;

     if(!sd_raw_write(i,tempBytes,2))
     {
       Serial.print("Write error");
     }
     //sd_raw_sync();
     delay(5000);

 Serial.println();

   }

   return 1;
}


int readDisk()
{
   byte low;
   byte high;
   byte info[2];
   int i;
   int  result;
   Serial.println();
   for(i=0;i<50;i=i+2)
   {
     sd_raw_read(i,info,2);

     //Serial.print(info[0],DEC);
     //Serial.print(" ");
     //Serial.print(info[1],DEC);
     low=info[0];
     high=info[1];
     result=high<<8;
     //result<<8;
     Serial.print(" ");
     Serial.print(result+low,DEC);
     Serial.print(" ");
   }

}

void printWelcome()
{
   Serial.println("------------------------");
   Serial.println("Data sampling system");
   Serial.println("send r to read disk");
   Serial.println("send s to start sampling");
   Serial.println("send q to stop sampling");
   Serial.println("Ready.....");
   Serial.println("-------------------------");
}


int print_disk_info()
{


   struct sd_raw_info disk_info;
   if(!sd_raw_get_info(&disk_info))
   {
     return 0;
   }


   Serial.println();
   Serial.print("rev:    ");
   Serial.print(disk_info.revision,HEX);
   Serial.println();
   Serial.print("serial: 0x");
   Serial.print(disk_info.serial,HEX);
   Serial.println();
   Serial.print("date:   ");
   Serial.print(disk_info.manufacturing_month,DEC);
   Serial.println();
   Serial.print(disk_info.manufacturing_year,DEC);
   Serial.println();
   Serial.print("size:   ");
   Serial.print(disk_info.capacity,DEC);
   Serial.println();
   Serial.print("copy:   ");
   Serial.print(disk_info.flag_copy,DEC);
   Serial.println();
   Serial.print("wr.pr.: ");
   Serial.print(disk_info.flag_write_protect_temp,DEC);
   Serial.print('/');
   Serial.print(disk_info.flag_write_protect,DEC);
   Serial.println();
   Serial.print("format: ");
   Serial.print(disk_info.format,DEC);
   Serial.println();
   Serial.print("free:   ");

   return 1;
}



Mas no entanto não consigo escrever nada no cartão SD porque mal inicio o HyperTerminal ele começa com o seguinte:

Quote
------------------------
Data sampling system
send r to read disk
send s to start sampling
send q to stop sampling
Ready.....
-------------------------

rev:    28
serial: 0x8F94BC8E
date:   1
7
size:   512229376
copy:   0
wr.pr.: 0/0
format: 0
free:

Sampling..
552
546
553
554
555
556
556

...e os números continuam e não param!!!

Alguém me pode dizer se isto é normal, caso não o que posso fazer para poder resolver esta situação?


Njay

#8
Com o código que tens sim, é perfeitamente normal. Ele vai imprimir números cerca de 250 vezes, com 5 segundos de intervalo entre cada impressão:

for (i = 0; i < 500; i = i + 2)
{
    (...)

    temp = analogRead(0);
    Serial.print(temp, DEC);
    Serial.print(" ");

    (...)

    delay(5000);
    Serial.println();
}

Só pára se carregares na tecla "q" minúscula (ascii 113; percebia-se logo se estivesse escrito 'q' em vez de 113), por causa desta parte:

if (Serial.available() > 0)
{
   inByte = Serial.read();
   if (inByte == 113) return 0;
}