CONNESSIONE PC to
MSP430G2553
Il collegamento tra PC ed il
Microcontrollore di segnali
MSP430g2553(Mixed-Signal Processor)della Texas Instruments non è certo una passeggiata!.
Infatti, non è stato mai realizzato,
come per altri MC, un Configuratore grafico che aiutasse nelle scelte
complicate che si presentano al programmatore del MC (in modo particolare per
la configurazione delle periferiche!).
Vedi Configuratore grafico
dell’ambiente STM32CubeIDE dove si lavora in un ambiente facilitato per la
configurazione delle periferiche si produce il file.ioc
tanto che sia possibile eventualmente ritornare sulla configurazione e cosa più
importante, in modo totalmente automatico mi trovo nel codice
riportate-scritte(chiaramente!) le
configurazioni (che volendo posso cercare di capire!).
Un Configuratore, veramente fu
realizzato ma non ha mai funzionato bene, non era attendibile e fu tolto dalla
circolazione!
Quindi, per utilizzare l’MC, è
necessario leggere e capire bene il Data sheet per
impostare con rigore matematico i registri per l’utilizzo che se ne vuole fare.
In seguito verranno riportate le scelte effettuate ma non certo le
motivazioni/spiegazioni del perché di tali scelte. Sarebbe troppo lungo e per
molti noioso.
Quindi, per chi vorrà utilizzare il programma
potrà farlo semplicemente usando il metodo del ‘copia ed
incolla’.
Per i più ‘curiosi’ che volessero
approfondire, riporto alcune immagini e tabelle tratte dal Data Sheet del MSP430G2553.
Schema elettrico.
N.B. con l’MSP430G2553 è possibile
montare il nostro circuito personalizzato, utilizzando solamente L’MSP
programmato tramite il LaunchPad.
Infatti, una volta programmato il MSP
è pronto all’utilizzo previo collegamento, come è visibile nello schema, del
quarzo. (nel nostro caso è necessario)
Copia del prog. In C (CommUnByte_in_Cfunziona.c)---------------------------------------- da
rinominareeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
/*
21.33, 24.10.2021
Versione in C di 'CommUnByte'----------------
funzionante.
*/
int D =0; //dato da comunicare
#include "msp430g2553.h"
int main(void)
{
WDTCTL
= WDTPW + WDTHOLD; // Stop WDT
DCOCTL
= 0; //
Select lowest DCOx and MODx settings
BCSCTL1
= CALBC1_1MHZ; //
Set DCO
DCOCTL
= CALDCO_1MHZ;
P1SEL |= BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
P1SEL2 |= BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD
// ;-----------UCA0 registri------------------------------------
//frequenza baud rate=9600 con clk=ACLK=32768Hz
UCA0CTL1
|= 0x40; //
ACLK=01 00 0000(32768)
SMCLK
UCA0BR0
= 0x03; //3=int(32768/9600)-----(3.4133)
UCA0BR1
= 0x00; //parte
più significativa di UCA0BRx=0
UCA0MCTL
= 0x06; //6<=3 (3.3066=(32768/9600)-int(32768/9600)*8)
UCA0CTL1
&= ~BIT0; //Resetta
modulo = ATTIVO
UC0IE
|= UCA0RXIE; //
Enable USCI_A0 RX interrupt0000 0001 UCA0RXIE=1, Enable
USCI_A0 RX interrupt.
__bis_SR_register(GIE); // General interrupt enable. When set, enables maskable
interrupts (BIS.W #0x008,SR)
while (1)
{
__no_operation();
__no_operation();
}
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
//D=D+1;
D=UCA0RXBUF;//legge dato
da buffer
__no_operation();
UC0IE
&= ~BIT0; //Disabilita
RX interr.
UC0IE
|= BIT1; //Abilita TX interr.(attiva
interr. e lettura ISR_TX)
__no_operation();
}
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
D=D+1;
UCA0TXBUF=D;// carica buffer di
trasmissione.
__no_operation();
UC0IE
&= ~BIT1; //Disabilita
TX interr.
UC0IE
|= BIT0; //Abilita RX interr.
(per rimanere nuovamente in attesa di un nuovo
dato)
__no_operation();
}
-------------------------------------------fine------------------------------------------------------
Spiegaz. Programma
in C ( fatto ottobre
2021 e funzionante!)
DCOCTL = 0; // Select lowest DCOx
and MODx settings
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ; // Calibra frequenza |
P1SEL |= BIT1 + BIT2 ; // P1.1 =
RXD, P1.2=TXD P1SEL2 |= BIT1 + BIT2 ; // P1.1 = RXD, P1.2=TXD |
;-----------UCA0 registri------------------------------------ //frequenza
trasmissione in baud rate=9600
con clk=ACLK=32768Hz |
Assegno
il clock dell’oscillatore quarzato (32768Hz)
al
BRCLK ( BaudRateClock) BRCLK= BaudRateClock
E LASCIO,
COME DI DEFAULT IL BIT ZERO DEL REG.
UCA0CTL1 =1 POICHE SPOSTO SOLO BIT 6
quindi è pronto per la config.(vedi ‘inizializing e reconfiguring module USCI)
UCA0CTL1
|= 0x40; //
UCA0CTL1=01 00 0001(32768) SMCLK
UCA0BR0
= 0x03; //3=int(32768/9600)-----(3.4133)
UCA0BR1
= 0x00; //parte
più significativa di UCA0BRx=0
UCA0MCTL = 0x06; //6<=3 (3.3066=(32768/9600)-int(32768/9600)*8)
---------------||||||||||||||||||----------------
UCA0CTL1 &= ~BIT0; //Resetta
modulo = ATTIVO |
UC0IE
|= UCA0RXIE; //
Enable USCI_A0 RX interrupt0000 0001 UCA0RXIE=1, Enable
USCI_A0 RX interrupt.
__bis_SR_register(GIE); // General
interrupt enable. When set,
enables maskable
interrupts (BIS.W #0x008,SR) |
while (1)
{ __no_operation(); __no_operation();
} } |
------- zona routine
interruzioni -------
Dichiarazione
vettore di interruzione dove salta il programma quando al pin P1.1=RX si
presenta l’impulso di START scritto dal dispositivo connesso(P.C.) #pragma vector=USCIAB0RX_VECTOR __interrupt void USCI0RX_ISR(void) { //D=D+1; D=UCA0RXBUF;//legge dato da buffer __no_operation(); UC0IE &= ~BIT0; //Disabilita RX interr.
(legge solo un dato!) UC0IE |= BIT1; //Abilita
TX interr.(attiva interr.
e svolgimento routine ISR_TX) __no_operation(); } |
Appena terminata la routine ISRRX, dove l’ultima istruzione è ‘Abilita TX’, il prog. Salta a questa routine dove il registro di trasmissione UCA0TXBUF viene caricato con il
valore precedentemente ricevuto dal P.C. maggiorato di uno. Contestualmente
alla scrittura del dato in
UCA0TXBUF, il MSP trasmette sul pin P1.2=TX il dato. Quindi Disabilita TX interr.
E Abilita RX interr. (per rimanere
nuovamente in attesa di un nuovo dato) #pragma vector=USCIAB0TX_VECTOR __interrupt void USCI0TX_ISR(void) {
D=D+1;
UCA0TXBUF=D;// carica buffer di trasmissione.
__no_operation();
UC0IE &= ~BIT1; //Disabilita TX interr.
UC0IE |= BIT0;
//Abilita
RX interr. (per rimanere nuovamente
in attesa di un nuovo dato)
__no_operation(); } |
PROGRAMMA IN SINTESI (QUASI UN
DIAGRAMMA DI FLUSSO!)