Quartz 20Mhz / 4 sur pic 18F4550
Répondre à la discussion
Affichage des résultats 1 à 22 sur 22

Quartz 20Mhz / 4 sur pic 18F4550



  1. #1
    invite0155ce91

    Quartz 20Mhz / 4 sur pic 18F4550


    ------

    Bonjour à tous,
    Je viens de mettre en place une liaison série asynchrone entre mon pic et mon PC. Actuellement tout marche mais j'ai mis un moment à la faire fonctionner pour une bonne raison :
    J'utilise un quartz de 20Mhz en HS, et d'après la datasheet du pic, il faut effectuer l'opération suivante pour initialiser le registre SPBRG = ((FOSC/Desired Baud Rate)/64) – 1. Je précise que c'est 9600bauds / 8bits de données / 1 bit de stop / sans parité / sans contrôle de flux. Je suis en low speed donc BRGH = 0.
    Mais voilà, d'après ce calcul je suis sensé trouver SPBRG = 31. Seulement avec cette donnée les caractères reçus et envoyés sont du grand n'importe quoi. Donc après une longue prise de tête et du tâtonnement, j'ai trouvé qu'avec SPBRG = 7, tout se passe bien, les caractères sont bons.
    Arrive la problématique : avec SPBRG = 7, je trouve une horloge cadencée à 5Mhz, soit 20Mhz / 4. Seulement je n'ai pas mis de pré diviseur ou autre. Est-ce donc normal de se retrouver avec cette fréquence ?
    Merci d'avance

    François

    -----

  2. #2
    invitedb9b1ced

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Bonjour,

    Peux tu poster ton code stp ?

    Merci.

  3. #3
    RISC

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Salut,

    Le PIC18F4550 a une horloge interne sophistiquée avec différents étages de division / multiplication.
    Commence pas lire la datasheet et regardes les bits de configuration.
    Si tu n'as pas initialisé ces bits au début de ton programme, ta fréquence interne Fosc n'est pas du tout celle que tu penses... en tout cas pas celle de ton quartz

    a+

  4. #4
    invite0155ce91

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Et bien justement j'ai bien lu la datasheet à plusieurs reprises et notamment les registres OSCCON et OSCTUNE, j'ai d'après moi initialisé comme il fallait l'horloge pour avoir du 20Mhz, et fais attention à ce qu'il n'y est pas de pré diviseur, mais ça ne doit juste pas être le cas.
    Je vous posterai mon code de configuration demain.
    Merci pour vos réponses

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

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Voilà les registres concernant l'horloge :

    //Clock externe : quartz 20MHz
    #pragma config FOSC = HS

    OSCCON = 0x00;
    OSCTUNE=0b00010000;

  7. #6
    invitedb9b1ced

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Salut,

    Le peu que tu as posté ne semble pas mauvais pour ce que tu veux faire (même si toucher à OSCTUNE ne sert à rien ici).
    Mais peux tu poster tout ton code stp ?
    Car pour configurer l'oscillateur en externe tu n'as même pas besoin de toucher à OSCCON et OSCTUNE, tu dois pouvoir le faire juste en configurant correctement les fusibles de configuration.

    A+

  8. #7
    invite0155ce91

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    D'acc alors voilà mon fichier c principal :

    #include <p18f4550.h>
    #include <delays.h>
    #include "inout.h"
    #include "config.h"

    /////////////Variables globales/////////////
    unsigned char gChar;

    /////////////Mise en place de l'interruption/////////////
    void it_prioritaire(void);

    #pragma code int_toto=0x08 //0x18 pour basse priorité
    void int_toto(void) {
    _asm GOTO it_prioritaire _endasm
    }
    #pragma code

    #pragma interrupt it_prioritaire
    void it_prioritaire()
    {
    if(OERR)
    {
    CREN=0;
    CREN=1;
    }
    if(RCIF)
    {
    gChar=RCREG;
    }
    if(TMR0IF)
    {
    if(!RA1)
    {
    gScore+=1;
    }
    else if(!RA2)
    {
    gScore+=2;
    }
    else if(!RA3)
    {
    gScore+=3;
    }
    else if(!RA4)
    {
    gScore+=4;
    }
    gCpt++;
    TMR0IF=0;
    }
    }

    /////////////Fonctions tempo/////////////
    void ms8(unsigned char count)
    {
    Delay10KTCYx(count); //tempo de 8ms si count=1
    }


    /////////////Fonction d'initialisation/////////////
    void init(void)
    {
    // OSCCON = 0x00; //pas de prédiviseur => 20MHz
    OSCTUNE=0b00010000;
    ADCON1=0x0F; //Utiliser RAx comme entrée analogique
    TRISA=0b0111111;
    TRISB=0x00;
    TRISC=0b00000001;
    TRISD=0x00;
    TRISE=0xF;
    T0CON=0b11000011; //Définition du comptage du timer0
    SSPEN=0;
    GIE=1;
    TMR0IE=1;
    TMR0IF=0;
    }

    void init_RS232(void)
    {
    PEIE=1;
    RC7; //RX
    RC6; //TX
    RCSTA = 0b10010000;
    TXSTA = 0b00100010;
    BAUDCON = 0b00000000;

    SPBRGH = 0b00000000;
    SPBRG = 7;
    CREN=1;
    RCIE=1;
    }



    /////////////Main/////////////
    void main(void)
    {
    init();
    init_RS232();
    RB0=1;
    RB1=1;
    while(1)
    {
    if(gChar=='A')
    {
    while(gChar=='A')
    {
    RB0=1;
    RB1=0;
    ms8(1);
    }
    }
    }
    }

  9. #8
    invite0155ce91

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Et voici mon config.h :

    /////////////Config/////////////
    //Pour le Timer0 T0CON
    #define TMR0ON T0CONbits.TMR0ON //timer0 ON/OFF
    #define T08BIT T0CONbits.T08BIT //8 ou 16 bits
    #define T0CS T0CONbits.T0CS //selection de l'horloge (0 pour l'interne)
    #define T0SE T0CONbits.T0SE //Compte sur Fmontant si à 0 et descendant si à 1
    #define PSA T0CONbits.PSA //pre diviser actif à 0
    #define T0PS2 T0CONbits.T0PS2 //Selection du prédiviseur 111=1/256 110=1/128...
    #define T0PS1 T0CONbits.T0PS1
    #define T0PS0 T0CONbits.T0PS0

    //Pour désactiver MCLR
    #pragma config MCLRE = OFF

    //Clock externe : quartz 20MHz
    #pragma config FOSC = HS

    //Pour l'interruption INTCON
    #define GIE INTCONbits.GIE
    #define PEIE INTCONbits.PEIE
    #define TMR0IF INTCONbits.TMR0IF
    #define TMR0IE INTCONbits.TMR0IE


    //Pour activer port série
    #define SSPEN SSPCON1bits.SSPEN

    //Désactiver Low Power Voltage pour activer RB5
    #pragma config LVP = OFF

    //Watch dog off
    #pragma config WDT = OFF


    #define RCIF PIR1bits.RCIF
    //#define TXIF PIR1bits.TXIF

    #define RCIE PIE1bits.RCIE
    //#define TXIE PIR1bits.TXIE

    #define TRMT TXSTAbits.TRMT //1 = TXREG empty / 0 = TXREG full

    #define OERR RCSTAbits.OERR
    #define CREN RCSTAbits.CREN

  10. #9
    paulfjujo

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    bonjour,


    Quand vas-tu montrer ta config bit complete ?

    CONFIG1L contient en autre CPUDIV1 et CPUDIV2
    postcaler divider ...
    For XT, HS, EC and ECIO Oscillator modes:
    11 = Primary oscillator divided by 4 to derive system clock <--- 20/4= 5MHz !!!
    10 = Primary oscillator divided by 3 to derive system clock
    01 = Primary oscillator divided by 2 to derive system clock
    00 = Primary oscillator used directly for system clock (no postscaler)

  11. #10
    paulfjujo

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    re..

    tu nous montre la config des registres et non pas la config des bits de configurations
    ex ci joint

    Nom : Pic_Config.jpg
