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!)