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.

[ATTiny13A][BAS]Modulacja sygnału ir - 56Khz

Wojtek001 24 Cze 2012 21:41 1797 16
  • #1 24 Cze 2012 21:41
    Wojtek001
    Poziom 15  

    Zajmuje się pisaniem programu (procek to Attiny13A) do diody ir współpracującej z czujnikiem TFMS 5560.Zaznaczam że jest to po prostu układ typu załącz / wyłącz. Nie żadne kodowanie itp.

    Tutaj link do noty katalogowej tego czujnika (w tabelce drugi pdf od góry) :
    http://www.datasheetarchive.com/tfm%205560-datasheet.html

    Z tego co udało mi się rozszyfrować wiem że czujnik ten reaguje na sygnał o modulacji 56 kHz ii cechuje go "aktywny stan niski" czyli gdy widzi modulowany sygnał ir podaje masę na wyjściu. Ale mam parę pytań:

    1) Czy sygnał modulowany musi mieć jakieś specjalne wypełnienie czy może być przez 50% czasu stan niski i 50% czasu stan wysoki?
    2) Czy jeśli przez jakiś dłuższy czas będę działał na czujnik sygnałem modulowanym to czy on zacznie się jakoś dziwnie zachowywać czy będzie cały czas dawać tą masę na wyjściu. Ktoś mi pisał jednak że tego typu czujniki po określonej ilości odebranych impulsów oczekują odpoczynku. Jak jest w wypadku mojego czujnika i ile to impulsów?
    3) Napisałem prościutki programik na Attiny13A i wewnętrznym oscylatorze 1Mhz do pilota (W BASCOMIE). Ma on modulować sygnał o częstotliwości ok. 56Khz przez cały czas działania programu na nóżce PB4 która będzie podłączona do diody nadawczej ir. Czy zadziała on poprawnie? Szczególnie chodzi mi o poprawność wyliczenie ,że aby uzyskać modulacje 56Khz należy dokonywać odwrócenia stanu logicznego na wyjściu PB4 co 9 mikro sekund.

    Program:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod



    4) Powyższy program jest tak napisany że sygnał modulowany będzie działać przez cały czas pracy procesora. Tak więc przycisk w pilocie będzie po prostu podłączał vcc do procesora i go uruchamiał. Reakcja procka to ok. 64ms (?) . Do tego dochodzi powiedzmy te kilka ms dla bezpieczeństwa czyli minimalna długość przytrzymania przycisku to 70ms. Ile trwa standardowo normalna długość wciśnięcia przycisku? Czy procesor Attiny13A zdąży uaktywnić się po tych 64ms?

    0 16
  • #2 25 Cze 2012 08:16
    Krauser
    Poziom 26  

    Masz błędne obliczenia. Przerwanie następuje gdy licznik się "przekręci" i do obliczeń należy brać wartość o 1 większą, ale to i tak nie będzie dokładnie ponieważ skok do procedury przerwania też zajmuje minimum 4 cykle zegara. Lepiej przejdź na PWM na PB0 lub PB1.

    0
  • #3 25 Cze 2012 17:24
    Wojtek001
    Poziom 15  

    A mógłbym prosić o jakiś gotowy fragment kodu - po PWM'em jeszcze się nie zajmowałem.
    Uczę się BASCOMA z książki "mikrokontrolery dla początkujących" i jestem dopiero przy szynie I2C. Tak więc zadowolił by nie jakiś króciutki gotowy programik generujący sygnał o częstotliwości 56 khz na nóżkę PB0 w oparciu o PWM.

    0
  • Pomocny post
    #4 25 Cze 2012 19:30
    Krauser
    Poziom 26  

    Dla taktowania 8MHz, ale możliwe że trzeba zmodyfikować nazwy Pwm i Compare

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    a na rejestrach timera
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    fOCnx = fclk/(2*N*[1+OCRnx]) = 8MHz/(2*1*[1+70])=56,34kHz

    0
  • #5 25 Cze 2012 20:22
    Wojtek001
    Poziom 15  

    Wielkie dzięki ,ale trochę mnie nie pokoi to 8Mhz bo układ zasilany będzie zasilany z jednej baterii pastylkowej - niby 3v. ale wiadomo jak to jest w praktyce ,pewnie z 2,7 v będzie miała a dochodzi jeszcze obciążenie diody.

    I nie będzie problemu jeśli ustawię wewnętrzny oscylator 8Mhz bo Attiny13 nie ma możliwości bezpośredniego podłączenia kwarcu?

    Poza tym twój program generuje sygnał o jakim wypełnieniu? 50% ?

    0
  • #6 26 Cze 2012 09:03
    Krauser
    Poziom 26  

    1. A właściwie skąd to 8MHz skoro w specyfikacji pisze że jest domyślnie 9,6MHz/8 = 1,2MHz.
    2. Jeśli chcesz do końca wykorzystać baterię CR to lepiej obniżyć częstotliwość do 4MHz, wtedy masz zakres napięcia zasilania od 1,8V.
    3. Jeśli chcesz kwarc to jeszcze potrzebny by był generator na bramkach, ale szkoda na to pieniędzy
    4. Tak w trybie CTC jest wypełnienie 50%

    0
  • #7 26 Cze 2012 10:05
    Wojtek001
    Poziom 15  

    Ja mam wersję Attiny13A i z wykresu (taktowanie od napięcia) w datasheet'cie wynika że przy 8Mhz 3v powinny starczyć na styk ale zobaczymy jak to będzie w praktyce.

    A co do taktowania 8Mhz to właśnie chcę przestawić uC na wewnętrzny oscylator 8Mhz (chyba jest taka możliwość?) żeby był zgodny z twoim programem.

    0
  • #8 26 Cze 2012 10:41
    Krauser
    Poziom 26  

    Do 10 MHz pracuje przy napięciu 2,7 – 5,5V.
    Lepiej doczytaj o tej częstotliwości. Jest inna niż w większości AVRów. Dla 9,6MHz OCR0A powinien wynosić 85

    0
  • #9 26 Cze 2012 15:15
    Wojtek001
    Poziom 15  

    Czyli dla Attiny13A jest dostępna częstotliwość taktowania 9,6 Mhz zamiast 8 Mhz?
    Czyli jedyna zmiana w programie to wpisać Pwm0a = 85 zamiast Pwm0a = 70 ?

    0
  • #10 26 Cze 2012 15:29
    Krauser
    Poziom 26  

    Tak, ale trzeba przeprogramować fusebity (dokładniej CKDIV8)

    0
  • #11 26 Cze 2012 17:13
    LordBlick
    VIP Zasłużony dla elektroda

    Krauser napisał:
    Tak, ale trzeba przeprogramować fusebity (dokładniej CKDIV8)
    Nie jest to konieczne, CKDIV8 powoduje tylko wpisanie odpowiedniej wartości po reset do rejestru preskalera CLKPR, który można zmieniać programowo.

    0
  • #12 26 Cze 2012 20:57
    Wojtek001
    Poziom 15  

    Ja sobie zmieniam fusebity w AVR studio i nie przejmuje się żadnymi rejestrami.

    0
  • #13 26 Cze 2012 21:08
    Krauser
    Poziom 26  

    Tak, ale w rejestrze możesz wybierać kilka stopni podziału, a fusem tylko 2. No i podczas pracy możesz sobie zmieniać taktowanie.

    0
  • #14 27 Cze 2012 16:51
    Wojtek001
    Poziom 15  

    Zrobiłem sobie program testowy oparty o instrukcje wait który mi gasi i zapala diodę co sekundę. Program ten działa na moim procku nie tylko przy częstotliwości 4,8 Mhz ale także 9,6 Mhz. Następnie wgrałem twój program jednak nie działa. Dioda ir (sprawdzam przez aparat) nie świeci się. Co jest źle? Możliwe żeby przyczyną tego było to że raz przez pomyłkę podłączyłem 3v odwrotnie - ale przecież procek daje się zaprogramować i przy innym programie działa.

    Tak to jest jak się wklepuje coś czego kompletnie się nie rozumie. Jeszcze mi się nie zdarzyło żebym zbudował coś wedle czyjegoś projektu - zawsze projektuje wszystko od początku. Dlatego też napisałem prymitywny program po swojemu:

    Code:
    Config Pinb.0 = Output
    

    Do
    Waitus 25
    Portb.0 = 1   'dioda nie świeci
    Waitus 3
    Portb.0 = 0   'dioda świeci
    Loop
    End

    Powyższy kod działa przy taktowaniu 4,8 Mhz (z uwagi na to żeby nie zabierać zbytnio napięcia na diodzie ir). Kompilator czyi BASCOM-AVR "myśli" jednak że będzie działał na 1Mhz. Dlatego też np. waitus 25 nie trwa w rzeczywistości 25 us ale 4,8 raza szybciej czyli ok. 5,2 us.
    Zauważyłem też że lepsze rezultaty przynosi wypełnienie równe ok. 90 % (tak jak w powyższym programie)

    Ale działa! Zasięg wynosi już parę metrów jednak chciałbym to zrobic jeszcze precyzyjniej dlatego może ktoś orientuje się ile mniej więcej cykli zegara trwa w powyższym kodzie :
    1) Przejście z końca pętli na początek ?
    2) Instrukcja Portb.0 = 1 ?
    3) Instrukcja Portb.0 = 0 ?

    0
  • #15 27 Cze 2012 21:37
    LordBlick
    VIP Zasłużony dla elektroda

    Jak chcesz precyzyjniej, to użyj timera, który masz w µC.

    0
  • #16 27 Cze 2012 23:21
    Wojtek001
    Poziom 15  

    Z timerem napisałem program --> jest w pierwszym poście (dostosowany do 1Mhz ale łatwo przerobić na 4,8 Mhz) ale ktoś pisał że się procek nie będzie wyrabiał i że na skok do przerwania też jest potrzebny czas. Poza tym nie jestem pewny czy dał bym radę zrobić wypełnienie odpowiednie (ok.90 %) - raczej tak ale pewny nie jestem.

    Dla 4,8 Mhz :

    Code:
    Config Pinb.0 = Output
    
     
    Config Timer0 = Timer , Prescale = 1
    Enable Interrupts
    Enable Timer0
    On Timer0 Modulacja
    Timer0 = 170
     
    Do
    If Timer0 = 247 Then Portb.0 = 1 ' Wygaś diodę tuż przed przepełnieniem timera
    Loop                                           'wypełnienie ok. 90%
    End
     
    Modulacja:
    Timer0 = 170
    Portb.0 = 0      'zapal diodę
    Return


    4 800 000 Hz / 255 + 1 - X = 56 000
    X = ok. 170

    Krauser napisał:
    ale to i tak nie będzie dokładnie ponieważ skok do procedury przerwania też zajmuje minimum 4 cykle zegara


    1) Dobrze to jest ? Szczególnie czy można taki warunek wstawić "If Timer0 = 247 Then... " ?

    2) A tak wogóle to czemu mi ten program z pwm nie działał? I co dopisać żebym miał wypełnienie np. ok. 90% w programie z pwm.

    0
  • #17 28 Cze 2012 09:23
    Krauser
    Poziom 26  

    Wojtek001 napisał:
    Kompilator czyi BASCOM-AVR "myśli" jednak że będzie działał na 1Mhz.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    lub opcje kompilatora sprawią, że waitus będzie takie jak sobie wpiszesz w kodzie.

    ATtiny13A.pdf mówi, że skok zajmuje 2 cykle zegara.

    0