Multinode USART?
Multinode USART?
Jag sitter och funderar på en grej och behöver kunna snacka med datorer och mikrokontroller (antagligen av lite olika typ).
Eftersom USART finns i nästan alla µC och här hyffsat lätt att få en PC att snacka (USB>RS232) så tycker jag att det är jättebra i grunden.
Men jag behöver multinode där alla noder ska kunna initiera paket som ska kunna skickas till en, flera eller alla enheter.
Så jag tänkte göra ett mjukvaruprotokoll som snackar över USART. Varje meddelande ska då initieras med ett meddelande till alla att "nu sänder jag" så att det inte krockar någon trafik. Sen skickar man id på alla noder som ska ha meddelandet, följt av själva meddelandet och kontrollsumma. Sist så avslutar man med "klar" så att andra kan gå in och sända, om det inte kommer något klar inom en viss tid så antar man att enheten som sände krasha eller något annat och att det är fritt fram att sända ändå.
Skulle det funka? Jag tänker om USART är tillräckligt snabbt för att alla ska få det första meddelandet och därmed inte sända något?
Man skulle även behöva ansluta allas RX/TX linor för att alla ska kunna höra och prata med alla. Kan det ge problem i en krets som sänder eller tar emot att det kommer data på den andra pinnen också?
Varför just USART?
Det finns hos "alla", är snabbt och funkar över längre avstånd. Dessutom är det oftast väldigt lätt att använda.
Eftersom USART finns i nästan alla µC och här hyffsat lätt att få en PC att snacka (USB>RS232) så tycker jag att det är jättebra i grunden.
Men jag behöver multinode där alla noder ska kunna initiera paket som ska kunna skickas till en, flera eller alla enheter.
Så jag tänkte göra ett mjukvaruprotokoll som snackar över USART. Varje meddelande ska då initieras med ett meddelande till alla att "nu sänder jag" så att det inte krockar någon trafik. Sen skickar man id på alla noder som ska ha meddelandet, följt av själva meddelandet och kontrollsumma. Sist så avslutar man med "klar" så att andra kan gå in och sända, om det inte kommer något klar inom en viss tid så antar man att enheten som sände krasha eller något annat och att det är fritt fram att sända ändå.
Skulle det funka? Jag tänker om USART är tillräckligt snabbt för att alla ska få det första meddelandet och därmed inte sända något?
Man skulle även behöva ansluta allas RX/TX linor för att alla ska kunna höra och prata med alla. Kan det ge problem i en krets som sänder eller tar emot att det kommer data på den andra pinnen också?
Varför just USART?
Det finns hos "alla", är snabbt och funkar över längre avstånd. Dessutom är det oftast väldigt lätt att använda.
Re: Multinode USART?
Kika på CMSA/CD kollisionshantering i Ethernet. Med dom förutsättningar du nämner så får du skicka teckensekvens och invänta svar på att det kom fram.
Alternativt så kör du bit-bang och kollar att linjen följer önskat nivåläge dvs "0" eller "1". Om man skickar "0" på linjen men läser "1" så vet man att det bara är att börja om efter att man väntat ut den andre.
Så det är helt enkelt en fråga om du vill lägga lite insats på att få det bra eller köra på det-funkar-nu-iaf.
Alternativt så kör du bit-bang och kollar att linjen följer önskat nivåläge dvs "0" eller "1". Om man skickar "0" på linjen men läser "1" så vet man att det bara är att börja om efter att man väntat ut den andre.
Så det är helt enkelt en fråga om du vill lägga lite insats på att få det bra eller köra på det-funkar-nu-iaf.
Re: Multinode USART?
CMSA/CD får jag kolla lite djupare på men det som stod på Wikipedia lät bra iaf.
Jag vill att det ska funka utan strul så jag lägger gärna lite tid på det och undviker helst bit-bang lösningar.
Tiden tills jag gör något mer seriöst med det är nog rätt lång så jag har ingen tidspress mer än min egen önskan om att det ska bli klart.
Jag har även tänkt på att man kan ha en lina som man drar hög när man vill sända något, då är det bara att läsa av den och är den låg är det bara att dra den hög och sända, är den hög är det bara att vänta tills den blir låg. Det känns enkelt men känns inte helt seriöst och frågan är hur det funkar på avstånd så jag undviker helst det även om det är bättre än bit-bang eller något system som bygger på gissningar.
Avståndet som jag snackar om är jag inte helt säker på själv. Desto längre desto bättre
Det ska minst funka att dra runt nätverket i ett hus så en 50m kanske? gärna runt 100m dock.
Hastigheten är inte jätteviktigt då meddelandena huvudsakligen kommer vara små, kanske runt 10-20Byte i vanliga fall, med ska kunna vara hur stora som helst. Det enda som stoppar är om kollisionshanteringen eller kontrollsumman kommer ställa några krav på storleken eller tiden.
Mer viktig är responstiden, ett normalt meddelande ska kunna överföras och få ett svar utan att användaren tycker att det tar lång tid. (Användaren är alltså en människa, runt 1sek brukar kännas segt så runt 0.1sek är att föredra)
Nätverket kommer inte har speciellt hög belastning utan kommer för det mesta vara tomt. Ibland kan dock två eller tre noder få för sig att skicka ett eller flera meddelanden ungefär samtidigt (samtidigt för en människa, inte för en µC). I teorin kan självklart många flera vilja skicka samtidigt men det är högst otroligt.
Så nu slipper jag få några av de obligatoriska frågorna iaf.
Jag vill att det ska funka utan strul så jag lägger gärna lite tid på det och undviker helst bit-bang lösningar.
Tiden tills jag gör något mer seriöst med det är nog rätt lång så jag har ingen tidspress mer än min egen önskan om att det ska bli klart.
Jag har även tänkt på att man kan ha en lina som man drar hög när man vill sända något, då är det bara att läsa av den och är den låg är det bara att dra den hög och sända, är den hög är det bara att vänta tills den blir låg. Det känns enkelt men känns inte helt seriöst och frågan är hur det funkar på avstånd så jag undviker helst det även om det är bättre än bit-bang eller något system som bygger på gissningar.
Avståndet som jag snackar om är jag inte helt säker på själv. Desto längre desto bättre
Det ska minst funka att dra runt nätverket i ett hus så en 50m kanske? gärna runt 100m dock.
Hastigheten är inte jätteviktigt då meddelandena huvudsakligen kommer vara små, kanske runt 10-20Byte i vanliga fall, med ska kunna vara hur stora som helst. Det enda som stoppar är om kollisionshanteringen eller kontrollsumman kommer ställa några krav på storleken eller tiden.
Mer viktig är responstiden, ett normalt meddelande ska kunna överföras och få ett svar utan att användaren tycker att det tar lång tid. (Användaren är alltså en människa, runt 1sek brukar kännas segt så runt 0.1sek är att föredra)
Nätverket kommer inte har speciellt hög belastning utan kommer för det mesta vara tomt. Ibland kan dock två eller tre noder få för sig att skicka ett eller flera meddelanden ungefär samtidigt (samtidigt för en människa, inte för en µC). I teorin kan självklart många flera vilja skicka samtidigt men det är högst otroligt.
Så nu slipper jag få några av de obligatoriska frågorna iaf.
Re: Multinode USART?
Använder du USART så blir det svårt att kolla linjen mot kollisioner. Med mindre du kör någon XOR på TX och linje återkopplat till interrupt-on-change.
Annars köp en MCU som har CAN inbyggt, så är problemen nästan lösta.
Annars köp en MCU som har CAN inbyggt, så är problemen nästan lösta.
Re: Multinode USART?
Koppla RXD linjen till en extra I/O pin (om du inte kan läsa pinstatus direkt från RXD). Så användar du den för att blockera sändningar om någon annan börjat sända (startbiten syns). CSMA/CD.
Det är fortfarande möjligt (men ytterst osannolikt) att två börjar sända exakt samtidigt. Det märkar du om du lyssnar på dina egna sändningar. Blir det felmismatch, vet du att det blev kollision. Vänta då en random tid och skicka igen. CSMA/CD.
Det är fortfarande möjligt (men ytterst osannolikt) att två börjar sända exakt samtidigt. Det märkar du om du lyssnar på dina egna sändningar. Blir det felmismatch, vet du att det blev kollision. Vänta då en random tid och skicka igen. CSMA/CD.
Re: Multinode USART?
Hur ska man lyssna på sina egna sändningar om man använder UART?
Kräver intelligent jämförelse mellan TX-ut och linjennivån.
Kräver intelligent jämförelse mellan TX-ut och linjennivån.
Re: Multinode USART?
Det tillkommer problemet att koppla ihop fler RS232-enheter! Man kan inte bara koppla ihop alla TX och peta dom in i masterns RX!
Detta är orsaken till att det finns RS485 (& RS422), då sänder master en förfrågan till en slav som då känner igen sin adress och svarar. Det finns USB-dongels för detta och det finns RS232 <-> RS485 omvandlare att köpa.
Att göra ett multi-master nät med RS485 är möjligt också men ska man göra det bra är CAN en möjlighet. Det fungerar i övrigt fint med RS485 nät.
Detta är orsaken till att det finns RS485 (& RS422), då sänder master en förfrågan till en slav som då känner igen sin adress och svarar. Det finns USB-dongels för detta och det finns RS232 <-> RS485 omvandlare att köpa.
Att göra ett multi-master nät med RS485 är möjligt också men ska man göra det bra är CAN en möjlighet. Det fungerar i övrigt fint med RS485 nät.
Re: Multinode USART?
Tänkte att det var underförstått.. 
Men rent elektriskt finns i stort sett två möjligheter:
* Öppen kollektor
* EIA-485 differentiellt
Förvänta dig en hastighet på ca 500 kbit/s och 50 meter.
Men rent elektriskt finns i stort sett två möjligheter:
* Öppen kollektor
* EIA-485 differentiellt
Förvänta dig en hastighet på ca 500 kbit/s och 50 meter.
Re: Multinode USART?
Jag är nöjd med 10kbit/s. Med ett meddelande på 20B skulle det ta 2ms att överföra meddelandet om vi struntar i responstid.
Att jag nämnde snabbt i första inlägget var mest jämfört med trådlöst som också har varit (och fortfarande är) med i planen och då med hänseende på responstid. Jag borde kanske inte ha nämnt det, det skapar bara extra förvirring.
Jag vill kunna använda mig av mikrokontrollers inbyggda USART modul, det är egentligen det enda jag vet. Hur det ser ut elektriskt är mindre intressant, men jag vill helst ha max en krets med ganska lågt antal kringkomponenter för att kunna få ner storleken på noderna.
Jag vet att CAN finns och det skulle egentligen vara nästan perfekt. Det är ju lite av CANs egenskaper jag vill återskapa i mjukvara.
Anledningen till att jag inte kör CAN är att det finns i för få mikrokontroller och är besvärligare med PC.
Att alla kan initiera kommunikation är ett krav så ingen polling med master/slave eller liknande.
Att jag nämnde snabbt i första inlägget var mest jämfört med trådlöst som också har varit (och fortfarande är) med i planen och då med hänseende på responstid. Jag borde kanske inte ha nämnt det, det skapar bara extra förvirring.
Jag vill kunna använda mig av mikrokontrollers inbyggda USART modul, det är egentligen det enda jag vet. Hur det ser ut elektriskt är mindre intressant, men jag vill helst ha max en krets med ganska lågt antal kringkomponenter för att kunna få ner storleken på noderna.
Jag vet att CAN finns och det skulle egentligen vara nästan perfekt. Det är ju lite av CANs egenskaper jag vill återskapa i mjukvara.
Anledningen till att jag inte kör CAN är att det finns i för få mikrokontroller och är besvärligare med PC.
Att alla kan initiera kommunikation är ett krav så ingen polling med master/slave eller liknande.
Re: Multinode USART?
Borde väl gå att göra en LIN-buss multimaster om man tänker till lite? En simpel transceiver och det går att implementera med en uart.
Re: Multinode USART?
Nu är det ju en fråga för vilken sorts kommunikation som det rör sig om. Om en enhet vill skicka till en annan enhet kan man ju köra med data/ACK så att varje sändande enhet vet att data kom fram OK: A skickar xx till B, B svarar A med ACK och allt är klart.
Då kan man ganska enkelt lägga in omsändning osv.
Men om data däremot bara skicka ut och då får intressenter själv ta dom om de vill blir det lite mer krångligt, då måste sändaren lyssna på vad den själv sänder och jämföra. Detta går dock också skapligt men då ska man ha en drivkrets med en RS422 mottagare och sändare var för sig, då kan man ha mottagaren aktiv alltid och bara slå på sändaren vid behov.
Detta kan enkelt göras med en vanlig RS485-krets så det är inget magisk i det. Har man Capture-pinnen och en timer till övers kan man sätta den till att fånga alla startbit som kommer in till mottagaren, då vet man om det redan är en transmission på gång som man inte ska lägga sig i.
Då kan man ganska enkelt lägga in omsändning osv.
Men om data däremot bara skicka ut och då får intressenter själv ta dom om de vill blir det lite mer krångligt, då måste sändaren lyssna på vad den själv sänder och jämföra. Detta går dock också skapligt men då ska man ha en drivkrets med en RS422 mottagare och sändare var för sig, då kan man ha mottagaren aktiv alltid och bara slå på sändaren vid behov.
Detta kan enkelt göras med en vanlig RS485-krets så det är inget magisk i det. Har man Capture-pinnen och en timer till övers kan man sätta den till att fånga alla startbit som kommer in till mottagaren, då vet man om det redan är en transmission på gång som man inte ska lägga sig i.
Re: Multinode USART?
Ursäkta att det fattas info. Saker som känns självklara i huvudet hamnar sällan med eftersom de är självklara (för mig, ni kan ju omöjligen veta vad jag tänkt)
Dessutom är inte allt självklart utan vissa saker funderar jag fortfarande på.
Alla meddelanden sak ha minst ett svar. Om A skickar till B ska B svara att den korrekt har mottagit meddelandet (CRC check och sånt).
Om ett meddelande skickas till flera enheter ska de svara med en viss fördröjning mellan varandra:
Ett meddelandet kommer se ut något liknande ID1,ID2,ID3;DATA. Då ska ID1 svara först, och efter en stund ID2 och till sist ID3. Exakta fördröjningen bestämmer jag senare. Om jag kommer använda mig av någon teknik som "låser" nätet (tex. med låsmeddelanden, en tråd för det eller något annat) så är det först efter att alla har svarat som nätet kommer "låsas upp". Om jag använder mig av en teknik som automatiskt känner av om det går data antar jag att det kan slinka in något annat meddelande emellan vilket kanske inte är jättebra, men det går väl att trimma med olika långa delay och olika lång tid som nätet måste vara tomt för att få börja skicka.
När en enhet kopplas in kommer den be om ett ID vilket en nod kommer få ansvara för. Då får den ett exklusivt ID som sparas på nått sätt. Om man skickar ett meddelande till ett ID som inte finns (ie. inte är registrerat hos noden som är ansvarig för detta) ska den svara med att IDt inte finns så att man slipper försöka skicka om ett meddelande flera gånger i onödan.
RS422 eller RS485 borde väll gå att interfacea med UART modulen på en µC med lämplig krets emellan? För visst funkar de hyffsat lika på det planet?
Dessutom är inte allt självklart utan vissa saker funderar jag fortfarande på.
Alla meddelanden sak ha minst ett svar. Om A skickar till B ska B svara att den korrekt har mottagit meddelandet (CRC check och sånt).
Om ett meddelande skickas till flera enheter ska de svara med en viss fördröjning mellan varandra:
Ett meddelandet kommer se ut något liknande ID1,ID2,ID3;DATA. Då ska ID1 svara först, och efter en stund ID2 och till sist ID3. Exakta fördröjningen bestämmer jag senare. Om jag kommer använda mig av någon teknik som "låser" nätet (tex. med låsmeddelanden, en tråd för det eller något annat) så är det först efter att alla har svarat som nätet kommer "låsas upp". Om jag använder mig av en teknik som automatiskt känner av om det går data antar jag att det kan slinka in något annat meddelande emellan vilket kanske inte är jättebra, men det går väl att trimma med olika långa delay och olika lång tid som nätet måste vara tomt för att få börja skicka.
När en enhet kopplas in kommer den be om ett ID vilket en nod kommer få ansvara för. Då får den ett exklusivt ID som sparas på nått sätt. Om man skickar ett meddelande till ett ID som inte finns (ie. inte är registrerat hos noden som är ansvarig för detta) ska den svara med att IDt inte finns så att man slipper försöka skicka om ett meddelande flera gånger i onödan.
RS422 eller RS485 borde väll gå att interfacea med UART modulen på en µC med lämplig krets emellan? För visst funkar de hyffsat lika på det planet?
Re: Multinode USART?
Om du använder en MAX485 (eller den billigare SP485) är det bara att koppla till UART'en direkt. Du behöver ytterligare en pinna för att styra sändaren av eller på.
Re: Multinode USART?
Snackas det inte lite äpplen och päron här?
Nån nämner UART, men TS har skrivit USART.
Det är stor skillnad på synkron och asynkron kommunikation. Ethernet jobbar med synkron kommunikation så det är inte helt osannolikt att det går att mer eller mindre planka Ethernet rakt av fast med lägre hastighet.
Och gamla ethernet (med koax) hade ju alla noder inkopplade på samma kabel utan konstigheter.
Nån nämner UART, men TS har skrivit USART.
Det är stor skillnad på synkron och asynkron kommunikation. Ethernet jobbar med synkron kommunikation så det är inte helt osannolikt att det går att mer eller mindre planka Ethernet rakt av fast med lägre hastighet.
Och gamla ethernet (med koax) hade ju alla noder inkopplade på samma kabel utan konstigheter.
Re: Multinode USART?
UART verkar enklast. Annars krockar ju klockorna också, om inte en viss nod ska vara master.
Du borde ha balanserad överföring med dominant nolla (alltså open-collector på utgången och pull-up). Förutom att du tar emot och sänder med den inbyggda UART-enheten, läser du av RX-pinnen precis innan du börjar en sändning. På så vis minskar antalet krockar markant. Lägg sedan till en slumpvist vald fördröjning innan en ny nod börjar prata, så minskar antalet krockar ännu mer. Skulle två noder ändå starta samma mikrosekund så ser de sändande noderna på ekot (rx-och tx går ju på samma balanserade linor) om den mottagna datan är densamma som den som sändes ut.
Ett mer intelligent system slutar ju sända i samma ögonblick som en enda bit blir fel, men inbyggda UART brukar ju tuffa på tills en hel byte är klar. Egentligen spelar det väl en mindre roll, då det inte uppstår någon kortslutning. Om den första byten innehåller sändarens adress så kommer minst en av dem att upptäcka krocken och avsluta.
EDIT: MCP2551 är en CAN-tranceiver som antagligen gör vad du vill ha. Ett problem med den är att den har en max-tid för utgående nolla. Om TX är kontinuerligt nolla för länge så stängs sändaren av. Detta för att en nod inte ska kunna blockera linjen om det blir något fel på den. Om du kör UART så kommer ju stoppbiten efter nio bitar - "The drivers are disabled if TXD is Low for more than 1.25 ms (minimum)." Du måste alltså köra fortare än 7200 BAUD vilket du antagligen ändå hade tänkt göra.
Du borde ha balanserad överföring med dominant nolla (alltså open-collector på utgången och pull-up). Förutom att du tar emot och sänder med den inbyggda UART-enheten, läser du av RX-pinnen precis innan du börjar en sändning. På så vis minskar antalet krockar markant. Lägg sedan till en slumpvist vald fördröjning innan en ny nod börjar prata, så minskar antalet krockar ännu mer. Skulle två noder ändå starta samma mikrosekund så ser de sändande noderna på ekot (rx-och tx går ju på samma balanserade linor) om den mottagna datan är densamma som den som sändes ut.
Ett mer intelligent system slutar ju sända i samma ögonblick som en enda bit blir fel, men inbyggda UART brukar ju tuffa på tills en hel byte är klar. Egentligen spelar det väl en mindre roll, då det inte uppstår någon kortslutning. Om den första byten innehåller sändarens adress så kommer minst en av dem att upptäcka krocken och avsluta.
EDIT: MCP2551 är en CAN-tranceiver som antagligen gör vad du vill ha. Ett problem med den är att den har en max-tid för utgående nolla. Om TX är kontinuerligt nolla för länge så stängs sändaren av. Detta för att en nod inte ska kunna blockera linjen om det blir något fel på den. Om du kör UART så kommer ju stoppbiten efter nio bitar - "The drivers are disabled if TXD is Low for more than 1.25 ms (minimum)." Du måste alltså köra fortare än 7200 BAUD vilket du antagligen ändå hade tänkt göra.
Senast redigerad av jesse 7 januari 2012, 15:36:48, redigerad totalt 1 gång.
