Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Mesurer une suite de délais avec Timer5
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#11 Message par Claudius » dim. 26 avr. 2020 10:00 lien vers la Data-Sheet : Cliquez ici

Bonjour,

Les 2 lignes:

Code : Tout sélectionner

    DIG[0] = (nbr%1000000)/100000 ;   // Problème par ici ???
    DIG[1] = (nbr%100000)/10000 ;

peuvent effectivement poser problème si le compilateur considère les constantes comme des int et si le cas, il y aura un débordement sur les 2 constantes 1000000 et 100000

Essayer pour corriger le problème de suffixer ces 2 constantes avec L:

Code : Tout sélectionner

    DIG[0] = (nbr%1000000L)/100000L ;   // Problème par ici ???
    DIG[1] = (nbr%100000L)/10000 ;

A suivre...

Mesurer une suite de délais avec Timer5
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#12 Message par satinas » dim. 26 avr. 2020 10:12 lien vers la Data-Sheet : Cliquez ici

Bonjour,
Je ne vois pas de problème dans cette fonction d'affichage, ayant testé avec et sans le L ou UL, car même pensée que Claudius :)
Si tu lances l'exécution en debug, avec un point d'arrêt sur la ligne "DIG[1] = (nbr%100000)/10000;"
Si en entrée nbr est plus grand que 65535, dans la fenêtre Window/Debugging/Variables est ce que nbr et DIG[0] sont corrects ?
Le debugger pas à pas est là pour indiquer à quel moment cela ne va plus.

Il faut sécuriser les fonctions, commencer par
if (ali != 'L' && ali != 'R' && (ali < 1 || ali > 6)) ali = 'L';
if (rng < ? || rng > ?) rng = ?;

Mesurer une suite de délais avec Timer5
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#13 Message par Claudius » dim. 26 avr. 2020 16:19 lien vers la Data-Sheet : Cliquez ici

Ok satinas, mais cela peut dépendre du compilateur qui peut définir les constantes sans savoir à quoi elles vont servir (ici, utilisation de long alors que la constante peut être "taillée" comme un int)

Toujours est-il est qu'il fortement conseillé de lui indiquer, cela ne mange pas de pain ;-)

Maintenant, pour éviter d'utiliser ces constantes 1000000 et 100000 et d'ailleurs les autres sauf 10, il est tout à fait possible de replacer les 6 lignes de code

Code : Tout sélectionner

   DIG[0] = (nbr % 1000000) / 100000;
   DIG[1] = (nbr % 100000) / 10000;
   DIG[2] = (nbr % 10000) / 1000 ;
   DIG[3] = (nbr % 1000) / 100;
   DIG[4] = (nbr % 100) / 10;
   DIG[5] = nbr % 10;

par

Code : Tout sélectionner

   DIG[5] = nbr % 10;
   nbr /= 10; DIG[4] = nbr % 10;
   nbr /= 10; DIG[3] = nbr % 10;
   nbr /= 10; DIG[2] = nbr % 10;
   nbr /= 10; DIG[1] = nbr % 10;
   nbr /= 10; DIG[0] = nbr % 10;

en faisant attention que le nbr passé en argument est modifié et donc à ne plus utiliser dans la méthode AFF_NBERS() ... :sifflotte:

Mesurer une suite de délais avec Timer5
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#14 Message par Superphénix » dim. 26 avr. 2020 17:13 lien vers la Data-Sheet : Cliquez ici

Yes! Problème résolut.

Code : Tout sélectionner

    unsigned int t5l=0, t5h=0 ;  // ici j'avais mis unsigned char. (je pensais l'avoir testé déjà??)
    t5l=TMR5L; t5h=TMR5H;
    val_timer = (t5h<<8) | t5l  ;
    AFF_NBERS(val_timer, 27, 6) ;  // étonnant que ça à donné un résultat très grand?


...il est tout à fait possible de replacer les 6 lignes de code...

Merci j'ai repris. :)

Prochain problème :-D :
mon compteur d'overflow s’arrête à 1 et je ne trouve pas pourquoi.

Code : Tout sélectionner

    IOCCN   = 0b00000001 ;  // RC0
    INTCONbits.IOCIE = 1 ;  // Enables the interrupt-on-change
    INTCONbits.GIE = 1 ;  // Enables all active interrupts
    T5CON = 0b00000001 ;  // <7:6>: Tosc/4  ,  <5:4> Prescal: 1:1  ,  <3>: osc 2dn éteint  ,  <2>: SYNC  ,  <1>: EN=1 ;
    T5GCON = 0b00000000 ;  // Always On
    PIE4bits.TMR5IE = 1 ;  // Enable interrupt overflow


Code : Tout sélectionner

void __interrupt() inter(void)
{
    if(IOCCFbits.IOCCF0)   // Si interruption sur RC0
    {
       COMPTEUR() ;
       IOCCF = IOCCF&0b11111110 ;   // Remise à 0 du flag de l'interruption
    }
    if(PIR4bits.TMR5IF)   // Si interruption sur overflow de Timer5
    {
        if(Ovf_count<255) Ovf_count = Ovf_count + 1 ;     // Ovf_count: unsigned char
        PIR4 = PIR4&0b11101111 ;   // Remise à 0 du flag de l'overflow
    }
}


Code : Tout sélectionner

void COMPTEUR(void)   // Fonction incomplète pour tester, je ferais les calculs pour connaitre le délai une fois que ceci fonctionne :
{
    unsigned int t5l=0, t5h=0 ;
    t5l=TMR5L; t5h=TMR5H;
    val_timer = (t5h<<8) | t5l  ;
   
    AFF_NBERS(t5h, 10, 3) ;    // Afficher TMR5H à l'écran
    AFF_NBERS(t5l, 18, 3) ;    // Afficher TMR5L à l'écran
    AFF_NBERS(Ovf_count, 20, 'R') ;
    AFF_NBERS(val_timer, 27, 6) ;
   
    /* [...] */
   
    Ovf_count = 0 ;
}
Modifié en dernier par Superphénix le dim. 26 avr. 2020 20:21, modifié 1 fois.

Mesurer une suite de délais avec Timer5
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#15 Message par satinas » dim. 26 avr. 2020 17:41 lien vers la Data-Sheet : Cliquez ici

Je suis resté sur le Timer 1 qui fait tout le boulot, résolution 1us, alors tout ça faut m'expliquer à quoi ça sert.
Pourquoi tu ne peux pas utiliser le Timer 1 ?

T5CON = 0b00000001 ; ?

Mesurer une suite de délais avec Timer5
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#16 Message par Superphénix » dim. 26 avr. 2020 20:23 lien vers la Data-Sheet : Cliquez ici

Parce que j'utilise déjà le Timer1 pour un PWM. Et le datasheet dit que tout ce qui est dit pour Timer1 vaut aussi pour les Timers3 et 5 sauf quand l'inverse est précisé.

T5CON = 0b00000001 ; ?

Dans le datasheet il y a le détail pour T1CON, mais du coup ça vaut aussi pour T5CON.

(j'ai rajouté des commentaires en plus dans le commentaire précédent)

Mesurer une suite de délais avec Timer5
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#17 Message par satinas » dim. 26 avr. 2020 20:39 lien vers la Data-Sheet : Cliquez ici

Pas mal, dans la doc, il y un registre T1CON avec le bit ON en b0 et TxCON (générique ?) avec le bit ON en b7.
timer 0, 8 bits, config OPTION_REG
timers 1/3/5 similaires, 16 bits, config utiliser T1CON comme exemple
timers 2/4/6/8 similaires, 8 bits, config utiliser TxCON comme exemple

Je lis que le CCP/PWM utilise au choix le Timer 2, 4, 6 ou 8 et le CCP/Capture/Compare utilise le Timer 1.

Mesurer une suite de délais avec Timer5
Superphénix
Débutant
Débutant
Messages : 54
Enregistré en : mars 2020

#18 Message par Superphénix » lun. 27 avr. 2020 01:38 lien vers la Data-Sheet : Cliquez ici

Je lis que le CCP/PWM utilise au choix le Timer 2, 4, 6 ou 8 et le CCP/Capture/Compare utilise le Timer1.

Ah! :shock: (comme disait Denis Brogniart). Effectivement. En plus j'avais utilisé le Timer6 pour ça. Pour une quelconque raison depuis un moment je pensais avoir utilisé Timer1 ??
Du coup j'en ai profité pour associer le Timer6 à CCP2 pour utiliser CCP1 pour le Timer1. Et je suis donc passé du Timer5 au Timer1.
Ça n'a toujours pas fonctionné pour l'overflow. Mais je viens aussi de résoudre ce problème il manquait INTCONbits.PEIE = 1 ;
Du coup mon afficheur m'affiche des magnifiques gros nombres qui diminuent quand j'accélère la cadence de fronts descendants sur RC0. idea !

Merci !


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 13 invités