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

[MikroC] interruptions Timer 16F648A



  1. #1
    nono313

    [MikroC] interruptions Timer 16F648A


    ------

    Bonjour,
    Afin de faire tourner une turbine avec variateur (brushless), je dois simuler une PWM de plus ou moins 1ms avec une précision d'au moins 50-100µs. (la fonction de PWM du PIC étant déja utilisé pour une autre fonction).
    J'ai essayé d'utiliser le Timer0 pour cela, et voila ce que j'obtiens.
    Code:
    unsigned long valchgt = 1000, cnt = 0;
    void interrupt()
    {
    
       INTCON.T0IE = 1;
    
       if(cnt == valchgt || cnt == 0)
       {
        		PORTB.F7 = ~PORTB.F7;      // Toggle PORTD
        }
       cnt++;
       if(cnt == 100000)		
        		cnt = 0;
    
    }
    
    void main()
    {
    
      TRISA = 0;
      PORTA = 0;
      PORTB = 0;
      TRISB = 0b00000011;      
      OPTION_REG = 0x80;
    
      TMR0 = 0;
      INTCON = 0;
      INTCON.GIE = 1;
      INTCON.T0IE = 1;
      INTCON.T0IF = 1;
    
      while(1)
      {
        if(PORTB.F0 == 1)
            valchgt+=20;
        if(PORTB.F1 == 1)
            valchgt-=20;
        PORTA = valchgt;
      }
    
    }
    La fréquence étant beaucoup trop rapide pour ce que je souhaite obtenir,(le PIC n'a pas non plus le temps de rentrer dans le while, donc la modification de l'interruption avec les boutons devient impossible), j'ai donc essayé d'activer le prescaler (bits OPTION_REG.PSX) mais ils semble n'avoir aucun effet.

    P.S : avec le code tel quel j'ai une période d'environ 3s pour observer les changements à l'oeil nu

    J'ai essayé d'utiliser le Timer1 mais là j'ai une période bien trop longue (d'environ 33ms), avec ce code :
    Code:
    unsigned long valchgt = 1, cnt = 0;
    void interrupt()
    {
       if(PIR1.TMR1IF == 1)
       {
          if(cnt == valchgt || cnt == 0)
        		PORTB = ~PORTB;      // Toggle PORTD
            cnt++;
        	if(cnt == 100)		
        		cnt = 0;
            PIR1.TMR1IF = 0;     
      }
    
    
    
    }
    
    void main()
    {
    
      TRISA = 0xFF;
      PORTA = 0;
      PORTB = 0;
      TRISB = 0;      
      INTCON = 0;
      PIE1 = 0;
      PIR1 = 0;
      T1CON = 0;
      INTCON.GIE=1;
      INTCON.PEIE = 1;
      PIE1.TMR1IE = 1;          //activer le timer1
      T1CON.TMR1CS = 0;         //horloge interne Fosc/4
      T1CON.T1OSCEN = 0;
      T1CON.TMR1ON = 1;         //démarrer le timer1
      //prescaler
      T1CON.T1CKPS1 = 0;
      T1CON.T1CKPS0 = 0;
    
    
    
      while(1)
      {
        
      }
    
    }
    P.S 2 : Veuillez m'excuser pour le manque de propreté du code mais je ne suis qu'un élève de Terminale S

    -----

  2. #2
    nono313

    Re : [MikroC] interruptions Timer 16F648A

    Quelqu'un aurait une idée ?

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, 14h27
  2. les comparateurs du PIC 16F648A
    Par arzew dans le forum Électronique
    Réponses: 13
    Dernier message: 25/03/2010, 15h31
  3. Interruptions mikroc + 16f628 + easypic5
    Par Thom0801 dans le forum Électronique
    Réponses: 0
    Dernier message: 06/10/2009, 18h13
  4. [PIC]-Interruptions / Timer : Déclenchement aléatoire
    Par jorg1n dans le forum Électronique
    Réponses: 28
    Dernier message: 01/08/2008, 09h27
  5. programmateur autonome pour PIC 16F648A
    Par ERM dans le forum Électronique
    Réponses: 1
    Dernier message: 28/07/2008, 23h23
Découvrez nos comparatifs produits sur l'informatique et les technologies.