Kommunikation mellan PC och flera AVR kretsar

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
ponkje
Inlägg: 4
Blev medlem: 4 november 2005, 10:04:34
Ort: Skövde

Kommunikation mellan PC och flera AVR kretsar

Inlägg av ponkje »

Hej!

Behöver lite råd/vägledning. Är rätt ny vad gäller mikrokretsar.
Har testat och gjort något något med Bascom och lite med C, undviker helst Assembler. :wink:

ÖNSKAN:
Från en PC vill jag "tala" (skicka/ta emot små textmeddelanden) med ett antal AVR-kretsar via serieporten
(ej nödvändigt via serieporten i.o.f. men antar det är lättast så.)

Att ha kontakt med EN AVR går ju fint via en MAX232 (el. MAX202 som sitter på mitt utvecklingskort DT006).

Om jag nu vill ha kontakt med flera och varför?
Om man tar en AVR som kollar läget på några strömbrytare.
En annan presenterar text i en LCD.
En tredje tänder/stäcker lysdioder o.s.v.

Visst kan man ha EN krets som gör MYCKET men om man nu börjar med en krets som bara gör LITE.
Efter ett tag så vill man göra något annat och bygger en lösning som man också vill kommunicera med PC:n.

IDÈ:
EN AVR sköter kontakten med PC:n.
Till den är dom andra i sin tur kopplade. Man kan lägga till fler efterhand.
Texten som skickas till/från PC:n går således via MAX232 till/från den första AVR:n och vidare till/från den andra.

...eller ALLA kretsar är kopplade till PC:n via var sin MAX232. Fast hur? Via en växel?
Det kanske går att koppla fler MAX232 direkt till porten.
Eller fler kretsar till en och samma MAX232?

FRÅGA:
Vilken väg tycker ni jag ska gå?
Har sett lite om SPI, TWI, I2C men... :oops:

Det känns bättre att fråga innan men gräver ned sig alldeles i saker jag ändå inte förstår om det ändå är "fel" väg för mig.

Vänligen Pontus
Senast redigerad av ponkje 4 november 2005, 11:58:28, redigerad totalt 1 gång.
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Du ger varje µC en adress de ska lyssna på och börjar alla överföringen med att sända adressen till den enheten du vill ska lyssna. I kort funkar SPI, TWI, I2C så. Det går bra att koppla minst 127 enheter på samm bus så länge kablarna är i rimlig längd.
Du kan sätta en RS232-I2C direkt mot datorn om du inte hittar något sätt att "direkt" konvertera serieporten till SPI, TWI eller I2C.

Mär väl skillnaden mellan dessa protokoll. RS232 är asynkront. SPI, TWI och I2C är synkriona seriella överföringsprotokoll med en tydlig uppdelning av master och slave.
ponkje
Inlägg: 4
Blev medlem: 4 november 2005, 10:04:34
Ort: Skövde

Inlägg av ponkje »

Hej $tiff!
Jo att varje krets får sin "egen" identitet har jag tänkt måste vara vettigt.

Det du menar med att sätta en RS232-I2C direkt till datorn är alltså
utan en MAX232 emellan? Flera kretsar parallellt direkt till serieporten på datorn?

Fast du kanske menade att ALLA kretsar har en egen MAX232 och sedan kopplade parallellt till datorn, låter mer rimligt... tror jag.


Pontus
Användarvisningsbild
$tiff
Inlägg: 4941
Blev medlem: 31 maj 2003, 19:47:52
Ort: Göteborg
Kontakt:

Inlägg av $tiff »

Vid en närmare snabbtitt via google så verkar det som att du måte ha en µC (och MAX232) för att omvandla RS232 till I2C/SPI. Jag trodde för en stund att man kunde göra det lika lätt som vissa "RS232 till 1-wire"-omvandlare.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Sätt in ett RS485-kort i datorn (eller använd converter för serieporten) och gör en multidropslinga till samtliga processorer. Det blir nog inte enklare än så. :)

Mvh
speakman
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Det finns många olika sätt att prata mellan enheter. Vad man väljer är till väldigt stor del beroende på vad man vill uppnå och under vilka omständigheter man jobbar. Någon form av seriell kommunikation är ofta smidigast. Det finns många seriella varianter också och det är några frågor man behöver ställa sig. Här är några (finns säkert fler):

