Sari la conținut
ELFORUM - Forumul electronistilor

UART to BUS


Gilbert Sparios

Postări Recomandate

Vreau sa folosesc comunicatia seriala pentru 5 microcontrolere folosind interfata UART. Nu doresc sa folosesc RS485/I2C/wifi sau alta comunicare. Distanta maxima va fi de 20 metri, voi folosi cablu ecranat.

Aplicatia sau protocolul pe care-l voi folosii, va fi unul de genul "strigam catalogul" - "elevul raspunde".

 

Se pare ca UART nu functioneaza ca un BUS, si nu pot conecta mai mult de 1 device. Si atunci ma gandeam sa-l fac cumva BUS.

Aceasta schema am verificat-o si functioneaza. Pe un fir.

 

UART_BUS.thumb.png.33db44149458fd3a8919632cc7a93253.png

 

Sa folosesc aceasta schema sau trebuie mai mult de atat ?..

A. Si inca o chestie. Daca lipsesc rezistenele de PULLUP,  traseul de BUS poate fi si intrerupt. Pe asta n-am inteles-o dar ... mai mult vreau sa stiu daca e ok sa merg pe ideea de mai sus.

Link spre comentariu
Acum 7 ore, Gilbert Sparios a spus:

Aplicatia sau protocolul pe care-l voi folosii, va fi unul de genul "strigam catalogul" - "elevul raspunde".

Adica master - multislave. Sau multimaster - multislave? Nu prea inteleg cati masteri sunt pe magistrala... Pentru mai multi masteri, situatia se complica un pic, pentru ca doi masteri pot intra in coliziune. Dar daca este vorba de catalog, atunci inteleg ca este un singur master, ca doar nu vine la ora intreaga cancelarie sa strige calatogul, nu?

Citat

 

Se pare ca UART nu functioneaza ca un BUS, si nu pot conecta mai mult de 1 device. Si atunci ma gandeam sa-l fac cumva BUS.

 

Ba cam da. UART poate functiona cu cate dispozitive slave vrei. De fapt UART este un bus. Totul sta in implementarea software. Atat ca UART nu este o chestie care sa duca pe o distanta mare. De aceea, pentru distante mari se foloseste un driver. Poate sa arate chiar ca al tau (la nivel ultra-minimal). Cu RS485 (de exemplu) se mareste distanta (si siguranta) transmisiei.

Asa cum arata poza, se pare ca doresti o implementare OneWire. In principiu, pentru ca in realitate este posibil sa arzi canalul RX, conectandu-l direct la 5V. Poate o rezistenta de 10k ar ajuta acolo...

Citat

A. Si inca o chestie. Daca lipsesc rezistenele de PULLUP,  traseul de BUS poate fi si intrerupt. Pe asta n-am inteles-o dar ... mai mult vreau sa stiu daca e ok sa merg pe ideea de mai sus.

Nici eu n-am prea inteles... Daca pui in scurt BUS-ul atunci, intr-adevar, se pune la masa colectorul tranzistorului, dar mai ai si rezistenta de pull-up, care limiteaza curentul. Poate ca la asta se refera...

Daca ar fi sa fac asa ceva, as aborda problema in doua variante.

- cu UART: cand fac transmisia, dispozitivul (master sau slave) isi receptioneaza toate datele trimise, lucru inutil. In cazul asta, cand dispozitivul face transmisia, receptia este dezactivata. Ideea ar fi cam asa: initial masterul are activata transmisia, toate dispozitivele slave, receptia. Apoi, masterul trece pe receptie, iar slave-ul care trebuie sa trimita date trece pe transmisie.

- fara UART: folosesc doar un pin al uC, la transmisie il setez ca iesire, iar la receptie il setez ca intrare. Mai departe, as copia cu nesimtire protocolul de transmisie 1Wire pe care-l folosesc pentru DS1820 si as implementa inca o rutina pentru slave (cea de transmisie pentru master exista). Aici timmingul este crucial.

