Non ho UART sul mio microcontrollore, quindi come posso aggiungerne uno?


13

Sto usando un microcontrollore ATMEGA32HVB che ha una funzione per il bilanciamento delle celle con cui possiamo collegare 4 batterie in serie e usarne una alla volta. Questo è molto utile per la gestione dell'alimentazione, quindi non posso usare un microcontrollore diverso. Si prega di suggerire alcuni metodi per aggiungere un UART ad esso in modo che io possa facilmente interfacciarsi a dispositivi seriali.


11
Il modo UART del software come descritto dall'utente26129 si chiama bit banging .
Johan.A

4
Solo i miei $ 0,02 molto soggettivi, ma di solito preferirei un controller della batteria dedicato separato e UART integrato nell'UC invece del contrario. Perché è necessaria la gestione della batteria integrata nell'UC?
Mel

Devo usare batterie ricaricabili che verranno ricaricate utilizzando un pannello solare, quindi ho bisogno di 4 battaglie in serie che verranno utilizzate una alla volta
user27475

4
Una domanda è quanto vuoi usare l'UART e in quali direzioni. Se vuoi solo generare un messaggio di stato o di debug occasionale, in un momento in cui il tuo processore non ha molta richiesta aggiuntiva, l'output seriale di bit bang può sembrare molto attraente. Ci sono segni di spunta come l'uso di interruzioni di cambio pin che possono ridurre il carico medio di avere anche un canale di input, ma se ti aspetti di ricevere caratteri con un baud rate elevato in un momento in cui hai altri impegni in tempo reale, potrebbe essere un problema.
Chris Stratton,

Risposte:


17

Come altri hanno già notato, è possibile aggiungere hardware aggiuntivo al sistema per fornire la funzionalità UART oppure emularne uno nel software. Se hai il controllo dell'intero design dell'hardware e l'aggiunta di un altro IC è un'opzione, prenderei fortemente in considerazione l'approccio basato sull'hardware. Puoi sicuramente far funzionare un software UART usando il bit banging , ma potresti non voler dedicare le risorse della CPU alla generazione del timing richiesto.

Da uno sguardo al foglio dati, sembra che il tuo microcontrollore abbia sia SPI che I2C (che Atmel chiama un'interfaccia a due fili (TWI)). Queste sarebbero probabilmente le migliori interfacce da utilizzare per collegare un UART esterno. Detti dispositivi sono disponibili presso numerosi produttori. Qualche esempio:

  • Exar ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) ha una linea di dispositivi UART SPI / I2C a 1 e 2 canali disponibili, che copre il ~ 1.6- Intervallo operativo 3.3V. Non ho usato nessuna di queste parti in particolare, ma in passato ho usato i dispositivi Exar (con interfacce bus di memoria parallele) e hanno funzionato bene.

  • NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ) ha una linea di dispositivi SPI / I2C UART / IrDA / GPIO disponibili, anche in 1- e 2 varietà a canale su un paio di intervalli di tensione. Ho usato queste parti (in particolare SC16IS762) ampiamente in passato con grande successo.

  • Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ) dispone dei dispositivi MAX3110E e MAX3111E, che sono UART collegati a SPI. Una caratteristica unica di questi dispositivi è che hanno un driver di linea RS-232 integrato. Quindi, se hai bisogno del tuo UART per interfacciarsi a un dispositivo che utilizza tensioni di linea RS-232 anziché livelli logici (ad esempio un PC), questo potrebbe essere utile, poiché ti salverà dall'aggiunta di un altro IC del driver di linea alla tua scheda.


Wow, non sapevo che Maxim avesse quegli oggetti, farei +2 se potessi.
Tevo D,


8

