interruption avec timer1
Répondre à la discussion
Affichage des résultats 1 à 27 sur 27

interruption avec timer1



  1. #1
    invite29c140ac

    interruption avec timer1


    ------

    bonjour,

    j'utilise le timer 1 du 16f876 je suis en langage C. je n'arrive pas a voir comment écrire le programme. le programme d'interruption doit durée 10s une fois sur deux je dois faire basculer une led. j'utilise le quartz de 32,768kHZ. je vois le principe mais je n'arrive pas à l'écrire.
    merci d'avance de votre aide

    -----

  2. #2
    marc2009

    Re : interruption avec timer1

    Salut

    comme je fais la même chose avec mon 12f675, je vais pouvoir t'aider.

    Alors, comme tu as un quartz de 32 768 Hz, ça va être facile ... une interruption est crée lorsque le timer1 déborde, c'est a dire lorsque timer1 passe de 65 535 à 0 ...

    Si on charge TMR1H=128; ( et TMR1L=0; ) le timer1 sera incrémenté ( au départ donc du programme ) à 32 768 incrémentations, donc il lui restera 32 768 incrémentations restantes .... et c'est parfais, tu auras donc 1 IRQ / s ... ( 32 768 Hz / 32 768 = 1 ) ( Encore un Grand Merci à Gérard pour ses explications ! )

    Donc pour ton programme, je sais pas si tu utilises MPLAB ( et CC5X ? )

    ++

  3. #3
    invite29c140ac

    Re : interruption avec timer1

    merci

    j'utilise mplab, j'arrive à calculer pour avoir mes 10s et tout je vois coment sa marche me j'arrive pas à y écrire en programme

  4. #4
    marc2009

    Re : interruption avec timer1

    bon, on va faire comme si t'avais configurer le config, etc ....

    Code:
    #pragma chip PIC12F675 // déclaration du pic
    #pragma library 1
    #pragma config |= 0x31E1
    #define sortie GPIO
    char sec;
    
    #include "int16CXX.h" // fichier interruptions
    //------------------interruption-----------------------
    
    #pragma origin 4
    
    interrupt timer1( void)
    {
    	int_save_registers    // W, STATUS (and PCLATH if required)
    
           //char sv_FSR = FSR;  // save FSR if required
    
           // handle the interrupt (insert application code here)
    		if (TMR1IF) {++sec;TMR1IF=0;TMR1H=128;TMR1L=0;}
    
           //FSR = sv_FSR;       // restore FSR if saved
    
           int_restore_registers // W, STATUS (and PCLATH if required)
    
           /* IMPORTANT : GIE should normally NOT be set or cleared in
              the interrupt routine. GIE is AUTOMATICALLY cleared on
              interrupt entry by the CPU and set to 1 on exit (by
              RETFIE). Setting GIE to 1 inside the interrupt service
              routine will cause nested interrupts if an interrupt is
              pending. Too deep nesting may crash the program ! */
       }
    void main(void)
    
    {
    	TRISIO = 0b00111100;
    	sortie = 0b00000010;
    	T1CON = 0b00000001;
    	CMCON =  0b00000111; //comparateur désactivé
    	TMR1H=128;
    	TMR1L=0;
    	TMR1IF=0;
    	INTCON = 0b11000000;
    	PIE1 = 0b00000001;
    for (;;) {
    			
    }
    }
    Bon, voilà le programme ( incomplet ) de mon 12f675 ; j'ai modifié la partie interruption pour correspondre à ce que tu voulais ... Alors dans la boucle principale, soit for (; tu mets ton programme ... donc tu veux 10s, tu mets if (sec==10) {xxx;} xxx étant évidement les commandes que tu veux faire ... Bon, faut juste que tu modifies les configs, la déclaration du pic, etc ... pour que ça corresponde à ton pic.

    ++

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

    Re : interruption avec timer1

    merci
    c'est en quoi que t'écrit? j'ai trouvé u truc pour l'instant je dois mettre enable_interrupts() c'est pour mes registre. c'est du ccs

  7. #6
    marc2009

    Re : interruption avec timer1

    Je dois faire un programme pour notre PPE, je le fais en C avec mplab et cc5x, et un pic 12f675.

    Faut donc que tu modifies le config, et les registres ... que ce soit d'entrées/sorties, interruptions, du timer1. ... par contre, dans le datasheet, les instructions sont données en assembleur, pas en C

    ++

  8. #7
    invite29c140ac

    Re : interruption avec timer1

    d'ac, la maniere general c'est juste configurer comis faut le timer et lui dire de se lancerque j'ai des docs mais faut savoir.

  9. #8
    marc2009

    Re : interruption avec timer1

    ben dans le datasheet, tu as les paramètres des registres ... tu as un registre qui va te permettre de configurer les entrées/sorties, un autre l'état des sorties, un autre le timer1, un autre le timer0 etc ...

    Un registre est composé au maximum de 8 bits ( bit 7 à bit 0 ). En C, faut mettre le nom du registre = 0b ( pour écriture binaire ) et après les paramètres des bits pour configurer le registre ... par exemple, TRISA est le registre qui va configurer une partie des pattes soit en entrées, soit en sorties ( pour les autres, il devrait y avoir TRISB, j'ai pas regardé le datasheet ) donc en C, tu mettras TRISA=0b11111110; donc on va dire que TRISA correspond aux patte RA7 à RA0, avec cette configuration de TRISA, j'ai mis RA0 en sortie et les 7 autres en entrées ....

    Tu me suis ? ( ou c'était pas ta question )

  10. #9
    invite29c140ac

    Re : interruption avec timer1

    sa je sais faire généralement j'utilise l'héxa mais c'est pareil. j'ai juste à congigurer tout comis faut

  11. #10
    marc2009

    Re : interruption avec timer1

    Citation Envoyé par pitch2158 Voir le message
    sa je sais faire généralement j'utilise l'héxa mais c'est pareil. j'ai juste à congigurer tout comis faut
    okok, quand tu as finis, postes ton programme si tu veux ... ( si t'as d'autres questions aussi )

  12. #11
    invite29c140ac

    Re : interruption avec timer1

    Pour l'instant j'en suis à la je bloque un peu

    #include<16F876.h>
    #byte T1CON=0x10
    #byte TRISB=0x86

    void main (void)
    {
    TRISB=0x00;
    T1CON=0x3F;

    ENABLE_INTERRUPTS(INT_TIMER1);


    }

  13. #12
    marc2009

    Re : interruption avec timer1

    et si tu prenais mon modèle

    déjà pour l'interruption, il faut que tu "include" le fichier int16cxx.h" qui est le fichier qui gère les interruptions ( je sais pas si c'est propre a chaque compilateur ).

    Puis, les interruptions sont gérées à partir de l'adresse 4 ( je crois ), d'où le #pragma origin 4 dans mon programme

    essaie de prendre mon modèle en modifiant si tu veux les configs des registres ( si tu veux pas les configurer en binaire comme je l'ai fait ... )

    ++

  14. #13
    invite29c140ac

    Re : interruption avec timer1

    #pragma sa doit etre pour les 16cxxx que moi j'ai pas a le mettre normalement c'est un 16Fxxx j'y est jamais utiliser j'utilise generalement les 16Fxxx.
    merci quand meme

  15. #14
    marc2009

    Re : interruption avec timer1

    rien a voir, c'est le fichier à utiliser pour les interruptions ( cf. mon sujet sur le 12f675 ) enfin je crois ! Je l'ai mis et jusqu'à maintenant, aucun problèmes.

    le #pragma origin 4 signifie "écrire à partir de l'adresse 4" ...

  16. #15
    Gérard

    Re : interruption avec timer1

    Citation Envoyé par marc2009 Voir le message
    Salut

    comme je fais la même chose avec mon 12f675, je vais pouvoir t'aider.

    Alors, comme tu as un quartz de 32 768 Hz, ça va être facile ... une interruption est crée lorsque le timer1 déborde, c'est a dire lorsque timer1 passe de 65 535 à 0 ...

    Si on charge TMR1H=128; ( et TMR1L=0; ) le timer1 sera incrémenté ( au départ donc du programme ) à 32 768 incrémentations, donc il lui restera 32 768 incrémentations restantes .... et c'est parfais, tu auras donc 1 IRQ / s ... ( 32 768 Hz / 32 768 = 1 ) ( Encore un Grand Merci à Gérard pour ses explications ! )

    Donc pour ton programme, je sais pas si tu utilises MPLAB ( et CC5X ? )

    ++
    Marc, tu me cites et tu écris des conneries !
    Tu oublies que l'entrée de TMR1 est F/4, si un 32,768KHz est utilisé, la fréquence qui entre dans TMR1 est 8192Hz.
    Pour 1irq/s, il faut recharger TMR1H avec la valeur 1110 0000b.

    En guise de punition pour Marc, tu me calculeras pourquoi cette valeur.

  17. #16
    marc2009

    Re : interruption avec timer1

    PU**** DE M****

    J'avais zappé le Fosc / 4 !!

    Oui donc tmr1h=224; il y aura 8192 incrémentations restantes, d'où 1 IRQ/s, ca revient au même

  18. #17
    invite29c140ac

    Re : interruption avec timer1

    bonjour gérard

    je voudrais savoir si vous savez comment écrire en ccs?

  19. #18
    Gérard

    Re : interruption avec timer1

    Citation Envoyé par marc2009 Voir le message
    PU**** DE M****

    J'avais zappé le Fosc / 4 !!

    Oui donc tmr1h=224; il y aura 8192 incrémentations restantes, d'où 1 IRQ/s, ca revient au même
    224 est juste mais pourquoi cette valeur ?

  20. #19
    Gérard

    Re : interruption avec timer1

    Citation Envoyé par pitch2158 Voir le message
    bonjour Gérard

    je voudrais savoir si vous savez comment écrire en ccs?
    Eh non, mon allergie au C me reprend !
    Je suis abonné au Basic et ça me va très bien.

  21. #20
    marc2009

    Re : interruption avec timer1

    Citation Envoyé par Gérard Voir le message
    224 est juste mais pourquoi cette valeur ?
    ah mais oui c'est vrai l'explication copyrightée Gérard

    alors, tmr1h=224; on met dans tmr1 un nombre d'incrémentations de 224 * 256 = 57344 incrémentations donc il reste 8192 incrémentations ... et donc 8192 / 8192 = 1 IRQ / s

  22. #21
    Gérard

    Re : interruption avec timer1

    Citation Envoyé par marc2009 Voir le message
    ah mais oui c'est vrai l'explication copyrightée Gérard

    alors, tmr1h=224; on met dans tmr1 un nombre d'incrémentations de 224 * 256 = 57344 incrémentations donc il reste 8192 incrémentations ... et donc 8192 / 8192 = 1 IRQ / s
    Tu as bien appris ta leçon :19/20
    le 20 ... c'est pour moi.

  23. #22
    Gérard

    Re : interruption avec timer1

    Une autre façon d'y arriver :
    On veut un débordement pour 8192 impulsions.
    TRM1 sait compter jusqu'à 65535 (en fait 65536 cas, le 0 compte aussi)

    En mettant à "1" le bit de poids fort de TMR1H, on réduit de moitié la possibilité de TMR1, soit 32768.
    Pour encore diviser par 2, on met "1" dans le bit suivant (bit 6 de TMR1H). on obtient 16384.
    Pour 8192, il faut encore diviser par 2 --> on met "1" dans le bit 5 de TMR1H.

    On écrit à chaque IRQ 1110 0000b dans TMR1H soit .... 224 en décimal. OUF on retrouve la même valeur.

  24. #23
    marc2009

    Re : interruption avec timer1

    Citation Envoyé par Gérard Voir le message
    Une autre façon d'y arriver :
    On veut un débordement pour 8192 impulsions.
    TRM1 sait compter jusqu'à 65535 (en fait 65536 cas, le 0 compte aussi)

    En mettant à "1" le bit de poids fort de TMR1H, on réduit de moitié la possibilité de TMR1, soit 32768.
    Pour encore diviser par 2, on met "1" dans le bit suivant (bit 6 de TMR1H). on obtient 16384.
    Pour 8192, il faut encore diviser par 2 --> on met "1" dans le bit 5 de TMR1H.

    On écrit à chaque IRQ 1110 0000b dans TMR1H soit .... 224 en décimal. OUF on retrouve la même valeur.
    Ce n'est pas de mon niveau xD Mais tu as forcément raison

  25. #24
    Gérard

    Re : interruption avec timer1

    Citation Envoyé par marc2009 Voir le message
    Ce n'est pas de mon niveau xD Mais tu as forcément raison
    Comment ça ce n'est pas de ton niveau ????
    Avec toutes les explications que je t'ai donné, tu DOIS savoir !

  26. #25
    marc2009

    Re : interruption avec timer1

    Citation Envoyé par Gérard Voir le message
    Comment ça ce n'est pas de ton niveau ????
    Avec toutes les explications que je t'ai donné, tu DOIS savoir !
    oui j'ai compris ta méthode

    mais pas celle avec les bits ... c'est pas mon truc ( même si ça doit etre débile :P )

  27. #26
    Gérard

    Re : interruption avec timer1

    Relis le #23 et dis moi ce que tu ne comprends pas.

  28. #27
    marc2009

    Re : interruption avec timer1

    Citation Envoyé par Gérard Voir le message
    Relis le #23 et dis moi ce que tu ne comprends pas.
    ah dac, j'ai essayé avec la calculatrice de windows, et effectivement quand on met tmr1h avec 0b1000, on obtient le nombre 128 soit la moitié de 65536 incrémentations ( tmr1=32 768 ) et ainsi de suite ...

Discussions similaires

  1. Interruption avec 16f84
    Par invitec25c7d0a dans le forum Électronique
    Réponses: 36
    Dernier message: 10/06/2009, 15h58
  2. réveiller mon pic avec timer1?
    Par invitee2a2ed9a dans le forum Électronique
    Réponses: 3
    Dernier message: 11/03/2008, 08h15
  3. Interruption Timer avec PIC16F876A
    Par invite5d1bc976 dans le forum Électronique
    Réponses: 9
    Dernier message: 28/07/2007, 21h57
  4. Probleme avec Timer1 sur 16F876
    Par invited72fbbcc dans le forum Électronique
    Réponses: 4
    Dernier message: 27/12/2006, 15h02
  5. PB interruption avec Pic, language C
    Par invite70a6d0ab dans le forum Électronique
    Réponses: 1
    Dernier message: 05/06/2006, 16h24
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...