Compréhension d'un programme
Répondre à la discussion
Affichage des résultats 1 à 13 sur 13

Compréhension d'un programme



  1. #1
    flyingrock

    Compréhension d'un programme


    ------

    Bonjour,
    Ci joint un code écrit en C à l'aide de MikroC qui permet de mesurer un lapse de temps entre 2 fronts montants.

    Je sèche un peu sur ce code surtout ici
    // Calculate length of pulse from rising edge to rising edge
    tword = ~tOld + tNew+1;
    Pourquoi inverser les bits de tOld et pourquoi ajouter 1 à la fin ?


    Code:
    /*
    * Project name:
    Capture Sample
    
    * Copyright:
    Nicholas Sirirak
    
    * Description:
    This is a simple capture a lenght of pulse. Capture from rising edge
    to rising edge and send to terimianl via RS232
    * Test configuration:
    MCU: PIC16F877A
    Dev.Board: EasyPIC3
    Oscillator: HS, 16.0000 MHz
    Ext. Modules: -
    SW: mikroC v8.1.0.0
    * NOTES:
    
    */
    
    unsigned tOld, tNew;
    char th,tl;
    char edge = 0;
    char capture = 0;
    unsigned tword;
    char txt[6];
    
    void interrupt() {
    if(PIR1.CCP1IF){
    if(!edge){
    tOld = (256*CCPR1H)+CCPR1L; // keep starting value
    edge = 1;
    }else{
    tNew = (256*CCPR1H)+CCPR1L; // keep ending value
    capture = 1; // complete capture, set a flag
    edge = 0;
    }
    PIR1.CCP1IF = 0; //clear CCP flag
    }
    }
    
    void main() {
    char i;
    TRISB = 0; // PORTB is output
    PORTB = 0; // Initialize PORTB
    TRISA = 0;
    TRISC = 0;
    CCP1CON = 0x05; // Capture mode every rising edge
    TRISC.F2 = 1; // RC2 must be input
    T1CON = 0x21; // timer1 ON, internal clock Fosc/4, prescaler 1:4
    INTCON.GIE = 1;
    INTCON.PEIE =1;
    PIE1.CCP1IE = 1; // enable interrupt capture
    PIR1.CCP1IF = 0; //clear CCP flag
    
    uart1_init(9600);
    while(1){
    if(capture){
    PIE1.CCP1IE = 0; // disable interrupt while processing
    capture = 0; // clear flag
    // Calculate length of pulse from rising edge to rising edge
    tword = ~tOld + tNew+1;
    // tword contain length of pulse in micro second
    WordToStr(tword, txt); // convert to string and send back to terminal
    for(i=0; i<6; i++) uart1_write(txt[i]);
    delay_ms(1000);
    PIR1.CCP1IF = 0; //clear CCP flag
    PIE1.CCP1IE = 1; // enable interrupt
    }
    }
    }
    @+

    -----

  2. #2
    invitee23b806b

    Re : Compréhension d'un programme

    Satut Flyingrock,

    complémenter et rajouter 1 revient à calculer -tOld à partir de tOld.
    Voir les cours de numérique.

    Le but est de calculer la différence entre tNew et tOld.
    tword = tNew- tOld = tNew + (-tOld) = tNew + (~tOld + 1)

    @ +,

  3. #3
    micka_ch

    Re : Compréhension d'un programme

    Bonjour,

    Comme le dit Tuxtronic, une addition du complément à 2 revient a faire une soustraction.

    Cela dit je ne vois pas l'utilité de faire cela car la soustraction est une instruction assembleur. Faudrait voir ce que le compilateur génère en faisant c=a-b; et c=a+(~b+1); Peut-être qu'on gagne quelques instructions quand les variable a et b sont sur 16bits.

    Salutations

  4. #4
    Jack
    Modérateur

    Re : Compréhension d'un programme

    Exact.
    C'est bizarre de ne pas avoir utilisé une soustraction.

    @flyingrock: c'est bien pour les balises code, mais l'intérêt reste limité si tu n'indentes pas ton code.

    A+

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

    Re : Compréhension d'un programme

    @ Jack,

    C'est bizarre de ne pas avoir utilisé une soustraction.
    J'ai peut-être une explication:
    Imaginons que tOld soit échantillonné juste avant que le timer 16 bits ne replie, par ex, tOld = 65500 et que tNew soit échantillonné juste après, par ex tNew=200.

    DU coup, on a tOld plus grand que tNew.

    Avec un calcul sur 8 bits, le résultat de tNew-tOld est toujours correct même si le timer a replié.

    Pour un calcul sur 16 bits avec un micro 8 bits, il faudrait en toute rigueur testé si tNew est plus grand que tOld.

    On aurait un truc du genre:
    Code:
    if (tNew>=tOld)
    {
        tword= tNew - tOld;
    }
    else
    {
        tword= tOld - tNew;
    }
    Peut-être que le fait d'utiliser le complément à 2 plutôt que la simple soustraction permet de gèrer le repli???

    @ +,

  7. #6
    invitee23b806b

    Re : Compréhension d'un programme

    Bon, comme je ne peux pas ré-èditer mon précédent message, je corrige:

    Il fallait évidement lire:
    Code:
    if (tNew>=tOld)
    {
        tword= tNew - tOld;
    }
    else
    {
        tword= (65536-tOld) + tNew; /* Temps jusqu'au repli + durée écoulée depuis le repli */
    }
    @ +,

  8. #7
    Jack
    Modérateur

    Re : Compréhension d'un programme

    je ne suis pas convaincu. Comme les opérations ont forcément un modulo, le résultat restera juste, même si le compteur est revenu à zéro entre les 2 temps. Pour ton exemple, 65500 = FFDCh et 200 = 00C8h
    Si on effectue la soustraction directe 00C8h - FFDCh, on trouve bien ECh, soit 236.

    A+
    Dernière modification par Jack ; 04/05/2012 à 11h50. Motif: 236, pas 238

  9. #8
    invitee23b806b

    Re : Compréhension d'un programme

    C'est pas impossible puisque 65536 sur 16 bits font 0.
    On se retrouve donc avec la même formule qu'il y ait repli ou pas.
    Code:
    tword= tNew - tOld;
    C'est bizarre, puisqu'avec un compilateur C (je ne sais plus lequel), il y a de cela plusieurs années, je n'avais pas le bon résultat quand le compteur 16 bits avait replié.

    Il est donc prudent, de faire une petite séance de debug pour vérifier que le résultat du calcul est bon dans le cas d'un repli.

    Si tNew-tOld, fonctionne, ben, même en cas de repli, tout va pour le mieux dans le meilleur des monde!

    @ +,

  10. #9
    Jack
    Modérateur

    Re : Compréhension d'un programme

    C'est bizarre, puisqu'avec un compilateur C (je ne sais plus lequel), il y a de cela plusieurs années, je n'avais pas le bon résultat quand le compteur 16 bits avait replié.
    Il faut choisir le bon type de donnée, en l'occurrence un "unsigned short" pour un compteur 16 bits, sinon on prend des risques.

    A+

  11. #10
    invitee23b806b

    Re : Compréhension d'un programme

    Oui, tout-à-fait, j'étais bien en "unsigned short".

    La morale de tout ça: il ne faut pas hésiter à regarder de plus près le code généré par le compilo: on voit de tout. Et surtout, ne pas hésiter à tester son code au limites tels que replis, changements de signe, etc...

    Et croire que tous les compilos sont exempt de bug, c'est croire au père noël! Déjà, faut avoir lu la doc...

    @ +,

  12. #11
    flyingrock

    Re : Compréhension d'un programme

    Bonjour à tous,

    Merci pour m'avoir décortiqué cette ligne, il me semblait bien que cela devait être une soustraction, mais très franchement ça ne m'a pas sauté au yeux.
    Je vais essayer de trouver un moyen de joindre l'auteur du programme et lui demander le pourquoi du comment.

    @+

  13. #12
    flyingrock

    Re : Compréhension d'un programme

    Bonjour,

    J'ai reçu une réponse de l'auteur du programme, je lui ai demandé pourquoi ne pas avoir utilisé une simple soustraction.

    Voici ce qu'il m'a répondu :"tNew may rollover from FFFF to 0, imagine if tOld is greater than tNew. so to be sure using adding method by subtrac the complement +1."

    Vu comme ça c'est pas idiot on a pas a se soucier d'avoir tNew supérieur a tOld

    @+

  14. #13
    Jack
    Modérateur

    Re : Compréhension d'un programme

    Vu comme ça c'est pas idiot on a pas a se soucier d'avoir tNew supérieur a tOld
    le fait que tOld soit supérieur ou non à tOld n'a aucune espèce d'importance comme je l'ai expliqué dans le post#7.
    Il me semblait que mon exemple le montrait bien pourtant ...

Discussions similaires

  1. compréhension d'un programme assembleur pour afficher un afficheur lcd.
    Par invite71a200f7 dans le forum Électronique
    Réponses: 1
    Dernier message: 09/03/2012, 10h43
  2. comment utiliser les résultats d'un programme fortran dans un autre programme
    Par invitedb78a3a3 dans le forum Logiciel - Software - Open Source
    Réponses: 1
    Dernier message: 30/09/2010, 19h21
  3. Compréhension d'un énoncé
    Par invite17fd9cf2 dans le forum Mathématiques du supérieur
    Réponses: 1
    Dernier message: 03/04/2008, 20h38
  4. Comprehension d'un calcul
    Par invited69aff95 dans le forum Chimie
    Réponses: 3
    Dernier message: 30/01/2008, 14h04
  5. compréhension d'un schéma
    Par invite5857d68c dans le forum Électronique
    Réponses: 18
    Dernier message: 05/01/2008, 08h31
Découvrez nos comparatifs produits sur l'informatique et les technologies.