Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[C][ATMEGA16/8] - Transmisja IR - nieprawidłowy czas trwania impulsu

Noisy_daddy 07 Wrz 2013 14:13 1230 3
  • #1 07 Wrz 2013 14:13
    Noisy_daddy
    Poziom 14  

    Witam,

    Napisałem prosty program wysyłający i odbierający sygnał z diody podczerwonej. Układ nadajnika składa się z: uC ATMEGA16, trzech przycisków i diody IR TSAL6200, a układ odbiorika z uC ATMEGA8, odbiornika IR TSOP1138 i diody led. Obok odbiornika dałem też elektrolit 47uF.
    Oto program nadajnika:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Czyli wysyłam impulsy o częstotliwości nośnej odbiornika (sprawdzane na oscyloskopie i się zgadza), a informacja kodowana jest poprzez czas trwania stanu wysokiego, przy czym start odpowiada za 40 impulsów, "jedynka" za 25 i "zero" za 10. Wysyłany kod jest 16 bitowy i ma wszystkie bity wyzerowane poza dwoma ostatnimi, które ustawiam w zależności od tego który przycisk jest naciśnięty - czyli cały kod ma wartość 0 gdy nic nie wysyłamy i 1,2 lub 3 jak któryś przycisk jest naciśnięty.

    A tak wygląda program odbiornika:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Program na mrugać diodą określoną ilość razy w zależności od odebranego kodu. Dekodowanie opiera się na pomiarze czasów trwania stanu niskiego (odbiornik odwraca sygnał). Czasy dobrane są na podstawie datasheeta tzn impuls wyjściowy może być o max 4/f0 mniejszy od wejściowego i max 6/f0 większy (f0 to rozumiem że częstotliwość nośna odbiornika 38kHz??). Policzone zakresy podałem w komentarzach. W programie jeszcze z pewnym zapasem. Różnice między ilościami impulsów dobrane tak, żeby najkrótsze czasy jednego impulsu nie nachodziły na najdłuższe drugiego. Z mojego sprawdzania działania programu (niestety nie mam już dostępu do oscyloskopu, mrugałem sobie diodą w określonych miejscach funkcji get_code()) wynika, że kod ma zawsze wartość 0 i jest to prawdopodobnie ta wartość zadeklarowana na początku w funkcji initial_settings(). Program zdaje się w ogóle nie wchodzić do if-ów odpowiadających za bit staru i 'jedynkę', tylko 'zero'. Myślałem, że może licznik TCNT0 nie liczy, ale sprawdziłem że przyjmuje wartości niezerowe. Natomiast dziwną rzecz zaobserwowałem przy zmiennej dt. Jak sprawdzam jej wartość tuż po jej nadaniu (TCNT0*32) jest niezerowa. Jednak kilka linijek potem, jeśli w if-ie odpowiadającym za 'zero' zmieniam warunek na dt==0 to mi do niego wchodzi!! Tak jak mówię, nie mam możliwości sprawdzenia jak to wygląda na oscyloskopie, więc zwracam się do Was. Ma ktoś pomysł w czym może leżeć problem? Myślałem też czy nie chodzi o to, że mam różne uC w odbiorniku i nadajniku, ale chyba nie w tym rzecz prawda? Z góry dziękuję za pomoc.

    0 3
  • #2 07 Wrz 2013 20:28
    BlueDraco
    Specjalista - Mikrokontrolery

    Jak masz podłączone te przyciski? Czy masz rezystory podciągające? Jeśli nie - to włącz wewnętrzne.

    0
  • #3 07 Wrz 2013 21:03
    Noisy_daddy
    Poziom 14  

    Są to tak naprawdę czujniki dotyku o takie: http://robodudes.com/pojemnosciowe/123-touchkey-modul-at42qt1011-czujnik-dotyku.html.. Włączyłem. Zmieniłem też warunki bit_is_set na bit_is_clear, bo teraz przycisk naciśnięty zwiera do masy tak? Niestety nic to nie dało. Cały czas wysyłany jest kod zerowy. Czy w doborze czasów powinienem może jakoś uwzględnić częstotliwość F_CPU?

    0
  • #4 12 Wrz 2013 17:10
    Noisy_daddy
    Poziom 14  

    To co nikt nie ma pomysłu czy wszyscy jeszcze wakacjują? ;) Mam wrażenie że jestem bardzo blisko, tylko jakaś jedna mała rzecz się nie zgadza, zapewne jakaś głupota..

    0