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

erreur timer+interruption



  1. #1
    bam98

    erreur timer+interruption


    ------

    Bonjour,
    j'ai écris un programme avec un timer et interruption, j'arrive pas à le compiler, normalement il doit permettre de déclencher le porta par le LATA. Rien de se passe en simulation.
    Merci de m'aider

    Voici le programme :


    #include <p18cxxx.h>

    #ifndef _XTAL_FREQ
    #define _XTAL_FREQ 4000000 /*4MHz*/

    //#pragma config SOSCSEL = DIG /* Digital (SCLKI) mode*/
    #pragma config FOSC = XT
    #pragma config PLLCFG = ON
    #pragma config PWRTEN = OFF
    #pragma config WDTEN = OFF

    /****************************** */
    void Int_Hight(void);
    /****************************** */
    /****************************** *******************/
    #pragma code HighVector=0x08
    void HighVector(void)
    {
    _asm goto Int_Hight _endasm
    }
    /*ooooooooooooooooooooooooooooo oooooo*/
    #pragma code LowVector=0x18
    void LowVector(void)
    {
    _asm goto Int_Hight _endasm
    }
    #pragma code
    /****************************** *******************/
    #pragma interruptlow Int_Hight
    void Int_Hight(void){
    unsigned char i;
    TRISA = 0x00;

    if(INTCONbits.TMR0IF){ /*==1*/
    INTCONbits.TMR0IF=0; /*: Clr Overflow Interrupt Flag bit*/
    TMR0L=0xFE;
    i=LATA;
    i^=i|0x01;
    LATA=i;
    }

    }
    void main (void){

    TRISA=0b11111110; /* Bit 0 out*/

    /**********************TIMER 0 INIT************************** *****************/
    T0CONbits.TMR0ON=1; /*: Timer0 On/Off Control bit
    1 = Enables Timer0*/

    T0CONbits.T08BIT=1; /*: Timer0 8-Bit/16-Bit Control bit
    1 = Timer0 is configured as an 8-bit timer/counter
    0 = Timer0 is configured as a 16-bit timer/counter*/

    T0CONbits.T0CS=0; /*Timer0 Clock Source Select bit
    1 = Transition on T0CKI pin input edge
    0 = Interna clock (FOSC/4)*/

    T0CONbits.PSA=0; /* Timer0 Prescaler Assignment bit
    1 = Timer0 prescaler is not assigned; Timer0 clock input bypasses the prescaler
    0 = Timer0 prescaler is assigned; Timer0 clock input comes from the prescaler output*/

    T0CONbits.T0PS=0x1; /*<2:0>: Timer0 Prescaler Select bits
    111 = 1:256 Prescale value
    110 = 1:128 Prescale value
    101 = 1:64 Prescale value
    100 = 1:32 Prescale value
    011 = 1:16 Prescale value
    010 = 1:8 Prescale value
    001 = 1:4 Prescale value
    000 = 1:2 Prescale value*/
    /****************************** ****************************** *******************/

    INTCON2bits.TMR0IP=1; /*TMR0 Overflow Interrupt Priority bit
    1 = High priority
    0 = Low priority*/

    INTCONbits.TMR0IF=0; /*: TMR0 Overflow Interrupt Flag bit
    1 = TMR0 register has overflowed (must be cleared in software)
    0 = TMR0 register did not overflow*/

    INTCONbits.TMR0IE=1; /*: TMR0 Overflow Interrupt Enable bit
    1 = Enables the TMR0 overflow interrupt
    0 = Disables the TMR0 overflow interrupt*/

    RCONbits.IPEN = 1; /*When IPEN = 1:
    1 = Enables all high-priority interrupts
    0 = Disables all interrupts*/

    INTCONbits.GIE=1; /*Global Interrupt Enable bit
    When IPEN = 0:
    1 = Enables all unmasked interrupts
    0 = Disables all interrupts*/

    TMR0L=0xFE; /*Timer0 Register Low Byte*/
    while(1){

    /****************************** ********/

    }
    }

    -----

  2. Publicité
  3. #2
    bird12358

    Re : erreur timer+interruption

    Bonjour ,
    A part le fait que les deux vecteurs d'interruption ne doivent pas pointer vers la mémé fonction je crois. Tout me semble bon sinon.

    Essayes:
    Code:
    void Int_Hight(void);
    
    
    #pragma code HighVector=0x08
    void HighVector(void)
    {
    _asm goto Int_Hight _endasm
    }
    /*ooooooooooooooooooooooooooooo oooooo*/
    #pragma code LowVector=0x18
    void LowVector(void)
    {
    
    }
    #pragma code
    
    #pragma interrupt Int_Hight
    void Int_Hight(void){
    unsigned char i;
    TRISA = 0x00;
    
    if(INTCONbits.TMR0IF){ /*==1*/
    INTCONbits.TMR0IF=0; /*: Clr Overflow Interrupt Flag bit*/
    TMR0L=0xFE;
    i=LATA;
    i^=i|0x01;
    LATA=i;
    }
    
    }
    Tu le mets dans l'interruption haute parce que tu as mis INTCON2bits.TMR0IP=1;

  4. #3
    bam98

    Re : erreur timer+interruption

    Merci bcp, je l'ai modifié, mais ca change toujours pas le bit O du port A, comme indique la simution ci joint.


    #include <p18cxxx.h>

    #ifndef _XTAL_FREQ
    #define _XTAL_FREQ 4000000 /*4MHz*/

    //#pragma config SOSCSEL = DIG /* Digital (SCLKI) mode*/
    #pragma config FOSC = XT
    #pragma config PLLCFG = ON
    #pragma config PWRTEN = OFF
    #pragma config WDTEN = OFF

    /****************************** */
    void Int_Hight(void);


    #pragma code HighVector=0x08
    void HighVector(void)
    {
    _asm goto Int_Hight _endasm
    }
    /*ooooooooooooooooooooooooooooo oooooo*/
    #pragma code LowVector=0x18
    void LowVector(void)
    {

    }
    #pragma code

    #pragma interrupt Int_Hight
    void Int_Hight(void){
    unsigned char i;
    TRISA = 0x00;

    if(INTCONbits.TMR0IF){ /*==1*/
    INTCONbits.TMR0IF=0; /*: Clr Overflow Interrupt Flag bit*/
    TMR0L=0xFE;
    i=LATA;
    i^=i|0x01;
    LATA=i;
    }

    }
    void main (void){

    TRISA=0b11111110; /* Bit 0 out*/

    /**********************TIMER 0 INIT************************** *****************/
    T0CONbits.TMR0ON=1; /*: Timer0 On/Off Control bit
    1 = Enables Timer0*/

    T0CONbits.T08BIT=1; /*: Timer0 8-Bit/16-Bit Control bit
    1 = Timer0 is configured as an 8-bit timer/counter
    0 = Timer0 is configured as a 16-bit timer/counter*/

    T0CONbits.T0CS=0; /*Timer0 Clock Source Select bit
    1 = Transition on T0CKI pin input edge
    0 = Interna clock (FOSC/4)*/

    T0CONbits.PSA=0; /* Timer0 Prescaler Assignment bit
    1 = Timer0 prescaler is not assigned; Timer0 clock input bypasses the prescaler
    0 = Timer0 prescaler is assigned; Timer0 clock input comes from the prescaler output*/

    T0CONbits.T0PS=0x1; /*<2:0>: Timer0 Prescaler Select bits
    111 = 1:256 Prescale value
    110 = 1:128 Prescale value
    101 = 1:64 Prescale value
    100 = 1:32 Prescale value
    011 = 1:16 Prescale value
    010 = 1:8 Prescale value
    001 = 1:4 Prescale value
    000 = 1:2 Prescale value*/
    /****************************** ****************************** *******************/

    INTCON2bits.TMR0IP=1; /*TMR0 Overflow Interrupt Priority bit
    1 = High priority
    0 = Low priority*/

    INTCONbits.TMR0IF=0; /*: TMR0 Overflow Interrupt Flag bit
    1 = TMR0 register has overflowed (must be cleared in software)
    0 = TMR0 register did not overflow*/

    INTCONbits.TMR0IE=1; /*: TMR0 Overflow Interrupt Enable bit
    1 = Enables the TMR0 overflow interrupt
    0 = Disables the TMR0 overflow interrupt*/

    RCONbits.IPEN = 1; /*When IPEN = 1:
    1 = Enables all high-priority interrupts
    0 = Disables all interrupts*/

    INTCONbits.GIE=1; /*Global Interrupt Enable bit
    When IPEN = 0:
    1 = Enables all unmasked interrupts
    0 = Disables all interrupts*/

    TMR0L=0xFE; /*Timer0 Register Low Byte*/
    while(1){

    /****************************** ********/

    }
    }
    Images attachées Images attachées

  5. #4
    bird12358

    Re : erreur timer+interruption

    Rebonjour,
    c'est peutetre a cause ce passage:

    Code:
    i=LATA;
    i^=i|0x01;
    LATA=i;
    Tout d'abord LAT c'est pour faire du write pas du read.Ensuite je comprend pas ce que tu veux faire. Si tu veux inverser l'etat du bit0 fait plutot ca.

    Code:
    LATA=PORTA^0x01;

  6. A voir en vidéo sur Futura
  7. Comparatifs

    Gagnez du temps et de l'argent grâce à nos comparatifs de produits. Parmi nos sujets :
  8. #5
    Aurélien

    Re : erreur timer+interruption

    Citation Envoyé par bird12358 Voir le message
    Tout d'abord LAT c'est pour faire du write pas du read.
    Partiellement faux...
    LATA stocke la valeur des latch de sortie. Tu peux le lire et y ecrire, sans te soucier de l'etat réel de la sortie (en court circuit ou pas).
    Si tu fais "LATA=PORTA^0x01", alors tu fous en l'air tout l'interet du registre LATA.
    Tu peux tres bien faire un LATA=LATA^0x01, et c'est fait pour ça.

    Aurélien

  9. #6
    Aurélien

    Re : erreur timer+interruption

    Par contre, vu qu'on ne connait pas le modele de PIC sur lequel tu travailles, il est fort possible que RA0 soit configuré comme entrée ANALOGIQUE au démarrage.
    Il faut donc désactiver d'eventuels ADC ou comparateurs.
    Lis bien la datasheet de ton PCI et le chapitre sur les ports.

    Aurélien

  10. Publicité
  11. #7
    bird12358

    Re : erreur timer+interruption

    Ah ouia desolé.
    J'avais pas pensé au coup de l'analogique.

  12. #8
    bird12358

    Re : erreur timer+interruption

    Par contre en quoi le fait de faire ca LATA=PORTA^0x01 mets en l'air tout l'intérêt du registre LATA?

  13. #9
    RISC

    Re : erreur timer+interruption

    Salut,
    Citation Envoyé par bird12358 Voir le message
    Par contre en quoi le fait de faire ca LATA=PORTA^0x01 mets en l'air tout l'intérêt du registre LATA?
    Voir le cours de Bigonoff...
    Quand on lit le LATA on lit le registre de sortie
    Quand on lit le PORTA on lit les broches

    Pas tu tout pareil...

    a+

  14. #10
    Aurélien

    Re : erreur timer+interruption

    Citation Envoyé par bird12358 Voir le message
    Par contre en quoi le fait de faire ca LATA=PORTA^0x01 mets en l'air tout l'intérêt du registre LATA?
    Parce que le registre LAT est là pour éviter de faire l'opération PORTA = PORTA^0x01, susceptible de subir le bug du read-modify-write.
    Si tu fais LATA = PORTA ^0x01, le résultat sera exactement le meme, et on n'aurait alors plus besoin du registre LAT. Il est la, il est donc utile, donc on l'utilise

    Aurélien

  15. #11
    bird12358

    Re : erreur timer+interruption

    Ok ca marche.

  16. #12
    electron22

    Re : erreur timer+interruption

    J'ai effectué ce que vous m'avez dit, et ça marche très bien.

    1- J'ai copié collé la ligne : LATB=LATB^0x01;

    2- J'ai vérifié le PORT A, et j'ai constaté que juste les bit 0xD0 qui sont disponible pour les sortie et j'ai pris le bit 0 du PORT B.

    Programme, simulation et datasheet des port ci joint

    Maintenant, je dois procéder à mon but est de contrôler la durer de chaque carré, si vous avez des conseils, s'il vous plaît

    Merci beaucoup c'est gentil
    Images attachées Images attachées

  17. Publicité

Discussions similaires

  1. Programmation en C avec Timer 0 et Timer 1
    Par Groundation dans le forum Électronique
    Réponses: 43
    Dernier message: 20/04/2010, 13h27
  2. [PIC]-Interruption / Timer / Led
    Par jorg1n dans le forum Électronique
    Réponses: 4
    Dernier message: 24/04/2008, 14h55
  3. Réponses: 2
    Dernier message: 08/10/2007, 12h59
  4. Interruption Timer avec PIC16F876A
    Par black_is_beautiful dans le forum Électronique
    Réponses: 9
    Dernier message: 28/07/2007, 21h57
  5. interruption ( timer )
    Par paterson dans le forum Électronique
    Réponses: 0
    Dernier message: 13/03/2007, 19h50
Découvrez nos comparatifs produits sur l'informatique et les technologies.