Dekódování, načtení obecných sériových dat

rteppp
Příspěvky: 5
Registrován: 07 bře 2022, 18:01
Reputation: 0

Dekódování, načtení obecných sériových dat

Příspěvek od rteppp » 07 bře 2022, 18:56

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í :-)
Přílohy
Perioda_500ms.jpg
Bity.jpg

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Dekódování, načtení obecných sériových dat

Příspěvek od kiRRow » 07 bře 2022, 19:13

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

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Dekódování, načtení obecných sériových dat

Příspěvek od Caster » 07 bře 2022, 19:31

Č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áš.

rteppp
Příspěvky: 5
Registrován: 07 bře 2022, 18:01
Reputation: 0

Re: Dekódování, načtení obecných sériových dat

Příspěvek od rteppp » 07 bře 2022, 20:13

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 :-)

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Dekódování, načtení obecných sériových dat

Příspěvek od Caster » 07 bře 2022, 21:21

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.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Dekódování, načtení obecných sériových dat

Příspěvek od kiRRow » 07 bře 2022, 21:21

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

AstroMiK
Příspěvky: 592
Registrován: 08 pro 2017, 19:05
Reputation: 0

Re: Dekódování, načtení obecných sériových dat

Příspěvek od AstroMiK » 07 bře 2022, 22:01

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):

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
      }
    
  }
//============================



rteppp
Příspěvky: 5
Registrován: 07 bře 2022, 18:01
Reputation: 0

Re: Dekódování, načtení obecných sériových dat

Příspěvek od rteppp » 07 bře 2022, 22:12

"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 :-(

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Dekódování, načtení obecných sériových dat

Příspěvek od ondraN » 08 bře 2022, 10:13

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.

Uživatelský avatar
Caster
Příspěvky: 380
Registrován: 11 zář 2019, 09:02
Reputation: 0

Re: Dekódování, načtení obecných sériových dat

Příspěvek od Caster » 08 bře 2022, 12:39

Mohlo by pomoci Reads a pulse

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 9 hostů