In orice caz, trebuie implementat un sistem de adrese, fiecare dispozitiv trebuie sa aiba adresa lui.

 

Rezistentele de pull-up fac ca 0L sa fie 5V. Daca se transmite 1L magistrala este trasa jos, la 0V (ma rog, plus caderea de tensiune de pe transistor, in saturatie). Un singur tranzistor face cu brio treaba asta, nu-i nevoie de doi. Partea nasoala, cum o vad eu, este ca pot sa apara paraziti pe magistrala, iar chestia asta duce la erori de comunicatie. De aceea, mi se pare imperios necesar implementarea in plus si a unui mecanism CRC. De asemenea, implementarea unui mecanism de timeout poate sa ajute.

 

Citat

... mai mult vreau sa stiu daca e ok sa merg pe ideea de mai sus.

In principiu, merge orice oricum. Dar va trebui sa reinventezi un pic apa calda. RS485 este larg folosit, se gasesc tone de exemple, merge brici pe master-multislave.

Daca mergi mai departe pe idee, n-ar strica sa mai arunci inca odata ochiul pe datasheet-ul lui DS1820, acolo se explica destul de frumos comunicatia pe un fir. Oricum, tu iti alegi implementarea, este decizia ta, dupa cum vrei sa arate toata treaba. La nivel de hobby, merge si pe un fir. Doar ca ma infioara cand vad pinul RX conectat direct la magistrala aia... Cu riscul de a ma repeta, dar pe cablul ala, chiar si ecranat, pot sa apara o gramada de paraziti. Adica erori cu care va trebui sa te descurci.

Pentru ceva mai de Doamne-ajuta, RS485 ar fi de preferat. Sau ceva WiFi. Standardele in comunicatie sunt o stiinta in sine. Iar multe din ele au la baza UART.

De curiozitate: ce microcontrolere intentionezi sa folosesti?

Oarecum off-topic. Toata lumea fuge, din cate am observat eu, de implementarea comunicatiei pe fir. Daca ai ales sa implementezi o comunicatie pe sarma, atunci nu inteleg de ce nu implementezi RS-485, este ieftin, robust, usor de implementat. Daca ai o sarma deja, doua nu pot sa doara. O implementare poti gasi aici

Link spre comentariu

Trenuletistii care doresc sa conecteze diorama la PC pentru diverse automatizari, au la dispozitie, printre altele, protocolul Loconet. Asta e o adaptare a protocolului RS232 fix ca cea pe care o propui tu, facuta de digitrax si documentata (pentru publicul larg, ca au si o varianta pe bani) in loconet pesonal edition . Cea mai simpla interfata pe care o stiu eu e cu un LM311 si un tranzistor si protejeaza RX de bus.

Loconet chiar se foloseste de faptul ca emitatorul si receptioneaza ce transmite, ca mod de verificare a transmisiei. Si e protocol "fara master", fiecare participant trasmite cand are ceva de zis. Pentru asta protocolul prevede un arbitraj al busului.

Link spre comentariu

nu am probleme cu programarea in sine. problema e fizic si strict legat de comunicatie si distante.

 

Acum 11 ore, kit a spus:

- fara UART: folosesc doar un pin al uC, la transmisie il setez ca iesire, iar la receptie il setez ca intrare.

 

am incercat deja varianta asta, pe un fir, mergea bine dar nu am reusit sa aflu la ce distanta sa ma astept.

Asa ca, m-ar ajuta sa mearga vreo suta de metrii.

 

Azi, beneficiarul (tata) mi-a spus ca poate nu sunt chiar 20m, poate 100m. Ca si cand ..tot metrii sunt. Daca e asa, cred ca nu ma pot gandii ca scap fara RS485. Desi m-ar ajuta enorm sa scap de inca o piesa cu perifericele lui pe pcb.. (tot timpul am problema asta. nu am loc !)

 

