Jednoduchá jednosmerná komunikácia dvoch PIC

no v tej scheme co som nasiel tam nie su 3 mcu ale ja tam cem mat tri :smiley: Teda sa pytam, ci to bude vediet fungovat aj s troma, a s nejakou adresaciou

Na takto položenou otázku není možno odpovědět. Musíš říct, k čemu tam ty tři procesory potřebuješ. Co má který dělat? Co se má dít s daty? Mají být přenášena z jednoho centrálního procesoru do dvou dalších nebo si mají data předávat všechny tři mezi sebou? Jednosměrně nebo obousměrně?

Co to tvoje zařízení vlastně má dělat? K čemu má sloužit? Mají to být tři nezávislé přístroje, navzájem propojené přes RS-232 (protože jinak asi nemá použití RS-232 opodstatnění) nebo ty tři procesory mají být součástí jednoho zařízení (na jedné DPS)?

Chtělo by to upřesnit.

Vl.

ono to tu bolo uz pisane v teme, ale mozem este raz. Jeden master procesor, 3 slave procesory. Slavy budu ovladat LED diody, master bude urcovat ktora ledka ma ako svietit a posielat prikazy slavom. Vzdialenosti su minimalna 3 metre, maimalna asi 10 . Teda prenos bude jednosmerny.

Poslouchej - a proč potřebuješ na ovládání LED diod tři procesory? To přece v pohodě zvládne jeden!

Pokud tomu správně rozumím, já bych na to šel asi takto:

  1. Jeden řídící PIC pro všechno.

  2. Výstup na LED diody realizovat jako sériovou linku => v programu převést paralelní slovo na sériové. Počet bitů a tedy LED diod může být libovolný, omezeno pouze pamětí PIC.

  3. Sériové výstupy převést např. pomocí MAX-232 na linku RS-232.

  4. Na straně LED diod (předpokládám, že tam budeš mít nějaký panel) bude malý plošný spoj, na kterém bude opět MAX-232 a dále několik posuvných registrů (např. 74164), z jejichž výstupů můžeš budit přímo LED diody.

Registry je možno řadit do série, omezení je dáno snad jen zpožděním přenosu a tedy možným probliknutím LED diod při zápisu do posuvných registrů. Toto je možno vyloučit použitím registrů s tzv. latch obvodem, ale to vyžaduje další drát v řízení sériové linky.

Existují i speciální budiče LED diod (LED displejů) se sériovým vstupem (já používám M5450, ale existují i pro I2C). Tyto obvody mají v každém výstupu proudové zdroje, takže je jim jedno, kolik LEDek na nich visí. Jas všech LED diod se nastavuje jediným rezistorem.

Takže každý výstup do linky se sadou LED diod potřebuje pouze dva dráty: data a hodiny.

Pokud by Ti takovéto řešení vyhovovalo, mohu zde dát nějaká schémata, ve kterých mi to bez problémů chodí.

Vl.

Uvedomujem si, ze by sa to dalo robit cez posuvne registre, ale bohuzial netrufam si na taketo riesenie, koli tomu, ze vsetky vypocty pre 72 diod by musel riest jeden procesor, okrem toho este display, klavesnicu, pohybovy senzor, svetelny senzor, wireless, 4 lampy, to by ho chudaka roztrhlo. Preto to robim cez extra procesory, respektive to mozno bude PWM diodovy radic (focus.ti.com/docs/prod/folders/p … c5951.html).

Haha, tak už to z Tebe leze … :slight_smile:.

Takže pokud Ti jde jen o to, aby tři externí procesory čekaly ve smyčce na to, až z RS-232 dostanou nějaká data a ty pak mají jen poupravovat a zobrazit, tak to je snadné, pokud můžeš do každého u nich posílat data přes samostatný sériový kanál. Pokud však mají “viset” na jednom společném vedení, tak to pak směřuje k RS-485, které je vlastně něco podobného, jako I2C, jenže na větší vzdálenost, pokud se napletu :slight_smile:.

Nic lepšího mne nenapadá.

Vl.

ono to moze byt aj na jednej dvojlinke aj na 3, to mi je jedno, kabelaz je uz aj tak natahana tak, ze mam 3 kanaly samostatne :smiley: Len ako to bude ovladaci procesor riadit ? Ten ma len jeden komunikacny kanal, nie tri, preto som to cel dat radsej na jednu dvojlinku. Skusal som to aj cez AUSART, ale to mi na 10 metrov nekomunikovalo. Ked ho znova spojazdnim, skusim tam este zapojit tranzistory, ze co to povie. Mrkni sa mi prosim do tejto temy: https://forum.mcontrollers.com/t/16f88-pres-ausart-se-posila-stav-portu-ktery-rozsvecuje-led/1361/1
ze kde mam chybu v programe, dakujem ti velmi pekne za tvoj zaujem :slight_smile:

No, omlouvám se, ale nemám teď příliš času na to, abych hledal chybu v kódu …

Ale to přece vůbec nevadí, že Tvůj procesor má jen jeden komunikační kanál. Převod na sériový tvar uděláš jednoduše pomocí rotace registru, krajní bit, který Ti z toho vypadne, máš tím pádem v Carry (STATUS,0), testneš, zda je tam jednička nebo nula a podle toho pošleš patřičný bit na datový výstup. Mezi jednotlivé bity vložíš hodinový pulz (na hodinový výstup, samozřejmě), pak tam vložíš zpoždění, odpovídající přenosové rychlosti, a pak už jen počítáš, kolik bitů jsi odeslal.

Struktura datového slova musí samozřejmě odpovídat tomu, co očekává registr na přijímací straně. Pokud se jedná o obyčejný posuvný registr, pak je to vcelku jedno, stačí, když budou na vstupu data o chvilku dříve než hodiny (pozor na správnou polaritu hrany hodin!). V případě M5450 se to musí napočítat dle datasheetu - on vyžaduje přenést přesný počet bitů, jinak se nezapíší do latche.

Protože se jedná o synchronní přenos, může být přenosová rychlost v podstatě jakákoliv (pokud chceš, můžeš to tam nacvakat i ručně tlačítkem :slight_smile:). V reálu musí být u 74164 minimálně tak vysoká, aby segmenty při přenosu neproblikávaly, u M5450 nebo jiných budičů s latch je to jedno.

74164 jsou velmi háklivé na blokování napájecího napětí kondenzátory 100nF u každého pouzdra - nesmí se na to zapomenout, jinak to nejde.

Já jsem např. tako komunikoval s třemi LED displeji. UART jsem použil pouze pro komunikaci s PC - výhodou je (kromě toho, že nemusíš psát rutinu pro převod na sériový tvar), že lze snadno z tabulky nastavit některou ze standardních přenosových rychlostí.

Do přílohy jsem Ti dal kousek kódu pro převod jednoho znaku na sériový tvar přes carry bit. Je to samozřejmě vytržené z kontextu, takže tam schází převodní tabulky znaků, zpožďovací smyčky atd., ale princip převodu tam je.

Dalo by se to napsat i o něco lépe, ale funguje to.

Pokud budeš chtít, pošlu Ti i patřičná schémata.

Vl.
Prevod.txt (1.15 KB)

Pro komunikaci 1 vysílače s několika přijímači ti samozřejmě 1 uart stačí. Jako první byte posílej adresu. Každý přijímač se podívá, jesli je to pro něj a podle toho se zařídí. Nejlepší je, když všechny procesory hw podporují 9-bit víceprocesorovou komunikaci. Master tak nastaví 9.bit do 1 když jde o adresu, jinak 0. Přijímače jsou pak probouzeny pouze v případě, že jde o adresový byte. Když adresa souhlasí, přijme se zbytek dat. Je taky vhodný si na konec paketu dát nějakou formu kontrolního slova(třeba XOR) - takovýto přenos totiž nebude nijak zvlášť spolehlivý.

Na stole (nablízko aby nebyl problém s fyzickým přenosem) to nadrátuješ jednoduše. Spoj všem procesorům země, pak TX vysílače s RX všech přijímačů. To nejlépe pomocí kroucený dvoulinky (můžeš vykuchat třeba ze síťovýho UTP kabelu). Až to rozjedeš, můžeš vyzkoušet na jaký vzdálenosti při jakých rychlostech ti to pojede. Nebudeš-li spokojen, přidá se rs485 driver a je vyřešeno. I tomu totiž v určitém zapojení stačí 2 dráty (bez propojování zemí).

Ahoj,

všechno má své výhody a nevýhody. To, co doporučuješ, určitě fungovat bude. Jsou však opravdu zapotřebí čtyři procesory (1 x vysílač + 3 x přijímač), pro které je nutno napsat program pro příjem, zpracování a zobrazení dat na zobrazovačích. Pak tam asi budou muset být alespoň nějaké budiče LED diod, jinak hrozí přetížení portů PIC. Pokud použiji obyčejné tranzistory, bude mi tam zase zavazet množství omezovacích rezistorů.

