tableau d'entier et interruption !!!!!!!!!!!!!
Répondre à la discussion
Affichage des résultats 1 à 14 sur 14

tableau d'entier et interruption !!!!!!!!!!!!!



  1. #1
    sinatra

    tableau d'entier et interruption !!!!!!!!!!!!!


    ------

    Bonjour,

    je suis entrain d'écrire une interruption avec le cc5x mais au cours de la compilation il y a toujours cette erreur : " PORTB = seg[digits[dcurr]]; // affectation de valeur 7 segments
    ^------
    Error[1] D:\digits.c 40 : FSR not saved/restored during interrupt 'interruption'
    (Please read 'int16cxx.h') "

    mon interruption c'est pour afficher les chiffres qui sont stockés dans le tableau "digits" et qui sera convertis en un mot binaire pour l'affecter a PORTB mais je crois que le compilateur ne veux pas des tableaux dans l'interruption.

    Code:
    int digits[4];
    int dcurr ;
    const char seg[10]={0b00111111,0b00000011,0b01101101,0b01100111,0b01010011,0b01110110,0b01111110,0b00100011,0b01111111,0b01110111};
    long    cntr ;
    #pragma origin 4
    interrupt interruption (void)
    {
        int_save_registers    
    
    
            if(T0IF)                         // timer 0 overflow ?
                    {
                    cntr++ ;                        // inc d'un compteur
    
                    dcurr++ ;                       // digit d'aprés
                    PORTB = 0 ;                     // digits eteints
                    if(dcurr == 4)                  // derier digit ?
                            {
                            PORTC = 0b00000001 ;    // allumer le 1er digit
                            dcurr = 0 ;
                            }
                    else
                            {
                            PORTC <<= 1 ;           //allumer le second digit
                            }
                    PORTB = seg[digits[dcurr]];           // affectation de valeur 7 segments 
    
                    T0IF = 0 ;               //ok
                    }
    est ce que quelqu'un peut m'aider s'il vous plais.

    .

    -----
    Dernière modification par gienas ; 20/01/2010 à 16h34. Motif: Ajouté les balises code

  2. #2
    Shaiton

    Re : tableau d'entier et inerruption !!!!!!!!!!!!!

    Bonjour,

    Merci d'utiliser la balise code (icone '#') pour mettre en forme le code, la il est ilisible .

    Je n'ai pas compris l'utilité du tableau digit[4] ... Il est définit ou ?

    Du coup je vois un peu près ce que tu veux faire là
    PORTB = seg[digits[dcurr]]; // affectation de valeur 7 segments
    ... sans le comprendre ...

    Tu as déjà testé tout simplement un
    Code:
    PORTB = seg[dcurr];
    ? Pour trouver d'ou vient l'erreur, simplifie ta fonction.
    (ok ce que je t'ai proposé est inutile, mais au moins tu verra qu'on peut utiliser des tableaux d'entier dans une interruption. Et tu sera vérifira que l'interruption se passe correctement.
    Le Geek Sportif !

  3. #3
    sinatra

    Re : tableau d'entier et inerruption !!!!!!!!!!!!!

    merci de me répondre avec cette ligne il compile avec succes
    Code:
    PORTB = seg[dcurr];
    mais je suis toujours dans une impasse

    le tableau digits contient le nombre decimale que j'ai calculé pour l'afficher par exemple :le nombe c'est 2314 donc digits[0]=4, digits[1]=1,digits[2]=3 et digits[3]=2 et le tableau seg contient les mots de 8bit qui seront affecter a PORTB selon la variable dcurr

    donc
    Code:
    PORTB = seg[digits[dcurr]];
    PORTB= seg [digits[0]] ====> PORTB= seg [4] PORTB= 0b01010011 et ainsi de suite pour 1 et 3 et 2.

    digits[4] est remplis dans une fonction que je l'appel dans main par " print (t);" et voila la fonction qui rempli un tableau de 4 entier
    Code:
    void Print( unsigned num)
    {
       int i=0;
       int j=0;
       if(num>99) return;
       while(num)
       {
          digits[i] = num % 10;
          i++;
         num = num / 10;
       }
       for(j=i;j<4;j++) digits[j]=0;

  4. #4
    Shaiton

    Re : tableau d'entier et inerruption !!!!!!!!!!!!!

    Je ne comprends pas la fonction Print(unsigned)

    Si num est supérieur à 99, elle ne fait rien. OK.
    Sinon, elle remplit digits[] suivant un algo étrange ...
    Que cherches-tu à récupérer ? Parce que pour moi, un entier inférieur à 100 est composé d'uniquement 2 digits. Il n'y aura pas grand chose dans les autres ...

    Et puis la condition du while est mauvaise. Au bout d'un moment num sera inferieur à 1, soit certainnement considéré comme nul donc tu sorts. Et là, et bien tu n'a pas remplis les 2 autres cases ... Qui seront systématiquement effacées ensuite.

    Avant de comprendre ce que tu cherches à envoyer sur PORTB, je cherche à comprendre à quoi te sert digits[] ...
    Je ne dois pas en être loin, mais explique moi un peu plus .
    Le Geek Sportif !

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

    Re : tableau d'entier et inerruption !!!!!!!!!!!!!

    Heuuuu au cas ou j'essaye quand même.

    Tu sais que
    Code:
    PORTB = 4;    // Equivalent à PORTB = 0x04;    // equivalent à PORTB = 0b00000100;
    Fonctionne ? On n'est pas obligé de parler binaire.
    Le Geek Sportif !

  7. #6
    sinatra

    Re : tableau d'entier et interruption !!!!!!!!!!!!!

    Citation Envoyé par Shaiton Voir le message
    Heuuuu au cas ou j'essaye quand même.

    Tu sais que
    Code:
    PORTB = 4;    // Equivalent à PORTB = 0x04;    // equivalent à PORTB = 0b00000100;
    Fonctionne ? On n'est pas obligé de parler binaire.
    oui je sais ca mais il faut afficher le nomnbre 4 en 7 segment c'est a dire pour l'exemple 4 PORTB = 0b01010011 pour afficher les 4 segment du nombre 4

  8. #7
    sinatra

    Re : tableau d'entier et interruption !!!!!!!!!!!!!

    Citation Envoyé par Shaiton Voir le message
    Je ne comprends pas la fonction Print(unsigned)

    Si num est supérieur à 99, elle ne fait rien. OK.
    Sinon, elle remplit digits[] suivant un algo étrange ...
    Que cherches-tu à récupérer ? Parce que pour moi, un entier inférieur à 100 est composé d'uniquement 2 digits. Il n'y aura pas grand chose dans les autres ...

    Et puis la condition du while est mauvaise. Au bout d'un moment num sera inferieur à 1, soit certainnement considéré comme nul donc tu sorts. Et là, et bien tu n'a pas remplis les 2 autres cases ... Qui seront systématiquement effacées ensuite.

    Avant de comprendre ce que tu cherches à envoyer sur PORTB, je cherche à comprendre à quoi te sert digits[] ...
    Je ne dois pas en être loin, mais explique moi un peu plus .
    oui oui tu as raison iil faut qu'il est inferieur a 9999 pour le 4 digits
    Code:
    void Print( unsigned num)
    {
       int i=0;
       int j=0;
       if(num>9999) return;
       while(num)
       {
          digits[i] = num % 10;
          i++;
         num = num / 10;
       }
       for(j=i;j<4;j++) digits[j]=0;
    }

  9. #8
    Shaiton

    Re : tableau d'entier et interruption !!!!!!!!!!!!!

    Ok, alors pour la fonction Print(), c'est plus logique .

    dcurr est bien initialisé à 0 ?

    Bon, alors là je ne vois plus quoi vérifier, le code à l'air correct.

    J'ai vu que tu utilises 'int_save_registers', je ne l'ai jamais utilisé,
    essaye d'ajouter 'int_restore_registers' à la fin de ta routine d'interruption. Ce serait plus cohérent.

    Qui devient donc (avec l'accolade manquante)
    Code:
    #pragma origin 4
    interrupt interruption (void)
    {
            int_save_registers    
    
            if(T0IF)                         // timer 0 overflow ?
            {
                    cntr++ ;                        // inc d'un compteur
    
                    dcurr++ ;                       // digit d'aprés
                    PORTB = 0 ;                     // digits eteints
                    if(dcurr == 4)                  // derier digit ?
                    {
                            PORTC = 0b00000001 ;    // allumer le 1er digit
                            dcurr = 0 ;
                    }
                    else
                    {
                            PORTC <<= 1 ;           //allumer le second digit
                    }
                    PORTB = seg[digits[dcurr]];           // affectation de valeur 7 segments 
    
                    T0IF = 0 ;               //ok
             }
             int_restore_registers      
    }

    En espérant que cela corrige l'erreur de compilation
    Le Geek Sportif !

  10. #9
    sinatra

    Re : tableau d'entier et interruption !!!!!!!!!!!!!

    Code:
    #pragma chip PIC16F876
    #include "int16CXX.H"
    
    static void SevenSegment(int n);
    int digits[4];
    unsigned char dcurr ;
    long    cntr ;
    #pragma origin 4
    interrupt interruption (void)
    {
        int_save_registers    
    
    
            if(T0IF)                         // timer 0 overflow ?
                    {
                    cntr++ ;                        // increment counter
    
                    dcurr++ ;                       // next digit
                    PORTB = 0 ;                     // turn digit off
                    if(dcurr == 4)                  // last digit ?
                            {
                            PORTC = 0b00000001 ;    // light the first digit
                            dcurr = 0 ;
                            }
                    else
                            {
                            PORTC <<= 1 ;           // light the next digit
                            }
    
                    PORTB = digits[dcurr] ;           // assign 7 segments value
    
                    T0IF = 0 ;               // done
                    }
            
    
    	int_restore_registers 
    }
    c'est toujours le même probleme toujours cette erreur " PORTB = digits[dcurr] ; // assign 7 segments value
    ^------
    Error[1] D:\e2.c 34 : FSR not saved/restored during interrupt 'interruption'
    (Please read 'int16cxx.h')

  11. #10
    sinatra

    Re : tableau d'entier et interruption !!!!!!!!!!!!!

    Citation Envoyé par Shaiton Voir le message
    Ok, alors pour la fonction Print(), c'est plus logique .

    dcurr est bien initialisé à 0 ?

    Bon, alors là je ne vois plus quoi vérifier, le code à l'air correct.

    J'ai vu que tu utilises 'int_save_registers', je ne l'ai jamais utilisé,
    essaye d'ajouter 'int_restore_registers' à la fin de ta routine d'interruption. Ce serait plus cohérent.

    Qui devient donc (avec l'accolade manquante)
    Code:
    #pragma origin 4
    interrupt interruption (void)
    {
            int_save_registers    
    
            if(T0IF)                         // timer 0 overflow ?
            {
                    cntr++ ;                        // inc d'un compteur
    
                    dcurr++ ;                       // digit d'aprés
                    PORTB = 0 ;                     // digits eteints
                    if(dcurr == 4)                  // derier digit ?
                    {
                            PORTC = 0b00000001 ;    // allumer le 1er digit
                            dcurr = 0 ;
                    }
                    else
                    {
                            PORTC <<= 1 ;           //allumer le second digit
                    }
                    PORTB = seg[digits[dcurr]];           // affectation de valeur 7 segments 
    
                    T0IF = 0 ;               //ok
             }
             int_restore_registers      
    }

    En espérant que cela corrige l'erreur de compilation

    même si elle est initialiser a 0 c'est toujours le même problème

  12. #11
    Shaiton

    Re : tableau d'entier et interruption !!!!!!!!!!!!!

    tu as essayer de sauvegarder toi même le FSR ?
    Comme précisé là http://www.abcelectronique.com/forum...ad.php?t=63245 ?

    C'est une solution qui vient directe de la doc de CC5X.
    Le Geek Sportif !

  13. #12
    RISC

    Re : tableau d'entier et interruption !!!!!!!!!!!!!

    Salut,

    Pourquoi s'ennuyer avec ce vieux compilateur (CC5X) et ne pas utiliser le compilateur Hitech gratuit pour les PIC10/12/16. Je pense qu'il sauvegarde plus de choses automatiquement. Télécharge la version Lite Mode.

    a+

  14. #13
    sinatra

    Re : tableau d'entier et interruption !!!!!!!!!!!!!

    Citation Envoyé par Shaiton Voir le message
    tu as essayer de sauvegarder toi même le FSR ?
    Comme précisé là http://www.abcelectronique.com/forum...ad.php?t=63245 ?

    C'est une solution qui vient directe de la doc de CC5X.
    wééé ca marche lorsque j'ai ajouter la FSR merci beaucoup pout ton aide

  15. #14
    Shaiton

    Re : tableau d'entier et interruption !!!!!!!!!!!!!

    De rien .

    RISC, cc5x c'est pas mal pour commencer en C. On définit les registres nous même, on configure nos timers etc, pour mieux comprendre (si on n'a pas appris en ASM).

    Bon après, c'est sur que pour faire un projet évolué, mieux vaut se baser sur un compilateur puissant qui nous simplifie le developpement.
    Le Geek Sportif !

Discussions similaires

  1. Devellopper le produit d'entier d'un entier dans un intervalle
    Par invited872b3ac dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 29/11/2009, 10h06
  2. Nbr de couple d'entier solution d'une Hyperbole équilatère
    Par rapasite dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 04/12/2008, 06h31
  3. Interruption
    Par scls19fr dans le forum Électronique
    Réponses: 1
    Dernier message: 22/06/2008, 14h05
  4. problème d'entier...
    Par invite2bd19fb4 dans le forum Mathématiques du supérieur
    Réponses: 14
    Dernier message: 10/01/2006, 02h53
  5. suite d'entier definie par recurrence
    Par invite55c88d9c dans le forum Mathématiques du supérieur
    Réponses: 14
    Dernier message: 17/02/2005, 14h06
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...