×
MSP430, Microcontrollori 16 bit Ultra Low Power
Problemi configurazione timer UART
12 Anni 1 Settimana fa #1
da fortezzadigitale
Problemi configurazione timer UART è stato creato da fortezzadigitale
Salve a tutti.
Sto cercando di interfacciare una scheda di sviluppo della Olimex (MOD-PULSE), basata su MSP430FG439 con uno smartphone android mediante il modulo Bluetooth RN-42 della Roving Networks.
Il codice dimostrativo della MOD-PULSE è settato per inviare i dati sull'interfaccia UART ad una velocità di 115200bps in questo modo:
UCTL0 |= SWRST;
ME1 |= UTXE0; // Enable USART1 TXD
UCTL0 |= CHAR; // 8-bit char, SWRST=1
UTCTL0 |= SSEL1; // UCLK = SMCLK
UBR00 = 52; // 115200 from 6.02MHz = 52.33
UBR10 = 0x00;
UMCTL0 = 0x45; // Modulation = 0.375
UCTL0 &= ~SWRST; // Initialise USART
mentre la parte di codice che invia i dati è questa (sono 4 byte in tutto, in cui i primi 2 servono da riconoscimento dei successivi):
TXBUF0 = 0x00; // Byte 1 - 0x00 (synchronization byte)
while (!(IFG1 & UTXIFG0));
TXBUF0 = 0xFF; // Byte 2 - 0xFF (synchronization byte)
while (!(IFG1 & UTXIFG0));
TXBUF0 = heart_rate_LSB; // Byte 3 - Heart rate data
while (!(IFG1 & UTXIFG0));
TXBUF0 = SaO2_LSB; // Byte 4 - %SaO2 data
Quando però vado a leggere i valori ricevuti dallo smartphone, noto dei valori strani che non dovrebbero esserci, e ciò succede anche se modifico il codice per inviare un pattern prefissato (ad esempio inviando ABCD mi ritrovo qualcosa del tipo (A?C#) ma mai sbagliati in modo sistematico.
Ho pensato (ed ho anche letto da qualche parte) che forse la velocità di 115200 bps è troppo alta per questo modulo bluetooth, ed in effetti per quello che devo fare io non è neanche necessaria.
Vorrei ridurre la trasmissione a 9600bps ma non ho capito che valori devo mettere nei registri UBR00, UBR10, UMCTL0.
Ho provato ad usare una delle calcolatrici disponibili online per ricavare i valori opportuni, ma i risultati che ottengo sono deludenti (non ricevo più niente di quello che dovrei ricevere).
Aggiungo che all'inzio del codice sono presenti le seguenti istruzioni:
SCFI0 |= FN_4; // x2 DCO frequency, 8MHz nominal
// DCO
SCFQCTL = 91; // 32768 x 2 x (91 + 1) = 6.03 MHz
FLL_CTL0 = DCOPLUS + XCAP10PF; // DCO+ set so freq = xtal x D x (N+1)
Qualcuno potrebbe cortesemente aiutarmi ad abbassare la velocità di trasmissione a 9600bps?
sono disperato
Sto cercando di interfacciare una scheda di sviluppo della Olimex (MOD-PULSE), basata su MSP430FG439 con uno smartphone android mediante il modulo Bluetooth RN-42 della Roving Networks.
Il codice dimostrativo della MOD-PULSE è settato per inviare i dati sull'interfaccia UART ad una velocità di 115200bps in questo modo:
UCTL0 |= SWRST;
ME1 |= UTXE0; // Enable USART1 TXD
UCTL0 |= CHAR; // 8-bit char, SWRST=1
UTCTL0 |= SSEL1; // UCLK = SMCLK
UBR00 = 52; // 115200 from 6.02MHz = 52.33
UBR10 = 0x00;
UMCTL0 = 0x45; // Modulation = 0.375
UCTL0 &= ~SWRST; // Initialise USART
mentre la parte di codice che invia i dati è questa (sono 4 byte in tutto, in cui i primi 2 servono da riconoscimento dei successivi):
TXBUF0 = 0x00; // Byte 1 - 0x00 (synchronization byte)
while (!(IFG1 & UTXIFG0));
TXBUF0 = 0xFF; // Byte 2 - 0xFF (synchronization byte)
while (!(IFG1 & UTXIFG0));
TXBUF0 = heart_rate_LSB; // Byte 3 - Heart rate data
while (!(IFG1 & UTXIFG0));
TXBUF0 = SaO2_LSB; // Byte 4 - %SaO2 data
Quando però vado a leggere i valori ricevuti dallo smartphone, noto dei valori strani che non dovrebbero esserci, e ciò succede anche se modifico il codice per inviare un pattern prefissato (ad esempio inviando ABCD mi ritrovo qualcosa del tipo (A?C#) ma mai sbagliati in modo sistematico.
Ho pensato (ed ho anche letto da qualche parte) che forse la velocità di 115200 bps è troppo alta per questo modulo bluetooth, ed in effetti per quello che devo fare io non è neanche necessaria.
Vorrei ridurre la trasmissione a 9600bps ma non ho capito che valori devo mettere nei registri UBR00, UBR10, UMCTL0.
Ho provato ad usare una delle calcolatrici disponibili online per ricavare i valori opportuni, ma i risultati che ottengo sono deludenti (non ricevo più niente di quello che dovrei ricevere).
Aggiungo che all'inzio del codice sono presenti le seguenti istruzioni:
SCFI0 |= FN_4; // x2 DCO frequency, 8MHz nominal
// DCO
SCFQCTL = 91; // 32768 x 2 x (91 + 1) = 6.03 MHz
FLL_CTL0 = DCOPLUS + XCAP10PF; // DCO+ set so freq = xtal x D x (N+1)
Qualcuno potrebbe cortesemente aiutarmi ad abbassare la velocità di trasmissione a 9600bps?
sono disperato
Si prega Accedi o Crea un account a partecipare alla conversazione.
- fortezzadigitale
- Autore della discussione
- Visitatori
12 Anni 1 Settimana fa #2
da Mauro Laurenti
Risposta da Mauro Laurenti al topic Re: Problemi configurazione timer UART
Ciao,
per semplificarti la vita e non dover calcolare il tuo valore usa 4MHz come frequenza di clock per la periferica.
La User Guide riporta per tale valore i valori dei registri per aver 9600bits/s sia che usi l'USCI che eUSCI.
Saluti,
Mauro
per semplificarti la vita e non dover calcolare il tuo valore usa 4MHz come frequenza di clock per la periferica.
La User Guide riporta per tale valore i valori dei registri per aver 9600bits/s sia che usi l'USCI che eUSCI.
Saluti,
Mauro
Ringraziano per il messaggio: fortezzadigitale
Si prega Accedi o Crea un account a partecipare alla conversazione.
- Mauro Laurenti
- Moderator
Riduci
Di più
Moderatori: Mauro Laurenti, Matteo Garia
Registrati al sito
Accedi a tutte le risorse e articoli non visibili pubblicamente, puoi registrarti con pochi passi.