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



Teraz jest 29 gru 2024, o 20:12


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 42 ]  Przejdź na stronę 1, 2  Następna strona
Autor Wiadomość
 Tytuł: RC5 dwa pytanka
PostNapisane: 22 sie 2012, o 00:18 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

Witam,
Ogólną idę działania dekodera RC5 pojąłem jednak jest parę kwestii których nie rozumiem:
1. w pliku ir_decode.c jest zawarty blok warunkowy
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Modulo z rc5cnt pomimo tego, że jest równe 0 już przy drugim bicie startu, to jest równe 0 tylko 9 razy a do odczytania jest 12 bitów tak więc jak to działa?

2. W pliku ir_decode.h zawarta jest jedna bardzo dziwna dyrektywa
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


odpaliłem Windows'owy kalkulator i nie wiem co o tym myśleć, ponieważ nie wiem co mam osiągnąć za wynik. Co prawda napisałeś komentarz
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

otrzymuję wynik lecz nie wiem jak go wykorzystać a chciałbym wiedzieć co oznacza otrzymany wynik ponieważ aby program działał na mojej ATMedze 644p muszę go trochę przerobić
Z góry dzięki za pomoc



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2012, o 09:07 
Offline
Uzytkownik zasłużony dla forum.atnel.pl
Avatar użytkownika

Dołączył(a): 16 lip 2012
Posty: 2088
Lokalizacja: Leżajsk / Kraków
Pomógł: 411

MIN_HALF_BIT, MAX_HALF_BIT i MAX_BIT to stałe wykorzystane w programie, które są porównywane z impulsami które zliczył timer pracujący w trybie przechwytywania, czyli inaczej pomiaru szerokości impulsu. Ich wartości wyliczane są w oparciu o makro ir_micro_s(num). To makro sprytnie wylicza te stałe na podstawie liczby us (np. 889us), a wykorzystuje do tego częstotliwość taktowania mikrokontrolera (ma być ustawiona w zależności od kwarcu/oscylatora jakiego używasz) i stopień podziału preskalera dla timera1. Właściwie to nic nie musisz robić tylko dobrze wpisać te wartości.

A odnośnie dekodowania RC5 to dlatego masz %2, bo 889us to tylko pół bitu informacji, bo cały składa się z 1 i 0 lub 0 i 1.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2012, o 09:10 
Offline
Moderator
Avatar użytkownika

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

eeeeh kolega Krauser mnie ubiegł ;)

------------------------ [ Dodano po: 20 minutach ]

infa08 napisał(a):
otrzymuję wynik lecz nie wiem jak go wykorzystać a chciałbym wiedzieć co oznacza otrzymany wynik ponieważ aby program działał na mojej ATMedze 644p muszę go trochę przerobić
Z góry dzięki za pomoc


Ja tylko może tutaj dodam, że makro tak sobie skonstruowałem aby na etapie kompilacji (a nie w programie) obliczane były odpowiednie wartości tyknięć timera w zależności od F_CPU i preskalera, żebym mógł w kodzie posługiwać się już wygodnie mikrosekundami....

zatem mogę sprawdzać czy upłynęło np 200us jeśli wpiszę

Kod:
if( PulseWidth > ir_micro_s( 200 ) ) .....


zamiast za każdym razem przeliczać sobie w głowie ile razy musi tyknąć timer w czasie 200us i wpisywać zawsze jakąś inną wartość..... Tzn żebyś to jeszcze lepiej zrozumiał to podpowiem, że przy danej częstotliwości taktowania i preskalerze można sobie pięknie tak dobrać parametry timera żeby 1 tyknięcie trwało 1us prawda ? czyli mógłbym pisać:

Kod:
if( PulseWidth > 200 ) .....


po co mi tu jakieś makro ???? ;)

no ale teraz wyobraź sobie że tą bibliotekę nagle potrzebujesz odpalić na swoim innym procku w którym masz całkiem inny kwarc np 20MHz, to co od nowa miałem sobie przypominać jak ja to obliczałem ??? a przecież z przyjemnością bym używał takiej biblioteki gdybym nie musiał sobie zawracać tym głowy niezależnie od taktowania prawda ?

dlatego raz na początku przy pisaniu biblioteki postanowiłem że potraktuję F_CPU jako zmienną i w takim makrze sobie będę na jej podstawie przeliczał te tyknięcia zawsze do 1us .... dzięki temu założony efekt się udał i można z biblioteki korzystać praktycznie na dowolnym procku AVR i dowolnej częstotliwości taktowania.

Zawsze mnie wkurzało kiedyś gdy na samym początku szukałem gotowca w necie na dekodowanie RC5, właśnie że ktoś np napisał jakąś fajną obsługę a pod spodem dopisek:

Cytuj:
biblioteka napisana i obliczona dla taktowania 8MHz.


no i ZONK bo ja potrzebowałem aby to pracowało przy kwarcu 11,0592MHz ..... i jak teraz ??? mam rozgryzać każdą linię biblioteki tego autora? dojść sposobu jego rozumowania? poprawić sobie ją? czasem się to udawało ale często nie. Zawsze było z takim czymś dużo zabawy......

dlatego jak ja teraz tworzę sobie biblioteki to staram się dodawać tego typu makra, które uniezależnią mnie od wartości F_CPU ;) i nie będę musiał nawet wracać myślami do tego co sam wcześniej napisałem - MA DZIAŁAĆ ;)

i do takiego podejścia zachęcam.

z podobnym podejściem ale nieco innym makrem spotkasz się w książce w rozdziale o sterowaniu fazowym 230V .... warto poczytać chociaż nawet jeśli nie będziesz robił tego ćwiczenia i przeanalizować także tamto makro ok ? ;)

_________________
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: 22 sie 2012, o 14:14 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

czyli wynikiem tego makra ma być cyfra 1?

zakładam, że F_CPU = 20MHz i obliczamy MIN_HALF_BIT to wynik makra przy preskalerze:
1 = ((889 - 200)*20) = 13 780
8 = 13780/8 = 1 722
64 = 13780/64 = 215
256 = 13780/256 = 53
1024 = 13780/1024 = 13

Minimalna długość połówki bitu to ok. 689 us, czyli jeżeli dobrze myślę to przy preskalerze 1024 czas ok. 689 us to ok. 13 impulsów Timera 1?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2012, o 16:23 
Offline
Moderator
Avatar użytkownika

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

NO DOKŁADNIE TAK ;) .... jak więc widzisz jesteś nie tylko uniezależniony od częstotliwości taktowania ale też od preskalera - możesz zastosować dowolny byle wynik nie przekroczył zakresu 0-65535 ;)

tyle że preskalera 1024 bym tu nie używał ponieważ niepotrzebnie stracimy na dokładności "co nieco". Optymalnie dobrany preskaler to 8 albo 64.

_________________
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: 22 sie 2012, o 17:15 
Offline
Użytkownik

Dołączył(a): 18 lut 2012
Posty: 50
Pomógł: 0

Czyli czym większy wynik tym dokładniejsze obliczanie czasu?
A jak ta cała obsługa tego przerwania się ma do płynności programu? bo kiedyś uruchomiłem ten timer ale program spowalniał mi procesor i zrezygnowałem z tego timera
Do odczytywania kodu RC5 jest potrzebna jak największa dokładność to dlaczego nie używamy preskalera 1?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 22 sie 2012, o 17:29 
Offline
Moderator
Avatar użytkownika

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

Panie kolego - stwierdzenie "TEN TIMER SPOWALNIAŁ MI PROCESOR", pokazuje TYLKO jedno, kolega jeszcze nie ma doświadczenia w pisaniu oprogramowania - ale nie ma co się martwić .... można nabrać tego doświadczenia i to każdy z nas ;) ..... tylko trzeba ćwiczyć i poczytać troszkę. Dlatego ja m.in w swojej pierwszej książce STAWIAM na naukę prawdziwego programowania, pokazując podejście do tworzenia tzw FUNKCJI NIEBLOKUJĄYCH, ale także tłumaczę jak pisać przerwania aby - nie spowalniały jak to nazwałeś procesora ;)

Pewnie popełniałeś TAK podstawowe i kardynalne błędy, że nie ma co się dziwić iż miałeś takie efekty. Tylko że widzisz - wiele różnych kursów internetowych albo książek do C dla mikrokontrolerów pokazuje TYLKO jak posługiwać się podstawowymi poleceniami języka C w celu wysterowania pinów, czy modułów procesora. I tu jest podstawowy błąd....

Ja natomiast staram się pokazać JAK PODEJŚĆ do programowania przez duże P. Nie piszę tego żeby się chwalić - po prostu staram się podzielić w prosty sposób swoją wiedzą w tym zakresie i w taki sposób aby mogło to być zrozumiałe na prawdę dla POCZĄTKUJĄCYCH. Zatem tytuł pierwszej mojej książki to nie jest żaden chwyt reklamowy jak w przypadku innych wydawnictw, które piszą że książka nauczy cię czegoś od podstaw - a potem początkujący - w ogóle nie wie o co chodzi gdy ją bierze w łapki:

A ponieważ ostatnio na nasze forum zaglądają osoby, które już się "poparzyły" takimi publikacjami niby dla początkujących i nie miały w ręku tej książki:

"Mikrokontrolery AVR Język C Podstawy programowania"

http://atnel.pl/mikrokontrolery-avr-jezyk-c.html

to dlatego ją polecam....

A jeśli tak się składa że ją masz - to poczytaj ostatnie rozdziały np o SuperDebounce czy "Wstęp do systemów czasu rzeczywistego" .... zobacz jak można pisać programy będą nawet początkującym totalnie.....

a jeśli coś będzie niejasne to dopytaj tu na forum .... po to zostało ono powołane do życia.

Bo w przeciwnym wypadku - będziemy się poruszać (nie mając tej pozycji przed sobą) tylko w oparach domysłów i domniemań że coś tam komuś działało a mi nie działa, a może raz działało ale innym razem nie ..... itp itd itp

------------------------ [ Dodano po: 2 minutach ]

sorki dopiero teraz zobaczyłem na początek postu i widzę że ją posiadasz - a zatem najlepsze jeszcze przed tobą w kolejnych rozdziałach ;) tylko czytaj po kolei nie przeskakując z rozdziału na rozdział i wykonuj po drodze wszystkie ćwiczenia OK ?

_________________
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: 27 wrz 2012, o 13:08 
Offline
Nowy

Dołączył(a): 27 wrz 2012
Posty: 3
Pomógł: 0

Odnośnie pytania zadanego przez infa08. Nie do końca rozumie zasady działania bloku warunkowego if((TCCR1B & (1<<ICES1))) skoro na początku przerwania w tym rejestrze bit ICES1 zmieniany jest na przeciwny więc zmienna IrData powinna na przemian przyjmować wartości 0101 itd. a to dla mnie nie ma sensu. Prosze o jakieś rozsądne wytłumaczenie.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 wrz 2012, o 14:16 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

Chodzi o to, że przy kodowaniu manchester, w połowie bitu jest zmieniany na przeciwny. Przy 1 w środku będzie zbocze opadające, przy 0 narastające. Dlatego badanie na jaki rodzaj zbocza ma zareagować pozwoli podjąć decyzję jaki bit właśnie nadlatuje i jaki bit 0 czy 1 ma być wpisany do aktualnie obrabianej ramki.

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 wrz 2012, o 16:18 
Offline
Nowy

Dołączył(a): 27 wrz 2012
Posty: 3
Pomógł: 0

Według ramki z książki Pana Mirka ja to rozumuje tak. Przerwanie następuje na zboczu opadającym 1 bitu, w TCCR1B bit ICES1 ustawiany jest na 1, rc5cnt na 1 i wychodzimy z przerwania. Na początku 2 bitu wystepuje przerwanie bit ICES1 w TCCR1B wynosi 1 (zbocze narastające). Bit ICES1 w TCCR1B zostaje zamieniony na 0 dlatego bit w IrData przyjmuje wartość 1 (tak jak bit drugi w ramce czyli 1) wychodzimy z przerwania. W połowie drugiego bitu przerwanie bit ICES1 w TCCR1B = 0 (zbocze opadające) bit w TCCR1B zamieniany jest na 1 i IrData =1 i tu mi nie pasuje bo 3 bit Toggle 0 a mi wychodzi 1 rozumując tak dalej nic się nie zgadza. Prosze o pomoc w zrozumieniu tego pliku programu.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 27 wrz 2012, o 20:59 
Offline
Moderator
Avatar użytkownika

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

Bit Toggle wcale nie jest zawsze 0 albo zawsze 1 ;) on się zmienia po każdym wciśnięciu klawisza - weź to pod uwagę.

_________________
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: 27 wrz 2012, o 21:44 
Offline
Nowy

Dołączył(a): 27 wrz 2012
Posty: 3
Pomógł: 0

Może troche namieszałem swoim poprzednik pytaniem. Ale chodzi mi głownie o to że jeżeli nastąpi zbocze opadające w pierwszym bicie ramki i wygeneruje się przerwanie to jeżeli w procedużę obsługi przerwania wystąpi zmiana zbocza na przeciwne to po wyjściu z przerwania następne przerwanie nastąpi zaraz na początku drugiego bitu startu (zbocze narastające).



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 28 wrz 2012, o 07:08 
Offline
Użytkownik

Dołączył(a): 24 sty 2012
Posty: 1469
Pomógł: 56

mar000 napisał(a):
Może troche namieszałem swoim poprzednik pytaniem. Ale chodzi mi głownie o to że jeżeli nastąpi zbocze opadające w pierwszym bicie ramki i wygeneruje się przerwanie to jeżeli w procedużę obsługi przerwania wystąpi zmiana zbocza na przeciwne to po wyjściu z przerwania następne przerwanie nastąpi zaraz na początku drugiego bitu startu (zbocze narastające).

Weź kartkę, i rozpisz sobie w tabelce co się dzieje z każdym nadchodzącym przerwaniem. W skrócie zabaw się w mikroprocesor. Ja właśnie tak zrobiłem i wszystkko się wyjaśniło. Sprawdź każdą linię przerwania. Inaczej nikt Ci tego do głowy nie włoży... ;)

_________________
Jestem początkujący i moje porady mogą być błędne



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 15:38 
Offline
Użytkownik

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

Witam , mam pytanie odnośnie odbioru kodu RC5, gdyż chcę napisać własną obsługę. Chciałem to zrobić na przerwaniu od timera 0 i przerwaniu zewnętrznym . Znalazłem jakiś przykładowy kod , który działa w ten sposób , iż zaczyna przerwanie zew. na zboczu opadającym,przenosi nas do case 1 w switchu, gdzie załączone jest przerwanie od timera 0, a wyłączone przerwanie zewn., następnie zwiększana zmienna etap_odbioru, co prowadzi nas do kolejnego przypadku, gdzie jest warunek, jeżeli trwa nadawanie (stan niski) i upłynęła 3,4 czasu tj. 222 us (w przerwaniu jest inkrementowana zmienna F_222 oraz za każdym razem ładowany rejestr TCN0 ,tak aby Timer0 generował przerwanie co 222us),czekamy na następny bit startu i uruchamiamy przerwanie zewn. I co dalej to jest moje pytanie, gdyż nigdzie nie widzę linijki wył. przerwanie od Timera 0, tylko sprawdzenie czy czas krótszy niż 444us lub w case 3 (nie wiem co się dzieje zmiennej F_222 ma wartość 2 i iloczyn bitowy z we_ir_1 i skok pod 8). Najlepiej rzucę kod
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Ogólnie zatrzymałem się na detekcji zbocza opadającego pierwszego bitu startu, później sprawdzenie czasu 2 połowy 1 bitu. Rejstry wrzuciem z atmegi 644p a czas ustawiłem na 8Mhz. Program się z kompilował , tylko nie zaświeciły się ledy , informujące o komendzie, podłączyłem sobie do leda port B1 cały czas się świeci. Proszę o algorytm na zdekodowanie RC 5 (przerwanie zew. i od Timera) i spojrzenie co jest nie tak z tym kodem. Od nr 3 do 8 nie wiem co sie dzieje , po co ta zmienna F_2.

------------------------ [ Dodano po: 13 minutach ]

Jak dla mnie to trochę niechlujny ten kod , może się mylę. Wzorem są oczywiście kody Pana Mirka, tak a propos nie do końca rozumiem tej linijki
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ICR1H and ICR1L – Input Capture Register 1
The Input Capture is updated with the counter (TCNTn) value each time an event occurs on the
ICPn pin (or optionally on the Analog Comparator output for Timer/Counter1). The Input Capture
can be used for defining the counter TOP value.
Znalazłem taką tylko notkę w swojej atmedze 644p. Za każdym razem jak generuje się przerwanie na ICP od zbocza wpisywana jest warość z licznika, która definiuje nam szerokość (czas połówki bitu). Ale to tylko takie podrzędne pytanie, bardziej chodzi mi o algorytm na zdekodowanie RC5.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 19:10 
Offline
Użytkownik

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

Ja tylko podpowie, że biblioteka mirka może być bardzo łatwo przerobiona, na przerwanie zewnętrzne czy PCINT, dla np. takich procków jak attiny13, które nie posiadają ICP, timer może sobie cały czas tykać do naszego innego celu, ważne aby robił to na okrągło, i aby czas który odmierza (jest to też ważne w bibliotece mirka, a nie wspominał o tym, a taka sytuacja wystąpi gdy mamy za duży zegar i/lub za mały prescaler) był co najmniej taki jak czas jednej ramki RC5

_________________
sig off ;(



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 31 sty 2013, o 22:04 
Offline
Użytkownik

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

A kolega może spojrzeć i objaśnić ten kod Mirkowy wyżej i jeszcze tego posta z przerwaniem zewn. i timerem w switchu, ogólnie w krokach powiedzieć jak do tego podejść w przypadku wykorzystania przerwania zew. i timera do odbioru RC5. Rozumiem ustawienie przerwania zewn, na konkretne zbocze, pierwsze będzie opadające, gdyż dwa pierwsze będą to bity startu o wartości jeden. Toteż ustawiam sobie przerwanie na to zbocze, później wiem że jestem w drugiej połowie 1 bitu startowego, załączam przerwanie od Timera wyłączam przerwanie zew., mierzę czas drugiej połowy , mogę sobie ustawić tak jak Pan Mirek min. max. połowa bitu i nie przekroczenie czasu całego bitu. Później , będę czekała na kolejne przerwanie od zbocza opadającego, 2 bit startu i zrobię te same procedury co w 1 bicie startu. Uwaga czy muszę to robić w procedurach przerwań , czy tylko wrzucać przykładowe zmienne , żeby wiedzieć czy ono przyszło czy nie, tak jak to jest w kodzie z switchem. Po dwóch bitach startu wystąpi bit Toggle [ będzie miał wartość przeciwną w przypadku wciśnięcia przycisku na pilocie, wartość początkowa to 1-wciśnęlismy przycisk na pilocie ], czyli również czekamy na zbocze opadające i to samo co w 2 bitach startu. I tu się moje rozumowanie kończy, bo później będą bity adresu 5 i bity komendy 6. Bit MSB tego adresu może być różny 0 lub 1, a ja mam przerwania zew. na zbocze opadające,czy teraz muszę je zmienić (czy teraz po rozpoznaniu 3 bitów mogę już tego przerwania nie wykorzystywać), a może w ogóle mierzyć teraz czasy kolejnych bitów i wpisywać je do jakiejś zmiennej , tu zaczynam się mieszać.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 10:47 
Offline
Użytkownik

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

Witam, może ktoś odpowiedzieć,bo nie widzę chętnych do odpowiedzi.
Pozdro



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

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

paweł napisał(a):
A kolega może spojrzeć i objaśnić ten kod Mirkowy wyżej i jeszcze tego posta z przerwaniem zewn. i timerem w switchu, ogólnie w krokach powiedzieć jak do tego podejść w przypadku wykorzystania przerwania zew. i timera do odbioru RC5.

Przerwanie zewnętrzne wykorzystujesz tak jak przerwanie ICP w którym zmieniasz co chwilę zbocza - zobacz jak to jest zrobione i opisane w książce, bo to co dalej piszesz....

paweł napisał(a):
Rozumiem ustawienie przerwania zewn, na konkretne zbocze, pierwsze będzie opadające, gdyż dwa pierwsze będą to bity startu o wartości jeden. Toteż ustawiam sobie przerwanie na to zbocze, później wiem że jestem w drugiej połowie 1 bitu startowego, załączam przerwanie od Timera wyłączam przerwanie zew., mierzę czas drugiej połowy , mogę sobie ustawić tak jak Pan Mirek min. max. połowa bitu i nie przekroczenie czasu całego bitu.


Ma się trochę nijak do tego co jest w niej opisane :( .... Jeszcze raz przeanalizuj dokładnie najpierw ten kod .... zrób z nim własne próby, zrozum go do samego końca. Przecież w zależności od potrzeb w trakcie przerwania zmieniana jest właśnie REAKCJA na zbocze raz opadające a raz na narastające. I taką funkcjonalność masz też w każdym przerwaniu INTx

Później to już trzeba użyć jakiegoś timera - może być 8-bitowy ale trzeba dobrać odpowiednią podstawę jego czasu aby móc odmierzać całe odcinki półbitów. W związku z powyższym prawie cała procedura przeniesie się do procedury obsługi przerwania INTx ale troszkę można też dać do przerwania timera.

_________________
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: 1 lut 2013, o 13:11 
Offline
Użytkownik

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

Mała sprostowanie , ja analizowałem kod na przerwaniach zewnętrznych i timera z wykorzystaniem switcha, który podałem wcześniej , nie ten z ksiązki.Poza tym miałem również pytanie o tę linijkę kodu z książki:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

oraz pytanie o algorytm odbioru RC5 z wykorzystaniem przerwania zewn. i timera. Mozę za dużo pytań naraz.
Dzięki.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 1 lut 2013, o 13:40 
Offline
Użytkownik

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

Tym kodem odmierzasz czas pomiędzy kolejnymi przerwaniami - dzięki temu wiemy czy mamy 1 czy 0, poczytaj dokładnie choćby na wiki o kodowaniu manchaster a mam nadzieję ci się to bardziej rozjaśni, ponieważ jeśli nie zrozumiesz jak są przesyłane bity to obsługi RC5 tym bardziej nie zrozumiesz.

_________________
sig off ;(



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

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

paweł napisał(a):
Mała sprostowanie , ja analizowałem kod na przerwaniach zewnętrznych i timera z wykorzystaniem switcha, który podałem wcześniej , nie ten z ksiązki.Poza tym miałem również pytanie o tę linijkę kodu z książki:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

oraz pytanie o algorytm odbioru RC5 z wykorzystaniem przerwania zewn. i timera. Mozę za dużo pytań naraz.
Dzięki.


Na prawdę jak dla mnie za duże zamieszanie w twoich pytaniach ....

Przede wszystkim w książce jest po kolei wszystko opisane - strona 314

odnieś się do tego i do kodu i zadaj najpierw pytania czego tu nie rozumiesz - bo nagle piszesz o jakimś switch() we własnym kodzie, który starasz się napisać - jak widzę nie rozumiejąc tego który masz pod ręką - no to jak ?

Proponuję na spokojnie - przeczytaj jeszcze raz ten rozdział od początku, zanotuj to co jest nie zrozumiałe i zadaj w jakichś punktach kilka pytań - a nie tak chaotycznie bo - nie wiem nawet jak odpowiedzieć/podpowiedzieć :(

_________________
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: 1 lut 2013, o 17:31 
Offline
Użytkownik

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

Ok. to zacznę od kodu z książki, rozrysowałem sobie tabele i bawię się w uC.
Pytanie 1. Co będzie po 1 przerwaniu w zmiennej PulseWidth, gdyż nie rozumiem tego zapisu. Tzn. znalazłem notę Atmega 644P i jest napisane,
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ICR1H and ICR1L – Input Capture Register 1
The Input Capture is updated with the counter (TCNTn) value each time an event occurs on the
ICPn pin (or optionally on the Analog Comparator output for Timer/Counter1). The Input Capture
can be used for defining the counter TOP value.
Czyli , że w chwili zajścia zdarzenia (przerwanie) do ICR przepisywana jest wartość licznika timera.
Czyli, od chwili wciśnięcia przycisku pilota do przerwania na zboczu opadającym obliczono czas polówki 1 bitu. W zmiennej LastCapture będzie 0.
Czyli w 1 przerwaniu obie te zmienne będą miały te same wartości.
A w następnych.....
Pytanie 2. Z moich obliczeń wynika , że w drugim przerwaniu od zbocza narastającego będzie w zmiennej Irdata wartość 0,gdyż po wejściu do procedury przerwania zmieniamy na przeciwny bit odpowiedzialny za przerwanie w rejestrze TCCR1B od ICP, stąd będzie tam wartość 0, co się zgadza gdyż jesteśmy w drugim bicie startu i czekamy na zbocze opadające. Tym samym po operacji modulo, gdyż jesteśmy na początku 2 bitu nie wykona się warunek, będzie to iloczyn bitowy, którego wartość logiczna będzie równa 0(fałsz). Warunek będzie tylko prawdziwy . gdy będzie zbocze narastające, chyba że wartość będzie dopiero załadowana po wykonaniu przerwania,wtedy będzie w zmiennej Irdata wartość jeden co odpowiada wartości drugiego bitu.
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Zmęczyłem się tym pisaniem :D ,już jaśniej nie umiem przedstawić swoich pytań.



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

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

Może i się zmęczyłeś - ale teraz widzę pytania lepiej i już staram się odpowiedzieć ;)

paweł napisał(a):
Ok. to zacznę od kodu z książki, rozrysowałem sobie tabele i bawię się w uC.
Pytanie 1. Co będzie po 1 przerwaniu w zmiennej PulseWidth, gdyż nie rozumiem tego zapisu. Tzn. znalazłem notę Atmega 644P i jest napisane,
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

ICR1H and ICR1L – Input Capture Register 1
The Input Capture is updated with the counter (TCNTn) value each time an event occurs on the
ICPn pin (or optionally on the Analog Comparator output for Timer/Counter1). The Input Capture
can be used for defining the counter TOP value.
Czyli , że w chwili zajścia zdarzenia (przerwanie) do ICR przepisywana jest wartość licznika timera.
Czyli, od chwili wciśnięcia przycisku pilota do przerwania na zboczu opadającym obliczono czas polówki 1 bitu. W zmiennej LastCapture będzie 0.
Czyli w 1 przerwaniu obie te zmienne będą miały te same wartości.


W pierwszym przerwaniu nas w ogóle nie interesuje co będzie w PulseWidth, bo po co ? ale za to w pierwszym przerwaniu zapamiętamy aktualny stan rejestru zliczającego ICR1 w zmiennej LastCapture - niech to będzie dla przykładu wartość pierwsza lepsza z gruszki 10000. I to jest KLUCZ! ;)


paweł napisał(a):
A w następnych.....


Więc jak przyleci następne przerwanie to pomyśl sobie, PulseWidth = ICR1 - LastCapture; spowoduje, że zmienna PulseWidth będzie wynosiła DOKŁADNIE tyle ile trwał IMPULS od ostatniego przerwania do bierzącego (następnego) bo teraz ICR1 - LastCapture. Zakładając więc że teraz IRR1 = 10800, to PulseWidth będzie = 800. A skoro przeliczamy tyknięcia na mikrosekundy to co ? nie widzisz ? akurat mamy np czas połówki bitu 800us. I tak dalej i tak dalej

Najpierw postaraj się to zrozumieć - bo nie wiem zupełnie dlaczego - część ludzi wyobraża sobie że ta wartość ICR1 będzie się jakoś tam zerować .... może i ty tak myślisz. Nie ona w kółko sobie lata jak dziki koń, od 0 do 65535 i zeruje się TYLKO przy przepełnieniu

_________________
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: 1 lut 2013, o 18:10 
Offline
Użytkownik

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

Cytuj:
Najpierw postaraj się to zrozumieć - bo nie wiem zupełnie dlaczego - część ludzi wyobraża sobie że ta wartość ICR1 będzie się jakoś tam zerować .... może i ty tak myślisz. Nie ona w kółko sobie lata jak dziki koń, od 0 do 65535 i zeruje się TYLKO przy przepełnieniu


Wydaje mi się, że w ICR1 wartość jest aktualizowana przy zmianie stanu na ICP (zależnie od bitu ICES1), a przepełniać w kółko się będzie TCNT1.

_________________
sig off ;(



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

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

No tak , pięknie wytłumaczone, timer 16 bitowy z przerwaniem od ICP , czyli uruchomienie przerwania a Timer cały czas liczy w kółko jak dziki, aż do przepełnienia i od początku. Tylko z chwila przerwania wpisywana jest wartość do ICR1. Mam nadzieję , że takie dywagacje przydadzą się w przyszłości autorowi kolejnej książki, zawsze będzie mógł popatrzeć jak rozumują ci delikatnie mówiąc ci początkujący (nie powiem słabsi intelektualnie). To taka dygresja , a drugie pytanie, może coś źle liczę.



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

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

krafin napisał(a):
Cytuj:
Najpierw postaraj się to zrozumieć - bo nie wiem zupełnie dlaczego - część ludzi wyobraża sobie że ta wartość ICR1 będzie się jakoś tam zerować .... może i ty tak myślisz. Nie ona w kółko sobie lata jak dziki koń, od 0 do 65535 i zeruje się TYLKO przy przepełnieniu


Wydaje mi się, że w ICR1 wartość jest aktualizowana przy zmianie stanu na ICP (zależnie od bitu ICES1), a przepełniać w kółko się będzie TCNT1.


Tak - oczywiście użyłem zbyt dużego skrótu myślowego - ale jak widać pytający już zaskoczył. Nie mniej jednak dziękuję za słuszne sprostowanie.

------------------------ [ Dodano po: 3 minutach ]

paweł napisał(a):
No tak , pięknie wytłumaczone, timer 16 bitowy z przerwaniem od ICP , czyli uruchomienie przerwania a Timer cały czas liczy w kółko jak dziki, aż do przepełnienia i od początku. Tylko z chwila przerwania wpisywana jest wartość do ICR1. Mam nadzieję , że takie dywagacje przydadzą się w przyszłości autorowi kolejnej książki, zawsze będzie mógł popatrzeć jak rozumują ci delikatnie mówiąc ci początkujący (nie powiem słabsi intelektualnie). To taka dygresja , a drugie pytanie, może coś źle liczę.


Nie wszystko da się w książce tak prosto przedstawić, myślę że to zrozumiesz jak kiedyś sam napiszesz książkę (czego ci oczywiście szczerze życzę - to żadne naigrywanie się)

Odnośnie drugiego pytania to poniekąd odpowiedziałem ci wyżej a ty w rozważaniach lecisz za szybko - jak ten Timer taktowany 1MHz ;) .... w drugim przerwaniu PulseWidth będzie miało czas trwania półbitu, dlatego że chyba nie zauważasz albo nie chcesz zauważyć że w każdym przerwaniu zmieniane jest zbocze wyzwalające to przerwanie ... więc nie będzie tam żadne ZERO (skąd taki pomysł?)

_________________
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: 1 lut 2013, o 19:29 
Offline
Użytkownik

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

Proszę o chwilę cierpliwości,widzę że w każdym przerwaniu jest zmieniane zbocze tylko, że....1 przerwanie było od zbocza opadającego, w tym przerwaniu ustawiamy kolejne na narastające, czyli drugie od narastającego a w nim ustawiane na opadające, trzecie od opadającego itd kodowanie bifazowe. Ale gdy wejdę w przerwanie drugie od zbocza narastającego zaraz na początku mam w rejestrze TCCR1B operację xor, która zmienia nam wartość bitu CSE1 na 0 (1->1 =0), tym samy w rejestrze mamy 0 . A w następnej linijce , gdy minęła 1 połowa bitu jest warunek if
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
, który się moim pewnie błędnym zdaniem nie wykona, chodzi o tę linijkę.



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

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

staraj się pisać dokładniej - co to za bit CSE1 ??? czy chodziło ci o CSx czyli od preskalera ? jeśli tak to POKAŻ mi gdzieś pan wyczytał że wyzerowanie preskalera zeruje licznik?

chyba że chodziło ci o ICES1 - to tym bardziej skąd takie kosmiczne POMYSŁY się biorą ? co ma wspólnego zmiana konfiguracji zbocza wyzwalania przerwania z jakimś tam zerowaniem licznika - no weź przestań ;) .... albo jak mówię pokaż mi gdzie to wyczytałeś bo na pewno nie w mojej książce :(

_________________
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 13:36 
Offline
Użytkownik

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

Tak, źle napisałem bit ICES1 miał być, ja nic nie pisałem o zerowaniu licznika,tylko o zmiennej Irdata, w której będą przechowywane bity adresu, komendy i toogle. Chodziło mi o to co koledze marro
Cytuj:

Według ramki z książki Pana Mirka ja to rozumuje tak. Przerwanie następuje na zboczu opadającym 1 bitu, w TCCR1B bit ICES1 ustawiany jest na 1, rc5cnt na 1 i wychodzimy z przerwania. Na początku 2 bitu wystepuje przerwanie bit ICES1 w TCCR1B wynosi 1 (zbocze narastające). Bit ICES1 w TCCR1B zostaje zamieniony na 0 dlatego bit w IrData przyjmuje wartość 1 (tak jak bit drugi w ramce czyli 1)


Tu sie niezgodze bo warunek w if po sumie modulo jest to iloczyn bitowy, a skoro bit ICES1 w TCCR1B JEST 0 to jak Irdata może być 1.



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

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

Po 1. Co ma bit ICES1 do tego co trafi do Irdata? To są 2 różne rzeczy. Warunek
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.

Po 2. Suma modulo jest po to aby sprawdzanie bitu odbywało się co 2 przerwanie - POCZYTAJ o kodowaniu MANCHASTER!

_________________
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ę 1, 2  Następna strona

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 11 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