Bonjour,

Je sollicite votre aide pour programmer un MSP430F5528. Je souhaiterai créer une liaison UART et une PWM.

J'ai réussi à faire la PWM:

init:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
void pwm_init(void){
  UCSCTL4 = SELS__DCOCLK ;   // Choix de la clock
 
  TA0CCR0 = 100;             // Nombre de periode
  TA0CTL = TASSEL_2 + MC_1;  // Choix de la clock du PWM et le mode (ici up mode)
 
  P1DIR |= BIT2 + BIT3;      // Choix des sortie (ici P1.2 et P1.3)
  TA0CCTL1 = OUTMOD_7;       // Set/Reset du PWM
  TA0CCR1 = 0;               // Pourctentage etat haut
  TA0CCTL2 = OUTMOD_7;       // Set/Reset du PWM
  TA0CCR2= 100;              // Pourctentage etat haut
 
}
Le code de controle d'un moteur DC:
Code : 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
 
void open(void){
  while(exit==0){
    TA0CCTL1 = OUTMOD_7;       // Set/Reset du PWM
    TA0CCR1 = TA0CCR1 + 2;     // Incrementation de pourcentage etat haut
 
    if(TA0CCR1 == 100){
      exit = 1;                // PWM 100% Donc sortie
      TA0CTL = MC_0;           // Stop Timer
      TA0CCTL1 = OUTMOD_0;     // Mode sortie manuelle
    }
  }
}
 
void close(void){
  while(exit==0){
    TA0CCTL2 = OUTMOD_7;       // Set/Reset du PWM
    TA0CCR2 = TA0CCR2 - 2;     // Decrementation de pourcentage etat haut
 
    if(TA0CCR2== 0){
      exit = 2;                // PWM 0% Donc sortie
      TA0CTL = MC_0;           // Stop Timer
      TA0CCTL2 = OUTMOD_0;     // Mode sortie manuelle
    }
  }
}
J'ai réussi à faire l'UART:

init:
Code : 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
 
void uart_init(void){
 
 
  UCA1CTL1 |= UCSWRST; 	//Reset 
  UCA1CTL1 |= UCSSEL1;
  UCA1CTL1 |= UCBRKIE;
  UCA1CTL0 = 0x00;
 
  UCA1BR0 = 18; // configuration BAUD
  UCA1BR1 = 0; // configuration BAUD
  UCA1MCTL = UCBRF_0 | UCBRS_0;
 
  UCA1STAT = 0x0;
  UCA1ABCTL = 0x0;
 
  P4DIR |= TXD; // RX et TX en output
  P4SEL |= TXD + RXD; // selection du mode UCA1TXD et UCA1RXD
 
  UCA1CTL1 &= ~UCSWRST;
 
  UCA1IE |= UCRXIE;
  UCA1IE |= UCTXIE;
 
}
Le print char:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
void print_char(char * buffer){
  char * bufptr = buffer;
  while (*bufptr != 0)
  {
    while (!(UCA1IFG&UCTXIFG));             // USCI_A0 TX buffer ready?
    UCA1TXBUF = *bufptr;             // TX character
    bufptr++;
  }
 
}
et une sorte de get char:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
 
char get_char(void){
  char recv;
  while (!(UCA1IFG&UCRXIFG));// Wait for a character
  recv = UCA1RXBUF; // Get the char.
  return recv;
}
Voici ce que je souhaite faire:

contrôle du moteur en fonction de la commande envoyer depuis un ordinateur: o (pour open) -> tourne le moteur dans un sens, c (pour close) -> tourne le moteur dans l'autre sens.

bus UART: 115200, no parity, 8 bits, 1 bit de stop.

pin utilisées:
moteur:
P1.2 et P1.3

UART
P4.4 et P4.5

Voici les problèmes que je rencontre avec ce que j'ai:
- Je ne comprend pas comment on définie les clock.
- Le buffer RX est toujours vide à la réception d'un caractère.

Toute aide est bienvenue: optimisation de code, explication, exemple de code.

Voici les docs que j'ai trouvé:

http://www.ti.com/lit/ug/slau208o/slau208o.pdf

Je vous remercie
cordialement
Sh0rtY