Bonjour,
Peut etre que quelqu'un se souvient, mais il y a environ 1mois, j'étais intérressé par un moyen d'acquisition pour un gyroscope électronique. Je me suis dis que la meilleure solution étais de dévelloper une petite board avec un pic et enregistrer tout ca sur une carte SD.
Principe du programme : chaque interruption je convertit la valeur du gyro en numérique, que je met dans un tableau tempon ping[], et au bout de 20 interruptions j'envoie ping[] à pong[] (qui est dans le main) pour qu'il soit enregistrer sur la carte SD.
Tout ca marchait très bien sur proteus, et la ca ne marche pas.
J'ai donc repris le programme en avancant pas à pas pour voir ce qui marchait et ce qui ne marchait pas. ET en fait c'est l'enregistrement sur la carte SD qui déconne.
Voici le programme de test actuel : les interruptions me permettent de faire clignoter une led :
PS : je ne suis pas un expert en la matière, donc je me débrouille un peu comme je peux, il se peut qu'il y ait des codes qui servent à rien
Peut être que je suis passé à côté de quelque chose, si vous pouviez y jeter un oeil, si vous avez le temps, ou me donner des pistes.Code:#include "FSIO.h" #include <p18f2620.h> #include <string.h> #include <timers.h> #include <pwm.h> #include <adc.h> //Nombre de donnée accumulée avant sav #define nbr_donnee 25 //* Pragma configs (en ordre): //* Utilize le quartz interne //* Pas de watch dog //* Pas de low voltage programming //* Power up active timer => preds du temps pour demarrer le programme //* PORTB on digital, not on analogical //* #pragma config OSC = INTIO67 #pragma config WDT = OFF #pragma config LVP = OFF #pragma config PWRT = ON #pragma config PBADEN = OFF int i=0; int compt_interupt=0,temoin_sav=0,compt_sav=0,n=0; //Déclaration des tableaux tempons int ping[nbr_donnee][1]={0}; int pong[nbr_donnee][1]={0}; void InterruptHandlerHigh (void); //---------------------------------------------------------------------------- // High priority interrupt vector #pragma code InterruptVectorHigh = 0x08 void InterruptVectorHigh (void) { _asm goto InterruptHandlerHigh //jump to interrupt routine _endasm } //---------------------------------------------------------------------------- // High priority interrupt routine #pragma code #pragma interrupt InterruptHandlerHigh void InterruptHandlerHigh () { if (INTCONbits.TMR0IF) { i++; //Initialize CAN OpenADC( ADC_FOSC_2 & ADC_RIGHT_JUST & ADC_14ANA, ADC_REF_VREFPLUS_VSS , ADC_CH0 & ADC_INT_OFF ); ConvertADC(); // Start conversion while( BusyADC() ); // Wait for completion ping[compt_interupt][0] = ReadADC(); // Read result CloseADC(); // Disable A/D converter //on enregistre la valeur dans les tableaux tempons ping[compt_interupt][1]=compt_interupt; if(compt_interupt>=nbr_donnee) { temoin_sav=1; compt_sav++; compt_interupt=0; } //check for TMR0 overflow INTCONbits.TMR0IF = 0; //clear interrupt flag } } void main (void) { SearchRec rec; unsigned char attributes; FSFILE * pointer; TRISB=0; PORTBbits.RB0=1; // Set clock to 8MHz and activate PLL, thus we have 32MHz OSCCONbits.IRCF2=1; OSCCONbits.IRCF1=1; OSCCONbits.IRCF0=1; OSCTUNEbits.PLLEN=1; TRISB=0b00000000; //Interupt structure initialization //Avec un quartz de 10 : 6,4ms //Avec un quartz de 6 : 11ms OpenTimer0( TIMER_INT_ON & T0_8BIT & T0_SOURCE_INT & T0_PS_1_64 ); PORTBbits.RB1=1; // Initialize the library while(!FSInit()); //CA BLOQUE LA PORTBbits.RB4=1; //PORTBbits.RB4=0; //Open a file pointer = FSfopenpgm ("fichier5.txt", "w"); if (pointer == NULL) while(1); PORTBbits.RB2=1; // Set the clock value // This will determine the create time for the file we're about to make // This will set the time and date to 3:05:26 PM on July 27, 2007. if (SetClockVars (2007, 7, 27, 15, 5, 26)) while(1); //FSfprintf(pointer,"Essai"); //FSfclose (pointer); PORTBbits.RB3=1; INTCONbits.GIEH = 1; //enable interrupts while(1) { //PORTBbits.RB4=1; if(i<200) { PORTBbits.RB5=1; } else { PORTBbits.RB5=0; } if(i==400) { i=0; } }; while(1); }
Merci d'avance.
-----