Dekódování, načtení obecných sériových dat
Dekódování, načtení obecných sériových dat
Jak načíst obecná sériová data ze snímače polohy?
Mám snímače, které generují co 500ms data o poloze v rozsahu 0-15.
Datagram tvoří vždy osm pulzů (bitů) o délce 1ms s mezerou 0,5ms.
Celkový rámec je fixní, vždy 11,5ms
První čtyři "bity" jsou vždy stejné:
0101 a další čtyři označují polohu čidla 0000 až 1111
Viz obrázky.
První - Perioda - opakování dat 500ms
Druhý - Bity ukazuje celý datagram, přičem změřená délka periody, tj. bitu včetně mezery je cca 1,54ms.
Jak jednoduše dekódovat? Jsem začátečník a moc by mi pomohlo alespoň nasměrování
Mám snímače, které generují co 500ms data o poloze v rozsahu 0-15.
Datagram tvoří vždy osm pulzů (bitů) o délce 1ms s mezerou 0,5ms.
Celkový rámec je fixní, vždy 11,5ms
První čtyři "bity" jsou vždy stejné:
0101 a další čtyři označují polohu čidla 0000 až 1111
Viz obrázky.
První - Perioda - opakování dat 500ms
Druhý - Bity ukazuje celý datagram, přičem změřená délka periody, tj. bitu včetně mezery je cca 1,54ms.
Jak jednoduše dekódovat? Jsem začátečník a moc by mi pomohlo alespoň nasměrování
Re: Dekódování, načtení obecných sériových dat
není k tomu nějaká chytrá knížka ? ... kdyby člověk věděl s čím má tu čest, možná by se dalo dohledat něco rozumného
Re: Dekódování, načtení obecných sériových dat
Čidlo polohy posílá data přes SPI, I2C nebo UART. Tento signál spíše vypadá na data, které posílá např. externí čidlo teploty na 433 MHz. Napiš, jaké čidlo polohy používáš.
Re: Dekódování, načtení obecných sériových dat
To je čidlo ke kterému není žádná dokumentace (není na něm žádný popis, bo Číňan .-)) a známý potřebuje vědět mimo logiku stroje v jakém stavu (poloze) je. "Odbočení" datového signálu přes optočlen není problém, komunikace je pouze jednosměrná a jednoduchá.
Stavy taky jasné, akorát to neumím vyparsovat
Úvodní sekvence je pořád stejná 1010 (nebo 0101) a další čtyři udávají polohu. Na osciloskopu je umím "přečíst", ale jak dostat do Arduina ne
Pak se poslední čtyři bity překóduje do LED, které vizualizují stav, to už umím.
Ad teploměry - existuje nějaká knihovna pro čtení, kde je možno nastavit časování (délky hodnot 0/1 a délku mezety mezi bity, délku slova a synchronizační mezery? Tím by se to vše vyřešilo...
Děkuji
Stavy taky jasné, akorát to neumím vyparsovat
Úvodní sekvence je pořád stejná 1010 (nebo 0101) a další čtyři udávají polohu. Na osciloskopu je umím "přečíst", ale jak dostat do Arduina ne
Pak se poslední čtyři bity překóduje do LED, které vizualizují stav, to už umím.
Ad teploměry - existuje nějaká knihovna pro čtení, kde je možno nastavit časování (délky hodnot 0/1 a délku mezety mezi bity, délku slova a synchronizační mezery? Tím by se to vše vyřešilo...
Děkuji
Re: Dekódování, načtení obecných sériových dat
Dej sem fotku toho čidla. Někdo by mohl poznat typ a pak už by neměl být problém najít knihovnu na dekódování signálu.
Re: Dekódování, načtení obecných sériových dat
tušil bych z křišťálové koule, že ta sekvence 1010 nebo 0101 bude sloužit k synchronizaci ... budeš si muset zmeřit délku těch obdelníků, dle toho si sesynchronizovat přijímač ... ale fakt střílím od boku
Re: Dekódování, načtení obecných sériových dat
Možná by se dala použít funkce pulseIn() pro měření šířky pulzu.
Musela by se ale nějak vyřešit synchronizace na první impulz po té dlouhé pauze.
Nevyzkoušený příklad (je to jen princip):
Musela by se ale nějak vyřešit synchronizace na první impulz po té dlouhé pauze.
Nevyzkoušený příklad (je to jen princip):
Kód: Vybrat vše
#define cteci_pin 5 // vstupni pin pro mereni impulzu
//============================
void setup(void)
{
Serial.begin(9600);
pinMode(cteci_pin , INPUT_PULLUP);
}
//============================
void loop(void)
{
byte hodnota = 0; // nulovani vysledku
unsigned long sirka; // sem se bude ukladat sirka impulzu v mikrosekundach
for (int pulz = 7; pulz >= 0 ; pulz --) // ocekava se 8 impulzu (pro jednodussi praci s funkci bitSet se zacina nejvyssim 7. bitem)
{
sirka = pulseIn(cteci_pin, HIGH, 200000UL); // kdyz se 0,2 sekundy neobjevi impulz, znamena to konec dat (prvni cteni impulzu se trefilo nekam doprostred dat)
if (sirka > 800) bitSet(hodnota,pulz); // minimalni sirka pulzu, ktera se ma vyhodnotit jako "1"
if (sirka == 0) break; // prvni cteni impulzu se trefilo nekam doprostred dat, test se prerusi. Protoze je hodnota nesmyslna, nezobrazi se
}
if (sirka > 0)
{
Serial.println(hodnota); // i osmy impulz mel nejakou sirku, takze vysledna hodnota ma nastaveno vsech 8 bitu
delay(400); // dalsi impulz je ocekavany za 0,5 sekundy, takze se nastavi takova pauza, aby i po jejim uplynuti do dalsich 0,2 sekundy bezpecne dorazil prvni impulz
}
else
{
Serial.println("Chyba"); // nepodarilo se nacist vsech 8 bitů
delay(100); // dalsi pokus o test bude trochu drive
}
}
//============================
Re: Dekódování, načtení obecných sériových dat
"tušil bych z křišťálové koule, že ta sekvence 1010 nebo 0101 bude sloužit k synchronizaci ... budeš si muset zmeřit délku těch obdelníků, dle toho si sesynchronizovat přijímač ... ale fakt střílím od boku"
Ano, první 4 bity (znaky) jsou s největší pravděpodobností synchronizační, nikdy se neměmí a jsou vždy na začátku každé sekvence a další čtyři bity jsou polohové po 25 st. Jejich význam znám - tabulku jsem si udělal dekódováním z obrazu na osciloskopu aa známé polohy čidla. Nic proto nepotřebuji dekódovat, pouze nakopnout jak načíst tato sériová data, která přijdou co 1/2 sekundy na nějaký pin Arduina. Nic víc.
Vím, že musím použít přerušení, ale co dále?
Délka dlouhého pulzu je 1ms HIGH, mezera 0,5ms LOW
Krátký pulz má délku 0,5ms HIGH+0,5ms LOW a opět mezera 0,5ms LOW.
Délka jednoho znaku (1ms) včetně mezery (0,5ms) je konstantní, vždy 1,5ms
Délka celeho datagramu je vždy 11,5ms
Doba opakování datagramu je 500ms
Tj. potřebuji načíst vždy 4 bity za synchronizačními 1010 (nebo 0101). Klidně může být výstupem Byte, ve kterém bude horní nibble vždy 0xA nebo 0x5 a spodní je hodnota polohy. Nepotřebuji znát více.
Nic více. Pouze to neumím naprogramovat, změřit ano
Ano, první 4 bity (znaky) jsou s největší pravděpodobností synchronizační, nikdy se neměmí a jsou vždy na začátku každé sekvence a další čtyři bity jsou polohové po 25 st. Jejich význam znám - tabulku jsem si udělal dekódováním z obrazu na osciloskopu aa známé polohy čidla. Nic proto nepotřebuji dekódovat, pouze nakopnout jak načíst tato sériová data, která přijdou co 1/2 sekundy na nějaký pin Arduina. Nic víc.
Vím, že musím použít přerušení, ale co dále?
Délka dlouhého pulzu je 1ms HIGH, mezera 0,5ms LOW
Krátký pulz má délku 0,5ms HIGH+0,5ms LOW a opět mezera 0,5ms LOW.
Délka jednoho znaku (1ms) včetně mezery (0,5ms) je konstantní, vždy 1,5ms
Délka celeho datagramu je vždy 11,5ms
Doba opakování datagramu je 500ms
Tj. potřebuji načíst vždy 4 bity za synchronizačními 1010 (nebo 0101). Klidně může být výstupem Byte, ve kterém bude horní nibble vždy 0xA nebo 0x5 a spodní je hodnota polohy. Nepotřebuji znát více.
Nic více. Pouze to neumím naprogramovat, změřit ano
Re: Dekódování, načtení obecných sériových dat
Dá se to udělat v podstatě dvěma způsoby. Záleží na tom, co jiného bude MCU ještě dělat. Pokud se budou pouze detekovat tyhle pulsy a občas se to pošle přes sériový nebo jiný port ven, šlo by to dekódovat v rychlé smyčce s použitím millis a micros na měření času (a poslat ven po skončení sekvence, před příchodem další). Pokud bude kromě dekódování a posílání i nějaká další zátěž, je asi jediná možnost přes interrupty a časovače. To není cesta pro každého a vyžaduje velmi dobrou znalost použitého MCU. Takže asi zvážit vlastní schopnosti a požadavky a buď se do toho pustit, nebo si to nechat navrhnout a napsat od někoho zkušeného.
Re: Dekódování, načtení obecných sériových dat
Mohlo by pomoci Reads a pulse
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 29 hostů