
Ska koppla en master till flera slavar. Slavarnas antal kan variera mellan en och 25. Varje slav har en unik adress (dvs ett nummer i programminnet som den identifierar sig med) Jag kör halv duplex UART.
Funderar lite på adressering och dataöverföring, hur jag löser det smidigast?
några funderingar: allra smidigast vore ett system där mastern vid reset (eller vid särskild uppmaning) letar reda på alla slavar som finns och lägger dessa i ett register. Varje slav ska då ha ett individuellt nummer mellan 0 och 127.
Så mastern får köra igenom alla 128 kombinationer för att se om den får något svar. Sedan har den en lista på vilka som finns närvarande.
Mastern kommer att kalibrera slavarnas UART (timing) genom ett allmänt anrop. Jag har valt FF som kod för detta anrop eftersom just FF är den enskilda siffra som är minst känslig för tidsförskjutning i UARTEN (består bara av en startbit). När slavarna fått in FF väntar de på koden 80 (hex) vilket innebär i praktiken en 8 bitar lång "nolla" på linjen vilken kan mätas och divideras för kalibrering.
Detta har jag fått att fungera (har kopplat upp en slav)
Sedan finns ett antal instruktioner som maser ger till slav. Jag tror inte det kommer att finnas behov för dataöverföring från master till slav (bara instruktioner) men däremot kommer data att skickas i ganska långa serier från slavarna som svar.
slavarna måste kunna reagera allihopa samtidigt på vissa instruktioner (t.ex starta AD-omvandlare) men måste reagera individuellt på andra instruktioner (som t.ex. skicka över inlästa data)
Jag har inte löst detta än, men funderar på att göra det hela enkelt för mig (men det kanske krånglar till det på sikt?).
Nämligen att dela upp de åtta bitarna i varje byte som skickas från master till slavarna i en bit (bit7) som talar om ifall det är en allmän instruktion eller en individuell. Bit 0-6 är då själva instruktionen.
Exempel: (alla koder i hex)
kalibrera UART: FF 80 : tolkas och utföres av alla slavar.
(kod 80 är då reserverat för kalibreringen)
81 = aktivera slav (inaktivera alla andra), följt av adress (00-7F)
82 = deaktivera slav (ingen slav vald)
83 = starta AD-omvandlare (alla slavar)
03 = starta AD-omvandlare (vald slav)
04 = skicka AD-data (vald slav)
05 = skicka status (vald slav)
06 = reset
så om jag kör 81 AA så sätts en flagga i slav nr AA att just den kan ta emot instruktioner med bit7=0
skriver jag sedan 81 AB så nollas flaggan hos alla andra (t.ex hos AA) och aktiveras hos AB.
sen kan jag köra ett gäng instruktioner mot just den processorn. ex. 03 04 06 (läs in AD, skicka data, reset)
Men mitt i alltihop kan jag alltså skicka ett "allmänt anrop" t.ex. 86. 86 är då reser för samtliga slavar.
kod 82 deaktiverar slaven utan att någon annan slav väljs.
sedan funderar jag på att ha nån slags checksum-byte i slutet på alla dataöverföringar från slav för att säkra resultatet (vid flera timmar långa körningar har det hänt att någon byte blivit fel).
enligt följande mönster: NN, AA, DD, DD, DD, DD, CC
NN = antal bytes som skickas.
AA = slavens adress
DD = databyte
CC = checksum, räkns ut så att alla när alla bytes adderas (inklusive checksum) så skall summan bli 00. dvs CC=00-(NN+AA+DD+DD+DD+DD) (8-bitars operationer)
om nu t.ex. NN skulle bli korrupt och visa 243 istället för 7 så kommer inte master att fastna i evighet och vänta på 243 bytes, det finns en timeout både för slav och master på några millisekunder - har inte förväntade data kommit in då så återgår den till normalmode igen och ger ett felmeddelande)
mja..... har egentligen ingen fråga direkt. undrar väl bara i allmänhet om det verkar vetttigt eller om jag missar något väsentligt? Något mer att tänka på innan jag kastar mig över min assemblereditor? Verkar det hela lysande, utmärkt, vettigt, tveksamt, vansinnigt? Kanske är det överambitiöst bara för att hämta lite siffror från några slavar? eller inte?

Den enda nackdelen jag kan komma på nu är väl att om master ska skicka data till en slav så får det inte finnas data med bit 7 ettställd, då kommer ju de andra slavarna att uppfatta det som "allmänt anrop" och börja utföra den som en instruktion... Just nu har jag inga planer på att överföra data från master till slave , men plötsligt kanske behovet finns där och då har jag bara 7 bitar tillgodo.
Sen är ju funderingen kring om jag ska ha checksum på något vis även för instruktioner från mastern? det är ju ofta bara en eller två bytes långa, men konsekvenserna kan ju bli vad som helst om det skulle bli ett fel.
EDIT: Jag har även sneglat lite på CAN-bus som alternativ. Men det verkar mycket krångligare! Det är bra om det tål tuff miljö, men alla slavar måste också vara galvaniskt isolerade, vilket gör det hela jobbigare om man ska ha aktiva kretsar som sänder och tar emot data på slav-sidan.