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:
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 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 }
J'ai réussi à faire l'UART:
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 } } }
init:
Le print char:
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; }
et une sorte de get 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++; } }
Voici ce que je souhaite faire:
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; }
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
Partager