1. Vilka avstånd är det mellan enheterna ?

2. Vilka hastigheter behövs ?

3. Hur många ledare kan jag tillåta i kabeln ?

4. Behöver jag strömförsörjning inbakat i kabeln ?

5 Behöver enheterna vara elektriskt isolerade från varandra ?

Skall man jobba "på skrivbordet" med enheterna så är synkrona interface som SPI, I2C och liknade, lämpliga. Dom kräver lite fler ledare och klarar inte så långa avstånd. Däremot är dom ofta lätta att koppla sig mot i mikroprocessorn och ger rätt så bra hastighet. För att koppla dessa till en PC så behöver man en intelligent (mikroprocessor eller speciellt chip) enhet för att omvandla RS232 eller USB till rätt interface och protokoll.

Är det däremot längre avstånd det handlar om så är det ofta enklast med asynkrona interface som RS232, RS485, LIN, 1-wire etc. Även CAN och liknande standarder för automatisering fungerar här. RS232 i sig är inte så lämpat för att koppla in mer än en pryl på, även om det finns en del som gjort speciallösningar. Däremot så går RS232 lätt att göra om till t.ex RS485 som är en buss med två signaltrådar och avsett för flera enheter på samma lina.

Vill man ha elektrisk isolation på inte alltför långa avstånd, så kan MIDI vara ett alternativ. Visserligen inte en multidroppbuss (flera enheter på samma lina) i egentlig mening, men kan vidarekopplas för att ge samma funktion.

En favorit hos mig är strömkopplad multidropslinga. Det är en tvåtrådsslinga med en strömgenerator (i vissa fall bara ett motstånd) på slingan och sedan "kortsluter" man slingan när man sänder. En fördel med detta är att man ofta kan tjuva ström från kommunikationen till små strömsnåla enheter, t.ex mätare eller knappar. Exempel på dessa interface är 1-wire, SIOX och LIN.
ponkje
Inlägg: 4
Blev medlem: 4 november 2005, 10:04:34
Ort: Skövde

Inlägg av ponkje »

Tack för svar speakman och vrf!

Det var lite nya frågeställningar och uttryck.

Vet inte riktigt vad RS485 är men går det att kommunicera med denna lösning lika enkelt som man nu gör från ex. Visual Basic till serieporten
i pc:n så kanske det kan vara något.

Avstånd mellan enheterna? Hmm, jo det skulle kunna gå att ha dom nära
varandra. Fast det klart... om man nu gör "något" på sitt eget kort, med sina brytare, displayer o.s.v. så blir det således kan det bli lite avtånd till
dom andra modulerna och pc:n. Max ett par meter eller så.

1-wire har jag "lekt" med lite. Dock ej med en AVR krets.
Skulle man kunna "tala" kretsarna emellan (eller åtminstone till den som
sköter kontakten med pc:n) så låter det ju också bra. Helt ok faktiskt.

SIOX, CAN och LIN... oj då, det var helt nytt.

Tack för respons så länge. Det är mycket att tänka på.

Pontus
Användarvisningsbild
Icecap
Inlägg: 26636
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

SioX (som det faktisk heter) är egentligen PLC-moduler från Telefrang. Deras bus är bra men deras mjukvara är en djup besvikelse och deras firmware har kostat mig ca: 36 arbetstimmer i onödan.
Användarvisningsbild
vfr
EF Sponsor
Inlägg: 3515
Blev medlem: 31 mars 2005, 17:55:45
Ort: Kungsbacka

Inlägg av vfr »

Det är ju sant! SioX skall det egentligen skrivas. Håller med dig ang. buss resp. protokoll. Jag kör ett liknande system till min husstyrning. Bussen är likadan som SioX men det är ett annat protokoll. Jag har även gjort en liten 1-wire node som hänger på en SioX-lina och matas via linan. Man kan dock inte ha så många enheter på 1-wiren då.

Ponkje> RS485 är asynkron seriekommunikation precis som RS232. Precis som speakman säger så behöver man bara ett 485-kort i datorn eller en omvandlare 232->485. Det som kan vara lite knepigt i PC-änden är att man måste styra när den skall sända med en separat signal. Detta är för att inte alla sändare på linan skall ligga och sända samtidigt och jobba "mot varandra". Jämför gärna med t.ex kommunikationsradio. Sändningssignalen i 485 motsvarar fingret som styr sändknappen när du talar i komradion. Om alla komradio låg i sändläge hela tiden så skulle ingen höra någonting.

