timer0 PIC18f25k20
Répondre à la discussion
Affichage des résultats 1 à 8 sur 8

timer0 PIC18f25k20



  1. #1
    invited40f9802

    timer0 PIC18f25k20


    ------

    Bonjour
    J'ai un souci avec le timer0 j'essaie de générer une interruption et de faire allumer un led sur RC0. mais sans résultat.
    voici le code

    unsigned cnt;

    void interrupt() {
    if (TMR0IF_bit) {
    cnt++; // increment counter
    TMR0IF_bit = 0; // clear TMR0IF

    }
    }

    void main() {

    ANSEL = 0; // Configure AN pins as digital
    ANSELH = 0;
    C1ON_bit = 0; // Disable comparators
    C2ON_bit = 0;
    TRISC = 0; // PORTB is output
    PORTC = 0x00; // Initialize PORTB

    INTCON = 0xA0; // Enable TMRO interrupt
    cnt = 0; // Initialize cnt

    do {
    if (cnt >= 400)
    {
    PORTC = ~PORTC; // Toggle PORTB LEDs
    cnt = 0; // Reset cnt
    }
    } while(1);
    }

    il est très probable que je me sois trompé au niveau de l'initialisation des registres.
    Merci de bien vouloir m'aider

    -----

  2. #2
    cherwam07

    Re : timer0 PIC18f25k20

    Salut,

    - C'est quoi comme compilateur ?

    - Tu ne configures aucun registre du timer ?

    Code:
    if (cnt >= 400)
    - 'cnt' étant de type "on-sait-pas-quoi", il y a un risque que le compilo choisisse un 'char', qui donc n'atteindra jamais 400.

  3. #3
    invited40f9802

    Re : timer0 PIC18f25k20

    J'utilise MIKRO C pro for pic
    et
    l'inialisation du timer
    T0CON|= 0x87;
    normalement c'est bien ça??
    pour cnt c'est char j'ai mal copié

  4. #4
    paulfjujo

    Re : timer0 PIC18f25k20

    bonsoir,


    unsigned cnt ;
    non renseigne est par defaut un entier (non signé) pouvant donc couvrir de 0 à 65535
    il est quand meme preferable de le declarer
    unsigned int cnt;


    T0CON=0x87

    Enable
    mode 16 bits
    prescaler 1/256


    valeur du quartz ? (en MHz)
    Clock= 4/quartz (en µS)
    donc puisque la valeur du timer n'est pas initialisee dans le programme ou l'interrupt..
    ta tempo sera maximum 65535*clock*256= ..... µS

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

    Re : timer0 PIC18f25k20

    meme à 20Mhz !
    il faudra plus d'une demie-heure pour basculer les leds ! ..
    si je me suis pas gourré quelque part..

  7. #6
    invited40f9802

    Re : timer0 PIC18f25k20

    voila le code que j'ai utilisé et qui marche:


    unsigned char nb;

    // Interrupt Handler
    void interrupt()
    {
    // Timer0 Interrupt - Freq = 15625.00 Hz - Period = 0.000064 seconds
    if (INTCON.TMR0IF ==1) // timer 0 interrupt flag
    {
    nb++;
    INTCON.TMR0IF = 0; // clear the flag
    INTCON.TMR0IE = 1; // reenable the interrupt
    }

    }
    void main()
    {
    int i;

    TRISB=0xFF;

    TRISC = 0x00; // PORT is all output...to show the interrupts
    PORTC = 0x00; // start with all outputs low

    //Timer0 Registers Prescaler= 1 - TMR0 Preset = 0 - Freq = 15625.00 Hz - Period = 0.000064 seconds
    T0CS_bit = 0; // bit 5 TMR0 Clock Source Select bit...0 = Internal Clock (CLKO) 1 = Transition on T0CKI pin
    T0SE_bit = 0; // bit 4 TMR0 Source Edge Select bit 0 = low/high 1 = high/low
    PSA_bit = 1; // bit 3 Prescaler Assignment bit...0 = Prescaler is assigned to the WDT
    T0PS2_bit = 0; // bits 2-0 PS2:PS0: Prescaler Rate Select bits
    T0PS1_bit = 0;
    T0PS0_bit = 0;


    // Interrupt Registers
    INTCON = 0; // clear the interrpt control register
    INTCON.TMR0IE = 1; // bit5 TMR0 Overflow Interrupt Enable bit...1 = Enables the TMR0 interrupt
    INTCON.TMR0IF = 0; // bit2 clear timer 0 interrupt flag

    INTCON.RBIE=1;
    INTCON.RBIF=0;

    INTCON.GIE = 1; // bit7 global interrupt enable
    nb=0;

    while(1) //endless loop
    {
    if(nb>200)
    {
    for(i=0;i<500;i++)
    {
    PORTC=~PORTC;
    Delay_ms(200);
    }
    }
    }
    }


    merci a tous

  8. #7
    RISC

    Re : timer0 PIC18f25k20

    Salut,

    La ligne en caractères gras ci-dessous est totalement fausse...il faut absolument la retirer : les interruptions (GIE) sont automatiquement réactivées à la sortie d'une interruption. L'interruption TIMER0IE n'a pas besoin d'être touchée

    Code:
    {
    nb++;
    INTCON.TMR0IF = 0; // clear the flag
    INTCON.TMR0IE = 1; // reenable the interrupt   // à supprimer
    }
    a+
    Dernière modification par RISC ; 22/08/2012 à 11h59.

  9. #8
    invited40f9802

    Re : timer0 PIC18f25k20

    merci : D c'est fait

Discussions similaires

  1. 16f872 Timer0
    Par invite42a371c9 dans le forum Électronique
    Réponses: 6
    Dernier message: 21/01/2011, 10h50
  2. timer0 pic18f4550
    Par titoff dans le forum Électronique
    Réponses: 20
    Dernier message: 26/08/2009, 21h47
  3. Timer0
    Par invite8dac0c00 dans le forum Électronique
    Réponses: 6
    Dernier message: 08/06/2009, 18h16
  4. Timer1 et timer0
    Par guifou dans le forum Électronique
    Réponses: 4
    Dernier message: 18/01/2009, 05h16
  5. 4 secondes Timer0
    Par bimo dans le forum Électronique
    Réponses: 8
    Dernier message: 29/06/2006, 14h53
Dans la rubrique Tech de Futura, découvrez nos comparatifs produits sur l'informatique et les technologies : imprimantes laser couleur, casques audio, chaises gamer...