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.

[Atmega8] - [c] generator 36khz początkujący

Connes 11 Sty 2016 17:15 1275 13
  • #1 11 Sty 2016 17:15
    Connes
    Poziom 6  

    Cześć jestem nowy na forum więc się przedstawię jestem Kamil mam 14 lat i od niedawna zajmuję się programowaniem. problem w tym że jestem początkujący i w sumie nie rozumiem kilku rzeczy . :| Dlatego proszę o wyrozumiałość.


    Moje pytanie dotyczy generatora 36 khz napisałem prosty program, ale oczywiście nie działa, ponieważ sedno problemu tkwi w tym że nie wiem na których portach , w atmedze 8, mogę generować przerwania, a 2 kanały pwm PB1 i PB2 mam zajęte. Pwm rozumiem natomiast z ctc mam problemy nie wiem, jak już wcześniej wspominałem na jakich portach mogę generować przerwania z ctc.

    generator potrzebny mi do robota (z TSOP2236 będzie pełnił funkcję czujników)
    odrazu mówię nie wciskajcie mi sharpów, wszystko w swoim czasie.mam książke Mirosława Kardasia, ale jest dla mnie trochę trudna.
    proszę o pomoc.


    Kod: c
    Zaloguj się, aby zobaczyć kod

    0 13
  • #2 11 Sty 2016 18:23
    Radzio M.
    Poziom 32  

    W tej książce masz wszystko opisane, nawet gotowce na płycie CD.

    0
  • Pomocny post
    #3 11 Sty 2016 18:25
    Steryd3
    Poziom 32  

    Ja wiem, że mając 14 lat trochę trudno o składne pisanie ...ale bez tego daleko nie "zajedziemy".

    Uporządkujmy- co chcesz zrobić?
    Może postudiuj książkę p. Kardasia bo masz problem z pojęciami i tworzy się z tego straszny bałagan. Ty co najwyżej chcesz wygenerować zmiany napięcia na porcie mikrokontrolera za pomocą przerwań.
    Tryb pracy licznika CTC polega na tym, że co pewien czas(określony wpisem w odpowiednim rejestrze licznika) generowane jest przerwanie. Co Ty w nim zrobisz- to już twoja sprawa. Możesz (co może chcesz uzyskać) zmieniać stan jednego z wyprowadzeń. Dzięki takiej metodzie możesz uzyskać na dowolnym wyprowadzeniu przebieg prostokątny - to jest tzw. metoda programowego generowania przebiegu.
    Można też licznik wprowadzić w tryb PWM (jeden z kilku) i wtedy po odpowiedniej konfiguracji na określonych przez producenta wyprowadzeniach można uzyskać przebieg prostokątny o okresie i wypełnieniu zależnym od wpisów w kilku rejestrach.
    Taka metoda nazywa się sprzętowym generowaniem przebiegu. Ma ona tą zaletę, że w generacji fali prostokątnej nie uczestniczy jednostka obliczeniowa a jedynie licznik który raz ustawiony nie absorbuje czasu na wykonywanie okresowo kilku instrukcji jak ma to miejsce w metodzie programowej.

    No i po tym lekkim naświetleniu napisz o co Ci chodzi.
    Najlepiej podeprzyj się schematem (nawet orientacyjnym) który powie jak ma wyglądać budowany przez Ciebie układ.

    0
  • #4 11 Sty 2016 19:18
    Connes
    Poziom 6  

    Radzio M. napisał:
    W tej książce masz wszystko opisane, nawet gotowce na płycie CD.


    Radku tylko że ja niestety nie mam płyty bo książke pożyczyłem od wójka, a on zgubił.

    Dodano po 10 [minuty]:

    Steryd3 chcę dokładnie zrobić to co napisałeś, ale mój procek jakimś dziwnym sposobem zupełnie inaczej reagował gdy wyjściem do którego doprowadzona była dioda był PB1, który jest kanałem pwm, a zupełnie inaczej niż jak to był PC5 stąd moje wątpliwości. Ale teraz rozumiem, że popełniłem jakiś błąd chyba w obsłudze przerwania. Jeśli tak to mógłbym cię prosić o poprawę mojego kodu źródłowego. Proszę cię oto nie z lenistwa, lecz dla zrozumienia.
    Bardzo ci dziękuje za pomoc jakby nie ty to pewnie bym z miesiąc jeszcze nad tym siedział.

    Niestety narazie nie dam rady dać ci schematu bo piszę z telefonu jutro jak będe przed laptopem to narysuję.
    Jeszcze raz Ci bardzo dziękuje.

    0
  • Pomocny post
    #5 11 Sty 2016 19:23
    grko
    Poziom 33  

    Masz błąd w obsłdz przerwania. Dokładnie w tych liniach:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Prawdopodobnie chodziło Ci o:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Albo cała obsługe przerwania można zrobić prościej tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod

    0
  • #6 11 Sty 2016 19:27
    Connes
    Poziom 6  

    Grzegorzu dzięki nie zauważyłem tego sprawdzę to jutro
    Ale dziwne że kompilator nie wysłał mi powiadomienia że źle napisałem.

    0
  • Pomocny post
    #7 11 Sty 2016 19:35
    grko
    Poziom 33  

    Niestety nie dostaniesz żadnego ostrzeżenia. PC4 jest zdefiniowanie na wartość 5 co odpowiada w systemie dwójkowym 0b101. W rzeczywistości w przerwaniu ruszałeś pinami PC0 oraz PC2. Powinieneś się zapoznać z binarna oraz heksadecymalną reprezentacją liczb:
    https://pl.wikipedia.org/wiki/Dw%C3%B3jkowy_system_liczbowy
    https://pl.wikipedia.org/wiki/Szesnastkowy_system_liczbowy

    0
  • Pomocny post
    #8 11 Sty 2016 19:56
    dondu
    Moderator Mikrokontrolery Projektowanie

    GrzegorzKostka napisał:
    Albo cała obsługe przerwania można zrobić prościej tak:
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Jeszcze prościej:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    najprościej:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    Skoro jednak pętla główna jest pusta, można nawet nie przerwań uruchamiać, tylko sprawdzać odpowiednią flagę przerwania i reagować na jej ustawienie, kasując ją także. Ale pusta jest zapewne tylko dlatego, że top program testowy, więc przerwanie pewnie będzie zasadne.

    0
  • Pomocny post
    #9 11 Sty 2016 20:23
    BlueDraco
    Specjalista - Mikrokontrolery

    Zieeewww...
    A z jakiego to ważnego powodu nie można użyć timera 2 do wygenerowania fali prostokątnej 36 kHz? Autor na wstępie zeznał, że potrzebuej obu kanałów T1 do PWM, więc T1 odpada.

    A tak poza tym: od kiedy to projekt urządzenia zaczyna się od narzucenia typu mikrokontrolera, a nie od spisania wymagań odnośnie tego, co mikrokontroler powinien mieć, żeby nadawał się do projektu?

    0
  • #10 12 Sty 2016 07:02
    Connes
    Poziom 6  

    Bluedraco no właśnie nie, do pwm używam timera 2. Timer 1 to tylko licznik więc zostaje mi tylko timer 1 16bit
    Zrobiłem tak bo t2 jest 8 bitowy i nim steruje silniki przez l293. Więc wyprowadzenia PB1 i PB2 mam zajęte. Na początku myślałem że mogę się bawić z przerwaniami tylko naPB1 2 i 3 , teraz wiem że tak nie jest. Przepraszam za błedy, ale tak naprawdę programuje ledwie od miesiąca więc popełniam naprawdę sporo gaf ale się uczę i mam nadzieję, że coś z tego będzie.


    Dziękuję wszystkim za poradę pozdrawiam


    Kamil

    PS jeśli wszystko pójdzie po mojej myśli pod koniec ferii
    pokażę skończonego robota na forbocie.

    0
  • Pomocny post
    #11 12 Sty 2016 07:30
    BlueDraco
    Specjalista - Mikrokontrolery

    To nie są przerwania na PB1, 2, 3, a sprzętowe wyjścia timerów. NA ATmega8 masz trzy wyjścia PWM - dwa z T1 i jedno z T2. Nie wiem, ilu w końcu potrzebujesz. Jednego powinieneś użyć do generowania 36 kHz, kolejnego (a może dwóch) do sterowania silnikiem. Czemu mają służyć te zabawy z przerwaniem timera i programowym machaniem nogą uC?

    0
  • #12 12 Sty 2016 16:04
    Connes
    Poziom 6  

    schemat jest tylko orientalny i pokazuje co chce zrobić.
    Wyjścia PB1 i PB2 mam zajęte a boję się programować PB3 bo to wejście od programatora . więc chce za pomocą timera2 w trybie ctc spowodować, że na PC5 będzie mi dioda migała z częstotliwością 36khz chodzi mi oczywiście o falę prostokątną . Falę mają odbierać dwa TSOPy 2236 i ma to działać jak czujnik.
    Bluedraco mógłbym cię prosić o wsad z samym generatorem ? miałeś rację tylko timer 1 jest w stanie obsługiwać dwa pwmy, dlatego generator musi być na timerze2. Nie wiem też czy tranzystor przy diodzie jest potrzebny .

    Dodano po 1 [godziny] 41 [minuty]:

    Kod: c
    Zaloguj się, aby zobaczyć kod



    gdy jest taki kod to w tsop 2236 podczas wykrycia jest 0,1 v czy to oznacza że osiągnąłem swój cel i wygenerowałem 36khz ?

    0
  • Pomocny post
    #13 13 Sty 2016 10:43
    dondu
    Moderator Mikrokontrolery Projektowanie

    1. Jeżeli przy braku wysyłania nośnej 36kHz na wyjściu TSOP masz stan wysoki, a podczas wysyłania nośnej masz stan niski to znaczy, że jest OK.

    2. W jakim celu tak komplikujesz funkcję przerwania wykonującą zmianę pinu na przeciwny - wykorzystaj ostatni kod z mojego poprzedniego postu.

    3. Najważniejsza jest jednak uwaga BlueDraco dot. sensu machania stanem pinu w przerwaniu. Skoro masz wolny timer2 który ma wyjście OC2 i tryb CTC, w zależności od częstotliwości taktowania mikrokontrolera możesz timer2 tak ustawić, by falę nośną generował automatycznie na pinie OC2. Dzięki temu bity danych będziesz przesyłał włączając i wyłączając funkcję generowania przez timer2 sygnału na pinie OC2.

    0
  • Pomocny post
    #14 13 Sty 2016 13:57
    deus.ex.machina
    Poziom 32  

    dondu napisał:
    1. Jeżeli przy braku wysyłania nośnej 36kHz na wyjściu TSOP masz stan wysoki, a podczas wysyłania nośnej masz stan niski to znaczy, że jest OK.


    Większość scalonych odbiorników IR ma zabezpieczenie przed ciągłą transmisja - 36kHz trzeba modulować - tak np definiuje to sobie Vishay:

    Minimum burst length 10 cycles/burst 10 cycles/burst
    After each burst of length
    a minimum gap time is required of
    10 to 70 cycles
    ≥ 10 cycles
    10 to 35 cycles
    ≥ 10 cycles
    For bursts greater than
    a minimum gap time in the data stream is needed of
    70 cycles
    > 4 x burst length
    35 cycles
    > 10 x burst length

    Szczegóły w datasheet - warto sprawdzić bo odbiorniki są różne! (i nie chodzi tu o częstotliwość nośnej).

    0