Newsgroup: it.hobby.elettronica.digitale
Titolo: SD PIC FAT : velocità di lettura

Ciao,
volevo usare un P18 per leggere un file su SD (FAT16).
La domanda da profano (rivolta a chi ha già provato ovviamente) è:
Con clock diciamo a  32Mhz, quanto impiego (mediamente) a leggere un
byte, in modo sequenziale (escludiamo il tempo di aprire il file,
ipotizziamo che l'SD sia appena formattata e i file non frammentati) ?
Chiaramente userei le routine già pronte dei vari compilatori in giro,
ma era per avere un idea dell'ordine di grandezza... 1ms? 3 ms? 10 ms?
0.5 ms?
grazie

 ha
scritto:

Bisogna vedere se usi una spi hardware o software, ma il tempo per leggere un
byte da SD è molto basso, dell'ordine dei microsecondi, una decina di cicli di
clock spi, se escludi il workaround della FAT16.
--
ciao
  Stefano

 ha

volevo fare quelche prova con uC o uPascal della mikroelektronika
usando Mmc_Init
Mmc_Read_Sector
Mmc_Write_Sector
quindi penso sia HW

 quindi penso sia HW
le funzioni che citi non riguardano la scrittura con filesystem. devi fare:
spi_init()
mmc_fat_init
mmc_fat_assign
eventualmente:
mmc_fat_append
e:
mmc_fat_write
o:
mmc_fat_read
guardati la guida. Le nuove librerie sono veramente dei begli oggetti, è 
implementato anche il quickformat
con un clock a 40MHz, e quindi frequenza di istruzione di 10MHz , riesco ad 
"appendere" a file di qualche mega in meno di 1ms (non ho misurato con 
precisione). Ricordati che il massimo rendimento lo ottieni a trasferire 
blocchi di 512byte, che è la dimensione di una pagina interna
Ricordati, comunque, che l'accesso con SPI tradizionale è la modalità più 
lenta. Esiste un modo per accederci 4bit alla volta e non 1 soltanto, che è 
il metodo utilizzato da macchine fotografiche e videocamere, con il quale si 
riesce a trasferire diversi mega al secondo (quindi saresti sotto al 
microsecondo)
Ciao
-- 
____________________
      CG Engineering
 Lab. Ricerca & Sviluppo
********************
Skype : cg_ingegnering
MSN : 
cgaudiola...@interfree.it
ICQ UIN# : 104528066

che tu sappia quelle proc sono ottimizzate x 4 bit ?

> che tu sappia quelle proc sono ottimizzate x 4 bit ?
no, perchè sfruttano l'spi hardware dei pic.
in più hanno il difetto di essere closed-source, quindi nemmeno 
ottimizzabili (anche se vanno già bene), in particolare potrebbero essere 
alleggerite di funzioni non sfruttate


 ICQ UIN# : 104528066

 ha scritto nel messaggio 
news:1192515651....@v29g2000prd.googlegroups.com...



oopsss allora non ti ripeto quello che mi hanno detto qua (http://
groups.google.com/group/sci.electronics.design/browse_frm/thread/
d8fdd63caf694b53/#)
per Mikro* ....

 per Mikro* ....
Cosa dirti, hanno ragione al 100%.
Io ho sempre usato il compilatore CCS C, e funziona decisamente meglio, 
peccato che la quantità di librerie di mikroC spesso è comodissima da 
utilizzare per sviluppare dei piccoli sottosistemi. Intendo dire piccoli 
processori che gestiscono una periferica, con una libreria mikroC sopra. 
Dopodichè un eventuale processore principale con un programma scritto con un 
compilatore più serio.
Devi considerare anche che il CCS esiste da venti anni mentre il mikroC è 
molto più giovane. Peccato per la loro politica del closed-source, ma la 
condivido visto che come compilatore è effettivamente piuttosto scarso.
C18 probabilmente è il compilatore più serio, anche se il loro "mass storage 
driver" mi dà seri dubbi....
Per quanto riguarda i punti da lui segnalati, per esempio la storia degli 
interrupt che ci mettono millisecondi....beh....mi dà seri dubbi sulle sue 
doti di programmatore, visto che mikroC dà pieno controllo sugli interrupt, 
semplicemente facendo puntare ad una funzione, totalmente "user" dal 
prototipo  void interrupt(void)....cosa vuoi di più?
Ciao
CG 

tornando alle librerie x mmc/sd.
Un vecchio progetto di anton di uPascal ha i sorgenti delle
librerie...
Non so quanto affidabile sia...
Volevo rifare il suo progetto wav player con qualche modifica.
Tuttavia non riesco a compilare coi P18 le procedure SoftI2C in
uPascal, quindi mi ero voltato sul uC... ma il C non lo uso e mi trovo
in difficoltà...
Procedure MMC_Read_Sector(sector : longint; var data : array[0..511]
of byte);
var  i          : word;
     byte_start : longint;
begin
  SSPCON1 := $22;              // select fast SPI mode for SD/MMC card
  byte_start := sector shl 9;  // 512 * sector
  MMC_SPI($FF);                // start clocking the card
  MMC_SPI($FF);
  MMC_SPI($FF);                // start clocking the card
  MMC_SPI($FF);
  MMC_SPI($FF);                // start clocking the card
  MMC_SPI($FF);
  FSR0Ptr := portaddress;
  ClearBit(INDF0,___cs);        // chip select card
  MMC_Send_Command($11, byte_start, $FF);   // opcode to read from
card
  while(MMC_SPI($FF) <> $FE) do nop;        // wait for 0xFE
  for i := 0 to 511 do         // save 512 bytes into data
  Begin
       data[i] := MMC_SPI($FF);
  End;
  MMC_SPI($FF);                // start clocking the card
  MMC_SPI($FF);
  FSR0Ptr := portaddress;
  SetBit(INDF0, ___cs);          // deselect the card
  SSPCON1 := $22;              // return to slow SPI
end;

 in difficoltà...
Io non conosco bene il pascal. Con il C me la cavo piuttosto bene
Se hai un problema con le librerie, posta sul forum, qualcuno saprà 
sicuramente aiutarti.
Ciao
-- 
____________________
      CG Engineering
 Lab. Ricerca & Sviluppo
********************
Skype : cg_ingegnering
MSN : 
cgaudiola...@interfree.it
ICQ UIN# : 104528066

 sicuramente aiutarti.
intendi quello di uC o uPascal ?

intendi quello di uC o uPascal ?
Quello di uPascal. Volevo dirti che col pascal non riesco ad aiutarti in 
tempi antropici (l'ultima volta che ho programmato in pascal risale a 7-8 
anni fa :) mentre col C macino tutti i giorni)
Ciao
CG

 CG
Allora ti chiedo una subito una cosa c'è modo di definire una
etichetta "simbolica" ad un particolare registro / registro pin ?
Per esempio in alcuni compilatori posso dire
Symbol LED_Rosso as RA.1
E riferirmi a LED_Rosso ogni qualvolta voglio avere accesso a RA.1

 E riferirmi a LED_Rosso ogni qualvolta voglio avere accesso a RA.1
Ti ripeto che non conosco il pascal
In C si può fare, quindi credo equivalentemente anche in pascal.
In C ci sono 2 modi: il primo è
#define     LED_Rosso      PORTA.F1
...
LED_Rosso = 1;    //per esempio
....
oppure:
typedef     PORTA.F1    LED_Rosso;
e utilizzarlo come sopra. Comunque anche soltanto facendo un giro sui vecchi 
post dei forum si imparano migliaia di queste cose, che sono 
importantissime, visto che poi il codice diventa molto più leggibile, e nel 
caso dovessi cambiare pin o porta devi solo modificare una istruzione
Ciao
CG 

Ok, grazie.
Stavo provando questo codice allegato.
Con il PIC leggo e scrivo senza problemi.
Se metto la MMC sul PC, vedo il file creato, la dimensione corretta,
ma se lo apro con notepad mi dà errore di lettura, come se ci fossero
problemi con la FAT.
Se poi provo ad impostare la data, il contenuto del file prende
casualmente quello di altri presenti nella scheda.
Sto usando uC 6.2.1 ...
Cosa consigli ?
unsigned short init_ok;
unsigned short car_blink;
unsigned long  i, size;
char
 filename[14] = "MIKRO00xTXT",          // File names
 file_contents[50] = "XX MMC/SD FAT16 library by Anton Rieckert\n";
void main() {
  TRISB = 0;                // PORTB is output
   ADCON1 = 0x0f ;
  TRISA=0;
  Lcd_Init(&PORTB);         // Initialize LCD connected to PORTB
  Lcd_Cmd(Lcd_CLEAR);       // Clear display
  Lcd_Cmd(Lcd_CURSOR_OFF);  // Turn cursor off
  Lcd_Out(1, 1, "MMC TEST");      // Print text to LCD, 2nd row, 1st
column
  Lcd_Out(2, 1, "Attendi");      // Print text to LCD, 2nd row, 1st
column
  Spi_Init_Advanced(MASTER_OSC_DIV16, DATA_SAMPLE_MIDDLE,
CLK_IDLE_LOW, LOW_2_HIGH);
  car_blink=32;
  do
   {
      init_ok=Mmc_Fat_Init(&PORTC,2);
      Lcd_Out(2, 1, "INIT Error");
      delay_ms(1000);
      if (car_blink==32)  {
        car_blink=42 ;
       }
       else {
        car_blink=32;
       }
       Lcd_chr(2, 14, car_blink);
    }
  while (init_ok != 0);
  Lcd_Out(2, 1, "INIT OK        ");      // Print text to LCD, 2nd
row, 1st column
  filename[7] = 'S';
  Mmc_Fat_Assign(&filename, 1);        // Will not find file and then
create file
  //Mmc_Fat_Set_File_Date(2005,9,30,17,41,0);
  Mmc_Fat_Rewrite();                   // To clear file and start with
new data
  Mmc_Fat_Write(file_contents, 42);  // write data to the assigned
file
  init_ok=Mmc_Fat_Assign(&filename, 0);
 // if (init_ok==1) {
     Mmc_Fat_Reset(&size);            // To read file, procedure
returns size of file
     for (i = 1; i <= size; i++) {
         Mmc_Fat_Read(&car_blink);
         Lcd_chr(2, 14, car_blink);
         delay_ms(700);
      }
   //  }
   //  else
   //  {
   //    Lcd_Out(1, 1, "NO FILE    ");
   //  }
}//~!

 Cosa consigli ?
Non ho letto il codice.... anche perchè stai usando librerie DEPRECATED. Il 
codice non è compatibile, e dovrai riscriverlo. Le vecchie librerie hanno 
dei problemi, come per esempio il nome del file che deve essere per forza 
8.3
Aggiorna MikroC alla versione 7.x
