Kanał - ATNEL tech-forum
Wszystkie działy
Najnowsze wątki



Teraz jest 5 lut 2025, o 11:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 
Autor Wiadomość
PostNapisane: 22 gru 2014, o 23:26 
Offline
Nowy

Dołączył(a): 24 wrz 2013
Posty: 11
Pomógł: 0

Witam serdecznie (i wesołych świąt!), czy da się obsłużyć odbiornik podczerwieni używając przerwań pin change?
Jeżeli tak to jakby wyglądało takie dekodowanie ramki rc5?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 23 gru 2014, o 21:12 
Offline
Nowy

Dołączył(a): 12 paź 2013
Posty: 20
Pomógł: 4

Obrazek
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!



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 24 gru 2014, o 00:57 
Offline
Nowy

Dołączył(a): 24 wrz 2013
Posty: 11
Pomógł: 0

Czy coś takiego ma sens?

Używam atmega88 smd 8mhz z wewnętrznego rezonatora.
Nóżka sygnału od czujnika podpięta jest pod PD6 (PCINT22).

W momencie, gdy to wysłałem myślę jak sprawdzić, czy to działa. Spróbuję może zapisać adres do eepromu, a potem zapalić coś gdy taki adres otrzymam.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


@edit w miejscu, gdzie rozszyfrowuję słowo ramka i wpisuję do zmiennych toggle, adres i komenda dałem sobie, ażeby zaświeciło mi diodę jednakże nic się nie zapala.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
Wyświetl posty nie starsze niż:  Sortuj wg  
Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 3 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 1 gość


Nie możesz rozpoczynać nowych wątków
Nie możesz odpowiadać w wątkach
Nie możesz edytować swoich postów
Nie możesz usuwać swoich postów
Nie możesz dodawać załączników

Szukaj:
Skocz do:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO