Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

BASCOM - Czas trwania czasu

wicy 07 Nov 2005 11:51 2885 5
  • #1
    wicy
    Level 22  
    Witam!
    Męczę się nad nadajnikiem IR 36kHz na AVR 2312. Do generowania nośnej wykorzystuję timer1 skonfigurowany w ten sposób, że generuje na pinie naprzemienne impulsy zbliżone do 36khz. Z grubsza jest OK choć dokładność siada, ale to m.in. kwestia złego doboru kwarcu. Interesuje inna kwestia, a mianowicie kluczowanie tego sygnału nośnego w programie. Wykorzystuję do tego coś takiego
    Code:

    timer1=0
    tcca1 = &B01000000 'on
    waitus X
    tcca1 = &B11000000 'off (albo odwrotnie...niewazne akurat)
    waitus X

    gdzie tcca1 włącza/wyłącza nośną na czas trwania impulsu. Czasy X muszę dobrać tak, żeby zapewnić pożądany czas trwania impulsu, ale pytanie jest takie:
    Czas trwania impulsu powinienem mierzyć od pierwszego ustawienia Tcca1 w stan ON do momentu przed drugim ustawieniem Tcca1 w stan ON.
    Po wyzerowaniu Timer1 przed wykonaniem tcca1 = &B01000000 ma już wartość zwiększoną o 1, czyli czas sobie już leci, czyli nośna już się generuje. Kiedy na port wystawiany jest impuls? Po komendzie tcca1 = &B01000000? Czyli po czasie 1+czas wykonania tej komendy? Czy najpierw jest wykonany rozkaz a potem zwiększa się czas lecącego "w tle" timera, czy odwrotnie? Nie wiem kiedy dokładnie zaczyna się impuls.



    Przy założeniu że program wykonuje ciąg instrukcji (bez jakichś tam pętli, które też "zjadają" czas procesora):
    Code:

    tcca1 = &B01000000 'on
    waitus X
    tcca1 = &B11000000 'off (albo odwrotnie...niewazne akurat)
    waitus X

    pomierzyłem czasy przed i po wykonaniu rozkazów (cykle/czas)
    0/0 Tccr1a = &B01000000 2/0,0005
    2/0,0005 Waitus 560 2242/0,5605
    2242/0,5605 Tccr1a = &B11000000 2244/0,561
    2244/0561 Waitus 560 4484/1,121
    4484/1,121 Tccr1a = ........ itd

    Ile w takim układzie trwa impuls?? Kiedy się rozpoczyna (jest wystawiony na port) i kiedy się kończy (zaczyna następny) co wyznaczy mi okres i czas trwania całego bitu??
  • #2
    wicy
    Level 22  
    Hmm... no tak... brak odpowiedzi to dobra odpowiedź :) Zmusza do myślenia. Nie mam doświadczenia w programowaniu, ale wykombinowałem sobie tak, iż niezależnie od tego w którym momencie wykonana instrukcja skutkuje ustawieniem portu w stan wysoki, trzeba złapać w instrukcjach taki sam okres i stałą Waitms tak go zawęzić, żeby wpadł w granicę 36kHz. Czyli w powyższym przykładzie złapię czas od "po wykonaniu" Tccr1a = &B01000000 do czasu przed wykonaniem następnego Tccr1a = &B01000000, czyli 4484-2=4482 cykli zegarowych i te 4482 cykli będzie moim okresem.
  • #3
    zumek
    Level 39  
    wicy wrote:
    Hmm... no tak... brak odpowiedzi to dobra odpowiedź :) Zmusza do myślenia...

    Nie napisałeś , na jakim procu "się męczysz".AVR 2313 to nic nie znaczy , a właściwie znaczy AT90S2313 lub ATTiny23123 niby to samo , a jednak nie to samo :D Jaką częsotliwością taktujesz proca :?: To wszystko jest ważne , a o generowaniu stabilnej częstotliwości za pomocą instrukcji "Wait" , zapomnij.Zanim zaczniesz pisać jakikolwiek kod , zapoznaj się z dokumentacją proca , ktróy chcesz oprogramować.Gdybyś znał możliwości swojego procka , to byś wiedział ,że to co zamierzasz zrobić, jest ...dziecinnie proste , jeśli wykorzystać sprzęt jaki ma "w sobie" Twój procek.Po odpowiednim ustawieniu rejestrów , potrafi generować dowolną - w granicach jego możliwości - częstotliwość , a tę falę można swobodnie modulować za pomocą ustawianie lub zerowania 1-go bitu , w odpowiednim rejestrze.Pomyśl nad tym.Umiejętność programowania , to jedno , a znajomość architektury proca , to drugie.A teraz podpowiedź:
    Timer w trybie CTC Mode.

    Pozdrawiam
    Piotrek
  • #4
    wicy
    Level 22  
    Może przeoczyłem istnienie ATTiny, ale morduję się z AT90S2313. Kwarce stosowałem rózne: 4, 3,68. Timer1 mam skonfigurowany
    Code:

    Config timer1 = Timer, Prescale = 1, Compare A = Toggle, Clear Timer = 1

    Czy ten tyb CTC to nie właśnie to coś powyżej??

    Quote:

    To wszystko jest ważne , a o generowaniu stabilnej częstotliwości za pomocą instrukcji "Wait" , zapomnij.

    Wiem, że Wait nie jest najszczęśliwszym rozwiązaniem. Nie odmierza dokładnie czasu, ale z tego co zaobserwowałem w symulatorze odmierza zawsze jednakowo, więc znając stały błąd można to uwzględnić w obliczeniach. Tak mi się zdaje... chyba, że symulator też podaje przybliżone czasy trwania instrukcji :(
  • Helpful post
    #5
    zumek
    Level 39  
    A widzisz :!: Gdybyś wkleił kod ,który już napisałeś , to bym sie tak nie "gimnastykował" ;) Teraz napisz , jak chcesz modulować "nośną" , czy to ma być RC5 , czy jakiś inny sygnał :?: Przy jakim stanie pinu dioda "świeci" :?: Nie bądź taki tajemniczy ;)

    Piotrek
  • #6
    wicy
    Level 22  
    Code:

    $regfile = "2313def.dat"
    $crystal = 4000000
    Config Timer1 = Timer, Prescale = 1, Compare A = Toggle, Clear Timer = 1
    Declare Sub _1
    Declare Sub _0

    Nosna_on = &B01000000
    Nosna_off = &B11000000
    Compare1a = 55
    Tccr1a = Nosna_off
    Timer1 = 0

    Do
      _1 : _1 : _0                   'bity startu i toggle bit
      _0 : _0 : _0 : _0 : _0      '5 bitow adresu
      _0 : _0 : _0 : _0 : _0 : _0  '6 bitow rozkazu     
    Loop

    Sub _1
      Tccr1a = Nosna_off
      Waitus 888
      Tccr1a = Nosna_on
      Waitus 886
    End Sub

    Sub _0
      Tccr1a = Nosna_on
      Waitus 888
      Tccr1a = Nosna_off
      Waitus 889
    End Sub

    Jest to program pilota niby na 36kHz. Zegar 4Mhz taktuje z czasem 0,25 us. Przy 36kHz impuls trwa 27,78 us, więc licznik procesora powinien zliczyc 111,11(1) taktów. Ze kodowanie (RC5 akurat w tym przykładzie) jest bifazowe, zmiana stanu następuje co 27,78 / 2. A zatem procesor powinien zliczyc 55,56 impulsów. Dlatego też zastosowanie:
    Code:
    Compare1a = 55
    powoduje, że na pinie (PB.3) generowany jest sygnał 1-0 naprzemiennie co 55 taktów zegara dając nośną zbliżoną do 36kHz (a dokładnie 36036,04 Hz). Problem jest z dobraniem czasu trwania Waitus w kluczowaniu zmiennej, ale jeśli wierzyć symulatorowi błąd instrukcji Waitus jest stały (jakies 0,0005 ms o ile pamietam) i można go praktycznie pominąć (albo dodac druga Waitus, blad sie zdubluje i pomniejszyc o 1 któryś z Waitus). Jeśli chodzi o hardware ;) to dioda podpięta przez 220ohm bezpośrednio do portu nadaje na 2-3cm (do testów na razie wystarczy). Inna rzecz, że urządzonko do którego ma być pilot chyba nie działa w RC5. Działa na systemie TV Sanyo, więc chyba to kodowanie NEC (chociaż niektóre komendy "łapał" przy zaprogramowaniu kodem w/w i ustawieniu Compare1a na 51), ale przy tego typu podejściu programowym (jeśli właściwe) nie jest to problem. Problemem jest uzyskanie dokładności nośnej (bez odpowiedniego kwarcu się nie obędzie) i włączenie/wyłączenie kluczowania we właściwym momencie i na właściwy czas.