interuption pic 18f
Répondre à la discussion
Affichage des résultats 1 à 10 sur 10

interuption pic 18f



  1. #1
    nirvo

    interuption pic 18f


    ------

    Bonjour;
    j'utilise un pic18f par le compilateur c18, je veux déclarer deux interruption au même temps et j'utilise cet algorithme mais la deuxième interruption (sur le timer 0) n'est jamais lancée
    #pragma code high_vector=0x08
    void intterupt(void)
    {
    _asm goto interrupt_IO_Timer _endasm
    }
    #pragma code
    void interrupt_IO_Timer(void)
    {
    if(INTCONbits.INT0IF==1) //INT In/OUT
    {
    //(code)
    INTCONbits.INT0IF = 0;
    }
    if(INTCONbits.TMR0IF==1) //interruption Timer 0
    {
    //(code)
    INTCONbits.TMR0IF = 0;
    }
    }
    dans mon main j'ai configuré mes intérruption sur le timer et sur INTO comme suit


    TRISBbits.TRISB0=1; // PORTB0 en entrée
    PORTBbits.RB0==0; // Initialisation de registre RB0

    T0CON = 0x88; // TMR0 en 16bits, ....

    EnablePullups(); //Pullups Activé
    INTCONbits.GIE = 1; // Active les interruptions globales

    INTCONbits.INT0IE = 1; // Autorise interruption sur RB0
    INTCONbits.INT0IF = 0; // initialisation du flag d'intérruption sur RB0

    INTCONbits.TMR0IE=1;
    INTCONbits.TMR0IF=0;

    ADCON1 = 0x0F; // ADC OFF
    INTCON2bits.INTEDG0 = 0; // interruption sur front descendant
    alors je sais pas si le probleme dans la déclaration des routines interruption car j'ai jamais déclarer deux Interruption ensemble

    merci pour votre aide

    -----

  2. #2
    sdec25

    Re : interuption pic 18f

    Bonjour,
    Il n'y a pas assez d'infos pour t'aider.
    Est-ce que le timer se lance bien ?
    En mettant TMR0IF manuellement, l'interruption a lieu ou pas ?
    Est-ce qu'on revient bien au programme principal après la première interruption ?
    Et en général on active les interruption après les avoir configurées, pas avant.

  3. #3
    bird12358

    Re : interuption pic 18f

    Bonjour,
    Comme l'a dit sdec25 il y a d'abord un ordre a respecter dans la sequence d'activation des interruptions.
    Ensuite je sais pas si c'est une erreur de recopie mais la ligne
    PORTBbits.RB0==0; // Initialisation de registre RB0
    c'est pas bon. Ton compilateur devrait te signaler un warning pour cette instruction.

  4. #4
    nirvo

    Re : interuption pic 18f

    Bonsoir
    merci pour les réponses, désolé pour '==' c'est une erreur d'ecriture,
    alors les interruptions se déclenche pour les IO mais pas pour le Timer, il détecte même pas l'interruption sur le timer (en mettant un point d'arret)
    mais si j'enlève les interruptions sur le IO (INT0), les interruptions sur le timer marche bien.

    Et en général on active les interruption après les avoir configurées, pas avant.
    qu'es ce que vous voulais dire par sa, ma configuration est dans le main et la routine est externe, mettre avant le main ou après n'a pas influencé sur le résultat

    j'ai jamais utilisé deux intérruption au mème temps, es vous pouvez me confirmer que la routine d'intérruption est bonne ou il existe une autre méthode de la faire ?

    je vous confirme que INT0 marche bien mais pas les interruption sur le timer!!

    merci

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

    Re : interuption pic 18f

    EN fait si le fait de configurer les registres dans le mauvais sens peut empecher le bon deroulement des interruptions.
    Code:
    TRISBbits.TRISB0=1; // PORTB0 en entrée
    PORTBbits.RB0==0; // Initialisation de registre RB0
    ADCON1 = 0x0F; // ADC OFF
    INTCON2bits.INTEDG0 = 0; // interruption sur front descendant 
    
    EnablePullups(); //Pullups Activé
    
    T0CON = 0x08; // TMR0 en 16bits, .... 
    
    
    
    INTCONbits.INT0IE = 1; // Autorise interruption sur RB0
    INTCONbits.INT0IF = 0; // initialisation du flag d'intérruption sur RB0
    
    INTCONbits.TMR0IE=1;
    INTCONbits.TMR0IF=0;
    
    INTCONbits.GIE = 1; // Active les interruptions globales
    
    T0CON &= 0x80; // Activation du timer
    Essaye comme ca pour voir ce que ca donne.

    Sinon le traitement des interruptions me semble correcte.

  7. #6
    nirvo

    Re : interuption pic 18f

    bonsoir
    ok je vous remercie, je vous tiens au courant de résultat demain

    merci

  8. #7
    nirvo

    Re : interuption pic 18f

    Bonjour, alors pour simplifier les choses voila un code qui permet de tester le portB1 chaque débordement du timer0 (intérruption générée chaque 10ms)
    le probleme que sa marhce meme pas si j'utilise ce programme !!
    #pragma code high_vector=0x08
    void intterupt(void)
    {
    _asm goto interrupt_timer0 _endasm
    }
    #pragma code
    void interrupt_timer0(void)
    {
    if(INTCONbits.TMR0IF==1)
    {
    INTCONbits.TMR0IF = 0;
    if(PORTBbits.RB1 == 1) tabBit[m]=1;
    else tabBit[m]=0; m+=1;
    }
    }
    et ma configuration du timer dans le main est :
    ADCON1 = 0x0F;

    TRISBbits.TRISB1=1;
    PORTBbits.RB1=0;

    EnablePullups();
    T0CON &= 0x48;

    INTCONbits.TMR0IE=1;
    INTCONbits.TMR0IF=0;
    TMR0H = 0xD8;
    TMR0L = 0xF0;

    INTCONbits.GIE = 1;
    T0CONbits.TMR0ON =1;
    while(1);
    merci pour l'aide

    nirvo

  9. #8
    bird12358

    Re : interuption pic 18f

    euh pourquoi tu ne mets pas tout simplement une led sur le portB1 que tu utilise pour voir si ca clignote. Parce que la je vois pas trop l'interet de ca.
    Code:
    if(PORTBbits.RB1 == 1) tabBit[m]=1; 
    else tabBit[m]=0; m+=1;
    C'est quoi cette valeur m ,c'est une variable globale ??

    Et ensuite la valeur que tu met dans TMR0H et TMR0L ont du etre calculé pour que quand le timer fait un overflow il se soit passé 10ms ?
    Si c'est ca il faut remettre ses valeurs lorsque l'interruption se fait pour que ce soit tjrs a 10ms.

    Enfin je croyais que tu travaillais sur un timer 16bit la tu l'as remis sur 8bit sauf si c'est une erreur de frappe.
    Code:
    T0CON &= 0x48;
    Dans le cas ou tu travailles sur un 8bit TMR0H ne sert pas a grand chose.

    Et derniere question, tu as un quartz externe ?

    A nan encore une derniere question c'est quoi cette fonction EnablePullups();

  10. #9
    nirvo

    Re : interuption pic 18f

    bonjour,
    m est une variable globale.
    alors j'ai un probleme d'utiliser le timer 0 en 16 bits, par contre 8 bits j'ai arrivé à le faire (voila l'aide)http://angeliz.free.fr/langagec/howto_timer0.htm

    Enabepullups() est une fonction dans portb.h qui active RB0 en pull up

    j'utilise un quartz externe de 4mhz

    Si c'est ca il faut remettre ses valeurs lorsque l'interruption se fait pour que ce soit tjrs a 10ms
    j'essayerai sa !!

    merci

  11. #10
    invite56a164ba

    Re : interuption pic 18f

    Salut tout le monde !
    j'essaye actuellement de faire un gradateur de lumière via un potentiometre que j'ai cable sur une carte possèdant un pic18f4431, sachant que les led sont cable aux rbo rb2 rb4 ( sortie pwm du pic). Malheureusement je n'y arrive vraiment pas
    voilà ce que j'ai écrit :
    //#include <18F4431.h>
    #include <htc.h>

    //****************************** ****************************** **
    // PROGRAMME PRINCIPAL 'MAIN'
    //****************************** ****************************** **

    void tempo(int vitesse)
    {
    int i ;
    for ( i=0 ; i<vitesse ; i++ );

    }
    void main(void)
    {


    //****************************** ****************************** **
    // CONFIGURATION DU PORT A ET DU CAN
    //****************************** ****************************** **

    PORTA= 0x8B; // configuration du port A
    LATA= 0x00; // initialisation du buffer de sortie A voir datasheet
    ANSEL0= 0x01; // configuration de selection de l'entrée analogique AN0
    ADCON0= 0x23; // configuration du registre 0 de contrôle du convertisseur
    ADCHS= 0xA8; // configuration du registre de selection de canal en l'occurence AN0
    ADCON1= 0x93; // configuration du registre 1 de contrôle du convertisseur
    ADCON2= 0x01; // configuration du registre 2 de contrôle du convertisseur
    TRISA= 0x0B; // configuration du registre de données A

    //****************************** ****************************** **
    // CONFIGURATION DU PORT B
    //****************************** ****************************** **²
    PORTB= 0x00; // configuration du port B en sortie
    LATB= 0x00; // initialisation du buffer de sortie B voir datasheet
    TRISB = 0x00; // configuration du registre de données B


    //****************************** ****************************** **
    // CONFIGURATION DU PORT C et des modules ccp1 et ccp2
    //****************************** ****************************** **

    PORTC= 0x0F; // configuration du port C en sortie
    LATC= 0x00; // initialisation du buffer de sortie C voir datasheet
    TRISC = 0x0F; // configuration du registre de données C
    CCP1CON = 0xDF; // activation du signal pwm
    T2CON= 0x7F; //configuration du timer ac un prescaler et un postscaller a 1/16
    PWMCON0= 0x40 ;
    PWMCON1= 0xF0; // pwm avec postscaller 1:16

    while(1)
    {
    PORTB=ADRESH;

    }
    }
    auriez vous une idée de ce qui ne va pas dans mon programme, j'ai pensé à une mauvaise configuraion et initialisation de mon can mais je n'en suis pas sur. Qu'en pensez vous ??

Discussions similaires

  1. HELP Please... PIC 18f
    Par invite3ea6ff8a dans le forum Électronique
    Réponses: 6
    Dernier message: 27/07/2010, 19h25
  2. interuption pic 18f
    Par nirvo dans le forum Électronique
    Réponses: 6
    Dernier message: 01/07/2010, 20h22
  3. Pic 18f
    Par electron22 dans le forum Électronique
    Réponses: 26
    Dernier message: 30/06/2010, 21h10
  4. PIC C 18F - Interruption 1S
    Par invite0098df65 dans le forum Électronique
    Réponses: 10
    Dernier message: 11/05/2010, 03h19
  5. comment passer des pic 16F au pic 18F ?
    Par MorpheusPic dans le forum Électronique
    Réponses: 5
    Dernier message: 13/08/2008, 22h04
Découvrez nos comparatifs produits sur l'informatique et les technologies.