Forum: Mikrocontroller und Digitale Elektronik PIC 32 / MMC wird nicht korrekt ausgelesen


von Peter B (Gast)


Lesenswert?

hallo
versuche auf einem PIC 32 mittels mikroC eine MMC auszulesen.
den Inhalt möchte ich auf verschiede Variablen zu laden.
das config-file auf der MMC ist in ASCII erstellt worden.
die ersten ca 3 Variablen werden korrekt ausgelesen. bei den weiteren 
gibt es ein ducheinander.
mehrere variablen werden in die selbe geschrieben etc.

Sieht jemand was im code falsch ist?

CODE:



void sd_card_init()
{
  // Initialisiere SPI für MMC Zugriff
  SPI2_Init_Advanced(_SPI_MASTER, _SPI_8_BIT, 64, _SPI_SS_DISABLE, 
_SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH, _SPI_ACTIVE_2_IDLE);
  Delay_ms(10);

  // Initialize MMC
  if (!Mmc_Fat_Init())
     {
    // Falls MMC Init nicht i.O. ist SPI schneller initialisieren.
    SPI2_Init_Advanced(_SPI_MASTER, _SPI_8_BIT, 4, _SPI_SS_DISABLE, 
_SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH, _SPI_ACTIVE_2_IDLE);
     }




}

void sd_card_read()
{
 int zi = 0, zb = 0, zc = 0 ,zd = 0; // Schlaufenzähler
 Mmc_Fat_Assign("config.txt", 0); //File config.txt öffnen
 Mmc_Fat_Reset(&size); //grösse des Files auslesen und in size speichern

 //File Auslesen und in buffer schreiben
 for (zi = 1; zi <= size; zi++)
     {
     Mmc_Fat_Read(&buffer[0]);
     //Wenn ein "-" (ASCII Code 45)
     if (buffer[0] == 45)
             {
              zb = 0;
              //Hier wird eine Zeile eingelesen (bis zum nächsten CR 
ASCII 13)
              //oder 200 Zeichen eingelesen wurden
              while (buffer [zb] != 13)
                {
                zb++;
                Mmc_Fat_Read(&buffer[zb]);
                if (zb == 200) break;
                }

              //Die ersten 4 Bytes des buffer werden in das Kommandobyte 
kopiert
              zc = 0; //Schlaufenzähler auf 0 setzen
              while (zc != 4) //Schlaufe um 4 bytes zu lesen
                    {
                     buffer_kdo[zc] = buffer[zc+1];
                     zc++;
                    }

             //Byte 6 bis Byte 26 werden in buffer_ebene gespeichert
              zd = 0; //Schlaufenzähler auf 0 setzen
              while (zd != 20) //Schlaufe um 20 bytes zu lesen
                    {
                     buffer_ebene[zd] = buffer[zd+6];
                     zd++;
                    }
             fill_vars();
             }
     }
}


void fill_vars()

{
//In dieser Funktion wird ein gefülltes Kommandobyte und Ebenenbyte
//vom Puffer in die entsprechende Variable ebenen_bez abgefüllt
//
//Funktionsinterne Variablendeklaration
int ebene_einer = 0 , ebene_zehner=0, ebene_total =0; //Ebenen Vraiablen
int ia = 0, i=0; //Schlaufen Variablen
//oder Ebenen Text

       if (buffer_kdo[0] != 'E') return;
       if (buffer_kdo[1] == 'B')

       {
        ebene_einer = buffer_kdo[3]-48;
        ebene_zehner = buffer_kdo[2]-48;
        ebene_total = (ebene_zehner * 10) + ebene_einer;
        //4 Bytes Ebenentext in entsprechendes Array abfüllen
        while (ia != 5)
              {
               ebenen_bez [ebene_total] [ia] = buffer[ia+6];
               ia++;
              }
       }

       //Ebenen Text in Array kopieren
       ia = 0;
       if (buffer_kdo[1] == 'T')
       {
        ebene_einer = buffer_kdo[3]-48;
        ebene_zehner = buffer_kdo[2]-48;
        ebene_total = (ebene_zehner * 10) + ebene_einer;
        //Bytes Ebenentext in entsprechendes Array abfüllen
        while (ia != 28)
              {
               ebenen_text [ebene_total] [ia] = buffer[ia+6];
               ia++;
              }
       }

for (i = 0; i <= 128; i++)
      {
      buffer[i] = 0;
      }
}

Danke schon mal
von heinzhorst (Gast)


Lesenswert?

Benutzt du die File System Library von Microchip? Sieht so anders aus 
bei dir.
von Peter B (Gast)


Lesenswert?

ja die müsste vorhanden sein.
du meinst ich müsste es komplet neu aufbauen?
von Peter B (Gast)


Lesenswert?

es wird die MMC und MMC_FAT16 library von mikroelektonika verwendet.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.