Mamy dwie zmienne globalne:
temp = 1;
ilosc_zboczy_T1 = 0; // ilość zboczy, między którymi czas wynosi T1;
Na pierwszym zboczu (wg wykresu powinno być opadające):
-wpisujesz do temp = 1;
-wpisujesz do zmiennej ilosc_zboczy_T1 = 0;
-umieszczasz temp jako pierwszy bit danych;
-uruchamiasz timer;
Na kolejnych zboczach sprawdzasz ile zliczył timer:
-Jeżeli zliczył około T1:
----ilosc_zboczy_T1 += 1;
----Jeżeli(ilosc_zboczy_T1 == 1) return; // wychodzisz z funkcji
----Jeżeli(ilosc_zboczy_T1 == 2):
--------ilosc_zboczy_T1 = 0;
--------przepisujesz wartość temp jako kolejny bit danych
-Jeżeli zliczył około T2:
----temp= !temp;
----przepisujesz wartość temp jako kolejny odebrany bit.
Notatka na marginesie: aby sprawdzić jakie zbocze wywołało przerwanie możesz w funkcji sprawdzić jaki jest stan pinu, który odpowiada za przerwania -> jeżeli niski: zbocze opadające, jeżeli wysoki: zbocze narastające;
Zmienna "temp" jest zmienną globalną( lub statyczną w funkcji obsługującej przerwanie - ale wtedy będzie więcej kombinowania z przypisywaniem jej wartości z innej funkcji). Na początku musi przyjąć wartość 1 (zgodnie z wykresem "u góry", jak i po zakończeniu musi mieć wartość 1, aby kolejna przychodząca paczka dała dobre wyniki. Ewentualnie jeżeli nie będziesz kontrolować jej wartości, musisz sprawdzać 2 pierwsze bity paczki. Jeżeli dwie jedynki - masz dobrą paczkę, jeżeli dwa zera - negujesz odebrane dane.
Zmienna ilosc_zboczy_T1, przydałaby się również globalna, aby przerwanie od przepełniającego się timera mogło jej przypisać wartość 0;
T1 i T2 to czasy, które zliczył timer. Można zapisać, że 2T1 = T2, czyli T2 jest 2 razy większy niż T1(zgodnie z przebiegiem na rysunku).
Dobrze by było, jakbyś zrobił jeszcze, że T2 nie jest na granicy przepełnienia timera, tylko gdzieś w połowie, ponieważ później będziesz mógł zrobić przerwanie od przepełniającego się timera, w którym:
-wyłączysz timer;
-przywrócisz zmienne do stanu początkowego;
Wesołych Świąt!