Jump to content
PLC Forum


Sign in to follow this  
Giorgio Demurtas

Cosa è L'uart?

Recommended Posts

Giorgio Demurtas

Inizio l'avventura nel mettere in comunicazione un PIC con la RS232 di un PC.

Ho capito che per adattare i livello del segnale TTL del pic (0-5V) a quello della seriale del pc rs232 (+-12V e più) dovrò utilizzare un MAX232.

Ciò che non ho capito è: visto che tutti i piedini di un PIC possono andar bene come TX e RX, perchè nel datasheet ne vengono indicati due in particolare come TX e RX?

Se la comunicazione fosse fra due PIC, potrei tenere tutto 0-5V e non usare il MAX232? ci sono delle limitazioni?

Cosa significa USART/UART?

Significa forse che la trasformazione da parallelo a seriale lo fa l'hardware specifico (uart), invece che il software (come sarebbe utilizzando dei pidini qualunque del pic)?

Share this post


Link to post
Share on other sites

Livio Orsini

1 - Non so che Pic stai usando ma, in genere, son previsti pin particolari per Rx, Tx, etc. Forse stai usando un vecchio pic economico come lo 84 che non ha pin specifici perchè non dispone di USART/UART

2 - USART(UART) ==> è il dispositivo di ricetrasmissione sincrona/asincrona (solo asincrona per UART). In pratica è una parte Hw che ti facilita le operazioni. SI seleziona il clock opportuno per avere il baud rate desiderato; per trasmettere un dato è sufficiente mettere il dato stesso nel buffer di trasmissione, idem per ricevere: basta leggere nel buffer di ricezione. Tramite pollimg o interrupt si può conoscere quando un nuovo dato è presente nel buffer di ricezione e quando quello di trasmisisone è vuoto.

Ovviamente ho ristretto al massimo i concetti. Se leggi il manuale di una CPU PIC di mnedia capacità come, ad esempio, il vecchio F876, c'è un intero capitolo dedicato all'UART ed aglia ltri dispositivi seriali, come SPI e I2C. Ovviamente ci sono porte dedicate a queste funzioni

Share this post


Link to post
Share on other sites
Giorgio Demurtas

Grazie Livio, ho capito il senso del USART. Il pic è un 16F876 e ha una sola USART.

Il compilatore (CCS C) mette a disposizione delle funzioni che rendono l'uso della rs232 (e anche i2c) molto semplice. Nella configurazione della funzione devo indicare quali piedini sono TX e RX.

Se nella configurazione della rs232 indico due piedini che non sono quelli della USART, che succede?

Sicuramente son costretto quanto ho bisogno di due porte seriali.

Nel manuale (http://www.ccsinfo.com/downloads/ccs_c_manual.pdf) a pag 42 c'è qualcosa a riguardo (FORCE_SW) che però non ho ben capito.

Potete darci uno sguardo?

grazie

Share this post


Link to post
Share on other sites
Nikiki

La pagina 42 del PDF risulta vuota senzasperanza.gif

La pagina 42 del documento parla della eeprom.

Ad ogni modo sembra che tu possa forzare il compilatore a generare una routine che crea una seriale di tipo software, da usare con un micro non dotato di UART o da usare con dei PIN non dedicati.

Io l'ho fatto in passato con micro piccoli tipo il 16F84 che non era dotato di UART, ma salvo casi eccezionali ti consiglio di usare la UART interna e quindi i suoi pin dedicati, in questo modo puoi usare l'interrupt.

Se devi far comunicare due PIC tra loro non hai bisogno di convertire in RS232 con il MAX, a meno chè non si trovino a diversi metri di distanza.

Il bus I2C è utile se i dispositivi comunicanti sono più di 2, oppure se usi dei dispositivi (come ad esempio delle eeprom tipo 24Cxx) che usano I2C nativo.

Share this post


Link to post
Share on other sites
Livio Orsini

Leggi la descrizione della direttiva pre compilatore #USE RS232(----), è spiegato chiaramente come si usa con UART o senza UART.

Sul mio manuale non c'è quel FORCE_SW, almeno in ordine alla seriale.

Io, con lo 876/877, ho sempre usato l'UART; rompermi le b---- con altre porte proprio non mi va

Share this post


Link to post
Share on other sites
Giorgio Demurtas

Pardon, è la 142 di 357.

link manuale del compilatore

Syntax:   #use rs232 (options)
Elements: Options are separated by commas and may be:
            STREAM=id                Associates a stream identifier with this RS232 port.
                                     The identifier may then be used in functions like fputc.
            BAUD=x                   Set baud rate to x
                                     NOINIT option:
                                     Use baud=0 to not init the UART and pins C6 and C7
                                     can still be used for input-output functions.
                                     #use rs232(baud=0,options)
                                     To make printf work with NOINIT option, use:
                                     setup_uart(9600);
            XMIT=pin                 Set transmit pin
            RCV=pin                  Set receive pin
            FORCE_SW                 Will generate software serial I/O routines even when
                                     the UART pins are specified.
            BRGH1OK                  Allow bad baud rates on chips that have baud rate
                                     problems.
            ENABLE=pin               The specified pin will be high during transmit. This
                                     may be used to enable 485 transmit.

Dici dell'interrupt perchè diversamente il pic ricevente dovrebbe fare il polling?

Per l'i2c posso connettere direttamente fra loro i piedini (SDA e SCL) dei due (o più) pic?

Share this post


Link to post
Share on other sites
antenore

Giorgio Demurtas+24/01/2010, 10:22--> (Giorgio Demurtas @ 24/01/2010, 10:22)

Si, ricordati anche di inserire due resistenze di pull-up.

Edited by antenore

Share this post


Link to post
Share on other sites
Livio Orsini

Perbacco hai l'ultima versione del manuale. Hai anche l'ultima versione del compilatore? Io son fermo alla 4.023

Certo, se usi l'interrupt ti dimentichi della ricezione. Ti crei un bel buffer della lughezza desiderata (è solo questione di qualche bytes di RAM) e vai a vedere se cis ono nuovi caratteri qaundo hai tempo di CPU.

Piccolo consiglio. Per l'I2C leggiti la specifica di Philips (che è l'inventore di questo bus); la scarichi dal sito di Ph ed è molto illuminante, ti evita un sacco di incomprensioni.

Edited by Livio Orsini

Share this post


Link to post
Share on other sites
Giorgio Demurtas

aaaah smile.gif sto chiarendo un sacco le idee!

Io ho la 4.088 se non ricordo male. Ho linkato il primo manuale che ho trovato sul sito di CCS.

Posso usare le funzioni per l'uso della RS232 su piedini diversi da quelli dell'uart?

Share this post


Link to post
Share on other sites
antenore
Giorgio Demurtas+24/01/2010, 17:53--> (Giorgio Demurtas @ 24/01/2010, 17:53)

Non conosco il ccs, ma ad esempio con le librerie incluse nel compilatore C18 puoi scegliere di utlizzare quella per la gestione seriale "hardware" e quindi sei obbligato ad usare i piedini specifici Tx ed Rx del pic oppure puoi scegliere di usare la libreria seriale con la sola gestione "software" ed allora puoi usare due piedini qualsiasi.

La versione hardware è da preferire per la semplicità di gestione.

Share this post


Link to post
Share on other sites
mf2hd

vedi pag.300 (312 sul reader) del manuale che hai messo in link, viene illustrato l' esempio di 2 seriali usando dei pin non facenti capo allo specifico blocco usart.

Praticamente tutti i compilatori per linguaggi ad alto livello prevedono istruzioni dedicate allo scopo, sia per l' usart che per i pin "generici".

Non conosco il compilatore C che stai usando, ma fai attenzione che spesso la temporizzazione di default per il baudrate e' calcolata in base al valore dell' oscillatore per una determinata frequenza.

Bisogna quindi usare delle istruzioni (es. "Define", ecc.) per informare il compilatore nel caso si utilizzi un clock diverso.

Come scritto da altri, se vuoi usare il micro con una RS232 (pc, apparecchiatura, ecc.) devi adattare i livelli.

La soluzione piu' classica e' quella con il MAX232 (o MAX233) o similari, altrimenti puoi fare tutto con due transistor e qualche resistenza.

Questi sono due esempi trovati tempo fa in rete e che tengo come promemoria:

user posted image

user posted image

Share this post


Link to post
Share on other sites
Livio Orsini

Come ti hanno già scritto altri è possibile, anzi è espressamente previsto. Io però te lo sconsiglio, almeno nella prima applicazione. Fatti "la mano" usando le risorse appositamente previste. Cerca di scoprire tutti quei piccoli inciampi che solitamente si presentano su una cosa nuova poi, quando domini bene il problema, puoi passare ad usare risorse non dedicate.

L'uso di un PC con Hyperterminal, o programma similare, ti facilita molto il debug

Share this post


Link to post
Share on other sites
Giorgio Demurtas

La RS232 che ottengo con quei due schemi sarebbe a livello 5V?

Sul forum del compilatore mi hanno segnalato anche un PIC con due USART: PIC18FxxJ11

Perfetto anche l'esempio del manuale! lo proverò.

Ora è chiaro, se devo fare un bus fra dispositivi da me progettati conviene l'i2c perchè posso usare due pienidi qualunque senza problemi di timing (visto che una linea è di clock).

Oltre al fatto che RS232 è fatta per interconnettere DUE dispositivi, mentre i2c è un bus dove posso mettere tante schede con una sola i2c ciascuna.

Quanto può essere lungo un bus i2c?

Share this post


Link to post
Share on other sites
Nikiki

Dipende dalla velocità di clock che utilizzi, normalmente viene utilizzato nell'ambito dello stesso circuito, ma io stesso l'ho utilizzato per collegare periferiche ad una quindicina di metri senza problemi.

Considera che il bus è tenuto alto da un pull-up da 2,2k quindi la velocità di salita potrebbe non essere rapida con velocità alte e capacità elevate sulle linee SCL SDA.

Se vuoi essere sicuro, una volta cablato il tutto, puoi fare un controllo con un oscilloscopio per vedere se i tempi di salita rientrano negli standard.

Comunque esistono altri tipi di bus per collegamenti distanti e multipunto che sono più indicati di un I2C, tipo una RS485.

Il bus I2C è utilizzato principalmente per far comunicare circuiti integrati che hanno questo bus nativo. Lo scopo principale è quello di utilizzare chip anche di natura diversa collegati con 2 soli fili. Esistono memorie, RTC (orologi/calendari), driver LCD, relè driver... ci sono un'infinità di chip I2C che possono condividere lo stesso bus. Niente ti vieta di usarlo per far comunicare due PIC, ma devi considerare tutto. Una 485 è semplice da realizzare, a livello hardware ti servono solo dei transceiver (tipo il MAX485) con i quali comunichi in TTL e il bus è una semplice coppia twistata.

Oltre ai livelli di tensione, la RS232 ha i segnali invertiti rispetto alla TTL, in condizioni di riposo (stato logico 1) una TTL è alta (+5v) mentre una 232 è a -12 volt.

Il MAX232 oltre ad adattare i livelli in tensione provvede a fare questa inversione.

I circuiti postati sono un'alternativa al MAX232 e si occupano principalmente di invertire ma non di adattare i livelli come fa il MAX, infatti se guardi lo schema, usa dei transistor NPN con emettitore a massa, questo significa che quando in base arriva il segnale TTL alto, il collettore sarà a 0 volt e non -12 come sarebbe una 232. Questa configurazione anche se non perfetta, è funzionante nella quasi totalità dei casi, anche se personalmente non ho mai fatto prove su tratte lunghe ma solo dal circuito al PC (pochi centimetri di filo).

Io la uso sempre, raramente ricorro al MAX.

Share this post


Link to post
Share on other sites
Giorgio Demurtas

Volendo fare una RS485 (perciò un bus con tanti dispositivi) da cosa devo partire con il PIC a livello hardware?

Sento spesso nominare adattatori 232/485, ma siccome 232 non è un protocollo per sisitemi a bus bensì punto-punto, credo di non poter partire da una RS232. huh.gif (e da i2c?)

Delucidazioni sulla RS485 please tongue.gif

Share this post


Link to post
Share on other sites
Giorgio Demurtas

Volendo fare una RS485 (perciò un bus con tanti dispositivi) da cosa devo partire con il PIC a livello hardware?

Sento spesso nominare adattatori 232/485, ma siccome 232 non è un protocollo per sisitemi a bus bensì punto-punto, credo di non poter partire da una RS232. huh.gif (e da i2c?)

Delucidazioni sulla RS485 please tongue.gif

Share this post


Link to post
Share on other sites
Nikiki

Prima di tutto devi fare una distinzione tra l'aspetto fisico e quello logico.

la 232 e la 485 possono essere simili a livello logico (se non si usano le linee per il controllo di flusso hardware), e quindi ci possono transitare gli stessi dati.

Sono diverse nell'aspetto fisico.

Cominciamo dall'aspetto fisico:

La 232 trasmette su 1 filo (TXD o TD), e riceve su un altro (RXD o RD), ha dei livelli teoricamente da +12v (livello logico 0) a -12v (livello logico 1). sono tensioni teoriche perchè se misuri una RS232 difficilmente trovi 12 volt, ma non è importante. I segnali della 232 sono riferiti a massa.

La 485 trasmette su due fili, ha dei livelli da 0 a 5 volt (alcuni transceiver possono essere alimentati a 12 volt e hanno livelli 0-12 v) ma la differenza sostanziale è che non è riferita a massa ma lavora in modo differenziale, i due fili sono sfasati tra loro. Il TX applica un livello alto sul filo A e un livello basso sul filo B quando l'ingresso dati è alto (livello logico 1), viceversa quando l'ingresso dati è basso. Il ricevitore interpreta il livello logico quando la differenza tra il filo A e il filo B è maggiore di 200 mV (non è detto che sia uguale per tutti i transceiver) se è più alto A sarà un livello logico 1, altrimenti sarà un livello logico 0.

La 232 è sempre in presa, nel senso che dal TX esce sempre tensione, inoltre la ricezione è affidata ad un altro pin (RXD), questo fa si che la comunicazione possa avvenire solo tra 2 dispositivi (TXD del disp. A collegato al RXD del disp. B e viceversa).

La 485 condivide le linee sia per la trasmissione che per la ricezione, e il transceiver fa presa sul bus solo quando il segnale "enable" è alto, mentre quando è basso il transceiver è come scollegato dal bus. Questo fa si che si possano collegare più dispositivi in parallelo.

Lo standard RS485 dice che si possono collegare massimo 32 dispositivi, ma usando transceiver che caricano meno il bus in realtà se ne possono collegare molti di più.

Entrambi i tipi di bus non sono vincolati da un protocollo (come è invece il CAN) il trasporto dei dati è trasparente, nel senso che quando applichi un livello logico 1 al TX, l'RX (o gli RX nel caso di 485) ti daranno in uscita un livello logico 1, e viceversa per il livello logico 0. Quindi puoi usare il protocollo che ti pare, anche uno fatto da te. Anche nel 485 puoi usare lo stesso modo di trasporto della 232, 1 bit di start, x bit di dati, 1 bit di stop, con o senza parità, quindi puoi usare a tutti gli effetti una libreria fatta per la trasmissione su 232. A livello di protocollo invece, se vuoi usare più dispositivi sul bus devi fare in modo di impacchettare i frame in modo da contenere almeno l'indirizzo del destinatario del messaggio, altrimenti un dispositivo non saprà quando il messaggio è diretto a lui, inoltre se più dispositivi sono master (che prendono l'iniziativa a trasmettere) dovrai gestire i conflitti, nel caso in cui 2 o più dispositivi trasmettino contemporaneamente.

Per un bus 485 hai bisogno di usare dei transceiver che colleghi direttamente al PIC, esattamente come faresti con un max232 per una RS232, sono dei piccoli integrati molto comuni, puoi trovare un datasheet qui.

E questa è anche la risposta alla tua prima domanda, a livello hardware ti servono solo questi transceiver.

I2C trova applicazioni diverse, ti consiglio di usarla solo nell'ambito della stessa scheda e solo per collegare dei dispositivi I2C nativi, come ad esempio questa memoria eeprom.

Ho cercato di usare un linguaggio semplice spero di essere stato sufficientemente chiaro. smile.gif

Share this post


Link to post
Share on other sites
Giorgio Demurtas

Grazie, ho capito tutto (ovviamente quando mi metterò a far le prove capirò di non aver capito biggrin.gif ).

A questo punto si potrebbe trasfomare la discussione in una "guida base sulle interfacce di comunicazione seriali (#usart, #rs232, #rs485, #i2c, #can, ...)" e inserirla nella sezione "didattica" del forum.

Per me è stato molto utile e non ho trovato niente di simile (conciso, pratico e chiaro) in rete.

Share this post


Link to post
Share on other sites
decoccio

salve a tutti leggendo questa interessantissima discussione anche se un po datata mi è venuto in mente uno schema di un tv lcd della samsung dove ce nella parte: Software Upgrade la nota per aggiornare il firmware: 1. Installthe Flash Downloader

ConnectSet(Service Jack)and Jig Cable to execute Program Update.

2. Flash Downloader program update

-Before Turning on the set,Click "connect"which is under of OSD Screen!

-Turn on the Set.

e poi guardando le spiegazioni dei vari ingressi poi vedo l'ingresso siglato come service e accanto la scritta:UART MAX 232. adesso mi chiedevo se costruendo un adattatore pc seriale con uscita max 232 fosse possibile aggiornare i firmware dei vari tv in questo caso il samsung ovviamente resta sottointeso avendo a disposizione l'adeguato software.

Share this post


Link to post
Share on other sites
Livio Orsini

Se il PC ha un'uscita seriale, la porta è sempre una RS232, quindi non hai bisogno di adattatori.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...