Centralenhet skicka och ta emot värden från andra enheter

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Eddie
Inlägg: 47
Blev medlem: 20 oktober 2005, 16:07:53

Centralenhet skicka och ta emot värden från andra enheter

Inlägg av Eddie »

Hmm, lång titel :?

Jag sitter lite och spånar på hur överföringen ska gå till i mitt system.

Jag har en centralenhet (Avr) som ska ta emot 10 värden via serieporten på datorn och sedan fördela ut dessa värden på 10 andra enheter (Avr UART/USART).

Problemet jag har är hur enheterna ska veta vilket värde de ska ta till sig.
Kan man parallelkoppla datasignalen till alla enheter och sen ha 10 utpinnar på centralenheten som aktiverar ett interupt på den enhet som ska ta emot värdet?

Det som ställer till det mest för mig är att centralenheten först ska skicka ett värde till slaven och sedan ta emot ett värde från densamma och sedan gå vidare till nästa slav. Dessutom ska varje enhet kunna kopplas i och ur individuellt utan att det påverkar systemet. Vill ju inte att centralenheten står och väntar på ett värde från en enhet som inte är inkopplad (Någon form av TimeOut?)

Har kollat lite på SPI också men jag kan inte reda ut riktigt om det är vad jag behöver... fördelar/nackdelar?

Slavarna ska självklart sköta andra sysslor under den tiden de inte tar emot och skickar värden.

Några tips?

Ska väl tillägga att det kan bli ganska långa ledare mellan centralenhet och slav (upp till 10 meter).
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1353
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Inlägg av baron3d »

Hej, intresant fråga. Funderar i samma banor.
SPI - Synkron överföring är bra om synkronisering är ett problem.
Slavarna behöver inte vara kristall-styrda.

SCI - Asynkron överföring går lätt att fixa med endast en signal. Slavarna behöver vara kristall-styrda för exakt funktion.

Timeout, javisst. Slaven måste ge respons ganska omedelbart. Så 100ms borde väl vara lagom för 1200 baud.
Användarvisningsbild
Icecap
Inlägg: 26645
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Kör RS485! (MAX485 *hint*)

Då behövs 3 trådar: skärm/noll + 2 (hälst) tvinnade dataledare.

Mastern skickar blocket med kommando och slaven svarar. Varje block måste alltså innehålla en adress + data/kommando. Mellan blockarna lyssnar alla enheter.

Det är ett multidrop-system, alla kopplas alltså ihop och kan i teorin prata med varandra men den överordnade styrningen är enklast om en master gör.

Se till att blockarna är enartade, om det är en fast längd eller med start/stop karaktär har mindre betydelse och använd vanlig UART på 9600,n,8,1, då kommer det att rulla stabilt och bra.
Eddie
Inlägg: 47
Blev medlem: 20 oktober 2005, 16:07:53

Inlägg av Eddie »

Tack! Precis vad jag letade efter...
Eddie
Inlägg: 47
Blev medlem: 20 oktober 2005, 16:07:53

Inlägg av Eddie »

Så om jag förstår det rätt så behöver mottagaren rent kodmässigt inte stå i en loop och vänta på ett värde? Jag behöver bara initiera UART:en och låta programmet göra annat under tiden som ingenting skickas till den och sedan ha ett receive-complete interupt?
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

En bra idé kan ju vara att göra ett enkelt protokoll med start-byte, stop-byte och checksumma.
I Receive-interruptet för U(S)ARTen sköter du emottagning av varje paket, och flaggar när du fått stopp-byte och checksumman stämmer.
Main-loopen kollar bara efter flaggan, och behandlar paketet när det inkommit komplett.

Mvh
speakman
Skriv svar