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



Teraz jest 16 sty 2025, o 10:41


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 42 ]  Przejdź na stronę Poprzednia strona  1, 2
Autor Wiadomość
PostNapisane: 2 lut 2013, o 15:50 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27346
Lokalizacja: Szczecin
Pomógł: 1041

krafin napisał(a):
Po 2. Suma modulo jest po to aby sprawdzanie bitu odbywało się co 2 przerwanie - POCZYTAJ o kodowaniu MANCHASTER!


No toż od tego trzeba zacząć a jest to przecież tłumaczone też na początku tego rozdziału, jeśli niezbyt jasno to warto się posiłkować jeszcze internetem bo w tym zakresie jest mnóstwo opisów.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2013, o 16:36 
Offline
Użytkownik

Dołączył(a): 02 lut 2013
Posty: 75
Pomógł: 0

Na temat zdalnego sterowania z wykorzystaniem podczerwieni polecam książkę "Mikrokontrolery w systemach zdalnego sterowania" autor Zbigniew Hajduk. Są ta przedstawione sposoby generowania konkretnych protokołów transmisji i ich dekodowania (nie tylko RC5). Minusem mogą być przykłady dla 8051.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 2 lut 2013, o 17:17 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27346
Lokalizacja: Szczecin
Pomógł: 1041

Badman napisał(a):
Na temat zdalnego sterowania z wykorzystaniem podczerwieni polecam książkę "Mikrokontrolery w systemach zdalnego sterowania" autor Zbigniew Hajduk. Są ta przedstawione sposoby generowania konkretnych protokołów transmisji i ich dekodowania (nie tylko RC5). Minusem mogą być przykłady dla 8051.


tak bardzo dobra książka jeśli ktoś chce rozgryzać standardy kodowania od podszewki, również ją polecam

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2013, o 21:28 
Offline
Użytkownik

Dołączył(a): 19 paź 2012
Posty: 45
Pomógł: 0

Rozumiem,że suma nodulo zaczyna się co 2, znam kod MANCHESTER, patrzę na fazę odbioru nie nadawczą. Jeszcze raz ostatni, drugie przerwanie czyli od zbocza narastającego, (pierwsze było od opadającego w którym to zmienna rc5cnt=0), gdyż jesteśmy w drugim bicie startu, zmienna rc5cnt =1 i czekamy na to aż zmienna PulseWidth będzie większa niż MAX_HALF_BIT (może tego nie zauważam),gdzie dokonuje się inkrementacja zmiennej rc5cnt na 2. Ale po tym czasie jesteśmy już w drugiej połowie 2 bitu startu i w kolejnym przerwaniu gdyż
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Dopiero tutaj następuje zmiana zbocza z wcześniejszego opadającego, które było ustawione zaraz na początku pierwszej połowy 2 bitu startu, teraz na wznoszące i bit ICES1 będzie miał wartość w rejestrze TCCR1B jeden, co po przejściu do warunku da nam w Irdata =1. Koniec mojego rozumowania, rejestr TCCR1B i bit ICES1 mają związek w tym warunku,stąd zdanie
Cytuj:
Po 1. Co ma bit ICES1 do tego co trafi do Irdata? To są 2 różne rzeczy. Warunek

jest moim zdaniem sprzeczne z tym kolejnym
Cytuj:
Kod:
if((TCCR1B & (1<<ICES1))) IrData |= 0x0001;


Sprawdza jakie z jakiego zbocza było wywołane przerwanie, aby wiedzieć czy dany bit był 1 czy 0.

jeżeli narastające bit 1 , opadające bit 0. Irdata =1 tylko gdy bit ICES1=1, zbocze narastajace.Koniec
Albo ja nie myślę logicznie albo coś mi tu ciągle ucieka.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 3 lut 2013, o 23:50 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Może się źle wyraziłem, chodziło mi o to, że ICES1 i irdata to 2 rzeczy bezpośrednio nie oddziałowujące na siebie.


Może spróbuję to wyjaśnić inaczej.
Zmienna rc5cnt przechowuje ilość "połówek" bitów rc5, teraz kodem
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


sprawdzamy czy zmienna rc5cnt jest parzysta (można to robić szybciej, sprawdzając ostatni bit czy jest równy 0), a więc sprawdzamy czy w dany "moment" (przerwanie) jest "połową" bitu, jeśli tak to sprawdzamy kodem
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

czy było zbocze opadające czy narastające (pamiętając, że na początku przerwania zmieniliśmy bit ICES1 na przeciwny) i jeśli było opadające to dany bit jest logiczną 1, a cały bajt jest przesuwany w lewo o 1 (koniecznie zauważ, że IrData ma operator OR |)

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2013, o 00:22 
Offline
Użytkownik

Dołączył(a): 19 paź 2012
Posty: 45
Pomógł: 0

Dzięki, czyli tak jak pisałem wcześniej po przerwaniu od zbocza narastającego , (drugie w kolejności) dopiero na następnym opadającym będzie jedynka, gdyż opadające w połowie bitu świadczy o tym , iż bit jest 1, natomiast w połowie bitu wznoszące świadczy o tym że bit jest 0. KONIEC

------------------------ [ Dodano po: 17 minutach ]

