[Programmation] Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus



  1. #1
    wyssflorian

    Question Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus


    ------

    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.
    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.
    Je dois envoyer 40kbps sur une UART configurée à 56400 bauds:

    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
    et mon timer 0 génère un envoi du message à une fréquence de 1000Hz.

    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é.
    Qui vient alimenter mon EUSART ici:

    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
        
    }
    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 !

    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

    -----
    Dernière modification par Antoane ; 12/09/2017 à 11h56. Motif: Remplacement balises html par url

  2. #2
    wyssflorian

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Ha oui,

    Avant que vous ne posiez la question l'envoi se fait sur interruption de haute priorité:
    Code:
    void high_priority interrupt interruptionsHautePriorite() {
    
            // Envoi du paquet sur la UART
        if (TMR0IF){
            
            envoiMessage(message_envoi);
            
            TMR0IF=0;
        }
    
    }

  3. #3
    invite03481543

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Bonsoir,

    j'ai pas tout lu de près, mais as-tu bien pris en compte ta PLL pour régler la vitesse de ton UART?
    La base de temps n'est pas la même.
    Et bizarrement 4*240Hz c'est pas loin de tes 1kHz

  4. #4
    Fantas-Pic

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Bonjour ,

    JE ne connais pas trop MPLAB, mais je doute que ces lignes choissise 'l'oscillateur interne :

    Code:
    OSCCONbits.SCS0 = 1;        // sélectionne l'oscillateur interne
    OSCCONbits.SCS0 = 0;

    Cela devrait être plutôt :
    OSCCONbits.SCS1= 1; // sélectionne l'oscillateur interne
    OSCCONbits.SCS0 = 0;

    Non ?

  5. A voir en vidéo sur Futura
  6. #5
    paulfjujo

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    bonjour,



    57600 bds => 5760 bytes / sec 5.7 bytes/ms !

    timer à 1mS
    => temps reel disponible < 1ms à cause du changement de context main <-> interrupt
    appel + sauvegarde /restitution registres MCU+ retour IT et duree de traitement envoiMessage

    l'envoi de tes 5 donnees n'est pas non plus contigu ..
    Meme si FOSC est bien reglé .. la fenetre temporelle de 1ms me parait bien trop juste
    pour que cela suive....
    en theorie tu dispose de 0.7 bytes ,au niveau temps . ( 5,7 -5)
    quelque soit FOSC , la limite reste surtout la vitesse de transmission UART .
    et avec une IT Timer0 à 1000Hz , ton MCU voit ses capacites de traitement bien entamées.
    il faut bien tenir compte des autres taches à effectuer ..


    passe à 57600 ou 115200 bds !
    FOSC 32MHZ ,à ces vitesses là (UART) , il vaudrait mieux utiliser un QUARTZ , plutot que FOSC interne
    à moins de paufiner OSCTUNE pour rester dans les tolerances vitesse en baud .

    Dans toutes les applis PICxxx, une petite led clignotant plusieurs fois à 1 sec
    en debut de programme .. permet tout de suite de verifier si FOSC est bien configuré.
    et que le programme est lancé ..

  7. #6
    wyssflorian

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Bonjour et merci à tous pour vos réponses

    Je vais digérer ces informations et essayer de modifier mon programme en conséquence, en particulier le passage sur quartz externe et le bon calcul des bauds...
    Je reviens vous montrer mon code une fois que ça fonctionnera (pas trop le choix)...

    Encore merci et bonne journée (de programmation )

    Florian

  8. #7
    wyssflorian

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    En fait PaulfJuju... Quel est l’intérêt d'utiliser un oscillateur externe ?
    Pour la précision du calcul du baudrate ? c'est vrai que je suis un peu haut en % d'erreur ... avec un quartz 40 MHz je descends à 1,2 % d'erreur à 115 bds, est-ce que c'est suffisant ?
    Est-ce que je n'aurais pas une meilleur précision justement en utilisant OSCTUNE ? l'important (cahier des charges) c'est cette vitesse minimum de communication à 1kHz. (Enfin, si j'arrive à échantillonner mes 3 capteurs, 1 AD 14 bits et deux codeurs incrémentaux à plus de 2,5 kHz derrière).
    Tu parles de capacités du uc, est-ce que je suis complètement à côté ou mon projet est réaliste ? Mon PIC18f4523 ne supporte pas des fréquences supérieurs à 40 MHz de toute façon ... sinon j'en utilise plusieurs mais ça va être casse couille à simuler ...

  9. #8
    antek

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    La datasheet indique l'erreur sur Fosc en fonction de la température avec l'oscillateur interne.
    Je ne me souviens plus des calculs mais il faut être à mieux que 2 % environ.
    Avec un quartz (pas à 40 MHz !) on obtient en général une valeur compatible avec le fonctionnement de la liaison série.
    La fonction "osctune" est utile uniquement si on peut mesurer la fréquence de la base de temps générée, ce qui est rarement le cas.

  10. #9
    wyssflorian

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Ok, d'accord, pas 40 MHz car il y a le PLL, mais j'ai quand même besoin d'un FOSC à 40 MHz selon mes calculs, donc un quartz à 10 MHz non ?

    PrtScr capture_8.jpg
    Images attachées Images attachées  
    Dernière modification par wyssflorian ; 10/09/2017 à 12h11.

  11. #10
    antek

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Citation Envoyé par wyssflorian Voir le message
    Ok, d'accord, pas 40 MHz car il y a le PLL, mais j'ai quand même besoin d'un Fosc à 40 MHz selon mes calculs, donc un quartz à 10 MHz non ?
    La datasheet, encore la datasheet, toujours la datasheet . . .

  12. #11
    wyssflorian

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Bonjour,

    J'ai lu la doc, recontrôlé (encore une fois) la configuration de mon oscillateur interne et j'ai tout juste selon moi (mais ça ne fonctionne toujours pas ...)

    J'ai passé en revu ce que me dit ma doc:

    The 4x frequency multiplier can be used with the internal
    oscillator block to produce faster ...
    1. The primary clock is the INTOSC clock source
    (selected in CONFIG1H<3:0>),
    Code:
    **
     * 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.
    comme selon ma fiche de configuration il faut le configurer CONFIG1H<3:0> de la sorte ...

    For example:
    // Oscillator Selection bits: Internal oscillator block, CLKO function on RA6, port function on RA7
    // Fail-Safe Clock Monitor Enable bit: Fail-Safe Clock Monitor enabled
    // Internal/External Oscillator Switchover bit: Oscillator Switchover mode enabled
    #pragma config CONFIG1H = 0xC9
    Et après ça:

    and 2. The 4 or 8 MHz INTOSC output is selected.
    Code:
    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.
    Remarquez que j'ai fait ces deux configurations avant d'écrire le bit PLLEN:
    Writes to the PLLEN bit will be ignored until both these
    conditions are met.
    Et malgré ça, mon uc tourne toujours à 2MHz dans ma simulation sur Proteus !!

    Franchement ... J'ai fais tout ce que j'ai pu là, si vous avez une autre piste dites le moi car autrement je vais jamais tenir mes délais

  13. #12
    wyssflorian

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Et mon calcul de Baud est correcte, mais j'ai plus de 2% d'erreur si je tourne à 32 MHz:

    Nom : 40001453F.pdf (PROTEGE) - Adobe Acrobat Pro.jpg
