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



Teraz jest 30 sty 2026, o 06:42


Strefa czasowa: UTC + 1





Utwórz nowy wątek Odpowiedz w wątku  [ Posty: 13 ] 
Autor Wiadomość
PostNapisane: 10 maja 2014, o 22:23 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Po przeczytaniu BB na temat własnego pilota IR napisałem sobie taki kodzik. Oczywiście nie działa :) . Ja tak to rozumiem. Jakimś licznikiem generuje sobie częstotliwość 36kHz - ja posłuzyłem się Timerem 2 w mojej Atmedze8. 8Mhz, preskaler 8 i ORC2 o wartości 26 daje nam taką częstotliwość (MKVRClac podaje błąd na poziomie 2,88%). Następnie utworzyłem drugi licznik zliczający każdą us - potrzebny do obliczeń połówek bitów. Na końcu utworzyłem funkcję send(); a w niej na sztywno jedną ramkę rc5 zwierającą w sobie komendę o wartości 129.

Rozumiem ze pisząc TCCR2 |= (1<<COM20); powoduje jakby zapalenie sie diody IR podłączonej do pinu OCR2 (PB3) w atmedze 8, prawda? - zapala sie, ale miga z częstotliwością 36 kHz, co jest odczytywane wraz z zależnością czasową jako np. "1"

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


Patrząc np. aparatem, widze ze dioda wogóle nie zapala się, a jest podłączona anodą do pinu OCR2. Próbowałem tez uzyc _delay_us(899); niestety tez nie działa, dioda nie zapala sie :/



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 10 maja 2014, o 23:20 
Offline
Moderator
Avatar użytkownika

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

To ty najpierw sobie podłącz zwykłą diodę LED żeby nie patrzeć aparatem i najpierw doprowadź do tego żeby dioda migała .... zamiast utrudniać sobie życie patrzeniem przez aparat ;) ... tak się to zaczyna robić

_________________
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: 11 maja 2014, o 00:12 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

No tak, no wiec coś sie przesyła.. w odbiorniku wyswietlają sie jakies losowe komendy.

Nie wiem, mam mnóstwo pytn, no dziwnych... bo mi sie nie zdarzyło takie coś. Funcja one(); nie działa - kurcze zwykłe właczanie wyłaczanie diody.. no nie działa...ale jesli całta fukcje przekopiuje do pętli while to działa.. tak samo funkcja send(); działa tylko przed komendą sei();.... no dziwaczne.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 maja 2014, o 16:07 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Próbue sobie znalesc gdzie jest błąd i tak...

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

Nie rozumiem , co jest powodem ze ta funkcja sie nei wykonuje, juz na samym poczatku sie blokuje bez zadnego w sumie rozkazu. Nie wiem co się dzieje - czemu taka reakcja jest. Przecież przy wejsciu w fukncje one(); na początku nie ma żadnego kodu.

Cały obecny kod:

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



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 maja 2014, o 20:00 
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

Jak to jest cały kod to zastanów się po co odblokowałeś dwa przerwania i do czego one mają służyć, bo widzę tylko jedną funkcję ISR(TIMER2_COMP_vect) dla timera 2, ale to bez sensu, bo niby liczysz tam us.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 11 maja 2014, o 21:01 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

hej Krauser, tak, cos własnie zauwzyłem ze jak wywale timer i przerwanie zliczające ta 1 us, to coś bardziej zaczyna to działac. Owszem w obecym kodzie gdy uzywam _delay_s(889) nie ma potrzeby dodatkowego przerwania, jednak - napewno nie tędy droga. Odbiornik odczytuje jakies kody,m lecz to napewno nie 129 co zaprogramowałem ; ) Pomysle jeszcze co mozne byc nie tak jeszcze. Dzięki :), jak masz jakis pomysł jeszcze to pisz :)



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 18:35 
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

Odblokowanie przerwania (a robisz to 2 razy) i brak funkcji obsługi (a masz tylko jedną funkcję ISR) powoduje skok do adresu 0, czyli reset. Poprawiłbym to tak:
- odblokowanie przerwania dla drugiego timera jest niepotrzebne
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

- wektor dla funkcji obsługi przerwania należy zmienić na timer 1, bo to on generuje przerwanie co 1us
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

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

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 20:42 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Krauser napisał(a):
- wektor dla funkcji obsługi przerwania należy zmienić na timer 1, bo to on generuje przerwanie co 1us
Składnia: [ Pobierz ] [ Ukryj ]
język c

ISR(TIMER2_COMP_vect){
if(flaga_us){
cnt_us++;
}
}

GeSHi

zmień na:
Składnia: [ Pobierz ] [ Ukryj ]
język c

ISR(TIMER1_COMPA_vect){

if(flaga_us){
cnt_us++;
}
}


zmieniłem tak, dodałem sobie mój debbuger jednodiodowy, i gdy zmienie tak jak mi powiedizałes, program sie zacina gdy wchodzi w fukncje one();.. nie rozumeim.. le juz wiem ze nie mozna odblokowac dwóch przerwan jednoczesnie, tylko ten wekstor dziwny... nawet jak go wykomentuje to dioda debuggera sie nie świeci (!?) musze go odkomentowac i ustawic taj ajak miałem czyli Time2_COMP bo inczej ani tele nei działa, dziwaczne. Acid mi podsunął tez mysl ze powinienem zwiększyc dwukrotnie czestotliwosc przerwania dla nosnej, niestety nie pomogło, ani tyle odbiornik nic nie wykrywa. Czy program z delayami odmierzajacymi 889us ma prawo działac?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 20:50 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 19 lut 2013
Posty: 223
Zbananowany użytkownik

Pomógł: 21

Pojawienie się nieobsłużonego przerwania powoduje skok do wektora resetu. Masz już napisane funkcje do obydwu wektorów przerwań, które odblokowałeś?

_________________
Nie pisz komentarzy - dobry kod komentuje się sam.



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 21:17 
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

Atmegowiec napisał(a):
gdy zmienie tak jak mi powiedizałes

wstaw kod po zmianach

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 21:26 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

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



jednak debbuger sie zaświeca, lecz dioda IR nie świeci - czyzby daltego ze wyłaczyłem zezwolenie na przerwanie od Timera zliczajace 36kHz ?



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 12 maja 2014, o 22:40 
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

Przerwanie to nie ma nic do rzeczy. Taki najprostszy kod wystarczy, aby uzyskać sygnał o częstotliwości 36kHz:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Jak nie zauważysz świecenia diody IR wymień inną może być też zwykła LED. Sprawdź połączenia itp.

_________________
Dragonus Cracovus: Biomagia



Góra
 Zobacz profil  
cytowanie selektywne  Cytuj  
PostNapisane: 13 maja 2014, o 09:18 
Offline
Użytkownik
Avatar użytkownika

Dołączył(a): 28 mar 2013
Posty: 333
Pomógł: 10

Na takim kodzie dioda świeci ładnie. Rozumiem ze kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
słuzy do "podpięcia" timera do fizycznego wyjscia OCR2 do nadawania czestotliwosci na diodę. Tzn ona teraz w tym momencie świeci z taką częstotliwością jaką ustawiłem na timerze, prawda?
Czyli teraz juz mam podstawę do transmisji danych przez TOPS, mógłbym sobie teraz opracowc swój standard przesyłu, ilośc bitów, rozmiar ramki. Pozostańmy przy RC5, bo taki system odbiera odbiornik. Rozumuje to tak ze teraz powinienem wysyłac jedynki i zera, zgodnie z schematem RC5 zachowują odstępy czasowe 889us i przełczając bit
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.
w odpowiedni stan. I w sumie to by było tyle przy nadawaniu prawda? Zastanawim sie czy tez to ze mi nie działa prawidłowo kod to moze byc spowodowane uzyciem delayów(889) ? zamiast timera?

**************
Krauser, mój kod nagle ozył i nadaje poprawne ramki i kody :) kluczem było to ustawienie timera w Twoj sposób, teraz myśle dlaczego maoje ustawienie nie działało.
Napewno po częsci powodem było to:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

**************
Dziwna sprawa ;) jesli wysyłam ręcznie w petli while jedynki i zera, to wszytsko gra, gdy przepuszcze przez funkcję w której formuje ramkę rc5 i wysyłam 1 i 0 poprzez pętlę do...while opisaną w BB na 376 [nie można publikować bibliotek], to za każdym razem muszę resetować zasilanie w odbiorniku, żeby pokazała sie ta wartość. Tak jakby tops- wogole cały odbiornik się zawieszał.



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

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