MAM jeszcze jedno pytanko co dokładnie oznacza ten zapis
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Moim zdaniem ustawienie jedynki w tym rejestrze flag od przepełnienia oznacza, iż timer 0 zaczyna prace od początku, bo gdy nastąpi przepełnienie to ustawiana jest jedynka , a zgodnie z tym zapisem
Cytuj:
The bit TOV0 is set when an overflow occurs in Timer/Counter0. TOV0 is cleared by hardware
when executing the corresponding interrupt handling vector. Alternatively, TOV0 is cleared by
writing a logic one to the flag. When the SREG I-bit, TOIE0 (Timer/Counter0 Overflow Interrupt
Enable), and TOV0 are set, the Timer/Counter0 Overflow interrupt is executed
flagę można ponownie zerować ustawiając programowo jedynkę i ustawić timer aby zliczył do TOP Value,zgodnie z notą
Cytuj:
The setting of this flag is dependent of the WGM02:0 bit setting.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2013, o 08:27 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27346
Lokalizacja: Szczecin
Pomógł: 1041

To jest rejestr flag przerwań i bardzo typowy sposób dla AVRów kasowania tych flag o dziwo przez wpisanie jedynki. Nie ma to nic wspólnego z tym zliczaniem co opisujesz. Po postu kasujemy flagę przerwania.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2013, o 11:54 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Ale przecież ta flaga się kasuje sama, przynajmniej tak mi się wydawało, więc jak to tak naprawdę jest :?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2013, o 12:35 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27346
Lokalizacja: Szczecin
Pomógł: 1041

krafin napisał(a):
Ale przecież ta flaga się kasuje sama, przynajmniej tak mi się wydawało, więc jak to tak naprawdę jest :?


Flaga się kasuje sama jeśli mamy odblokowane i obsługiwane przerwanie. Na pewno więc masz rację. (Pamiętaj też, że jeśli przerwanie nie jest odblokowane to flaga sama by się nigdy nie skasowała - wtedy programista sam musi o to zadbać koniecznie)

ale teraz pomyśl, przyszło przerwanie, flaga się ustawiła, wywołana została procedura obsługi przerwania, flaga została skasowana i TRWA TERAZ obsługa przerwania.... I załóżmy że w międzyczasie zostało zgłoszone kolejne przerwanie w trakcie, czyli flaga znowu się zapaliła. Co mogłoby spowodować, że zaraz po zakończeniu obsługi przerwania i wykonaniu jednego cyklu z programu głównego, ponownie rozpocznie się obsługa przerwania.

Dlatego czasem przy niektórych przerwaniach i nie tylko - dano nam możliwość skasowania flagi, czyli żądania poprzedniego przerwania, które było zgłoszone w trakcie a nam na nim nie zależało ;)

Dlatego czasem kasujemy sobie flagę (oczywiście kasujemy przez wpisanie JEDYNKI) ;) do rejestru flag.

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2013, o 15:25 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Dziękuje za wytłumaczenie, teraz rozumiem, ale może zadam przy okazji jeszcze 2 pytanka:
- jeśli mamy obsługę przerwania zadeklarowaną jako EMPTY_INTERRUPT() to flaga ta zostaje również skasowana?
- czy możemy ustawić tą flagę aby wywołać "ręcznie" przerwanie gdzieś z reszty programu?

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2013, o 15:43 
Offline
Moderator
Avatar użytkownika

Dołączył(a): 03 paź 2011
Posty: 27346
Lokalizacja: Szczecin
Pomógł: 1041

krafin napisał(a):
Dziękuje za wytłumaczenie, teraz rozumiem, ale może zadam przy okazji jeszcze 2 pytanka:
- jeśli mamy obsługę przerwania zadeklarowaną jako EMPTY_INTERRUPT() to flaga ta zostaje również skasowana?



Flaga będzie ZAWSZE kasowana automatycznie gdy zezwolisz na przerwanie ;) ... nie ważne więc czy będzie ono puste, czy empty, czy go nie będzie - flaga zostanie skasowana automatycznie przez procek.


krafin napisał(a):
- czy możemy ustawić tą flagę aby wywołać "ręcznie" przerwanie gdzieś z reszty programu?


jak widzisz przez to zerowanie poprzez wpisanie JEDYNKI nie mamy możliwości ręcznego USTAWIENIA flagi czyli programowego wywoływania przerwań, ale zapoznaj się np z możliwościami np timer0 w ATmega88 gdzie można uzyskać programowo wywoływane przerwanie ;)

ustawiasz sobie zamiast preskalera "External clock source" i pomimo iż pin będzie ustawiony jako wyjście to i tak będzie ten mechanizm działał, więc programowo zmieniając stan na pinie T0 uzyskasz niejako programowe wywołanie przerwania - ale oczywiście tracimy cały timer sprzętowy na ten cel

_________________
zapraszam na blog: http://www.mirekk36.blogspot.com (mój nick Skype: mirekk36 ) [ obejrzyj Kurs EAGLE ] [ mój kanał YT TV www.youtube.com/mirekk36 ]



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 5 lut 2013, o 16:22 
Offline
Użytkownik

Dołączył(a): 26 lip 2012
Posty: 291
Lokalizacja: okolice Opola
Pomógł: 20

Teraz już wszystko rozumiem, dziękuje bardzo.

_________________
sig off ;(



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: 42 ]  Przejdź na stronę Poprzednia strona  1, 2

Strefa czasowa: UTC + 1


Kto przegląda forum

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


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:  
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO