Répondre à la discussion
Affichage des résultats 1 à 20 sur 20

Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)



  1. #1
    Hizaack

    Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)


    ------

    Bonjour,

    Je créé un fichier log.csv sur une carte SD à l'aide d'un pic18f46J50, et plus précisement du matériel EXPLORER 18 + Pic Dem 18F46J50 PIM + Pic Tail Board SD/MMC Card.

    Le fichier est bien créé et lisible. Je voudrais écrire du texte dans les 4 premiere cases de la ligne 1, pour avoir un nom de colonne, et ensuite y mettre des valeurs. Je n'est pas de probleme pour ecrire les valeurs.

    Mais la chaine de texte quqi correspond à mon nom de colonne fonctionne pour les deux premieres cases, mais pas dans les deux dernieres, alors que j'utilise les meme fonctions.

    J'utilise MCC18 Pro et Mplab v8.63.

    Voici ce que je ressort du csv :
    _____A____|_____B_____|___C___ |_____D___________|_
    1|..1ainG_C1....2ainG_C2...... .......3...........4ainD_C4ain DainD

    Voila ce que j'ai quand je regarde en txt:
    1ainG_C1;2ainG_C2;3;4ainD_C4ai nDainD

    Les 4 noms de colonnes que j'utilise sont :
    "1ainG_C1"
    "2ainG_C2"
    "3ainD_C1"
    "4ainD_C2"
    Vous pouvez les retrouver dans le code. On constate que les deux premières colonnes ont bien leurs nom, mais les colonnes 3 et 4, c'est du n'importe quoi....

    Si vous avez une idée, elle est la bienvenue.
    Merci de votre aide.

    Le programme:
    Code:
    #include <p18F46J50.h>
    #include <stdio.h>
    #include "HardwareProfile.h"
    #include "MDD File System/SD-SPI.h"
    #include "MDD File System/FSIO.h"
    #include <delays.h>
    
    
    
    
    #pragma config WDTEN = OFF          //WDT disabled (enabled by SWDTEN bit)
    #pragma config PLLDIV = 3           //Divide by 3 (12 MHz oscillator input)
    #pragma config STVREN = ON          //stack overflow/underflow reset enabled
    #pragma config XINST = OFF          //Extended instruction set disabled
    #pragma config CPUDIV = OSC1        //No CPU system clock divide
    #pragma config CP0 = OFF            //Program memory is not code-protected
    #pragma config OSC = HSPLL          //HS oscillator, PLL enabled, HSPLL used by USB
    #pragma config FCMEN = OFF          //Fail-Safe Clock Monitor disabled
    #pragma config IESO = OFF           //Two-Speed Start-up disabled
    #pragma config WDTPS = 32768        //1:32768
    #pragma config DSWDTOSC = INTOSCREF //DSWDT uses INTOSC/INTRC as clock
    #pragma config RTCOSC = T1OSCREF    //RTCC uses T1OSC/T1CKI as clock
    #pragma config DSBOREN = OFF        //Zero-Power BOR disabled in Deep Sleep
    #pragma config DSWDTEN = OFF        //Disabled
    #pragma config DSWDTPS = 8192       //1:8,192 (8.5 seconds)
    #pragma config IOL1WAY = OFF        //IOLOCK bit can be set and cleared
    #pragma config MSSP7B_EN = MSK7     //7 Bit address masking
    #pragma config WPFP = PAGE_1        //Write Protect Program Flash Page 0
    #pragma config WPEND = PAGE_0       //Start protection at page 0
    #pragma config WPCFG = OFF          //Write/Erase last page protect Disabled
    #pragma config WPDIS = OFF          //WPFP[5:0], WPEND, and WPCFG bits ignored   
    #pragma config T1DIG = ON           //Sec Osc clock source may be selected
    #pragma config LPT1OSC = OFF        //high power Timer1 mode
    
    
    
    /** PRIVATE PROTOTYPES *********************************************/
    static void InitializeSystem(void);
    //WORD_VAL ReadPOT(void);
    int can(void);
    
    
    void main(void)
    {
    	unsigned int* data;
        unsigned int i;
        FSFILE *logFile;
        BOOL initResults;
        WORD_VAL ADCResult;
    
    	WORD_VAL MainG_C1;
    	WORD_VAL MainG_C2;
    	WORD_VAL MainD_C1;
    	WORD_VAL MainD_C2;
    
    
    	char NomCol1 [9] = {'1','a','i','n','G','_','C','1',';'};
    	char NomCol2 [9] = {'2','a','i','n','G','_','C','2',';'};
    	char NomCol3 [9] = {'3','a','i','n','D','_','C','3',';'};
    	char NomCol4 [9] = {'4','a','i','n','D','_','C','4',';'};
    
    	int ResultCAN;
    
    	BYTE printColon[9];
    	BYTE printData[6];
    
        //set the data pointer for the FSfwrite function
        data = &i;
    
    	//Initialisation du systeme (E/S)
    	InitializeSystem();
    
    	//Initialisation du systeme de fichier
    	initResults = FSInit();
    
        //initialize the A/D
        mInitPOT();                   
    
        //Set up the LED as output
        mInitAllLEDs();
    
        //Set the push button input
        mInitSwitch2();
    	
    	//The log file is not open so let's make sure the pointer is NULLed out
        logFile = NULL;
    
    	
    	
     	
    
    	while(1)
    	{
    		if(initResults == TRUE)
            {
    
    			if(sw2 == 0)
    			{
    				if(logFile != NULL)
    	            {       
    	                // Get an ADC sample
    	                //ADCResult = ReadPOT();
    					
    					ResultCAN = can();
    
    	    
    
    	                //sprintf((char*)&printData[0],"%d; ",ADCResult.Val);
    //					sprintf((char*)&printData[0],"%d; ", ResultCAN);
    //	                FSfwrite((const void*)&printData[0],1,sizeof(printData),logFile);
    //
    //					sprintf((char*)&printData[0],"%d; ", ResultCAN);
    //	                FSfwrite((const void*)&printData[0],1,sizeof(printData),logFile);
    //
    //					sprintf((char*)&printData[0],"%d; ", ResultCAN);
    //	                FSfwrite((const vo"id*)&printData[0],1,sizeof(printData),logFile);
    //
    //					sprintf((char*)&printData[0],"%d \r\n", ResultCAN);
    //	                FSfwrite((const void*)&printData[0],1,sizeof(printData),logFile);
    
    					
    
    
    
    
    
    					mLED_1_On();
    					mLED_2_Off();
    	                
    	            }
    	            else
    	            {
    	                logFile = FSfopenpgm("log_test.csv",WRITE);
    					
    					//Ecriture du nom colonnes
    					sprintf((char*)&printColon[0],"%s", NomCol1);
    	                FSfwrite((const void*)&printColon[0],1,sizeof(printColon),logFile);
    
    					//Ecriture du nom colonnes
    					sprintf((char*)&printColon[0],"%s", NomCol2);
    	                FSfwrite((const void*)&printColon[0],1,sizeof(printColon),logFile);
    
    					//Ecriture du nom colonnes
    					sprintf((char*)&printColon[0],"%s", NomCol3);
    	                FSfwrite((const void*)&printColon[0],1,sizeof(printColon),logFile);
    
    					//Ecriture du nom colonnes
    					sprintf((char*)&printColon[0],"%s", NomCol4);
    	                FSfwrite((const void*)&printColon[0],1,sizeof(printColon),logFile);
    
    					mLED_2_On();
    					mLED_1_On();
    
    					                  
    	            }
    	
    				
    			}
    			else
    			{	
    				if(logFile != NULL)
    	            {
    					
    	                FSfclose(logFile);
    	                logFile = NULL;
    					mLED_1_Off();
    					mLED_2_On();			
    					
    	            }
    							
    			}
    		
    		}
            else
            {
                if(MDD_SDSPI_MediaDetect() == TRUE)
                {    
                    initResults = FSInit();
                }
            }
    
    
    	}//end while
    }
    //end main
    
    
    
    static void InitializeSystem(void)
    {
      
        ADCON1 |= 0x0F;                 // Default all pins to digital
       
    	//Configure all I/O pins to use digital input buffers.  The PIC18F87J50 Family devices
    	//use the ANCONx registers to control this, which is different from other devices which
    	//use the ADCON1 register for this purpose.
        ANCON0 = 0xFF;                  // Default all pins to digital
        ANCON1 = 0xFF;                  // Default all pins to digital
    
    	
    	//On the PIC18F87J50 Family of USB microcontrollers, the PLL will not power up and be enabled
    	//by default, even if a PLL enabled oscillator configuration is selected (such as HS+PLL).
    	//This allows the device to power up at a lower initial operating frequency, which can be
    	//advantageous when powered from a source which is not gauranteed to be adequate for 48MHz
    	//operation.  On these devices, user firmware needs to manually set the OSCTUNE<PLLEN> bit to
    	//power up the PLL.
        {
        unsigned int pll_startup_counter = 600;
        OSCTUNEbits.PLLEN = 1;  //Enable the PLL and wait 2+ms until the PLL locks before enabling USB module
        while(pll_startup_counter--);
        }
        //Device switches over automatically to PLL output after PLL is locked and ready.
       
    
    
    
        //********* Initialize Peripheral Pin Select (PPS) *************************
        //  This section only pertains to devices that have the PPS capabilities.
        //    When migrating code into an application, please verify that the PPS
        //    setting is correct for the port pins that are used in the application.
    
      
        //Initialize the SPI
        //RPINR21bits.SDI2R = 1;
        //RPOR4bits.RP4R = 10;    //RP4 = SCK
        //RPOR2bits.RP2R = 9;     //RP2 = SDO   
        RPINR21 = 1;   //SDI = RP1
        RPOR4 = 10;    //RP4 = SCK
        RPOR2 = 9;     //RP2 = SDO
        RPINR22 = 4;   //SCK = RP4
    
        //enable a pull-up for the card detect, just in case the SD-Card isn't attached
        //  then lets have a pull-up to make sure we don't think it is there.
        INTCON2bits.RBPU = 0; 
    
    }
    
    
    
    /******Conversion Analogique Numérique*******/
    int can() // Sous programme CAN
    {
    	int ResultConv;
    	ResultConv = 0;
    
    	
    	ADCON0bits.GO = 1;  // Lancement de CAN
    	while(ADCON0bits.NOT_DONE);   // Attente fin CAN
    	//ResultConv = ((ADRESH <<8) + ADRESL); // Lecture résultat sur 16 bits (10 utiles)
    
    	ResultConv = ADRESH;
    	ResultConv <<=8;
    	ResultConv = ResultConv + ADRESL;
    
    	
    	return ResultConv ; 
    /******Fin Conversion Analogique Numérique*******/
    }

    -----

  2. Publicité
  3. #2
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Salut,

    je pense que tu as du résoudre ton problème depuis le temps ^^

    j'ai essayé ton code, en faisant un simple copier/coller, mais je rencontre un problème,

    selon le debugger,

    //Initialisation du systeme de fichier
    initResults = FSInit();

    initResults est toujours à false.

    je pense que le problème vient du port mapping, mais j'ai du mal à le configurer, en effet, j'utilise le PIC 18F Starter KIT (avec le même microcontroller que toi)

    Donc ceci doit être incorrect je pense ?:

    //Initialize the SPI
    //RPINR21bits.SDI2R = 1;
    //RPOR4bits.RP4R = 10; //RP4 = SCK
    //RPOR2bits.RP2R = 9; //RP2 = SDO
    RPINR21 = 1; //SDI = RP1
    RPOR4 = 10; //RP4 = SCK
    RPOR2 = 9; //RP2 = SDO
    RPINR22 = 4; //SCK = RP4


    voici une doc, page 36 on peut voir comment est cablé le lecteur SD.

    http://ww1.microchip.com/downloads/e...er%20Guide.pdf

    je lis :

    SDI => RD6 => RP23
    SDO => RB3 => RP6
    SCK => RC2 => RP13
    /CS => RC6 => RP17 (pourquoi dans la config du dessus, CS n'Est pas mappé ?)

    donc le code plus haut serait à remplacer par :

    RPINR21 = 23;
    RPOR4 = 13;
    RPOR2 = 6;

    et le /CS ?

    je réfléchis correctement ?

    sinon mis à part, d'autres suggestions ? ou est ce que ej fais fausse route ? ^^

  4. #3
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    edit : je vois bien pour le SCK output (donc va vers le port micro SD, mais pour le SCK input ?)

  5. #4
    Hizaack

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Bonjour,

    Alors pour mon problème d'ecriture dans les colonnes je l'ai résolus, c'etait seulement une taille de chaine de caractere et et du nombre de caractere dans cette chaine. Je force donc la fonction sprintf() à écrire un espace quand il y a un '0', et j'ai donc toujours la même taille de chaine de caractere.

    Code:
    char ResultCAN[21];
    
    sprintf(ResultCAN,"%4d;%4d;%4d;%4d\r\n", ResultCAN1, ResultCAN2, ResultCAN3, ResultCAN4); //Concaténation des 4 résultats des capteurs, chaine de 21 caracteres, avec \r\n inclus
    
    FSfwrite(ResultCAN,1,sizeof(ResultCAN),logFile); 
    
    memset(ResultCAN, '\0', sizeof(ResultCAN)); //Par sécurité, on efface la chaine de caracte ResultCan

    Pour la carte SD...
    - Est ce que tu a initialiser les différents broches en numérique?
    Code:
        ANCON0 = 0xFF;                  // Default all pins to digital
        ANCON1 = 0xFF;                  // Default all pins to digital
    - Tu peux vérifier sur ta carte les différentes connexions du slot de la SD au PIC, et s'il y a des signaux?

    - Pour moi le /CS est défini dans le hardware profile, en
    Code:
    // Chip Select Signal
        #define SD_CS               PORTBbits.RB3
        #define SD_CS_TRIS          TRISBbits.TRISB3
    et on voit ensuite dans le fichier SD-SPI.c que SD_CS = 0 quand les différentes fonctions sont appelées.

    -C'est vrai bonne question pour le SCK input, j'ai remarqué ca en reprenant le code ^^ En fait je ne me suis pas posé de question puisque ca fonctionnait deja

    J'ai pas la carte sous la main mais c'est un point à éclaircir oui.
    Je reprend:

    Code:
    //Initialize the SPI
    RPINR21 = 1; //SDI = RP1 = RA1
    RPOR4 = 10; //RP4 = SCK = RB1
    RPOR2 = 9; //RP2 = SDO = RA5
    RPINR22 = 4; //SCK = RP4 = RB1
    On voit bien que c'est louche sur RB1, mais sur la doc (http://ww1.microchip.com/downloads/e.../DS-51583b.pdf) RB1 est sortant du PIC.

    J'aurais mis pareil que toi :
    Code:
    //Initialize the SPI
    RPINR21 = 23; //SDI = RP23 =RD6
    RPOR4 = 13; //RP13 = SCK = RC2
    RPOR2 = 6; //RP6 = SDO = RB3
    Tiens moi au courant si du a des nouvelles, je test des lundi de mon coté.

  6. #5
    RISC

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Salut,

    ATTENTION à la séquence de mapping des broches...

    Il ne faudrait pas oublier de lire le manuel car il faut envoyer une séquence spéciale pour pouvoir programmer les broches (voir section 9.7 de la datasheet) et aussi une séquence à la fin de la modification des registres RPINR et RPOR.

    Et aussi le bit de configuration qui va bien

    a+
    Ma marotte ? les microcontrôleurs ;=)

  7. A voir en vidéo sur Futura
  8. #6
    Hizaack

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Bonjour,

    Exact, il s'agit du registre PPSCON.

  9. Publicité
  10. #7
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Bonjour tout le mode, j'espère que vous avez passé un bon week end

    pour en revenir à "mes" moutons ^^ j'ai un peu réfléchi/testé, voici ce qu'il en ressort :

    Sur ma platine, j'ai quelques trous dans lesquels je peux souder des cables, j'ai vu que certains portaient la dénomination "SCK,MISO,MOSI", j'ai donc mesurer avec un testeur de continuité si SCK et et RB1 étaient physiquement reliés, et c'est le cas, idem pour MISO et MOSI.
    A l'oscilloscope, je ne vois aucune activité sur ces broches (j'y reviendrai).

    je me demandais pourquoi il n'y avait pas de SCK input, mais il y en a un, en effet, SCK out est sur RP13, et je n'ai donc plus qu'a configuré RPINR22 (sck input) = 13, de cette manière :

    RPINR21 = 23; //SDI
    RPOR4 = 13; //SCK out
    RPOR2 = 16; //SDO
    RPINR22 = 13; //SCK in

    correct ?

    j'ai testé sans débloquer le registre IOLOCK, dans le debuggeur, IOLOCK est à 0 dès le lancement du programme, et je peux modifier les registres RPINR et RPOR juste comme ca. Bon, j'ai quand meme rajouté :

    EECON2 = 0x55;
    EECON2 = 0xAA;
    PPSCONbits.IOLOCK = 0; avant de modifié RP,

    et

    EECON2 = 0x55;
    EECON2 = 0xAA;
    PPSCONbits.IOLOCK = 1; après avoir modifié RP

    Dans mon hardware profile j'ai aussi

    #define SD_CS Portbits.RB3, je me demande si c'est correct ?? (je n'ai pas accès aux broches faisant cotnact avec la carte SD pour mesurer)

    je sais aussi qu'il y a deux bus SPI, j'espere que de ce côté je n'ai pas fais d'erreurs.

    bon, maintenant le problème, est de savoir pourquoi FSInit() renvoie toujours false, je me suis penché un peu sur la fonction, et un moment on fait appel à :

    #ifdef __18CXX (suis-je concerné ?)
    SRAMInitHeap();
    #endif
    La fonction n'est définie nulle part. je suppose que je ne suis pas concerné du coup.

    Mis à part, je lance mon programme et le laisse RUN pour faire mes mesures à l'oscillo, et je ne vois rien, du coup, je sais pas trop ce qu'il se passe...

    Du coup, mon hardware profile n'est plus bon, ou bien le port mapping sert justement à corriger cela ?

  11. #8
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    petite avancée (j'espere que ce nest "que" le port mapping qui pose problème),

    si je fais

    SPICLOCKLAT = 0;
    SPICLOCKLAT = 1;

    seul le registre LATB change (le deuxième bit en partant du LSB) donc LATBbits.1

    donc RB1 qui correspond à RP4 d'après la doc.

    je vais continuer à creuser demain.

  12. #9
    steup

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Bonjour,

    Aïe aïe aïe... Le C est un des langages les plus difficiles qui soit, après l'assembleur bien entendu (quoique... en fait l'assembleur est peut-être même plus simple de par ses fonctions très limitées)

    L'apprendre en autodidacte n'est pas chose aisée.

    En C, TOUTE chaine de caractère DOIT se terminer par 0 ('\0', ou 0x00 directement selon la méthode employée)

    Toutes les fonctions de manipulations de chaines (printf, sprintf, scanf, etc...) se basent sur ce "zéro de fin de chaîne" pour savoir quand s'arrêter. Tu m'étonnes que ton sprintf perdait la boule

  13. #10
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Bon, je viens de vori que sur une partie j'ai un peu fais le boulet
    j'utilisais le hardware profile du PIM, au lieu du starter kit, du coup, les broches sont configurées correctement et plus besoin de mapping.

    J'ai directement :

    #define SPICLOCK TRISCbits.TRISC2
    etc pour MOSI,MISO, que ce soient les PORT, ou LAT

    bon on moins on avait réfléchi correctement pour trouver sur quels ports la carte est reliée ^^

    et par la meme occasion, SD_CS, SD_CD etc sont configurés correctement.

    Si je boucle sur :

    initResults = FSInit();
    je peux voir à l'oscillo (très difficilement), un signal sur SCK, MOSI, et pour MISO je suis pas sur. bref, deja une petite avancée.

    Par contre ca ne marche toujours pas, initResults reste desesperement à 0
    là je commence à m'inquiéter sérieusement sur la viabilité de mon projet :S

    je pense encore à l'instant à une chose, on défini le SCK out, et le SCK in est sensé etre mappé sur SCK OUT, or, là je ne le fais pas, possible source d'erreur ? le problème étant que mon mappage ne marche pas, cf l'autre post :

    http://forums.futura-sciences.com/el...ml#post3612722

  14. #11
    Hizaack

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Bonjour,

    J'ai regarder de mon coté et effectivement il n'y a que 4 broches pour l'utilisation du SPI: SCK, CS, SDI, SDO.
    J'ai enlever la SCK sur le registre de sortie :
    Code:
    //RPINR22 = 4;   //SCK = RP4, RB1, Clock Input
    et je n'est remarqué aucune différence de fonctionnement. Il n'y a donc pas lieu de mettre cette ligne. Mon hypothese est que la pin RB1 correspondant au SCK peux etre attribuée en entrée sortie, et l'entrée serait utilisée si on veux utiliser le PIC en esclave. Mais cela reste à vérifier.

    J'ai donc l'utilisation de mes broches du SPI dans le hardware profile comme suit:

    Code:
    /*******************************************************************/
        /******** MDD File System selection options ************************/
        /*******************************************************************/
        #define USE_PIC18
    
        #define USE_SD_INTERFACE_WITH_SPI
    
        #define TRIS_CARD_DETECT    TRISBbits.TRISB4    // Input
        #define CARD_DETECT         PORTBbits.RB4
        
        #define TRIS_WRITE_DETECT   TRISDbits.TRISD7    // Input
        #define WRITE_DETECT        PORTDbits.RD7
     
        // Chip Select Signal
        #define SD_CS               PORTBbits.RB3
        #define SD_CS_TRIS          TRISBbits.TRISB3
            
        // Card detect signal
        #define SD_CD               PORTBbits.RB4
        #define SD_CD_TRIS          TRISBbits.TRISB4
            
        // Write protect signal
        #define SD_WE               PORTDbits.RD7
        #define SD_WE_TRIS          TRISDbits.TRISD7
    
        // TRIS pins for the SCK/SDI/SDO lines
        #define SPICLOCK            TRISBbits.TRISB1
        #define SPIIN               TRISAbits.TRISA1
        #define SPIOUT              TRISAbits.TRISA5
    
        // Latch pins for SCK/SDI/SDO lines
        #define SPICLOCKLAT         LATBbits.LATB1
        #define SPIINLAT            LATAbits.LATA1
        #define SPIOUTLAT           LATAbits.LATA5
    
        // Port pins for SCK/SDI/SDO lines
        #define SPICLOCKPORT        PORTBbits.RB1
        #define SPIINPORT           PORTAbits.RA1
        #define SPIOUTPORT          PORTAbits.RA5
    
        // Registers for the SPI module you want to use
        #define SPICON1             SSP2CON1
        #define SPISTAT             SSP2STAT
        #define SPIBUF              SSP2BUF
        #define SPISTAT_RBF         SSP2STATbits.BF
        #define SPICON1bits         SSP2CON1bits
        #define SPISTATbits         SSP2STATbits
    
        #define SPI_INTERRUPT_FLAG  PIR3bits.SSP2IF 
        #define SPIENABLE           SSP2CON1bits.SSPEN
    et l'attribution dans les RPn:

    Code:
    //********* Initialize Peripheral Pin Select (PPS) *************************
        //  This section only pertains to devices that have the PPS capabilities.
        //    When migrating code into an application, please verify that the PPS
        //    setting is correct for the port pins that are used in the application.
    
      
        //Initialize the SPI
        //RPINR21bits.SDI2R = 1;
        //RPOR4bits.RP4R = 10;    //RP4 = SCK
        //RPOR2bits.RP2R = 9;     //RP2 = SDO   
        RPINR21 = 1;   //SDI = RP1, RB0    
        RPOR2 = 9;     //RP2 = SDO, RC7
    	RPOR4 = 10;    //RP4 = SCK, RB1, Clock Output
        //RPINR22 = 4;   //SCK = RP4, RB1, Clock Input
    
        //enable a pull-up for the card detect, just in case the SD-Card isn't attached
        //  then lets have a pull-up to make sure we don't think it is there.
        INTCON2bits.RBPU = 0;
    Pour l'initialisation, j'ai les fonctions dans cette ordre-ci :
    Code:
    	//Variable pour le systeme de fichier
    	unsigned int* data;
        unsigned int i;
    
    	// Definition du buffer 
    	// BYTE printColon[36];
    	BYTE printData[];
    
        //set the data pointer for the FSfwrite function
        data = &i;
    
    	//Initialisation du systeme (E/S)
    	InitializeSystem(); //Iniailise SPI
    
    
    	//Initialisation du systeme de fichier
    	initResults = FSInit();
    
    
        //initialize the A/D
        mInitPOT();                   
    
        //Set up the LED as output
        mInitAllLEDs();
    
        //Set the push button input
        mInitSwitch2();
    	
    	//The log file is not open so let's make sure the pointer is NULLed out
        logFile = NULL;
    
    
    	ANCON0 = 0xFF;                  // Default all pins to digital
       	ANCON1 = 0xFF;                  // Default all pins to digital
    
    
    	if(initResults == TRUE)
            {
    			if(sw2 == 0)
    			{
    				if(logFile != NULL)
    	            {
    	                // Get an ADC sample	          
    //					ADCResult = ReadPOT();					
    					 
      
    					memset(ADCResult, '\0', sizeof(ADCResult)); 
    
    
    	                
    	            }
    	            else
    	            {
    					
    
    					logFile = FSfopen(FileName, FileMode);
    					                  
    	            }
    	
    				
    			}
    			else
    			{	
    				if(logFile != NULL)
    	            {
    					
    	                FSfclose(logFile);
    	                logFile = NULL;
    		
    					
    	            }
    
    							
    			}
    		
    		}
            else
            {
                if(MDD_SDSPI_MediaDetect() == TRUE)
                {    
                    initResults = FSInit();
                }
            }
    Voila j'ai fait ça rapidement mais c'est ce que j'ai.

    J’espère que tu pourra cerner ton problème.

    A +

  15. #12
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Ben je comprends pas, j'ai essayé la même séquence que toi,
    en modifiant correctement le hardware profile et les RP, et rien.

    serait-il possible que tu compresses le dossier contenant ton projet (avec le .mcp et tout), et me l'envoie, comme ca je pourrai l'ouvrir, et n'aurai a modifier que les PIN.

    j'ai peut etre un réglage dans mplab qui est incorrect ou ...je sais pas

    en tout cas ca me parait louche cette histoire

  16. Publicité
  17. #13
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    tu pourrai me dire le système de fichier de ta carte SD ?

    FAT16 ? 32 ? ou ... ?

  18. #14
    Hizaack

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Bonjour,

    Si tu as pareil que moi alors c'est que le problème ne vient pas du code.

    Moi aussi j'ai été décu à certain moments, mais laisse passé un ou deux jours et remet toi dessus et des fois on voit plus clair.

    Essaie de recommencer depuis zéro, en partant du projet de Microchip.
    Fait le fonctionner sans rien modifier, juste avec bon hardware profil.

    Fait des debugs, des tests, allume une led, vérifie que les ports que tu utilise sont bien définis et configurer, en numérique. Vérifie que tu as bien ajouter les librairies.

    Je doute que ca aille mieux si je te passe mon projet , car j'ai modifié certains points, certaines variables, et tu ne vas rien comprendre.

  19. #15
    Hizaack

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Formatée FAT32

  20. #16
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    au point ou j'en suis ... si tu peux me l'envoyer, comme ca je serais sur a 100% que tout les fichiers que j'utilise dans le projet sont les bons etc...

  21. #17
    Hizaack

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    Re,

    Tu ne dit pas ce qui ne fonctionne pas.
    Essaie déjà de reprendre un projet compatible avec le pic et ta carte qui utilise l’écriture sur carte SD, et sans le modifier test le.

  22. #18
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    alors, si je prends le projet
    C:\Microchip Solutions v2010-10-19\PIC18F Starter Kit 1\Demos\USB Device - Mass Storage - SD Card reader

    Donc, fait pour mon microcontroller, et meme mieux, pour ma plaque de démo, je compile, lance, et ca fonctionne.

    Par contre il n'y a pas de gestion de la table FAT...

    si je prends le projet

    C:\Microchip Solutions v2010-10-19\USB Device - Mass Storage - SD Card data logger

    tel quel, il ne marche pas, normal.

    Ce projet est pour mon microcontroller, mais monté sur une autre platine,
    Je dois modifier le hardware profile pour faire correspondre les PIN du bus SPI, modifier les lignes RPOR et RPINR pour que ca corresponde, et ajouter la ligne #define MEDIA_SOFT_DETECT (en effet, je n'ai pas de pin de détection de présence, ni même de bouton ou autre).

    A partir de la, la fonction
    FSInit renvoie toujours false.

    Donc si je me penche un peu sur le code, je vois qu'en cas de renvoie false, on fait appel a la fonction MDD_MediaDetect()

    et je me suis appercu qu'en fait la fonction renvoie n'importe quoi.
    si je fais un
    while(!MDD_MediaDetect());

    il va passer la boucle, que la carte soit insérée ou non.
    Maintenant arrivent les choses vraiment bizarres.

    Dans le fonction MDD_MediaDetect() ,

    je vois
    if(response.r2._word !=0x00)
    {
    blabla
    }
    else
    {
    //no error was reported, the card is present
    return 1;
    }

    A ce moment, que la carte soit présente ou non, response.r2._word vaut 0x00, et donc il dit que la carte est présente alors que ce n'est pas le cas...

    Donc il y a un problème plus haut dans le code je suppose ?
    je regarde, je vois if SPIENNABLE == 0, et je rentre dans ce if, est-ce bien normal qu'il soit à 0 ?

    autre chose, dans FSCONFIG.h, je vois
    "FS_MAX_FILE_OPEN #define is only applicable when FS_DYNAMIC_MEM not defined)
    or, ce dernier est défini plus bas...

    voila ou j'en suis

  23. Publicité
  24. #19
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    rebonjour,

    j'ai un peu avancé,

    j'ai modifié ce projet :


    C:\Microchip Solutions v2010-10-19\PIC18F Starter Kit 1\Demos\USB Device - Mass Storage - SD Card reader

    En effet, main() appel une fonction, que je vais nommer A().
    A() appelle B(),
    B() appelle C() etc...

    Un moment (disons dans F() ), il y a cette ligne qui est appelée :
    MDD_MediaDetect() (En fait,LUNMedia_Detect() est appellée, mais cette fonction pointe sur MDD_MediaDetect() )

    Bref, a cet endroit, MDD_MediaDetect() renvoie true ou false selon que la carte soit présente ou non.

    si j'appelle MDD_MediaDetect() depuis le main(), elle me renverra n'importe quoi.

    Donc je me suis dis, à quel moment dans la chaine A()=>B()=>C() etc, la fonction ne marchera plus ?
    et j'ai trouvé.

    Dans le fichier "usb_device.c", dans la fonction USBDeviceTasks(), on peut voir ces lignes :

    if(USBDeviceState < DEFAULT_STATE) return;
    if(TransactionCompleteIE))
    {
    ...

    Eh bien,

    if(USBDeviceState < DEFAULT_STATE) return;

    MDD_MediaDetect() //fonctionne correctement

    if(TransactionCompleteIE))
    {
    ...

    ET

    MDD_MediaDetect() //renvoie toujours true
    if(USBDeviceState < DEFAULT_STATE) return;
    if(TransactionCompleteIE))
    {
    ...

    On peut voir qu'il n'y a qu'une ligne d'écart, mais je n'arrive pas à comprendre ce qui se passe, pourquoi cette différence...
    (et pourquoi la fonction MDD_MediaDetect() ne peut pas etre appellée depuis le main()...)

  25. #20
    terriblement

    Re : Ecriture dans log.csv avec SD Card et pic18f46J50 foir à moitié (bizarre)

    bon j'ai trouvé,

    avant de faire mon while(!MDD_MediaDetect()),

    il faut ajouter :

    LATC = 0x40;
    TRISC = 0x86

    Me demandez pas pourquoi, j'en sais rien.
    Quand ca amrchait pas, LATC valait 0x41, donc appremment c'est bien le dernier bit qui est utile dans cette histoire,

    TRISC = 0xC7 quand ca marchait pas.

    donc entre C7 et 86 il y a un certaine nombre de bits qui changent, j'ai pas été vérifié le ou lesquels étaient utiles.

    Si quelqu'un peut m'expliquer cette histoire, je suis preneur...

Discussions similaires

  1. Ecriture fichier TXT sur SD Card en FAT32 avec un PIC.
    Par Romain2 dans le forum Électronique
    Réponses: 17
    Dernier message: 08/06/2011, 09h51
  2. Graph "courbe" dans une representation log-log
    Par VauRDeC dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 24/06/2010, 14h53
  3. ecriture sd card avec 18f4550 en spi sans fat
    Par EmKa69 dans le forum Électronique
    Réponses: 12
    Dernier message: 22/06/2010, 23h28
  4. card reader sweex avec SD problème
    Par boolat dans le forum Matériel - Hardware
    Réponses: 0
    Dernier message: 03/01/2010, 16h37
  5. lire et ecrire dans uns SD-card
    Par ABN84 dans le forum Électronique
    Réponses: 5
    Dernier message: 07/08/2009, 12h40
Découvrez nos comparatifs produits sur l'informatique et les technologies.