Problemet är att Windows drivisar för vanliga standard UART klarar inte riktigt av att styra sändningen tillräckligt tight för att det skall fungerara bra. Antingen köper man ett riktigt 485-kort med egna drivrutiner som är gjorda för ändamålet, eller så kör man en extern omvandlare som har intelligent styrning av sändningen. Annars är det en användbar standard med bra hastighet och bra avstånd!
Användarvisningsbild
Icecap
Inlägg: 26636
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Jepp, RS485 är, rätt använd, ett mycket bra och enkelt sätt att överföra kommunikation. Då linan är simplex (bara en kan prata åt gången) måste man ha en hygglig styrning av vem som säger vad och när men med lite omtanke går det galant.
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

Lättaste och snabbaste lösningen (utan att behöva köpa en massa extra komponenter etc) bör väl vara att göra så som $tiff först sa... dvs varje AVR får sin adress och alla är kopplade till TX/RX efter MAX232:an...
dvs PC <-> MAX232 <-> AVR:ERNA

RS232 är antagligen det smidigaste sättet också...

Så hade jag löst det...

//rickeboy
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jag skulle vilja hissa en flagga för CAN här.

Väldigt smidigt när man har flera "noder" som har olika funktioner.

Med CAN behöver man inte veta *vilken* node som gör vad, eftersom noderna inte har adresser som man håller reda på. Utan man skickar olika meddelanden (som t.ex "tänd lampa A", vilket har ett unikt meddelande-ID). Den node som har ansvar för "lampa A" kommer att fånga upp medelandet och (t.ex) tända lampan.

Det blir också smidigt att dela upp en node (som t.ex har blivit överbelastad med funktioner) på två noder. Det är bara att dela upp meddelandera mellan dom. Övriga noder märker ingen skillnad och behöver inte "veta" att det nu är två olika noder som sköter samma uppgifter, de skickar ju fortfarande samma meddelanden ut på CAN-nätet.

Varje node bestämmer alltså själv (med "masks" och "filters") vilka meddelanden som den ska "trigga" på.

Sen är det en annan sak att för att man måste använda speciell CAN hårdvara, antingen inbyggt direkt i de mikrokontrolers man använder (PIC eller AVR eller något annat) eller med speciella CAN-drivers som man kopplar till varje kontroller.

Men är detta ett hobby projekt, kanske CAN är lite "överkurs"... :-)
Användarvisningsbild
Icecap
Inlägg: 26636
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

rickeboy: förklara för mig att du vill att det ska fungera med RS232.

Att utgången från PC:n ska gå till alla andras ingång är ju klart men alla andras utgång som ska gå till 1 ingång....hur löser du det?

Med RS485 skickas det en förfråga från mastern, slaverna får det, dekoder address osv. Under tiden byter sändaren till mottagare och rätt slavenhet svarar på frågan efter att ha vänt sin RS485-krets till sändare och när den är klar vänder den tillbaka till att lyssna.

Det enda det kräver är ett vettigt kommunikationsprotokoll samt en drivkrets per enhet.

CAN kan också vara ett sätt men jag tror att det är lite overkill i detta.
Användarvisningsbild
rickeboy
Inlägg: 678
Blev medlem: 13 augusti 2003, 09:12:17
Ort: Göteborg / Karlskrona
Kontakt:

Inlägg av rickeboy »

Icecap>> Hmm... ser inte problemet...

Säg att du har 10st AVR:er. Den första har adressen 1 den andra 2 osv...

Säg att den tredje AVR:en har endast en LED du vill ska sätta igång.
Från PC:n skickar du typ adress,gör > 3,1 dvs 1=sätt igång...
för att stänga av 3,0 t ex!

Om den nu ska svara att det gick bra kan man ju låta den svara med sin adress och typ OK eller en 1 om det gick bra eller nolla eller liknande... förutsättningen är ju att svaret inte innehåller ngn av de andras adresser...
Blir ju typ som en "hub"...

//rickeboy
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

> Hmm... ser inte problemet...

En RS232 sändare ==>> flera RS232 mottagare är väll OK. Men tvärtom ?
Skriv svar