Sarà necessario utilizzare un driver UART software. A seconda esattamente di cosa ci si aspetta da questo UART, è possibile utilizzare AVR305 (estremamente compatto, ma nessuna funzionalità oltre al blocco dell'invio / ricezione half-duplex), AVR274 (interruzione guidata, funzione abbastanza completa), è possibile scrivere il proprio driver UART software o puoi usarne uno che trovi su Internet, ad esempio cercando su google "avr software uart"


3

Una breve nota sulla progettazione del software "UART": esistono almeno approcci qualitativamente diversi, a seconda delle esigenze:

  • Un driver bit-bang "take over everything" disabiliterà tutti gli interrupt e utilizzerà il codice conteggio dei cicli per sincronizzare ogni bit. La ricezione di dati con un driver "take over everything" richiede che quando arrivano i dati il ​​controller non stia facendo altro che aspettarlo.

  • Un driver bit-bang "take over main loop" si comporterà in modo simile a quanto sopra, tranne per il fatto che utilizzerà una risorsa timer per i tempi dei bit anziché il conteggio dei cicli. Gli interrupt che non richiedono troppo tempo per il servizio possono essere lasciati abilitati. Per la trasmissione seriale, la risorsa timer a velocità fissa può essere condivisa con altri scopi; per la ricezione seriale, tuttavia, il driver bit-bang dovrà essere in grado di ricaricare il timer quando arriva il bit di inizio in modo da farlo scadere nel mezzo di ogni tempo di bit in arrivo.

  • Un driver bit-bang completamente guidato da interruzioni utilizza un timer a velocità fissa che funziona preferibilmente con un multiplo della velocità di trasmissione dei dati (3x e 5x sono entrambi migliori di 4x) e fa tutto attraverso quel timer. Tale driver può essere eseguito contemporaneamente a tutto il resto, ma richiederà una CPU più veloce di quanto richiederebbero i tipi di driver precedenti.

Per evitare che i primi due stili del controller aspettino per sempre i dati che potrebbero non arrivare mai, è comune che le routine di lettura includano un valore di timeout. Nota che se un loop di un controller ad esempio "ottiene un byte mentre aspetta fino a 100ms per esso, fai qualche altra cosa se non ne viene, quindi ottieni il byte successivo, ecc." e un byte arriva tra il tempo di timeout della routine "get" e il controller ricomincia ad aspettare, quel byte andrà perso; il dispositivo con cui sta comunicando dovrà aspettarsi tale possibilità.

Solo il terzo stile di driver sarà in grado di gestire la possibilità che un byte di dati inizi ad arrivare mentre viene trasmesso un byte di dati. I primi due stili possono tuttavia essere utilizzati per alcuni protocolli di comunicazione full-duplex a piena velocità se il controller deve parlare solo quando si parla. Il trucco è avere una routine di "lettura e scrittura dei dati" che attenderà un bit di avvio in arrivo, e quando uno viene rilevato si sovrappongono una lettura e una scrittura in modo tale che il controller invii ogni bit proprio mentre sta per esaminare i dati in arrivo. Una volta che il controller rileva il bit di avvio in ingresso, saprà esattamente quando dovrà cercare i successivi 8 bit di dati e arrestare il bit, e quindi saprà che può utilizzare in modo sicuro il tempo tra l'output dei propri dati.

Una nota di separazione: un controller che utilizza uno dei primi due stili di bit-bang uart per ricevere i dati deve elaborare ogni byte di dati prima del fronte di discesa del bit di inizio del byte successivo per evitare la perdita di dati. Se il controller sa che l'elaborazione richiederà almeno la metà del tempo, può massimizzare il tempo disponibile per l'elaborazione accettando ogni byte non appena ha acquisito l'ultimo bit di dati, anziché attendere il bit di stop. Come ulteriore mezzo per dare più tempo al controller, può essere utile che il dispositivo che gli sta trasmettendo i dati venga trasmesso con due bit di stop anziché uno. Se è possibile configurare "contrassegna parità", ciò aggiungerà un altro tempo in più. La trasmissione ad es. 115200-8-M-2 consentirà un tempo di elaborazione maggiore rispetto a 57600-8-N-1, anche se fornirà i dati più di 1,6 volte più velocemente.


1

Puoi semplicemente usare il pin I / O di uC. L'unica cosa quando si scambiano o si trasferiscono dati su questi pin si dovrebbe avere una frequenza dei pin doppia rispetto alla velocità di trasmissione. Ecco come funziona normalmente UART, campionerà il segnale bit nel mezzo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.