Nu e vorba decat ca am luat deja niste cutiute cam prea micute, si nu o sa mai am loc de bagat in ele... Eu am incercat sa pun cap la cap toate firele ce le aveam prin casa, cred ca insumate erau vreo 50m????, nu foarte intinse ca nu aveam atata loc, si mergea uns. Dar eu stiu..nu am unde sa intind 100m de fir sa vad...nu are nimic daca e colac facut ?...

 

Ca idee, oare cat (distanta) ar merge pe varianta asta de struto-camila, pe un pin cum ziceam mai sus ?

M-am gandit sa pun in scurt un capat si sa ma intorc pe celalat ca sa am si mai mult "metraj" dar un amic mi-a spus ar fi totusi mai bine sa nu ma intorc pe acelasi traseu pentru o simulare de lungime.

 

 folosesc Attiny85, Atmega328, si un STM8 in proiect.

 

thumb_20200219_201215.jpg

Editat de Gilbert Sparios
Link spre comentariu
Acum 5 ore, Liviu M a spus:

Trenuletistii care doresc sa conecteze diorama la PC pentru diverse automatizari, au la dispozitie, printre altele, protocolul Loconet. Asta e o adaptare a protocolului RS232 fix ca cea pe care o propui tu, facuta de digitrax si documentata (pentru publicul larg, ca au si o varianta pe bani) in loconet pesonal edition . Cea mai simpla interfata pe care o stiu eu e cu un LM311 si un tranzistor si protejeaza RX de bus.

Loconet chiar se foloseste de faptul ca emitatorul si receptioneaza ce transmite, ca mod de verificare a transmisiei. Si e protocol "fara master", fiecare participant trasmite cand are ceva de zis. Pentru asta protocolul prevede un arbitraj al busului.

 

foarte buna idee. dar pentru proiectul meu ma descurc cu jumate de duplex , si daca s-ar putea fara RS485 macar..

Cea cu AO LM311 nu o stiam. Sau am uitat. Multam.

Editat de Gilbert Sparios
Link spre comentariu

In afara ca as vrea sa stiu o estimare despre lungimea de 100metri in varianta propusa si de colegul @kit, as vrea sa imi dati o parere legata de tensiunea statica aparuta la nivel de cablu exterior. Practic cablul va fi in interior si pozat, nu in aer. Ar trebuii sa ma gandesc la o solutie de prevenire descarcare tensiune statica in INPUT? Legarea ecranului la pamant, ar fi suficient? sau trebuie ceva TVS, Zenner...? 

 

Editat de Gilbert Sparios
Link spre comentariu

pai curent pe TX.. pot sa-i dau cat scoate un uC pe port. undeva la 10mA sigur e. dar cred ca nu am decat sa intind un fir de 100m sa verific daca merge. poate daca îl las colac, sa fie aceasi treaba sau cel puțin mai rau decât întins. ca sa probez.. 

Link spre comentariu

Salut,

 

Acum cativa ani, am reusit sa comunic prin UART full duplex la aproximativ 60 de metri cu un device, folosind un driver RX/TX doar la un capat, langa master. In schimb am redus baud rate-ul la 4800 ca sa  functioneze. Dar asta ramane de stabilit in cazul tau in functie de  fluxul de date pe care  vrei sa-l transmiti.

 

Numai bine,

Vlad

Link spre comentariu

hmm... pana la urma m-am hotarat sa ingramadesc si un MAX485 acolo. Ma cam incurca si cele 6/7 rezistori, dar o scot eu la capat.

Poate ar fi mers si cum spuneam mai sus, direct pe un PIN cu switch intre RX/TX. Am facut teste cu colacii aia si mergea ca uns.

Dar pentru ca nu a incercat nimeni vreodata pe aici sa-mi spuna ca idee ce lungime a reusit, stau si eu cuminte si-l fac cu RS...mai ales ca am si protectie integrata pana la 15KV..e ceva.

Link spre comentariu
Citat

In afara ca as vrea sa stiu o estimare despre lungimea de 100metri in varianta propusa si de colegul @kit

