Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

Interruption Timer avec PIC16F876A



  1. #1
    black_is_beautiful

    Interruption Timer avec PIC16F876A


    ------

    Salut,

    J'essaye d'utiliser les interruptions pour des pauses précises, j'ai donc fait un programme de test à partir de ce cours :
    http://hhollard.club.fr/doc/PIC%20en%20C_fonctions.pdf
    Mais ça ne marche pas...
    Voilà le code que j'ai essayé d'adapter:
    Code:
    #include "int16CXX.h"
    
    char sortie @ PORTB;
    bit led1 @ PORTB.0;
    char temps;
    
    #pragma origin 4
    
    interrupt timer(void)
    {
    int_save_registers
    if(T0IF){++temps;
    if(temps==15)
    {led1=!led1;
    temps=0;}
    T0IF=0;}
    int_restore_registers
    }
    
    void main(void)
    {sortie=0;
    TRISB=0b00000000;
    TMR0=0;
    INTCON=0b10100000;
    OPTION=0b11000111;
    for(;;){
    PORTB.1=1;
    }}
    La pin B à 1 c'est pour tester si il est en route.
    Quelqu'un à une idée du problème?

    Merci d'avance

    -----

  2. Publicité
  3. #2
    maximilien

    Re : Interruption Timer avec PIC16F876A

    bonsoir
    jai utilisé ce cour aussi pour faire une temporisation de 1s mais ca ne marchais pas non plus...
    peut etre cela venait du cour.
    et sinon désolé je ne connait pas les interuptions...
    par contre si tu sait comment utilisé le timer pour réaliser une tempo de 1ms je suis preneur!!!
    merci

  4. #3
    Gérard

    Re : Interruption Timer avec PIC16F876A

    Pour utiliser le Timer1, il faut aussi configurer TMR1.
    Page 53 du datasheet.

  5. #4
    Gérard

    Re : Interruption Timer avec PIC16F876A

    Suite :

    Pour générer une IRQ pour le débordement de TMR1, il faut :
    GIE = 1 (INTCON)
    PEIE = 1 (INTCON)
    TMR1IE = 1 (PIE1)

    Pour démarrer le comptage de TMR1 :
    TMR1ON = 1 (T1CON)
    Il faut ausi configurer les autres bits de T1CON (page 53 du datasheet).

    Dans la routine d'IRQ, il faut effacer TMR1IF (PIR1)

    Après tout ça, tu auras un fonctionnement correct de TMR1.
    Suivant ce que tu sélectionnes comme entrée de comptage (fréq int/ext), il faudra peut-être précharger
    les registres TMR1L et TMR1H.
    Avec un quartz de 3,2768MHz, les divisions sont faciles, cette valeur est un multiple de 2.

    Juste un truc encore, il faut lire les datasheets, tout y est.

    Bigonoff peut aussi être une aide en plus, c'est en français (pour les non anglophones).

    Sans avoir été voir le cours, avec ce qui est dit plus haut, je n'ai pas envie d'aller le voir.

    Bon codage.

  6. #5
    Gérard

    Re : Interruption Timer avec PIC16F876A

    J'ai été voir le cours, il parle du 16F84 et toi du 876, il y a des différences.

    Je t'ai parlé de TMR1 vu la durée de la tempo demandée.

  7. A voir en vidéo sur Futura
  8. #6
    black_is_beautiful

    Re : Interruption Timer avec PIC16F876A

    Il y a une différence entre Timer0 et Timer1?
    J'utilise un Quartz 4Mhz. Donc apparament c'est juste un problème de configuration du PIC non?

  9. Publicité
  10. #7
    Gérard

    Re : Interruption Timer avec PIC16F876A

    Citation Envoyé par black_is_beautiful Voir le message
    Il y a une différence entre Timer0 et Timer1?
    J'utilise un Quartz 4Mhz. Donc apparament c'est juste un problème de configuration du PIC non?
    TMR0 travaille sur 8 bit
    TMR1 travaille sur 16 bit
    Tout est dans la doc.

  11. #8
    maximilien

    Re : Interruption Timer avec PIC16F876A

    bonsoir
    est ce que quelqu'un est capable de me donner le code en C d'une tempo précise qui utilise le timer0? j'utilise un 16F84!
    merci!

  12. #9
    black_is_beautiful

    Re : Interruption Timer avec PIC16F876A

    Ayé a force de chercher j'ai trouvé. Voilà j'ai bien modifier jusqu'à avoir ça. Moi ici ça marche avec un PIC16F876A 4Mhz.
    Code:
    #pragma chip PIC16F876A
    #pragma config WDTE=off, FOSC=XT
    char sv_FSR;
    int long nbpas;
    #pragma origin 4
    #include "int16CXX.h"
    
    interrupt int_server(void)
    {
    int_save_registers
    sv_FSR=FSR;
    if (T0IF==1) {
                T0IF=0;                             
    			nbpas++;          
                if (nbpas==3906) {                   
                            	nbpas=0; 
    							PORTB.4=!PORTB.4;
                               }
    			
                }
    FSR=sv_FSR;
    int_restore_registers
    }
    
    void main(void)
    {
    TRISA=0x00;
    TRISB=0x00;                       
    PORTB=0;
    PORTA=0;
    OPTION=0x00;                
    TMR0=0;                     
    nbpas=0;                       
                          
                       
                                     
                                  
                       
    T0IE=1;                          
    GIE=1;                          
    {
     nop();
    }
    }

    Pour le PIC16F84 normalement c'est pareil.

    A bientôt

  13. #10
    RISC

    Re : Interruption Timer avec PIC16F876A

    Bonsoir,

    Dans ton dernier exemple de code, il n'est pas nécessaire de faire le test :

    if (T0IF==1)

    Car l'entrée en interruption ne peut venir que du TIMER0.


    Bien sûr, si tu utilises plusieurs interruptions, ce test est nécessaire pour connaître la source

    a+

Sur le même thème :

Discussions similaires

  1. Problème de quartz avec PIC16F876A
    Par black_is_beautiful dans le forum Électronique
    Réponses: 2
    Dernier message: 16/07/2007, 15h09
  2. interruption ( timer )
    Par paterson dans le forum Électronique
    Réponses: 0
    Dernier message: 13/03/2007, 19h50
  3. PB interruption avec Pic, language C
    Par Cyrius666 dans le forum Électronique
    Réponses: 1
    Dernier message: 05/06/2006, 16h24
  4. Temporisation réglable avec un PIC16F876A
    Par ico dans le forum Électronique
    Réponses: 13
    Dernier message: 18/04/2006, 17h57
  5. Interruption avec CC5x (Pour pic)
    Par joseph4008 dans le forum Électronique
    Réponses: 4
    Dernier message: 28/09/2005, 18h07