HT12E enkoderio emuliatorius 2021.11.22 at 12:51

Tęsiame eksperimentus su HT12E, dabar bandysime sumesti jo emuliatorių. Kad jau reikia greitai, paprastai ir suprantamai net lameriams – jamam Arduino Uno. Beje, pasigirsiu, kai tik gausiu NUCLEO-F446RE pereisiu prie Kūbo ir STM32F446RE. Kažkurias savo programas gal išportinsiu iš Arduino į normalų C, bet ir savarankiškai jas perrašyti yra labai paprasta. O šitų bandymų rezultatas jau realizuosis, greičiausiai, su STMu. Ok, važiuojam. Pradžiai sumaniau pabandyti koks gali būti maksimaliai greitas meandras pas Uno:

Štai, apie 3,4 us, tai beveik 100 kartų greičiau negu mums reikia, panaudojant D2 arba PD2 kontaktą. Nepabandžiau dedikuoto PWM išėjimo, kitą kartą… O kol kas reikia pristabdyti Atmegą panaudojant delayMicroseconds(Pause) funkciją, kur Pause yra laikas mikrosekundėmis. Rašome 328 us, nors reiktų 330 us – 2 us paliekam prievado junginėjimo laikui. Oscilografas patvirtina sprendimą:

Štai, loginis 1 turėtų trukti 330 us, dėl tikslumo paėmiau 5 loginius 1 ir 5 loginius 0, trukmė 3,340 ms = 3340 us, vieno bito trukmė 3340/10 = 334 us, panašiai :). Kadangi jau sureguliavom bito trukmę, sumetam bitbanginimui programėles:

void one () {

digitalWrite (Data_Out, LOW);
delayMicroseconds(Pause);
digitalWrite (Data_Out, LOW);
delayMicroseconds(Pause);
digitalWrite (Data_Out, HIGH);
delayMicroseconds(Pause);

}

void zero () {

digitalWrite (Data_Out, LOW);
delayMicroseconds(Pause);
digitalWrite (Data_Out, HIGH);
delayMicroseconds(Pause);
digitalWrite (Data_Out, HIGH);
delayMicroseconds(Pause);

}

void one () padarys vienetuką, t.y. išsiųs 001, o void zero () padarys nuliuką, t. y. išsiųs 011.

Dešinėje loginio 1 trukmė, nors ir nuliai ne iš tos pusės – 990 us, idealu.

Kairėje HT12D signalas, dešinėje sugeneruotas programiškai, visi loginiai 1. Jau galima jungti maketinę plokštė ir paduoti į ją mūsų signaliuką.

Pajungiau, niekas nesprogo, net nekaista, netgi veikia. Tuoj padarysiu video kaip mirksi LEDukai.

Programėlė labai paprasta, visų pirma inicializuojam LEDus, t. y. siunčiam visų LED užgesinimo signalą (arba uždegimo, priklausomai nuo SINK ar SUORCE pasirinkimo). To reikia, nes HT12E atsimena siųstus duomenis, taigi, jeigu tarkim buvo įjungtas pirmas LED ir nutraukiam duomenų siuntimą – jis lieka šviesti. Šiaip, principe, kol kas nesvarbu kokia LED būklė buvo prieš sekantį duomenų paketą, bet dėl tvarkos tiesiog inicializuojam ir tiek. Po inicializavimo luktelname 1 sekundę ir pradedam junginėti po vieną LED iš eilės. 5 mm žalias LED mirktelna, kad Transmission Valid (VT). Perjungus trumpiklius LED veikimas invertuojamas. Taip yra todėl, kad HT12D pagal komandą paduoda arba pliusą, arba minusą, t. y. srovę tiekia arba priima, jei taip galima sakyti, o vienas LED prijungtas prie pliuso, o kitas prie minuso. Kadangi HT12D nemoka pakabinti išėjimo ore, neduoti nei pliuso nei minuso, gaunasi, kad LED visada turi maitinimą, tik jeigu į LED ateina iš abiejų pusių pliusai arba abu minusai – LED neveikia. Toliau greitaveikos bandymas. Kaip mes visi žinome, visokie NOP, Pause, Delay ir panašūs dalykai yra blogis, kurio reiktų vengti, bet tokiai paprastai programėlei arba pritaikymui bus gerai. Greitaveikai nelabai turi įtakos normalūs kontrolerio veiksmai (čia tik vienas toks – digitalWrite, rašymas į prievadus), tai to nepatestuosim, bet užtai yra nemažai laukimo (delay ir delayMicroseconds), o tuos būtų galima mažinti. Aišku, jeigu taip parašyti programą Asembleriu, būtų galima patiuninguoti ir rašymą į prievadus bei visą kitą inicializaciją. Bet nafik, vis tiek HD12x bus didesni stabdžiai, net naudojant standartines Arduino komandas. Kaip žinome, kad kažkas atsitiktų, reikia 4 žodžių, taigi, bus laikas tarp žodžių. Pats žodis generuojamas programiškai, taigi, bus 1 ir 0 trukmė. Iš HT12E bandymų žinome, kad bito trukmė yra 330 us (programoje 328 us), o laikas tarp žodžių 10 ms. Bandymai parodė, kad vis dar stabiliai veikia prie 90 us bito trukmės ir 2 ms pauzės tarp žodžių. Sumažinus labiau – arba veikia nestabiliai arba neveikia.

Arduino programa yra čia.

Leave a Reply

*