Amis électroniciens bonjour
Et déjà merci de me lire
Je galère une fois de plus avec mon projet de module d'acquisition de capteurs de force et angulaires.
J'utilise pour ça un PIC18F4523 cadencé sur l'horloge interne avec le PLL activé ce qui me donne une fréquence d'horloge de 32 MHz
Code:#pragma config OSC = INTIO67 // 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.Je dois envoyer 40kbps sur une UART configurée à 56400 bauds:Code:OSCCONbits.SCS0 = 1; // sélectionne l'oscillateur interne OSCCONbits.SCS0 = 0; OSCCONbits.IRCF = 0x7; // Fréquence de base: 8/1 = 8 MHz OSCTUNEbits.PLLEN = 1; // active le PLL (x4) FOSC = 32 MHz.
et mon timer 0 génère un envoi du message à une fréquence de 1000Hz.Code://Configuration de l'UART pour une transmission à 57.6 kbps // Pour une fréquence de 32 MHz, ceci donne 57600 bauds : TXSTA1bits.BRGH = 1; // Mode haute vitesse. //BAUDCONbits.BRG16 = 1; // Active la lecture de SPBRG sur 16 bits SPBRGH = 0x00; // N = 34 = 0x22 NOP(); // Temps d'arrêt pour permettre l'enregistrement SPBRG = 0x22; //Baudrate = FOSC / (16 * (N + 1)) = 57143Bauds. // 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; // Active les interruptions pour l'UART IPR1bits.TX1IP = 0; // interruptions de basse priorité pour l'UART
Qui vient alimenter mon EUSART ici:Code:// 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é.
Le code fonctionne bien dans son ensemble mais lorsque je lance la simulation sur Proteus, les messages sont émis à une fréquence de 15 HZ !Code:void envoiMessage(struct MESSAGE){ putch(0b00111011); // séparateur ";" introduit en manuel pour éviter les bug putch(message_envoi.val_genou); putch(message_envoi.val_hanche); putch(message_envoi.val_forceF); putch(message_envoi.val_forceL); } PIE1bits.TX1IE = 0; // bit mis a 1 lorsque l'UART ne transmet plus }
De plus, lorsque le programme attend un flag dans une boucle while, le temps d'attente entre deux interrogation est de 500 ns ce qui me fait penser que mon horloge principale tourne à 2 MHz au lieu des 32 que je veux.
Il y a plusieurs problèmes de tt façon car même si je rétablit la fréquence de l'horloge à 32 (x16) la fréquence d'envoi des messages restera à max 240 Hz au lieu des 1000 voulus !
J'ai lu et relu la datasheet http://www.alldatasheet.com/datashee...IC18F4523.html de mon pic et recontrôlé 10x chaque registre de configuration mais je ne parviens pas à me sortir de cette impasse.
Avez-vous une idée d'où pourrait venir mon problème ?
Merci infiniment pour vos réponses
-----