Dakujem velmi pekne za odpovede.
Do komunikacnej schemy som doplnil priblizne dlzky komunikacie medzi jednotlivymi CPU. Ako Panda38 spomenul, ide o vlakovu zeleznicu, ale je to vsetko z lega a kazdy vlak ma vlastne baterie - kolajnice su plastove, takze rusenie by tam nemalo byt velke. Popri komunikacii mi ide 2x napajanie, zatial docastne 1x10V pre L7805CV z ktorych robim 5V - kvoli ubytku napatia som ho zdvykol na 10V aby aj v poslednom CPU dokazal stabilizator spravit 5V a 1x11V pre napajanie motorcekov pre prepinanie vyhybiek. Do buducna, ked budem robit uz plosaky chcem spojit tie dve napajania do jedneho, kde sa mi zvysi prierez kabla a pustim tam vacsie napatie, ktore najprv zrazim stabilizatorom 7809TO220 na 9V pre napajanie morocnekov a potom z tych 9V stabilizatorom L7805CV spravim 5V pre CPU, LED a pod.
CPU su cez externy krystal taktovane na 14,7456MHz a prenosovu rychlost som zvolil 9600 baud, chybovost je 0,0%. Prosim len o potvrdenie, ci je to spravne, popripade, ci je vhodne zvysit rychlost? Bude potrebne pouzit “zaterminovanie” komunikacie?
Radius - tie ochrane odpory ty pouzivas a ak ano tak akej hodnoty? Nerobi mi problem ich tam doplnit, aj pri programovani cez LPT port a piny MISO, MOSI a SCK pouzivam ochranne odpory, tam mam 330 Ohm. Neviem ako velmi je citlivy tento prevodnik.
Napajanie prevodnikov zablokujem ako pri CPU 100nF keramickym kondenzatorom.
Ten prevodnik teda pouzijem presne SN75176BP, ako ste mi poradili, dufam, ze bude dobre fungovat pri danej frekvencii a rychlosti. Do komunikacnej schemy som doplnil zapojenie pinov DE a RE na jeden vystup CPU. Ak som spravne pochopil, nastavim na pine CPU log 0 pre citanie z komunikacii (prijat znak) a log 1 pre pre posielanie do komunikacie (odoslat znak). Pri CPU6 v komunikacnej scheme som principialne zakreslil signalizaciu s dvoma LED diodami, ktora by mala znazornit, ci dany CPU cita alebo vysiela - aj ked neviem, ci to bude volnym okom pozorovatelne.
Rozmyslal som nad prepinanim medzi citanim a odosielanim pri CPU1-5. Ako riesenie mi vychadza urobit to cez prerusenia:
- Zapnutie napajania, CPU1-5 bude prepnute do rezimu citania a CPU6 do rezimu vysielania.
- CPU6 posle znak 11000001 (vysielaj CPU1) - neviem, ci nie je potrebne osetrit, aby zacal vysielat az po urcitom case, aby boli vsetky CPU pripravene po privedeni napajania na citanie? Mozno by som pre CPU6 pouzil delay_ms hned na zaciatku na cca 5 sekund.
3.1. CPU1-5 prijme znak a po dokonceni prijmu znaku skoci do prerusenia USART0 Tx Complete (USART0_TX alebo USART_TX) a vyhodnoti, ci dany CPU moze alebo nemoze vysielat.
3.2. CPU6 skoci do prerusenia USART Rx Complete (USART_RX) a prepne sa do rezimu citania.
(poznamka)
- Po precitani znaku CPU1 zisti, ze ma vysielat.
(poznamka)
- Nasledne sa CPU1 prepne do rezimu vysielania a ak ma co poslat, tak posle udajovy znak a ak nie, posle 11000000 (prazny znak). Ostatne CPU ostavaju v rezime citania.
- Poslanu hodnotu prijme CPU2 az CPU6 a skocia do prerusenia TX Complete. CPU1 skoci do prerusenia RX Complete.
6.1. Ak ide o udajovy znak, kazde CPU okrem CPU1 ho prijme a zapracuje (aj CPU6 - kde LED diodami signalizujem ktora trat je volna a ktora obsadena - pre info)
6.2. Ak ide o prazdny znak, CPU1-5 ho odignoruje a spracuje ho len CPU6. V podstate ho aj CPU6 odignoruje.
(poznamka)
7.1. CPU1 sa prepne do rezimu citania.
7.2. CPU6 sa prepne do rezimu vysielania a posle znak 11000010 (vysielaj CPU2) a vsetko sa zopakuje. Takto by to stale dookola.
(poznamka) → Tieto poznamky som tam vkladal preto, ci tam netreba cakat na vyprazdnenie buferu, ako pisal Panda38, alebo staci pouzit prepinanie v preruseniach RX/TX Complete? Ak nie, slo by to osetrit cez prerusenie USART, Data Register Empty (USART0_UDRE a USART_UDRE)? Zatial som to chapal tak, ze ked skoci do prerusenia RX Complete, tak je komunikacia skoncena a moze sa zas pouzit na prenos.
V prilohe posielam upravenu komunikacnu schemu a tabulku vyznamu kodov, ktore pouzivam pri prenose.
Zatial velmi pekne dakujem.
Lego vlaky Vyznam znakov.pdf (23 KB)
Lego vlaky Komunikacna schema.pdf (126 KB)