Bonjour,

Je dois faire fonctionner un moteur pas à pas (PAP) en utilisant un timer avec interruption. Mon moteur PAP doit faire un cycle de 4 positions à l'infini (en réalité il doit faire un tour, de 360° mais pour l'instant je ne m'y attarde pas).

Ce que je veux faire :

Coup d'horloge -> Position 1 -> Coup d'horloge -> P2 -> Coup d'horloge -> P3 -> Coup d'horloge -> P4 -> Coup d'horloge -> P1 -> ...

J'ai réussi à le faire en utilisant un délais entre chaque position, comme ceci :
Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include <msp430.h> 
 
main(void)
{
volatile int cpt =0;
P2DIR |= 0x3F;
while (1)
{
    switch (cpt)
            {
 
           case 0 : // Position 1
 
              P2OUT |= 0x03;
              P2OUT &= 0x03;
              cpt++;
              _delay_cycles(10000);
             break;
 
            case 1 : // Position 2
 
              P2OUT |= 0x18;
              P2OUT &= 0x18;
              cpt++;
              _delay_cycles(10000);
              break;
 
            case 2 : // Position 3
 
              P2OUT |= 0x06;
              P2OUT &= 0x06;
              cpt++;
              _delay_cycles(10000);
              break;
 
            case 3 : // Position 4
 
              P2OUT |= 0x30;
              P2OUT &= 0x30;
              cpt=0;
              _delay_cycles(10000);
              break;
        }
}
}

Donc avec ça, mon moteur tourne à l'infini.
Mais quand j'adapte mon code en utilisant un timer avec une interruption, ca ne marche pas. Le moteur fait une petite rotation (vraiment légère) et ce bloque. Il ne tourne plus. Et quand j'arrête le programme, il refait son petite tour, mais dans l'autre sens. De plus, un petit bruit sourd apparaît.

Je me pose donc la question, est-ce que mon timer est bien réalisé en boucle dans mon main? Ou ai-je bien déclaré mon timer ? Je n'ai pas trop d'idée (c'est le premier timer que je fais.)


Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <msp430.h>
volatile int cpt =0;
void main(void)
{
 
WDTCTL = WDTPW + WDTHOLD; //desactivation Watch Dog Timer
BCSCTL1= CALBC1_1MHZ; //frequence d’horloge 1MHz
DCOCTL= CALDCO_1MHZ; // "
P2DIR |= 0x3F;
TA0CTL = 0|(TASSEL_2 | ID_0); //source SMCLK, pas de predivision ID_0
TA0CTL |= MC_1; //comptage en mode up
TA0CTL |= TAIE; //autorisation interruption TAIE
TA0CCR0 = 27776; 
 
__enable_interrupt();
while(1); //boucle infinie ou le programme peut faire autre chose
}
 
#pragma vector=TIMER0_A1_VECTOR //voir diaporama seance precedente
__interrupt void ma_fnc_timer(void)
{
 
    switch (cpt)
        {
 
        case 0 : // Position 1
 
          P2OUT |= 0x03;
          P2OUT &= 0x03;
          cpt++;
          break;
 
        case 1 : // Position 2
 
          P2OUT |= 0x18;
          P2OUT &= 0x18;
          cpt++;
          break;
 
        case 2 : // Position 3
 
          P2OUT |= 0x06;
          P2OUT &= 0x06;
          cpt++;
          break;
 
        case 3 : // Position 4
 
          P2OUT |= 0x30;
          P2OUT &= 0x30;
          cpt=0;
          break;
    }
}

Je vous remercie d'avance.