Program simuláoru odesílá v půlsekundových intervalech tu sekvenci '1010', za kterou následuje binární kód úhlu '0000' až '1111'.
SIMULÁTOR:
Kód: Vybrat vše
#define vysilac 5
byte uhel;
//-----------------------------------------
void setup(void)
{
Serial.begin(9500);
pinMode(vysilac,OUTPUT);
}
//-----------------------------------------
void loop(void)
{
for (uhel = 0; uhel < 16 ; uhel ++)
{
for (int bity = 7; bity >= 0 ; bity --)
{
jeden_impulz(bitRead(0b10100000 + uhel,bity));
}
delay(490);
Serial.println(uhel);
}
}
//-----------------------------------------
void jeden_impulz(boolean stav)
{
if (stav == true)
{
digitalWrite(vysilac,HIGH);
delayMicroseconds(1000);
digitalWrite(vysilac,LOW);
delayMicroseconds(500);
}
else
{
digitalWrite(vysilac,HIGH);
delayMicroseconds(500);
digitalWrite(vysilac,LOW);
delayMicroseconds(1000);
}
}
//-----------------------------------------
Výstup jednoho datového bloku ze simulátoru na osciloskopu (stav "10100010"):
Na druhém Arduinu jsem spustil ten svůj včerejší program s použitím funkce pulseIn() a FUNGOVALO to!
Během dvou datových bloků se to sesynchronizovalo a začalo to sypat hodnoty.
Zkusil jsem na to jít ještě trochu jiným způsobem - bez měření šířky impulzů.
Jen se správným načasováním testování stavu pinu od první vzestupné hrany prvního impulzu.
První test proběhne po 700 mikrosekundách od první vzestupné hrany, dalších 7 testů potom s pravidelným odstupem 1500 mikrosekund.
Když se test trefí do stavu HIGH, nastaví se ve výsledku bit do '1', když se test trefí do LOW, zůstane příslušný bit v '0'
Odzkoušeno a také funguje.
Verze s časovanými testy stavu:
Kód: Vybrat vše
#define cteci_pin 5
unsigned long start_dat;
//============================
void setup(void)
{
Serial.begin(9600);
pinMode(cteci_pin,INPUT_PULLUP);
while (digitalRead(cteci_pin) == LOW) ; // tady visi tak dlouho, nez dorazi prvni vzestupna hrana (je uplne jedno, jestli trefi nejaky prostredni impulz)
delay(50); // bezpecne preklene jakakoliv data az do mista, kde zadna data zarucene nejsou
while (digitalRead(cteci_pin) == LOW) ; // znova ceka na vzestupnou hranu. Ted je jistota, ze je to prvni impulz z datoveho bloku
start_dat = micros(); // casova znacka, kde zacinaji data
}
//============================
void loop(void)
{
if (micros() - start_dat > 700) // prvnich 500 mikrosekund je nezajimavych (budou vzdycky HIGH). Zajimave je to, co nasleduje mezi 500 a 1000 mikrosekundami
{ // Nad 1000 mikrosekund bude zase vzdycky stav LOW, takze taky neni zajimavy.
byte vysledek = 0;
for (int pulz = 7 ; pulz >= 0 ; pulz --) // ocekava se 8 impulzu. Test stavu probiha vzdycky 700 mikrosekund po zacatku impulzu
{
if (digitalRead(cteci_pin) == HIGH) bitSet(vysledek,pulz); // podle aktualniho stavu cteciho pinu se posklada vysledny bajt
delayMicroseconds(1500); // kazdy impulz trva 1500 mikrosekund (nezavisle na tom, jestli signalizuje '1' nebo '0')
}
//----------------------------------
// tady se muze necelou pul sekundu vykonavat nejaka dalsi cinnost (muze se i testovat, jestli jsou data v poradku)
if ((vysledek & 0b11110000) == 0b10100000) Serial.println(vysledek,HEX); // test hornich 4 bitu
else Serial.println("Chyba dat");
delay(400);
//----------------------------------
while (digitalRead(cteci_pin) == LOW) ; // ceka se dalsi vzestupnou hranu - to bude prvni impulz z dalsiho datoveho bloku
start_dat = micros(); // casova znacka, kde zacinaji data
}
}
//============================