Bonjour à tous,
Ce poste est la suite d'une question que j'ai posé sur futura-science et qui ne trouve pas réponse depuis quelques temps déjà. J'ai entendu dire qu'il y avait des personnes à même de m'aider sur ce site (merci Mr. Fantaspic
En résumé j'ai un PIC18f4523 à faire tourner à 32 MHz afin de pouvoir exploiter 2 capteurs angulaires (quadrature incrémental) et un capteur de force (convertisseur AD 12 bits), il faut que je récupère leurs signaux à une fréquence de 2,5 MHz
Alors mon problème est le suivant: Toute ma configuration de l'oscillateur est ok (selon moi), la configuration de mon UART est ok également (~2% d'erreur) et malgré ça mon programme tourne au ralentit sur mon simulateur (Proteus) j'ai une fréquence réelle (mesurée dans une boucle while d'attente) de 2 MHz. Premier truc bizarre Ma UART fonctionne normalement est mes messages sont visibles sur le terminal virtuel malgré cette fréquence visiblement trop faible !?!
Voici mon code de configuration de mon oscillateur:
Code : Tout sélectionner
/**
* Bits de configuration:
*/
#pragma config CONFIG1H = 0X8 // Oscillateur interne avec RA6 et 7 en I/O
#pragma config IESO = OFF // Pas de démarrage à deux vitesses
#pragma config FCMEN = OFF // Pas de monitorage de l'oscillateur.
#pragma config MCLRE = ON // RE3 est actif comme master reset.
#pragma config WDT = OFF // Watchdog inactif (pour ICSP /ICD)
#pragma config LVP = OFF // Single Supply Enable bits off.
...
void hardwareInitialise(){
// Configure le micro contrôleur pour 32MHz
OSCCONbits.SCS0 = 0; // sélectionne l'oscillateur interne avec PLL
OSCCONbits.SCS1 = 1;
OSCCONbits.IRCF0=1; // Fréquence de base: 8/1 = 8 MHz
OSCCONbits.IRCF1=1;
OSCCONbits.IRCF2=1;
OSCTUNEbits.PLLEN = 1; // active le PLL (x4) FOSC = 32 MHz.
Code : Tout sélectionner
//Configuration de l'UART pour une transmission à 115.2 kbd
// Pour une fréquence de 32 MHz, ceci donne 115200 bauds :
TXSTA1bits.BRGH = 1; // Mode haute vitesse.
//BAUDCONbits.BRG16 = 1; // Active la lecture de SPBRG sur 16 bits
SPBRGH = 0x10; // N = 16 = 0x10
NOP(); // Temps d'arrêt pour permettre l'enregistrement
SPBRG = 0x22; //Baudrate = FOSC / (16 * (N + 1)) = 117640 Bauds.
// Configure RC6 et RC7 comme entrées digitales, pour que
// la EUSART puisse en prendre le contrôle:
TRISCbits.RC6 = 1;
TRISCbits.RC7 = 1;
// Configure l'UART:
TXSTA1bits.SYNC = 0; // Mode asynchrone.
TXSTA1bits.TXEN = 1; // Active l'émetteur.
RCSTA1bits.SPEN = 1; // Active l'UART.
PIE1bits.TX1IE = 1; // Acive les interruptions pour l'UART
IPR1bits.TX1IP = 0; // interruptions de basse priorité pour l'UART
Autre truc bizarre: La configuration de mes interruptions est comme inactive, quand je modifie TMRxH afin de changer la valeur du débordement cela n'a aucun effet sur la fréquence de mes interruptions (de nouveau mesuré sur la simulation) par contre si je modifie la valeur du prédiviseur je vois un effet sur cette fréquence ... C'est comme si le compteur TMRxH était inactif ... Et pourtant ma config m'a l'air à nouveau ok:
Code : Tout sélectionner
// Temporisateur 1: Échantillonnage du capteur de force
T1CONbits.TMR1CS = 0; // Raccordé sur Fosc/4 = 8 MHz (0)
T1CONbits.T1CKPS = 0x2; // Diviseur de fréquence TPS = 8 (ox2)= 1 MHz
T1CONbits.T1RUN = 0; // Le timer 0 ne dépend pas de timer 1
T1CONbits.T1RD16 = 1; // Temporisateur de 16 bits. (1)
// Calcul: 1 MHz /2500, 2^16-400 = 65136 = 0xFE70
TMR1H = 0x01; // Etablit le compteur pour un débordement
NOP(); // Temps d'arrêt pour permettre l'enregistrement
TMR1L = 0x90; // à 400 -> T = 0.4 ms -> f = 2500 Hz
T1CONbits.T1OSCEN = 0; // pas d'activation de l'osc du timer 1 (32kHz))
T1CONbits.TMR1ON = 1; // Active le temporisateur 1 (1)
PIE1bits.TMR1IE = 1; // Active les interruptions.
IPR1bits.TMR1IP = 0; // Interruptions de basse priorité.
/*
* Remarque: Malgré l'ajout d'un NOP entre TMRH et TMRL comme précisé dans
* l'ERRATA du PIC18F4523, la fréquence d'envoi ne dépasse pas les 611 Hz.
*/
// Temporisateur 0: Envoi du message sur la UART
T0CONbits.TMR0ON = 1; // Active le temporisateur (1)
T0CONbits.T0CS = 0; // Source interne: FOSC / 4 => 8 MHz (0))
T0CONbits.T0SE = 0; // Incrémentation au flant montant du cpt (0)
T0CONbits.PSA = 0; // Active le diviseur de fréquence (0).
T0CONbits.T08BIT = 0; // Compteur de 16 bits.
T0CONbits.T0PS = 0x2; // Div. de fréquence /8 (0x2) TPS => 1MHz
// Calcul: 1MHz/1000 Hz = 1000, 2^16-1000 = 64536 = 0xFC18
TMR0H = 0xFC; // Établit le compteur pour (0xFC18)
NOP(); // Temps d'arrêt pour permettre l'enregistrement
TMR0L = 0x18; // un débordement à 1 ms -> f = 1 kHz
INTCONbits.TMR0IE = 1; // Active les interruptions pour timer 0.
INTCON2bits.TMR0IP = 1; // Interruptions de haute priorité.
// Active les interruptions générales:
RCONbits.IPEN = 1; // Interruptions de basse et de haute priorité
INTCONbits.GIEH = 1; // Interruptions de haute priorité activées
INTCONbits.GIEL = 1; // Interruptions de basse priorité activées
// Configure les ports IO:
TRISA = 0b11111111; // Tous les bits du port A comme entrées
TRISB = 0b11111101; // Tous les bits du port B comme entrées sauf b1
TRISC = 0b11000000; // Tous les bits du port C comme sorties sauf TX et RX
TRISD = 0b11111111; // Tous les bits du port C comme entrées
Mon main ne m'a pas l'air trop surchargé, ces deux programmes récupèrent les miettes, mais normalement ça devrait aller, ils devraient tourner à plus de 2000 Hz chacun en sachant qu'ils font qqch à une fréquence max de 500 Hz (les autres passages sont des contrôles que rien n'a changé entre temps).
Code : Tout sélectionner
void main(void) {
// Initialise le hardware:
hardwareInitialise();
while(1) {
Capt_genou();
Capt_hanche();
}
}
Enfin, si qqun s'y connait et qu'il arrive à me débloquer ça serait vraiment toppissime !!
Je dois dire que je suspect Proteus d'être mal configuré .. mais je n'ai rien trouvé de bizarre dans son paramétrage ... Ou cette histoire de paramétrage des interruptions, c'est comme si je ne pouvais pas aller plus vite sans augmenter la fréquence d'horloge de mon uc ...
à très bientôt et merci de m'avoir lu jusqu'au bout



Et pour te le démontrer, je peux te passer un schéma, avec le programme que j'ai écrit, et tu verras comment ça déconne leurs
