interruption avec cc5x svp
Répondre à la discussion
Affichage des résultats 1 à 17 sur 17

interruption avec cc5x svp



  1. #1
    sinatra

    interruption avec cc5x svp


    ------

    salut,

    j'ai realiser mon schema avec un pic 16f876 et un quartez 4Mhz et 4 afficheur 7 segment anode commune dont les segment sont configurer de cet facon :

    RB0=a, RB1=b, RB2=c, RB3=d, RB4=e, RB5=f, RB6=g et la selection par un transistor et une resistance sur aff1 = RC0, aff2=RC=1, aff3=RC2, aff4=RC3.

    j'utilise mplab et cc5x je veux faire un rafraichissement de 100hz mais j'arrive pas a programmer cet interruption.

    est ce que quelqu'un peut m'aider ??

    -----

  2. #2
    invite7a49d0d5

    Cool Re : interruption avec cc5x svp

    Citation Envoyé par sinatra Voir le message
    salut,

    j'ai realiser mon schema avec un pic 16f876 et un quartez 4Mhz et 4 afficheur 7 segment anode commune dont les segment sont configurer de cet facon :

    RB0=a, RB1=b, RB2=c, RB3=d, RB4=e, RB5=f, RB6=g et la selection par un transistor et une resistance sur aff1 = RC0, aff2=RC=1, aff3=RC2, aff4=RC3.

    j'utilise mplab et cc5x je veux faire un rafraichissement de 100hz mais j'arrive pas a programmer cet interruption.

    est ce que quelqu'un peut m'aider ??
    Salut,

    il faut, par exemple, utiliser l'interruption du Timer1...
    mais il faudrait avoir le code pour être sur...
    qu'est ce qui s'affiche sur les afficheurs?
    comment c'est géré actuellement (dans une boucle)??

    vede
    ;O]

  3. #3
    sinatra

    Re : interruption avec cc5x svp

    voila le code que j'ai debuter :

    #pragma chip PIC16F876
    #define SEVEN_SEGMENT_PORT PORTB
    void SevenSegment(int n);
    void Print( uns16 num);
    int digits[4];
    #define FIRST_ON PORTC.0 = 1
    #define FIRST_OFF PORTC.0 = 0
    #define SECOND_ON PORTC.1 = 1
    #define SECOND_OFF PORTC.1 = 0
    #define THIRD_ON PORTC.2 = 1
    #define THIRD_OFF PORTC.2 = 0
    #define FOURTH_ON PORTC.3 = 1
    #define FOURTH_OFF PORTC.3 = 0

    void main(void)
    {

    TRISA = 0b00000000;
    TRISB = 0b00000000;
    TRISC = 0b00000000;
    PORTA = 0;
    PORTB = 0;
    PORTC = 0;

    unsigned count=0;
    Print(2134);
    while(1)
    {

    ????????????????????????????

    }
    }


    void SevenSegment(int n)
    {
    if(n<10)
    {
    switch (n)
    {
    case 0:
    SEVEN_SEGMENT_PORT=0b00111111;
    break;

    case 1:
    SEVEN_SEGMENT_PORT=0b00000011;
    break;

    case 2:
    SEVEN_SEGMENT_PORT=0b01101101;
    break;

    case 3:
    SEVEN_SEGMENT_PORT=0b01100111;
    break;

    case 4:
    SEVEN_SEGMENT_PORT=0b01010011;
    break;

    case 5:
    SEVEN_SEGMENT_PORT=0b01110110;
    break;

    case 6:
    SEVEN_SEGMENT_PORT=0b01111110;
    break;

    case 7:
    SEVEN_SEGMENT_PORT=0b00100011;
    break;

    case 8:
    SEVEN_SEGMENT_PORT=0b01111111;
    break;

    case 9:
    SEVEN_SEGMENT_PORT=0b01110111;
    break;
    }

    }
    }

    void Print( uns16 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;
    }


    example dans ce code je veux afficher le nombre " 2134 " mais j'arrive pas a trouver comment ecrire en utilisant le timer1 pour une frequence de 100hz

    merci pour ta réponse

  4. #4
    invite7a49d0d5

    Cool Re : interruption avec cc5x svp

    re ;O]

    ben faut commencer par activer le Timer...
    puis son interruption...

    v ;O]

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

    Re : interruption avec cc5x svp

    oui je sais en theorie mais comment la programmer à 100hz de rafréchissement par digit

  7. #6
    invite7a49d0d5

    Cool Re : interruption avec cc5x svp

    Citation Envoyé par sinatra Voir le message
    oui je sais en theorie mais comment la programmer à 100hz de rafréchissement par digit
    Bonsoir,

    moi, je commencerais par faire et tester un petit programme,
    faisant clignoter une led, à différences fréquences, et grâce à
    l'utilisation d'une interruption sur un Timer... et là je pourrais t'aider...
    et surtout histoire de comprendre le principe et le fonctionnement général...
    (calcul et définition d'une fréquence/période générée entre autres)...
    avant d'attaquer du 100Hz sur des afficheurs 7 segments multipléxés...

    vede
    ;O]

  8. #7
    invite7a49d0d5

    Cool Re : interruption avec cc5x svp

    re ;O]

    le calcul de la fréquence/période générée par une interruption sur un Timer
    est souvent basée sur la vitesse d'horloge (quartz) du µC...

    dans le cas d'un PIC, du Timer1 et de son interruption,
    c'est F(Quartz)/4, avec l'interruption qui se déclenche
    lors du débordement du Timer1 (à 65536)...

    donc on initialise le Timer1 à une valeur qui va engendrer
    un débordement/une interruption au moment désiré...

    un exemple avec un Quartz 4Mhz, on a F(Timer1) = 1Mhz
    (période = 1µs)

    en initialisant le Timer1 à 55536, l'interruption va se
    déclencher "au bout" de... 10000µs...soit 100Hz...

  9. #8
    invite7a49d0d5

    Cool Re : interruption avec cc5x svp

    re re ;O]

    déjà faut calculer la periode/frequence necessaire
    pour l'affichage de N digits avec une fréquence de
    "rafraichissement" de 100Hz...

    disons N = 6, F voulue = 100Hz

    donc ça fait 600 "rafraichissements" par seconde,
    donc 1000/600 = 1,66666ms...

    donc théoriquement faudrait générer une interruption
    toutes les 1,6666ms...

    bon là je vais peut-être un peu trop vite...
    je ne suis pas du tout sur de l'exactitude
    compléte du raisonnement ci-dessus...
    c'est surtout pour te donner une idée d'approche...

    n'hésites pas si question...
    vede
    ;O]

  10. #9
    sinatra

    Re : interruption avec cc5x svp

    merci beaucoup de m'eclaircir l'idée mais j'ai toujours un pb comment ecrire le code avec cc5x pour cette interruption.

    c'est le code avec cc5x qui me gène je sais comment l'ecrire.

  11. #10
    sinatra

    Re : interruption avec cc5x svp

    est-ce quelqu'un peut m'aider d'ecrire le code avec cc5x svp ??

  12. #11
    invite7a49d0d5

    Cool Re : interruption avec cc5x svp

    Bonjour Sinatra,

    une p'tite recherche, avec les mots clés "cc5x interruption" sur ce forum,
    et sur Gougueule, retourne toutes les infos, et des exemples de codes...
    quelques résultats, parmis d'autres, expliquants les interruptions avec cc5x :

    http://forums.futura-sciences.com/el...-cc5x-pic.html

    http://forums.futura-sciences.com/el...-pic-cc5x.html

    http://herve.hollard.perso.sfr.fr/do..._fonctions.pdf

    http://www.aix-mrs.iufm.fr/formation...0en%20main.pdf

    http://www.infos-du-net.com/forum/26...n-interruption

    http://www.electroniciens.aquitaine-...ubrique15.html

    http://www.u-electronique.com/forum/...ad.php?t=53378

    http://jmandon.free.fr/UART%20C/uartc.htm

    etc... etc... etc...

    Bon Dimanch'à Tous,
    vede
    ;O]

  13. #12
    sinatra

    Re : interruption avec cc5x svp

    voila mon interruption mais j'ai une erreur dans la compilation j'arrive pas à la résoudre :

    #pragma chip PIC16F876
    #include "int16CXX.H"
    #pragma origin 4
    void SevenSegment(int n);
    int digits[4];
    interrupt interruption (void)
    {
    int_save_registers

    unsigned i=0;

    if(i==3)
    {
    i=0;
    }
    else
    {
    i++;
    }

    PORTC=PORTC<<1;

    SevenSegment(digits[i]);
    int_restore_registers
    }
    #define SEVEN_SEGMENT_PORT PORTB
    void Print( unsigned num);
    void SevenSegment(int n)
    {
    /*
    n must be less than 9
    */
    if(n<10)
    {
    switch (n)
    {
    case 0:
    SEVEN_SEGMENT_PORT=0b00111111;
    break;

    case 1:
    SEVEN_SEGMENT_PORT=0b00000011;
    break;

    case 2:
    SEVEN_SEGMENT_PORT=0b01101101;
    break;

    case 3:
    SEVEN_SEGMENT_PORT=0b01100111;
    break;

    case 4:
    SEVEN_SEGMENT_PORT=0b01010011;
    break;

    case 5:
    SEVEN_SEGMENT_PORT=0b01110110;
    break;

    case 6:
    SEVEN_SEGMENT_PORT=0b01111110;
    break;

    case 7:
    SEVEN_SEGMENT_PORT=0b00100011;
    break;

    case 8:
    SEVEN_SEGMENT_PORT=0b01111111;
    break;

    case 9:
    SEVEN_SEGMENT_PORT=0b01110111;
    break;
    }

    }
    }
    void Print( unsigned num)
    {
    /*


    This function breaks apart a given integer into separete digits
    and writes them to the display array i.e. digits[]

    */
    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;
    }
    void main(void)
    {
    //Setup
    INTCON = 0b10001000;
    OPTION = 0;
    TRISA = 0b00000000;
    TRISB = 0b00000000;
    TRISC = 0b00000000;
    PORTA = 0;
    PORTB = 0;
    PORTC = 0;

    while(1)
    {
    Print(2134);
    }
    }



    SevenSegment(digits[i]);
    ^------
    Error[1] D:\re2.c 24 : FSR not saved/restored during interrupt 'interruption'
    (Please read 'int16cxx.h')

  14. #13
    invite7a49d0d5

    Cool Re : interruption avec cc5x svp

    Citation Envoyé par sinatra Voir le message
    voila mon interruption mais j'ai une erreur dans la compilation j'arrive pas à la résoudre :

    #pragma chip PIC16F876
    #include "int16CXX.H"
    #pragma origin 4
    void SevenSegment(int n);
    int digits[4];
    interrupt interruption (void)
    {
    int_save_registers

    unsigned i=0;

    if(i==3)
    {
    i=0;
    }
    else
    {
    i++;
    }

    PORTC=PORTC<<1;

    SevenSegment(digits[i]);
    int_restore_registers
    }
    #define SEVEN_SEGMENT_PORT PORTB
    void Print( unsigned num);
    void SevenSegment(int n)
    {
    /*
    n must be less than 9
    */
    if(n<10)
    {
    switch (n)
    {
    case 0:
    SEVEN_SEGMENT_PORT=0b00111111;
    break;

    case 1:
    SEVEN_SEGMENT_PORT=0b00000011;
    break;

    case 2:
    SEVEN_SEGMENT_PORT=0b01101101;
    break;

    case 3:
    SEVEN_SEGMENT_PORT=0b01100111;
    break;

    case 4:
    SEVEN_SEGMENT_PORT=0b01010011;
    break;

    case 5:
    SEVEN_SEGMENT_PORT=0b01110110;
    break;

    case 6:
    SEVEN_SEGMENT_PORT=0b01111110;
    break;

    case 7:
    SEVEN_SEGMENT_PORT=0b00100011;
    break;

    case 8:
    SEVEN_SEGMENT_PORT=0b01111111;
    break;

    case 9:
    SEVEN_SEGMENT_PORT=0b01110111;
    break;
    }

    }
    }
    void Print( unsigned num)
    {
    /*


    This function breaks apart a given integer into separete digits
    and writes them to the display array i.e. digits[]

    */
    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;
    }
    void main(void)
    {
    //Setup
    INTCON = 0b10001000;
    OPTION = 0;
    TRISA = 0b00000000;
    TRISB = 0b00000000;
    TRISC = 0b00000000;
    PORTA = 0;
    PORTB = 0;
    PORTC = 0;

    while(1)
    {
    Print(2134);
    }
    }



    SevenSegment(digits[i]);
    ^------
    Error[1] D:\re2.c 24 : FSR not saved/restored during interrupt 'interruption'
    (Please read 'int16cxx.h')
    Bonsoir Sinatra,

    même si ça se compile... ben... ça ira pas trés loin...
    faut initialiser et activer un Timer avant l'interruption...

    et un appel de "fonctions" dans une interruption...
    c'est chaud... à gérer...

    comme je te l'ai déjà écris, commence par
    faire clignoter une led en utilisant un Timer
    et une interruption... avant d'essayer d'aller plus loin...

    vede
    ;O]

    ps : pseudo exemple qui fait clignoter une led
    sur port.0, en utilisant une int. sur un timer
    la période/fréquence est définie lors de "init. timer"...

    Code:
    interrupt:
      c = c + 1
      port = c
      init. timer
      active int. sur timer
    retw
    
    main :
      init. timer
      active timer
      active int. sur timer
      while true
       nop
      wend
    end.

  15. #14
    sinatra

    Re : interruption avec cc5x svp

    merci pour cet example mais ca m'aide pas beaucoup puisque il est ecrit avec basic.

  16. #15
    sinatra

    Re : interruption avec cc5x svp

    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
    }

    SevenSegment(digits[dcurr]) ; // assign 7 segments value

    T0IF = 0 ; // done
    }


    int_restore_registers
    }

    #include "delay.c" // déclaration du fichier contenant les temporisations
    #define SEVEN_SEGMENT_PORT PORTB
    void Print( unsigned num);
    void SevenSegment(int n)
    {
    /*
    n must be less than 9
    */
    if(n<10)
    {
    switch (n)
    {
    case 0:
    SEVEN_SEGMENT_PORT=0b00111111;
    break;

    case 1:
    SEVEN_SEGMENT_PORT=0b00000011;
    break;

    case 2:
    SEVEN_SEGMENT_PORT=0b01101101;
    break;

    case 3:
    SEVEN_SEGMENT_PORT=0b01100111;
    break;

    case 4:
    SEVEN_SEGMENT_PORT=0b01010011;
    break;

    case 5:
    SEVEN_SEGMENT_PORT=0b01110110;
    break;

    case 6:
    SEVEN_SEGMENT_PORT=0b01111110;
    break;

    case 7:
    SEVEN_SEGMENT_PORT=0b00100011;
    break;

    case 8:
    SEVEN_SEGMENT_PORT=0b01111111;
    break;

    case 9:
    SEVEN_SEGMENT_PORT=0b01110111;
    break;
    }

    }
    }


    Error[1] D:\e2.c 34 : FSR not saved/restored during interrupt 'interruption'
    (Please read 'int16cxx.h')
    File 'temperature2.occ'

    j'arrive pas a comprendre cette erreur

    si j'enleve le tableau digits[decurr] et je mis sevensegment(decurr); compilation avec succes et je vois dans mon afficheur 0 1 2 3 alors que je veux voir le contenu de mon tableau.

  17. #16
    invite7a49d0d5

    Cool Re : interruption avec cc5x svp

    Citation Envoyé par sinatra Voir le message
    merci pour cet example mais ca m'aide pas beaucoup puisque il est ecrit avec basic.
    Bonsoir Sinatra,

    non, on ne peut pas dire que ce soit du Basic...

    car c'est en "aucun langage"... ou "pseudo-code"...

    c'est simplement l'algo de base pour faire clignoter une led
    en utilisant un timer et son interruption... avec un pic...

    algo à "traduire" dans ton "environnement"...

    vede
    ;O]

    ps : ton probléme c'est la gestion des interruptions et timers...
    c'est spécifique au PIC, et ça se gére pareil dans n'importe quel langage...
    les interruptions... et les timers... vu que c'est du "PIC" ;O]...

  18. #17
    sinatra

    Re : interruption avec cc5x svp

    le problem maintenant le compilateur ne veut pas de cette ligne : SevenSegment(digits[dcurr]) ; si j'enleve le tableau digits et je mets seulement une variable il l'accepte sans probleme.


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

    SevenSegment(digits[dcurr]) ; // assign 7 segments value

    T0IF = 0 ; // done
    }


    int_restore_registers
    }

Discussions similaires

  1. Programmation PIC16f876 avec cc5x
    Par Bernibernouille dans le forum Électronique
    Réponses: 8
    Dernier message: 25/03/2012, 12h15
  2. PIC sous CC5X, Programmation avec DS1302
    Par invite5b0b28b7 dans le forum Électronique
    Réponses: 3
    Dernier message: 18/09/2008, 15h11
  3. Debug en C avec MPLAB et CC5X
    Par invitee099a9c7 dans le forum Électronique
    Réponses: 11
    Dernier message: 16/07/2008, 07h57
  4. nombre réel avec CC5X
    Par invitebf47a06a dans le forum Électronique
    Réponses: 16
    Dernier message: 02/11/2007, 22h16
  5. Interruption avec CC5x (Pour pic)
    Par joseph4008 dans le forum Électronique
    Réponses: 4
    Dernier message: 28/09/2005, 18h07
Découvrez nos comparatifs produits sur l'informatique et les technologies.