Seriell överföring med endast en tråd?
- Klas-Kenny
- Inlägg: 11843
- Blev medlem: 17 maj 2010, 19:06:14
- Ort: Växjö/Alvesta
Seriell överföring med endast en tråd?
Hej!
Jag har funderat lite, men lyckas inte komma fram till något riktigt vettigt.
Hur gör man egentligen om man vill ha en seriell överföring mellan t.ex. två µC, men endast en tråd? Med två trådar får jag ihop det (En clock och en data), men bara en ledning får jag inte ihop?
För, skulle jag ha så att varje µC läser med en hastighet på exakt t.ex. 500Khz känns inte alls tillförlitligt, då man inte vet helt säkert att de båda börjar exakt samtidigt osv. Dessutom känns det som en hel massa jobb att optimera koden så att ingenting tar för lång tid?
Någon som sitter på en bra guide hur man går till väga, eller har lust att skriva ihop någonting vettigt?
Jag har funderat lite, men lyckas inte komma fram till något riktigt vettigt.
Hur gör man egentligen om man vill ha en seriell överföring mellan t.ex. två µC, men endast en tråd? Med två trådar får jag ihop det (En clock och en data), men bara en ledning får jag inte ihop?
För, skulle jag ha så att varje µC läser med en hastighet på exakt t.ex. 500Khz känns inte alls tillförlitligt, då man inte vet helt säkert att de båda börjar exakt samtidigt osv. Dessutom känns det som en hel massa jobb att optimera koden så att ingenting tar för lång tid?
Någon som sitter på en bra guide hur man går till väga, eller har lust att skriva ihop någonting vettigt?
Re: Seriell överföring med endast en tråd?
Hej!
Med 1 tråd, menar du då 1 signal samt 1 jord? Ett förslag man skulle kunna köra på är att du ändrar pulsbredden beroende på om du vill skicka en 1a eller en 0a, ung som radio. T.ex så skulle du kunna köra en puls på 1us = 0 samt 2us = 1 och ifall det är längre än 10us mellan 2 pulser så har överföringen brutits..
Har inte testat själv, men det var bara ett spontant förslag på hur man skulle kunna lösa problemet. Det kanske finns fler och bättre sätt.
Med 1 tråd, menar du då 1 signal samt 1 jord? Ett förslag man skulle kunna köra på är att du ändrar pulsbredden beroende på om du vill skicka en 1a eller en 0a, ung som radio. T.ex så skulle du kunna köra en puls på 1us = 0 samt 2us = 1 och ifall det är längre än 10us mellan 2 pulser så har överföringen brutits..
Har inte testat själv, men det var bara ett spontant förslag på hur man skulle kunna lösa problemet. Det kanske finns fler och bättre sätt.
Re: Seriell överföring med endast en tråd?
Man använder oftast den inbyggda UART till sånt. Den har hårdvaran till att avkänna start och klockar därefter automatisk (om den är ställd till rätt baud-rate).
Om du ska överföra signal åt båda håll (bidirektionellt eller half duplex) blir det lite knepigare och ska du överföra över längre avstånd kommer hela konceptet med 1 ledare (+ GND såklart) att ha allvarliga problem.
Och är det kortare sträckor som gäller dyker frågan upp: varför ha fler mikroprocessorer i samma projekt? Brukar bara bli besvärligt och onödigt komplext.
Ett tips är att beskriva VAD du vill göra, då brukar det komma fler och bättre svar.
Om du ska överföra signal åt båda håll (bidirektionellt eller half duplex) blir det lite knepigare och ska du överföra över längre avstånd kommer hela konceptet med 1 ledare (+ GND såklart) att ha allvarliga problem.
Och är det kortare sträckor som gäller dyker frågan upp: varför ha fler mikroprocessorer i samma projekt? Brukar bara bli besvärligt och onödigt komplext.
Ett tips är att beskriva VAD du vill göra, då brukar det komma fler och bättre svar.
Re: Seriell överföring med endast en tråd?
> ...eller har lust att skriva ihop någonting vettigt?
Det är redan skrivits många gånger om.
T.ex http://sv.wikipedia.org/wiki/RS-232
Det är redan skrivits många gånger om.
T.ex http://sv.wikipedia.org/wiki/RS-232
Re: Seriell överföring med endast en tråd?
Använder du Open collector och använder olika pulslängd för att indikera "0" respektive "1" enligt dangraf:s metod så kan du får det du önskar.
Pulsllängden måste dock vara så lång att mikrokontrollern hinner räkna tillräckligt antal klockcykler för att kunna skilja pulslängderna åt. Samt att klockan driver mindre (jitter) än gissningsvis halva tiden för den kortaste pulsen. Felkorrigering mha CRC eller liknande är nog också bra. Den interna RC oscilllatorn borde kunna klara uppgiften.
Det som är essentiellt för förståelsen är att man använder en "egen" tidspuls från en oscillator för att ersätta en överförd klockpuls.
Pulsllängden måste dock vara så lång att mikrokontrollern hinner räkna tillräckligt antal klockcykler för att kunna skilja pulslängderna åt. Samt att klockan driver mindre (jitter) än gissningsvis halva tiden för den kortaste pulsen. Felkorrigering mha CRC eller liknande är nog också bra. Den interna RC oscilllatorn borde kunna klara uppgiften.
Det som är essentiellt för förståelsen är att man använder en "egen" tidspuls från en oscillator för att ersätta en överförd klockpuls.
Re: Seriell överföring med endast en tråd?
Både asynkron och synkron överföring använder ju ett pulståg på en ledning. Vid asynkron överföring har man en start-bit per sänd byte/oktett, eller egentligen är det väl stoppbiten som så att säga är synkroniseringen (men normalt så startar man ju timingen på startbitens flank).
Vid synkron överföring har man synkroniseringspulståg med jämna mellanrum för att synka ihop sändarens och mottagarens klocka.
Har man uC med inbyggd UART är det väl vettigast att använda den för asynkron överföring.
Vid synkron överföring har man synkroniseringspulståg med jämna mellanrum för att synka ihop sändarens och mottagarens klocka.
Har man uC med inbyggd UART är det väl vettigast att använda den för asynkron överföring.
Re: Seriell överföring med endast en tråd?
Förutsättningen är att det finns nog med UART:s att tillgå. Samt att klockförskjutningen understiger 1/3 bit-tid under hela överföringen.
Re: Seriell överföring med endast en tråd?
Jag har skrivit seriekommunikation i assembler på ABC80 som utan problem klarade 300 BPS i alla fall. Och då var det ändå skrivet med fula loopar (med NOP) för timingen. Så det beror ju på vad man är ute efter för hastighet.
Den läste visserligen bara ett tecken i taget, men farsan körde den i flera år för att skicka program till/från sina NC-maskiner via långa seriekablar och en RS-232-växel (vridomkopplare som växlade mellan 4 anslutninar).
Den läste visserligen bara ett tecken i taget, men farsan körde den i flera år för att skicka program till/från sina NC-maskiner via långa seriekablar och en RS-232-växel (vridomkopplare som växlade mellan 4 anslutninar).
-
- Inlägg: 2436
- Blev medlem: 28 januari 2007, 18:45:40
- Ort: Kungsbacka
Re: Seriell överföring med endast en tråd?
Vanlig uart modul + 2 dioder = klart!
Varje enhet har en diod med katod på TX och anod på RX och koppla samman alla RX.
Dock får man invertera uarten, så 1:a blir hög och 0:a låg.
Och man måste såklart hantera echot som blir, allt som sända tas också emot.
Varje enhet har en diod med katod på TX och anod på RX och koppla samman alla RX.
Dock får man invertera uarten, så 1:a blir hög och 0:a låg.
Och man måste såklart hantera echot som blir, allt som sända tas också emot.
-
- Inlägg: 8457
- Blev medlem: 15 april 2006, 18:57:29
- Ort: Typ Nyköping
Re: Seriell överföring med endast en tråd?
Med en tråd så är det helt omöjligt, med en tråd och GND dvs två trådar totalt eller ett på något annat sätt ihopkopplat system så är det görbart och ganska enkelt dessutom.
Alla enheter sätter sin pinne till input, en av enheterna sätts till master, varje enhet pollas via protokoll och svarar då med att den vill sända eller att den inte vill sända, mastern går över i lyssning samt tar emot det som sänds, alla enheterna avgör om det sända var till dom eller inte. När sändningen avslutats (avslutningsmeddelandesträng) så börjar mastern att skicka ut pollningar igen. Om inget meddelande sänts på en viss tid så tas masteruppgiften över av någon annan enhet lämpligen efter en tid baserat på dess serienummer*ett tidsinkrement.
Alla enheter sätter sin pinne till input, en av enheterna sätts till master, varje enhet pollas via protokoll och svarar då med att den vill sända eller att den inte vill sända, mastern går över i lyssning samt tar emot det som sänds, alla enheterna avgör om det sända var till dom eller inte. När sändningen avslutats (avslutningsmeddelandesträng) så börjar mastern att skicka ut pollningar igen. Om inget meddelande sänts på en viss tid så tas masteruppgiften över av någon annan enhet lämpligen efter en tid baserat på dess serienummer*ett tidsinkrement.
Re: Seriell överföring med endast en tråd?
Jag tog "Med två trådar får jag ihop det (En clock och en data), men bara en ledning får jag inte ihop?" som att han ej räknar GND. Utan räknar endast logiska signaler.
Men problemdefinitionen är oklar.
Men problemdefinitionen är oklar.
Re: Seriell överföring med endast en tråd?
Har kört som victor_passe förslog med lyckade resultat, dock med ADM101E mellan enheterna för längre avstånd (9m kabel untwisted och 19.200 kbps utan några som helst problem). Har MCU:n inbyggd UART så är detta ett billigt och snabbt sätt att lösa det hela på, utan att behöva bitbanga egna protokoll.
Senast redigerad av blueint 15 juli 2010, 11:17:15, redigerad totalt 1 gång.
Re: Seriell överföring med endast en tråd?
Vanlig aynkron UART "is the shit" i det här fallet. UART:en hanterar allting med tider och programmet behöver inte bry sig. Sedan beror det på avståndet. På korta avstånd så funkar Victors metod utmärkt. Pullup och sänkande till nolla vid sändning. Ska man köra längre avstånd så kan man använda samma metod fast med lite mer avancerad "pullup" i form av en strömgenerator. Den går sedan att köra med både 12V & 24V.
En stor fördel är att man kan blanda "riktig" UART i hårdvara med soft-UART i mjukvara beroende på vilken hårdvara som finns tillgänglig och vilka hastigheter man pratar om.
En stor fördel är att man kan blanda "riktig" UART i hårdvara med soft-UART i mjukvara beroende på vilken hårdvara som finns tillgänglig och vilka hastigheter man pratar om.
Re: Seriell överföring med endast en tråd?
Titta på maxim:s app note http://www.maxim-ic.com/app-notes/index.mvp/id/214
Edit: fast med två uart:er i varje ände. Då har du halv-duplex uart över en tråd + gnd
Edit: fast med två uart:er i varje ände. Då har du halv-duplex uart över en tråd + gnd
Re: Seriell överföring med endast en tråd?
Då Klas-Kenny (KK?) inte har svarat någonting i tråden tycker jag att ytterligare svar är meningslösa. Jag kan t.o.m. komma på en lösning som medger full duplex på 1 tråd + GND men då KK inte har varit mer specifik rörande behov av avstånd, kommunikationshastighet, befintlig hårdvara osv känns det ganska meningslöst att gå vidare.