Pai eu n-am propus nici o varianta, am enumerat cateva posibilitati. Daca te referi la lungimea unei magistrale 1Wire, aici poti gasi niste informatii despre asta. Eu personal am mers doar pana in 5 metri cu tipul asta de magistrala, pentru 3xDS1820.

Daca pozezi cablul la 20cm distanta de cablurile de putere, legi mantaua la impamantare, e ok, ma gandesc ca n-o sa ai probleme. Daca probezi cu cablul colac si merge, atunci 100% o sa mearga si cu cablul intins.

RS485 are o amprenta pe PCB de 1,5x1,5 cm, cu tot cu cei 2 rezistori (legati la canalele A si B) plus un cond de 100n. In varianta THT, cu rezistentele rasfirate generos, PCB placat pe o singura parte, fara vias-uri. In varianta SMD iesi si mai bine. Cand am adus vorba de RS485 a fost numai pentru a incerca sa te indrum pe un drum batatorit, care te scuteste de ceva munca.

Citat

Poate ar fi mers si cum spuneam mai sus, direct pe un PIN cu switch intre RX/TX. Am facut teste cu colacii aia si mergea ca uns.

Pe lungimea de 100m? Super! Tinand cont ca nu folosesti senzori legati strict de timming, ci implementezi propriul tau protocol, asta inseamna ca poti lucra un pic la viteza de transmisie, in sensul ca o poti scade daca da rateuri. Implementarea CRC sau macar Checksum te poate ajuta sa detectezi erorile de transmisie.

Citat

Ar trebuii sa ma gandesc la o solutie de prevenire descarcare tensiune statica in INPUT?

Uitandu-ma mai bine, magistrala propusa de tine, la inceput, este pull-up, prin rezistorul ala de 4k7, in plus, daca-i pui in paralel si o dioda spre VCC orice spike se va duce intr-acolo, suntand rezistorul.

Ca un fel de sumar, prin pozare elimini semnificativ parazitii pe linie, te poti juca la timming/baud, nu prea inteleg care-i problema sa mergi mai departe cu implementarea ta, mai ales ca ai probat si functioneaza... Ca doar nu-ti da nimeni peste mana, faci cum vrei.

Eventual ne poti ajuta pe noi prezentand rezolvarea ta.

Spor!

Link spre comentariu
Acum 23 ore, ratza a spus:

TVS ar fi bun acolo. Dacă lungimea e importantă, poţi folosi curent în loc de tensiune, de exemplu 4-20mA.

 Poti sa îmi dai o referinta, model.. pentru un uC cu intrare maxima de 5V? 

Sau ce specificații sunt importante sa "deschidă" la ce tensiune? ar trebuii in paralel si un zener? 

Mulțumesc. 

 

 

In alta ordine de idei, am o grava reținere pe ideea ca pot eu sa va ajut. Dar ce am testat eu a fost ca am folosit un singur pin pentru Rx/Tx, in comutatie, si da pot sa cobor rata se transfer, teste am facut pe 2000. Ar merge pana la 10000, dar mai mult nu pentru un Atmega328, ar fi prea dese acțiunile in timer. Si cum ele vin de fapt pe attiny85 la 8Mhz,am testat pe 2000. Ce am obținut.. a fost ca am avut transmisie curata cu zero erori in CRC. Ca date, am o structura cu 10 x uint32_t, 6 x uint16_t, 20 X uint8_t, plus header plus CRC. Mhm, medie zic eu. De distanta nu stiu, sunt cele 2 colacuri de cablu din foto. cred ca unul mai avea vreo 35m iar cel alb.. nu pot estima..dar sa zic ca vreo 80m erau in Total??..

 

totusi, pinii raman fara protectie esd, si ar trebuii protejați..

 

Am ramas totuși sa pun MAX485 pe pcb. Cu alta ocazie cand nu sunt asa distante voi merge clar astfel. Nu acum totusi. 

Editat de Gilbert Sparios
Link spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum
×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări