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



Teraz jest 4 gru 2024, o 00:47


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 15 ] 
Autor Wiadomość
PostNapisane: 16 sie 2013, o 19:13 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

Witam

Przeczytałem rozdział o RC5 z książki jednak nie rozumiem na razie działania przerwania ICP ... ale nie o tym temat.

Prosiłbym was panowie, abyście powiedzieli mi co robię źle w moim testowym programie ... Mam pilota Phillipsa i wiem że jest on na 100 % RC5 bo przetestowałem go na kodzie Pana Mirka i działa. Chciałem jednak jak zwykle podejść do zagadnienia nie na zasadzie korzystania z gotowca, tylko na rozwiązaniu problemu w inny ale zrozumiały dla mnie sposób.

Chciałbym zdekodować tego pilota zużywając przerwanie zewnętrzne INT1 i Timer0. Napisałem taki program, który mierzy mi czas od nastąpienia 1 przerwania zewnętrznego do drugiego. Innymi słowami chciałem zmierzyć czas stanu niskiego dla pierwszego półbitu ramki (zaznaczyłem na obrazku o co mi chodzi):

Obrazek

Oto kod:

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


Program ma działać tak, że jak wcisnę np przycisk 1 na pilocie, to nastąpi pomiar czasu trwania pierwszego półbitu ramki i następnie wynik ma się wyświetlić na terminalu. Moje pytanie jest takie: dlaczego w wyniku działania programu otrzymuję wynik:

licznik=335

skoro, czas trwania półbitu dla RC5 trwa 889us ? Czy ustawiłem gdzieś źle timer ? (chciałem co 1us - kwarc 16Mhz) . Co jest nie tak ? ...

Korzystam z EvB v5.1

Pozdrawiam

PS: jak coś jest nie jasne, albo lakonicznie opisane to proszę pytać ;)

_________________
-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2013, o 21:11 
Offline
Użytkownik

Dołączył(a): 02 maja 2012
Posty: 34
Pomógł: 2

Witaj kolego, mi jest ciężko Twój kod zrozumieć, co robisz. Powiem Ci na moim przykładzie na Xmega jak mierzę każdą połówkę bitu.
U Ciebie będzie to logicznie tak samo, tylko inne nazwy rejestrów. Czytaj komentarze i tak staraj się postępować

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


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

Kod jest prosty, czytam za każdym razem stan licznika, ze względu na wydarzenie raz na zbocze opadające a raz na rosnące.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2013, o 21:34 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

Nie znam XMEGA, ale czy ty czasem nie używasz tego przerwania coś ala: TIMER0_CAPT_vect i z tym ICP z AVR ? Bo jeżeli tak, to chodzi mi właśnie o to, aby nie korzystać z tego przerwania. Ładujesz jakąś wartość licznika z jakiejś funkcji TC_GetCaptureA... ja nie wiem jak to zrobić analogicznie na AVR.

Piszesz, że nie rozumiesz mojego kodu. Ja robię tak, czekam na zbocze opadające ... jak nastąpi to odpalam timer .... i czekam na zbocze narastające ... jak nastąpi, wtedy blokuje timer i czytam to co się wpisało do zmiennej "licznik".

PS: ja też twojego kodu nie rozumiem :)

_________________
-



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

Dołączył(a): 02 maja 2012
Posty: 34
Pomógł: 2

fullmoonguy napisał(a):
Ładujesz jakąś wartość licznika z jakiejś funkcji TC_GetCaptureA... ja nie wiem jak to zrobić analogicznie na AVR.
u Ciebie jest ICR1(Atmega32)

fullmoonguy napisał(a):
Piszesz, że nie rozumiesz mojego kodu. Ja robię tak, czekam na zbocze opadające ... jak nastąpi to odpalam timer .... i czekam na zbocze narastające ... jak nastąpi, wtedy blokuje timer i czytam to co się wpisało do zmiennej "licznik"

Dokładnie robię to samo wyżej, tak jak w komentarzach.

fullmoonguy napisał(a):
PS: ja też twojego kodu nie rozumiem

hahaha dobre



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2013, o 22:20 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

ringel napisał(a):
fullmoonguy napisał(a):
Ładujesz jakąś wartość licznika z jakiejś funkcji TC_GetCaptureA... ja nie wiem jak to zrobić analogicznie na AVR.
u Ciebie jest ICR1(Atmega32)


Noo czyli ja nie chce używać przerwania ICR1. ok ?

ringel napisał(a):
fullmoonguy napisał(a):
Piszesz, że nie rozumiesz mojego kodu. Ja robię tak, czekam na zbocze opadające ... jak nastąpi to odpalam timer .... i czekam na zbocze narastające ... jak nastąpi, wtedy blokuje timer i czytam to co się wpisało do zmiennej "licznik"

Dokładnie robię to samo wyżej, tak jak w komentarzach.


Czyli robimy to samo tylko inaczej i mnie nie działa, a tobie działa :) ... tak w ogóle to w wyniku twojego kodu otrzymujesz wartość około tego 889 us ?

_________________
-



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

Dołączył(a): 02 maja 2012
Posty: 34
Pomógł: 2

fullmoonguy napisał(a):
Czyli robimy to samo tylko inaczej i mnie nie działa, a tobie działa ... tak w ogóle to w wyniku twojego kodu otrzymujesz wartość około tego 889 us ?

Widzisz ja musiałem zaadoptować bibliotekę Mirkową do Xmega, dlatego musiałem wiedzieć co robie. Wogóle chciałem resetować licznik po każdym odczycie, w sumie też mi to działało. Także zanim przerobiłem kod, chciałem mierzyć te połówki, jak mi się to udało dopiero uruchomiłem dekodowanie RC5.
Jeżeli chodzi o szer. tej połówki to ja miałem ponad 900us.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2013, o 22:44 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

Więc mógłbyś ponownie przeanalizować mój kod ? Możliwe że błąd jest jakiś trywialny, typu timer źle ustawiony czy jakoś tak. Zmienna "licznik" miała się inkrementować co 1 us .. taki był mój zamysł.

_________________
-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 16 sie 2013, o 23:03 
Offline
Użytkownik

Dołączył(a): 02 maja 2012
Posty: 34
Pomógł: 2

Spróbuje jutro na żywym organiźmie, niestety ale na Xmega ten Twój pomysł przetestować. Dopiero po Twoim ostatnim poście zaczaiłem co Ci biega.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 17 sie 2013, o 18:05 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

Naprawdę, nikt nie wie co jest nie tak w tym kodzie ?

_________________
-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 sie 2013, o 21:31 
Offline
Użytkownik

Dołączył(a): 02 gru 2012
Posty: 237
Lokalizacja: Stróża-Łódż
Pomógł: 7

Użyłem bibl. Mirka aby spróbować wgrać program w A32 ale nie mogę przejść kompilacji.
Obrazek
Pozdrawiam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 18 sie 2013, o 21:39 
Offline
Moderator
Avatar użytkownika

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

Józef 63 napisał(a):
Użyłem bibl. Mirka aby spróbować wgrać program w A32 ale nie mogę przejść kompilacji.


Ewidentnie masz coś nie tak z tą biblioteką do UART'a albo może nie z nią ale z wywołaniem funkcji - i to uart_Init() ... zwróć uwagę na małe i duże litery. Zajrzyj do pliku *.h i sprawdź sobie jakie masz nazwy

albo na razie wyłącz tą bibliotekę jeśli chcesz po prostu RC5 odpalić

_________________
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: 19 sie 2013, o 19:27 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

@Józef 63

Tą bibliotekę do UART'a próbowałem pisać sam i już nie pamiętam czy nazwy funkcji były podobne do tych z biblioteki Pana Mirka czy nie. Najlepiej dodaj sobie tą z książki i jak kompilator gdzieś będzie płakał, to pozmieniaj nazwy funkcji.

Ale problem i tak rozwiązany. Zmieniłem przerwanie na 10 mikrosekundowe (widocznie procedura obsługi przerwania była zbyt długa i nie dało się wszystkiego zrobić co 1us).

--

Tak przy okazji zapytam. Czy jest możliwe obsłużenie tak odbiornika podczerwieni, by przy nadawaniu np pilota RC5 i jednocześnie np RC6 (albo z innego standardu) odbiornik widział tylko sygnał z RC5 a ten drugi ignorował ? Bo teraz tak to zrobiłem, że jak nadaje inny w niezgodnym standardzie, to odbiornik czeka do momentu aż zacznie nadawać tylko pilot RC5. Zastanawiam się, czy to jest w ogóle fizycznie możliwe takie ignorowanie innego pilota w trakcie działania właściwego RC5 ...

_________________
-



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

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

pomyśl chwilę ... odbiornik podczerwieni dostaje dwa sygnały naraz, na wyjściu do procka leci jakaś sieczka .... i jak chcesz sobie to ignorować ?

_________________
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: 20 sie 2013, o 15:55 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 09 mar 2013
Posty: 64
Pomógł: 0

Racja, chciałem się tylko upewnić, dziękuje za odpowiedź.

_________________
-



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 21 sie 2013, o 05:19 
Offline
Użytkownik

Dołączył(a): 25 lip 2013
Posty: 2587
Pomógł: 128

Tak jak pisal Mirek, nie da sie ignorowac, bo w eterze. Masz zmieszane dwa sygnaly-czyli jak za sumatorem. Jak by byly o nosnych o wiekszej różnicy to można je wycinac 'optycznie' filtrem lub programowo

Sent from my mobile



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: 15 ] 

Strefa czasowa: UTC + 1


Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zidentyfikowanych użytkowników i 2 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:  
cron
Sitemap
Technologię dostarcza phpBB® Forum Software © phpBB Group phpBB3.PL
phpBB SEO