Bonjour,
Voilà, j'ai créé un prog sur un PIC18F252 et souhaite maintenant l'utiliser sur un 18F4550 (pour ajouter une fonctionnalité de dialogue par USB avec le PC),
A code équivalent, pour le 18F4550, pour moi la seule chose qui change, c'est le registre ADCON1 qui doit être à 0b00111101 au lieu de 0b10001101 (gestion différente du choix de AN2 et AN3 comme références + et - des conversion AN.
Seulement voilà, j'ai un problème :Le programme fonctionne sur le 4550, mais est SUPER LENT (sortie à 1Hz pour peut-être 600 Hz !) et je n'arrive pas à trouver pourquoi.
Pour expliquer un peu le code : je génère sur RB0 à ,RB5 6 horloges dont la fréquence dépendent de la position en X et Y de 3 joysticks.
Voici mon code sous le 18F252:
Si vous avez une piste...Code://Déclaration varibles int sens[6]; //sens rotation moteurs unsigned double JoyDZ[6][2]; //Limites des zones mortes unsigned double JoyBd[6][2]; //Mini et Maxi des joysticks unsigned int cnt[6]; //compteur moteurs unsigned double ANval[6]; //Val num sur RA0 et RA1 unsigned double periode[6]; //Période liée à RA0 unsigned double periode2[6]; //Période liée à RA0 unsigned double tmp; unsigned int i; //var de boucle pour procédure autres que void unsigned int joy; //var de boucle pour main const int valTimer0 = 185; const double Pi = 3.14159; const double demiPi = 1.570796; //unsigned int j; #include "HeaderJoyboard.h" char text[13]; void interrupt() { // Increment value of cnt on every interrupt if (!(sens[0]==0)) {++cnt[0];} if (!(sens[1]==0)) {++cnt[1];} if (!(sens[2]==0)) {++cnt[2];} if (!(sens[3]==0)) {++cnt[3];} if (!(sens[4]==0)) {++cnt[4];} if (!(sens[5]==0)) {++cnt[5];} //Front montant sortie si période atteint if (cnt[0] >= periode[0]) {PORTB.F0 = 1; cnt[0] = 0;} if (cnt[1] >= periode[1]) {PORTB.F1 = 1; cnt[1] = 0;} if (cnt[2] >= periode[2]) {PORTB.F2 = 1; cnt[2] = 0;} if (cnt[3] >= periode[3]) {PORTB.F3 = 1; cnt[3] = 0;} if (cnt[4] >= periode[4]) {PORTB.F4 = 1; cnt[4] = 0;} if (cnt[5] >= periode[5]) {PORTB.F5 = 1; cnt[5] = 0;} //Remise à 0 sortie sur interruption suivante if (cnt[0] >= periode2[0]) {PORTB.F0 = 0;} if (cnt[1] >= periode2[1]) {PORTB.F1 = 0;} if (cnt[2] >= periode2[2]) {PORTB.F2 = 0;} if (cnt[3] >= periode2[3]) {PORTB.F3 = 0;} if (cnt[4] >= periode2[4]) {PORTB.F4 = 0;} if (cnt[5] >= periode2[5]) {PORTB.F5 = 0;} //Réinitialiser le Timer0 TMR0L = valTimer0; //Délai=(256-PRC)*4*PRD*1/FH INTCON = 0x20; // Set T0IE, clear T0IF 0x20 } void main() { initIO(); initVars(); initTimer0(); //unsigned int joy; //numéro du joystick à lire do { //conversions AN for (joy=0; joy<3; ++joy) { if (joy==0) {PORTC.F0=1;} if (joy==1) {PORTC.F1=1;} if (joy==2) {PORTC.F2=1;} //delay_ms(10); //pour analyser le fonctionnement ANval[joy*2] = Adc_Read(1) + 1; ANval[joy*2+1] = Adc_Read(0) + 1; PORTC=0x00; } calcPeriodes(); } while(1); } //Calcul périodes avec rapport cyclique à 50% void calcPeriodes() { for (i=0; i<6; ++i) { if (ANval[i] > JoyDZ[i][1]) { tmp = (ANval[i] - JoyDZ[i][1]) / (JoyBd[i][1] - JoyDZ[i][1]) * demiPi ; periode[i] = 1 / (0.03 * sin(tmp)); //tmp = sin(tmp); periode2[i] = periode[i] * 0.5; sens[i] = 1; } else if (ANval[i] < JoyDZ[i][0]) { tmp = (ANval[i] - JoyBd[i][0]) / (JoyDZ[i][0] - JoyBd[i][0]) * demiPi + demiPi; periode[i] = 1 / (0.03 * sin(tmp)); //tmp = sin(tmp); periode2[i] = periode[i] * 0.5; sens[i] = -1; } else { sens[i] = 0; } } } void initIO() { //initialisation RA0 et convertion A/N ADCON1 = 0b10001101; //0x80; //OxC0 RA0 et RA1 as A/N TRISA = 0b00001111; //PORTA = INPUT or OUTPUT TRISC = 0x00; PORTC = 0x00; TRISB = 0x00; PORTB = 0x00; } //init LCD sur portB void initLCD() { Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0); // Initialize LCD connected to PORTB LCD_Cmd(LCD_CLEAR); // Clear display LCD_Cmd(LCD_CURSOR_OFF); // Turn cursor off } //Init du timer0 interruption unique void void initTimer0() { T0CON = 0b11000000; // PORTB pull-ups disabled, prescaler TMR0=1:2 TMR0L = valTimer0; // Valeur de départ du timer INTCON = 0xA0; // Enable TMRO interrupt } void initVars() { for (i=0; i<6; ++i) { JoyBd[i][1]=1024; //1024 maxi JoyDZ[i][1]=640; //maxi de la zone morte JoyDZ[i][0]=570; //mini de la zone morte JoyBd[i][0]=1; //au moins 0 sens[i]=0; cnt[i]=0; periode[i]=2; periode2[i]=1; } }
Mikaël
-----