Affichages : 266
Taille : 220,3 Ko:

  12. #11
    invite0155ce91

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    C'est justement parce que la case Configuration Bits set in code est coché, donc tous les bits de configurations non initialisés dans mon code ont pris leur valeur par défaut.
    Donc ce que tu dis Paulfjujo ne tient pas vu que dans la datasheet les registres CPUDIV sont initialisés à 0 par défaut donc pas de pré diviseur, ce que j'avais déjà vérifié préalablement avant de poster sur le forum ^^

    U-0 U-0 R/P-0 R/P-0 R/P-0 R/P-0 R/P-0 R/P-0
    — — USBDIV CPUDIV1 CPUDIV0 PLLDIV2 PLLDIV1 PLLDIV0

  13. #12
    invitedb9b1ced

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Sinon pour être sûr que ce ne soit pas un souci de configuration d'oscillateur tu peux faire osciller une sortie avec une fréquence connue et visualiser le signal sur un oscillo.
    Si le signal a une fréquence identique à la théorie alors il n'y a pas de soucis d'oscillateur, sinon si.

  14. #13
    invite0155ce91

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Oui en effet c'est une solution, mais bon à vrai dire je posais plus cette question par curiosité et interrogation. Ca ne me pose pas vraiment de probème dans mon travail d'utiliser du 5MHz mais je trouve ça tout de même bizarre après vérification de la config. En tout cas merci pour vos réponses.

  15. #14
    invitedb9b1ced

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Je suis tout de même curieux de connaître le pourquoi du comment ?
    Tu peux un peu investiguer ?

  16. #15
    paulfjujo

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    re


    Peux tu mettre ton code pour "inout.h"
    où je pense une macro est definie pour :
    RC7; //RX
    RC6; //TX

    ainsi, je pourrai tester ton programme (meme avec un 18F2550) ..et un quartz de 20Mhz
    et te dire ce que j'obtiens..

  17. #16
    paulfjujo

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    bonsoir,

    J'ai fait un test avec un 18F2550 monte sur une platine Start USB , mais avec un quartz de 8MHz.(soudé!)
    Cela ne fonctionnait pas..
    J'avais rajoute un Put_RS(char untel) pour tester au moins l'envoi..
    Il semblerait bien que la clock ne passait pas du tout .. rien sur la transmission.

    j'ai essayé alors avec la librairy C18 <usart.h> Init_UART1 .. OK
    vitesse à 3900 bauds au lieu de 9600 .. mais NORMAL avec Q=8Mhz

    puis je suis revenu sur ton programme.
    J'ai rajoute le traitement sur Frame Error dans l'interrupt
    et un Put_RS pour aider au debugging...
    et dans l'init RS232
    IPR1bits.RCIP=1; // high priority for UART
    RCONbits.IPEN = 1; // Enable High interrupt priority model.

    A priori, il y a bien un bug dans la specsheet , confirmé d'ailleurs par les parametres de a routine de la librairie C18 UART
    le mode de calcul avec BRG16=0 est FAUX
    il n'y a qu'avec BRG16=1 que la formule correspond exactement
    Mon quartz etant de 8Mhz j'ai une vitesse de 3906 bauds au lieu de 9600 bds
    Test OK avec terminal VBRAY et clignotement de led sur reception lettre A.
    le parametre BRGH correspond à celui utilise via la library C18.

    C'est quand meme fort , car 130 est bien contenu dans un Byte !


    Code:
    #include <p18f2550.h>
    #include <delays.h>
    // Quartz 8MHz
    // config bits dans le code !
    
    #include <stdlib.h>
    #include <usart.h>
    //#include "inout.h"
    
    /////////////Config/////////////
    //Pour le Timer0 T0CON
    #define TMR0ON T0CONbits.TMR0ON //timer0 ON/OFF
    #define T08BIT T0CONbits.T08BIT //8 ou 16 bits
    #define T0CS T0CONbits.T0CS //selection de l'horloge (0 pour l'interne)
    #define T0SE T0CONbits.T0SE //Compte sur Fmontant si ŕ 0 et descendant si ŕ 1
    #define PSA T0CONbits.PSA //pre diviser actif ŕ 0
    #define T0PS2 T0CONbits.T0PS2 //Selection du prédiviseur 111=1/256 110=1/128...
    #define T0PS1 T0CONbits.T0PS1
    #define T0PS0 T0CONbits.T0PS0
    
    //Pour désactiver MCLR
    #pragma config MCLRE = OFF
    //Désactiver Low Power Voltage pour activer RB5
    #pragma config LVP = OFF
    //Watch dog off
    #pragma config WDT = OFF
    //Clock externe : quartz 20MHz
    #pragma config FOSC = HS
    
    //Pour l'interruption INTCON
    #define GIE INTCONbits.GIE
    #define PEIE INTCONbits.PEIE
    #define TMR0IF INTCONbits.TMR0IF
    #define TMR0IE INTCONbits.TMR0IE
    
    //Pour activer MSPP SPI !!
    #define SSPEN SSPCON1bits.SSPEN
    #define RCIF PIR1bits.RCIF      // timer1
    //#define TXIF PIR1bits.TXIF
    
    #define RCIE PIE1bits.RCIE      // timer1 ?
    //#define TXIE PIR1bits.TXIE
    #define TRMT TXSTAbits.TRMT //1 = TXREG empty / 0 = TXREG full
    #define OERR RCSTAbits.OERR
    #define CREN RCSTAbits.CREN
    
    #define BAUDS 9600
    //-------Variables globales-----------
    
    unsigned int BRG_REG;
    unsigned char gChar;
    int gCpt;
    
    void Put_RS(unsigned char untel);
    void Init_UART1(void);
    
    /////////////Mise en place de l'interruption/////////////
    void it_prioritaire(void);
    
    #pragma code int_toto = 0x08 //0x18 pour basse priorité
    void int_toto(void) {
    _asm 
    GOTO it_prioritaire 
    _endasm
    }
    #pragma code
    
    #pragma interrupt it_prioritaire
    void it_prioritaire()
    {
    
    if(RCIF)
    {
      if(OERR)
      {
      CREN=0;
      CREN=1;
      }
     if(RCSTAbits.FERR==1 )
       {
         RCSTAbits.SPEN = 0 ;
         RCSTAbits.SPEN= 1 ;
      }
     //gChar =ReadUSART();
     gChar=RCREG;
     Put_RS(gChar); // echo
     // RCIF=0;  // reset by interrupt itself
    }
    if(TMR0IF)
    {
    gCpt++;
    TMR0IF=0;
    }
    }
    
    /////////////Fonctions tempo/////////////
    void ms8(unsigned char count)
    {
    Delay10KTCYx(count); //tempo de 8ms si count=1
    }
    
    
    void Put_RS(unsigned char untel)
    {
    //while((TXSTA & 0b00000010)==0);
    //while(!TRMT);
    TXREG = untel;
    ms8(2);
    }
    
    /////////////Fonction d'initialisation/////////////
    void init(void)
    {
    // OSCCON = 0x00; //pas de prédiviseur => 20MHz
    //OSCTUNE=0b00010000;
    //ADCON1=0x0F; //Utiliser RAx comme entrée analogique
    //TRISA=0b0111111;
    ADCON1=0x0C;
    TRISA=0b0111100;    // test sur led RA1
    TRISB=0x00;
    //TRISC=0b00000001;
    TRISC=0b10000001;
    T0CON=0b11000011; //Définition du comptage du timer0
    SSPEN=0;
    TMR0IE=1;
    TMR0IF=0;
    }
    
    
    void init_RS232(void)  // page 248 datasheet paragraph 20
    {
    TRISCbits.RC7=1; //RC7; //RX
    TRISCbits.RC6=1; //RC6; // TX en entree ?? meme si ce sera une sortie voir p 245
    RCSTA = 0b10010000;  // SPEN must be set to 1, and  CREN=1
    //TXSTA = 0b00100010; // TSR empty ?  read only bit !
    TXSTAbits.BRGH=1; // High speed bit 2 High Baud Rate Select bit
    
    TXSTA = 0b00100000; //TXEN=1
    
    // datasheet page 249 table 20-1   FAUSSE !!!
    // avec BRG16 à 1 on a cela 
    BAUDCONbits.BRG16=1;
    SPBRGH = 0;     // FOSC/[64 (n + 1)]   Q=20Mhz => Fosc=Q/4= 5000 000
    SPBRG = 130;    // SPBRGH:SPBRG =    n=7  =>  9765 bauds  
    CREN=1;         //  ou 3906 bauds si  Q=8Mhz au lieu de 20Mhz
    }
    
    
    void Init_UART1(void)
    {
    // USART_BRGH_HIGH,32
    // init 38400Bd a 20Mhz
    // init 19200Bd a 10Mhz avec IT en rx
    // voir para 18.5 spec sheet DS41159B page 186
    // 9600   130 @ 20MHz      sinon  3900 bauds à 8Mhz
    // 19200  64 @ 20MHz 
    // 38400  32 @ 20MHz 
    // 115200  10 @ 20MHz 
    switch ( BAUDS)
    {
        case 9600: BRG_REG=130;break;
        case 19200: BRG_REG=64;break;
        case 38400: BRG_REG=32;break;
        case 115200: BRG_REG=10;break;
        default: 
        BRG_REG=130;
         break;
    
    }
    OpenUSART( USART_TX_INT_OFF &
    USART_RX_INT_ON &
    USART_ASYNCH_MODE &
    USART_EIGHT_BIT &
    //USART_CONT_RX &
    USART_SINGLE_RX &
    USART_BRGH_HIGH,BRG_REG 
    ); //130 pour 9600 bds @20Mhz
    IPR1bits.RCIP=1;  // high priority for UART
    RCONbits.IPEN = 1;     // Enable High interrupt priority model.
    RCIE = 0;
    PEIE = 0 ; // autorisation des IT des périphériques
    GIE = 0 ; // autorisation globale des IT
    }
    
    
    /////////////Main/////////////
    void main(void)
    {
    init();
    
    init_RS232();
    //Init_UART1();
    
    INTCONbits.GIEL=1;
    RCIE = 1;// interrupt Timer1 enable ?
    PEIE=1; // autorisation des IT des périphériques
    GIE=1;  // autorisation globale des IT
    
    
    ms8(255);
    Put_RS('A');
    Put_RS('a');
    Put_RS('z');
    Put_RS('Z');
    Put_RS(13);Put_RS(10);
    PORTBbits.RB1=0; 
    ms8(255);
    PORTBbits.RB1=1; 
    ms8(255);
    PORTBbits.RB1=0; 
    ms8(255);
    PORTAbits.RA1=1; 
    ms8(255);
    PORTAbits.RA1=0; 
    while(1)
     {
      if(gChar=='A')
      {
        while(gChar=='A')
        {
        PORTBbits.RB1=!PORTBbits.RB1;
        ms8(255);
        }
       }  
        else
       {
       PORTBbits.RB1=0;
       
      }
     }
    }

  18. #17
    invite0155ce91

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Désolé de répondre aussi tardivement. En effet dans "inout.h" il n'y a que des #define pour faciliter l'écriture. Donc tu confirmes l'erreur de la datasheet ? Il faut donc mettre le registre BRG16 à 1 pour effectuer le calcul avec cette formule ?

  19. #18
    paulfjujo

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    bonjour,

    Citation Envoyé par Francois06 Voir le message
    Donc tu confirmes l'erreur de la datasheet ?
    NON , j'ai melangé les 2 termes BRGH et BRG16 , pas d'erreur sur la datasheet !
    par contre BRG16 est une alternative à BRGH
    j'ai refait d'autre tests de config:

    Code:
    //avec BRGH=0 et BRG16=1 et Q=20MHz  9600bds
    TXSTAbits.BRGH=0; 
    BAUDCONbits.BRG16=1; 
    SPBRGH = 0;     // FOSC/[16 (n + 1)] = 200000000/(16x33)
    SPBRG = 130;    // 9541 bauds  -0.6% ou 3906 bauds si  Q=8Mhz au lieu de 20Mhz
    
    
    /*avec BRGH=1 et BRG16=0  Q=8Mhz 9600 bauds
    TXSTAbits.BRGH=1; // High speed bit 2 High Baud Rate Select bit
    BAUDCONbits.BRG16=0; 
    SPBRGH = 0;     // FOSC/[16 (n + 1)]   Q=8Mhz => Fosc=8000000/(16*(53))
    SPBRG =52;      // 9433 bauds  -1.73%
    */
    
    /*
    /*avec BRGH=1 et BRG16=0  Q=20Mhz  9600 bauds
    TXSTAbits.BRGH=1; // High speed bit 2 High Baud Rate Select bit
    BAUDCONbits.BRG16=0; 
    SPBRGH = 0;     // FOSC/[16 (n + 1)]   Q=8Mhz => Fosc=8000000/(16*(53))
    SPBRG =130;     // 9541.9 bauds  -0.6%
    */
    Je pense que l'usage de BRGH est preferable à BRG16
    d'autant que personnellement je n'ai pas bien compris l'usage d'un mode 16 bits Asynchrone
    puisqu'on ne peut lire que 8 bits dans le registre RCREG
    ou est-ce qu'il faut le lire 2 fois de suite dans la meme interrupt ?
    Je n'ai pas trouvé sur le web d'explication la-dessus.

    J'avais trouvé sur le net cet outils microchip:
    Images attachées Images attachées  

  20. #19
    invite0155ce91

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    En effet, mais je viens de vérifier dans la datasheet, pour mon cas, SYNC=0, BRG16=0, BRGH=0 et je suis en 8bits de donnée. Je tombe donc sur l'opération Baud rate = Fosc/[64(n+1)] (voir page 247). Pourtant mon n est égale à 7. C'est quand même troublant, et rien dans la config ne divise la fréquence de mon quartz. As-tu fait les tests, avec BRGH et BRG16 = 0 ?
    Je vais finir par utiliser un oscillo pour percer le mystère ^^

  21. #20
    paulfjujo

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Hello

    Apres avoir refait des test avec config BRGH=0 BRG16=0

    Resultat BAD:
    il s'avere que j'ai un pourcentage d'erreur trop important ( -6.99%) pour 9600 bauds
    avec mon quartz de 8Mhz
    et je n'obtiens que du charabia!

    Resultat OK
    si je baisse la vitesse à 2400 bauds pour Q=8Mhz avec n=52 , suivant le tableau
    La COMM est OK car le pourcentage d'erreur est retombé à -1,7%


    Resultat OK:
    Si je configure comme si j'avais un quartz de 20Mhz , j'ai une bonne COMM en
    equivalent 9600 bauds , mais j'ai en reel =3768 bauds car mon quartz est de 8Mhz!
    (rappel : Vbray terminal possede un custom bitrate !)
    donc N=32 doit etre la bonne valeur..


    voila la config bits que voit le Pickit3 sur mon fichier de test
    Configuration 0C20 1E19 8300 0081 C00F E00F 400F


    Code:
    //avec BRGH=0 et BRG16=0 et Q=8MHz   2400bds
    TXSTAbits.BRGH=0; 
    BAUDCONbits.BRG16=0; 
    SPBRGH = 0;     // FOSC/[64 (n + 1)] = 80000000/(64x53)
    SPBRG = 52;    //  2358 bauds  -1.73%   OK meme à 2400 bauds
    
    
    /*
    //avec BRGH=0 et BRG16=0 et Q=8MHz   9600bds
    TXSTAbits.BRGH=0; 
    BAUDCONbits.BRG16=0; 
    SPBRGH = 0;     // FOSC/[64 (n + 1)] = 80000000/(64x14)
    SPBRG = 13;    //  8928 bauds  -6.99%   BAD ! BAD! 
    */
    
    
    /*
    //avec BRGH=0 et BRG16=0 et Q=20MHz   9600bds
    TXSTAbits.BRGH=0; 
    BAUDCONbits.BRG16=0; 
    SPBRGH = 0;     // FOSC/[64 (n + 1)] = 200000000/(64x14)
    SPBRG = 32;    //  9467 bauds  -1.36%  
    // si regle de 3 avec Q=8Mhz
    // => custom bauds rate =3768 bauds 
    // test  OK !!)
    */
    Toujours est-il que je ne vois AUCUN lien avec ton N=7
    hormis un quartz oscillant sur un frequence plus basse que celle marquée ( quartz overtone ?)
    ou un bit de config foireux.

    La Freq d'oscillation du quartz est quand meme facile à verifier.
    en prenant Temps de Cycle (µS) =4/Quartz(Mhz)
    dans on cas 8Mhz cycle de 0.5µS * 2000 000 soit 1 seconde

    En cochant Time sur VBRAY, et

    Code:
    PORTBbits.RB1=1;  // led verte ON
    Put_RS('#');Put_RS(13);Put_RS(10);
    Delay10KTCYx(200);      // 200 x 10.000 cycles
    Put_RS('*');Put_RS(13);Put_RS(10);
    PORTBbits.RB1=0; // // led verte OFF
    j'obtiens sur le terminal
    18:47:49.223> #
    18:47:50.234> *
    18:47:51.746> TesT EUSART
    18:47:53.098>
    18:47:54.460>

    avec Q=8Mhz 1 seconde (à 11mS pres) .. OK

  22. #21
    RISC

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Bonjour,

    Beaucoup de suppositions et d'affirmations fausses dans les posts ci-dessus...
    Il n'y a pas d'erreur dans la datasheet concernant l'UART et ses tableaux.

    La réalité est très simple : afin d'avoir une liaison UART correcte, il FAUT utliser un quartz et que le taux d'erreur sur la vitesse soit <= +/-2%

    Le PIC18F4550 est capable de gérer des baudrate jusqu'à 115Kbits/s avec moins de 2% d'erreur...a condition de LIRE LA DATA SHEET ET DE PROGRAMMER CORRECTEMENT LES BITS DE CONFIGURATION !.

    La fréquence du quartz a "peu d'importance" car le PIC18F4550 a un diviseur programmable et une PLL sophistiquée.
    On peut obtenir Fosc= 48MHz même avec un quartz 4 MHz !!
    tout est expliqué dans la section 2 (oscillator configurations) de la datasheet.

    Il y a un diviseur en entrée de façon à avoir 4MHz en sortie du diviseur : c'est "obligatoire" pour pouvoir avoir 48MHz pour l'USB.
    La PLL interne est x 24.

    Exemple : si la quartz est à 4 MHz on divise par 1, s'il est a 20MHz, on divise par 5 etc...

    L'important est donc de bien programmer les bits de configuration CPUDIV, PLLDIV (voir section 18.1 de la datasheet).

    Plus Fosc est elevé moins l'erreur sur le baud rate sera importante...
    Avec un quartz à 8MHz il est TRES FORTEMENT RECOMMANDE d'utiliser la PLL intégrée pour avoir un Fosc plus élevé.
    Si l'USB doit être mis en oeuvre, de toute façon on a pas le choix. il FAUT utiliser la PLL

    NB : il y a des milliers d'exemples de programmes sur internet pour ce micro...il serait plus rapide de chercher et regarder comment les autres programment les bits de configuration

    Faire des printf dans l'interruption c'est donner un baton pour se faire battre...Regarde ton code désassemblé et le temps d'exécution de ton interruption et tu comprendras.


    a+
    Dernière modification par RISC ; 26/05/2012 à 13h41.

  23. #22
    invite0155ce91

    Re : Quartz 20Mhz / 4 sur pic 18F4550

    Merci pour ta réponse, mais je suis toujours dans l'interrogation. Sur la datasheet, il est bien spécifié que les bits CPUDIV et PLLDIV sont, par défaut, mis à zéro. De plus, mon FOSC = HS, la PLL n'est donc pas activée. Alors pourquoi un n=7 pour ma part ?

Discussions similaires

  1. aide sur la programmation USB pour le PIC 18F4550
    Par invitea9f115f3 dans le forum Électronique
    Réponses: 8
    Dernier message: 24/04/2012, 21h57
  2. rs232 parité sur pic 18f4550
    Par invite1208e497 dans le forum Électronique
    Réponses: 1
    Dernier message: 22/06/2011, 17h24
  3. utilité de l'oscillateur à quartz sur un PIC
    Par mariepour dans le forum Électronique
    Réponses: 4
    Dernier message: 17/01/2011, 15h28
  4. Quartz 20Mhz au lieu de 4MHz ?
    Par invite2c55735f dans le forum Électronique
    Réponses: 28
    Dernier message: 06/12/2009, 18h45
  5. Programmation sur PIC 18F4550
    Par inviteaa7c8409 dans le forum Électronique
    Réponses: 5
    Dernier message: 31/03/2009, 15h10
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...