Affichages : 137
Taille : 93,1 Ko

    ça se joue à pas grand chose, je tente le coup ...

  14. #13
    RISC

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Salut,
    Si tu dépasses +/-2% tu auras des problèmes...
    Déjà que certains appareils sont "hors spec" et ne tolèrent même pas +/- 1% alors que la norme donne +/-2% max.
    Donc, il est recommandé d'utiliser un quartz à 10MHz ( x 4 par la PLL) sur la vraie carte (le simulateur ne connais probablement pas les PB de baudrate de l'UART)
    Mon conseil : ne configure pas l'oscillateur en touchant aux registres internes mais seulement les bits de configuration.
    Utilise le menu dédié de MPLAB X pour générer les bits de configuration
    J'ai utilisé Proteus au travers du plugin de MPLAB X et cela est conforme à ce qui se passe sur ma carte EXPLORER16 (16bits) ou PICDEM2PLUS (PIC16 ou PIC18)
    a+
    Dernière modification par RISC ; 17/09/2017 à 20h27.

  15. #14
    invite03481543

    Re : Communication sur UART (beaucoup) trop lente - PIC18F4523 - XC8 - MPLABX - Proteus

    Bonjour wyssflorian,

    tu mets un quartz de 24MHz, sans PLL, tu consommeras un peu moins moins.
    Pour 115kbps tu choisis:

    BRG16=1
    BRGH = 0

    Tu auras ton baud rate à 0.16%

Discussions similaires

  1. [Analogique] Communication UART et GND
    Par Bastien59 dans le forum Électronique
    Réponses: 17
    Dernier message: 13/04/2016, 09h22
  2. Communication uart STM32F4
    Par hichooo1991 dans le forum Électronique
    Réponses: 8
    Dernier message: 22/06/2015, 13h08
  3. problème liaison MPLabX / Proteus 8.0
    Par liarn dans le forum Électronique
    Réponses: 3
    Dernier message: 09/04/2014, 16h15
  4. communication entre labview 2012 et MPLABX
    Par puzzlou dans le forum Électronique
    Réponses: 2
    Dernier message: 18/03/2014, 22h14
  5. communication UART
    Par invitea302684b dans le forum Électronique
    Réponses: 0
    Dernier message: 07/01/2010, 08h53
Découvrez nos comparatifs produits sur l'informatique et les technologies.