Při řešení s klasickými posuvnými registry nepotřebuiji na přijímací straně žádný programovatelný obvod a nemusím tedy psát žádný program. Počet pouzder bude počet LED/8, omezovací rezistory budou zapotřebí, proudově vychází výstupy docela dobře.

Při řešení se speciálními budiči nepotřebuji software, mám k dispozici poměrně výkonné budiče LED a navíc samostatně řízené zdroje proudu pro řízení jasu jedním rezistorem nezávisle na počtu LED diod.
Počet pouzder vychází počet LED/32 (u MM5450).

Pokud použiji verzi s I2C, mohu je navíc pověsit všechny na jeden drát a platí totéž, co jsi psal Ty, pouze bez nutnosti psaní software pro přijímač.

Takže možností je více, jen si vybrat tu správnou … :slight_smile:.
Vl.

A ještě něco …

Nechci tady mermomocí prosazovat své názory, ale já bych rozhodně netahal TTL signály mimi DPS nebo lépe řečeno mimo jedno zařízení.

Něco jiného je, když mám zařízení, třeba i složitější, s více propojenými DPS v jedné bedně, která je kovová a uzemněná a něco jiného, když mám natahané dráty jen pod omítkou po domě. I kdyby to zpočátku chodilo i s TTL úrovněmi, nikdy nevíš, co za rušení Ti tam přibude za nějaký čas a budeš mít problém.

Před lety jsem montoval pokladní systémy v obchodech a vzpomínám si na jeden případ, kdy jsme natáhli síť přes několik místností (UTP kabelem!), propojili několik pokladen s PC a vše chodilo.
Pak asi po půlroce to začalo švindlovat a zjistilo se, že problémy se objevily od chvíle, kdy si přikoupili dva nějaké nové stroje a zapojili je do sítě poblíž té naší. Když se ty strojčeky vypnuly, vše bylo OK, jakmile se zapnuly, začalo to nanovo.

Až když jsme použili pro přenos proudovou smyčku, problémy ustaly.

Proto doporučuji těmto problémům předcházet a to zvláště, když se jedná o investici řádově v desetikorunách.

Vl.

To I2C by zase nemuselo jít tolik na vedlejší kolej, protože jsou nové obvody pro galvanické oddělení I2C a tím pádem nehrozí tak velké nebezpečí poškození. Stačí mrknout na LTC4310, ADuM1250, ADuM2250, Si8400. Každej z nich má svoje specifika, ten Linear potřebuje navíc oddělovací trafa. Pak se dělají pěkné moduly pro kompletní galvanické oddělení RS485 od LT je to LTM2881, nebo podobný LTM2882 pro RS232, pak se připravuje LTM2883 kterej bude mít SPI/I2C a k tomu ještě zdroje 3-5V a +/-12V.
Jirka

Ale tady vůbec nejde o nebezpečí poškození obvodů! Jde tu o rušení na linkách! Toto se tu už nedávno poměrně obsáhle diskutovalo (viz “Domácí síť mikrokontrolérů pro indikaci, regulaci a ovládání”).

Vl.

Tak to vidim, ze prenos si vyriesim cez RS232 prevodnik z AUSART, dokaze aj adresovat nejak 255 zariadeni co som sa docital. Ako radice budu musiet byt mcu, konkretne nieco s 24 IO pinmi, nakolko PWM pre 8 diod som zvladol akurat sa mi nedari to dat do matice. Posuvne registre ako som spominal neprichadazju do uvahy, lebo riadiaci mcu by to nezvladol, hotove pwm radice este zvazujem, len mi tam hapruje realizacia, nakolko som este nenasiel jednoduchy vhodny co by obsluzil 24 LEDiek.

Aha, nějak jsem přehlédl, že potřebuješ na LEDky PWM …

Sorry, omluva :slight_smile:

Vl.

Tak, nakoneic som sa rozhodol pouzit RS-232. Kupil som si MAX232 a snazim sa ho spojazdnit stylom: PIC1 → MAX232 → PIC2
piny zapajam takto: members.multimania.co.uk/snico/N200/max232.gif

pricom druhy PIC pripajam RX na pin 9, TX na pin 10. A zaroven prepajam piny na MAXku: 14-8, 13-7

Samozrejme zapajam aj vsetky kondenzatory, ale nejako sa mu neche komunikovat, vidite tam niekto chybu ?

Navyse, ked prepojim len 2 procesory cez UART, tak minutu dve funguju ako maju, potom im komunikacia zblbne. Aj ked v behu odpojim linku a pripojim, tak uz nekomunikuju, je to normallne ???

:arrow_right: administrator: přiloženy externí soubory