logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Programowe dzielenie, mnożenie impulsów. [BASCOM]

karlos79 04 Mar 2009 16:27 5660 32
  • #1 6235382
    karlos79
    Poziom 33  
    Witam.
    Jak można programowo dzielić i mnożyć impulsy wejściowe i wynik wystawiać w postaci fali prostokątnej na pin kontrolera?
    Na tym etapie kontroler jest nie istotny, byle by to był AVR.
    Chodzi o to, żeby nie było przerw w wystawianiu wyniku dzielenia/ mnożenia na pin wyjściowy.
    Oczywiście kontroler ma w między czasie sprawdzać stan jeszcze kilku wejść.
    Nie podaję częstotliwości i innych szczegółów- na tym etapie jest to nie istotne.
    Poszukuję jakiegoś pomysłu na napisanie kodu.
    Zaznaczam pomysłu, a nie gotowego kodu.
    Pozdrawiam
  • Pomocny post
    #2 6235480
    KJ
    Poziom 31  
    Jak rozumiem chcesz defakto dzielić częstotliwość przebiegu jeżeli tak to nic prostszego: pętla for inkrementowana stanem wysokim np. i po osiągnięciu określonej ilości powtórzeń zmiana jakiegoś pinu "wynikowego" na stan przeciwny. problem się zacznie jak będziesz chciał podzielić przez liczbę inną niż wielokrotność 2 nie mam pomysłu jak takie dzielenie zrealizować. Mnożenie to już w ogóle duży problem. Kiedyś robiłem to w ten sposób że ładowałem do timera wartość tak wyliczoną żeby timer przepełniał się w czasie nieco dłuższym niż półokres sygnału wejściowego. Timer ten był dosynchronizowywany do przebiegu z każdym zboczem sygnału wejściowego (narastającym i opadającym) a w pętli głównej generowany był przebieg co 1 2 3 n inkrementacji timera. Uzyskiwałem w ten sposób przebieg o częstotliwości wyższej od wejściowego i będący z wejściowym w fazie oczywiście sygnał wejściowy wchodził na przerwanie zewnętrzne.
  • #3 6235576
    karlos79
    Poziom 33  
    Witam
    No to mam już jakiś punkt zaczepienia:)
    Wieczorem będę już coś pisać.
    Masz rację z dzieleniem nie powinno być problemu :)
    Mnożenie zostawię sobie na potem.
    Dzięki za zainteresowanie i czekam na kolejne propozycje.
    Pozdrawiam
  • Pomocny post
    #4 6236171
    Konto nie istnieje
    Poziom 1  
  • #5 6244911
    karlos79
    Poziom 33  
    atom1477 napisał:
    Mnożenie można zrobić robiąc programową symulację PLL.
    Zwykła symulacja wymagała będzie użycia jednego Timera i dość zamotanego kodu.

    Ale można inaczej.
    Dwa Timery.
    Jeden Timer zlicza okres przebiegu. A drugiego ustawia sie żeby zliczał powiedzmy do 1/3 wartości zmierzonej pierwszym Timerem. Taki układ ma już w miarę dobre parametery bo powinien działać w dość szerokim zakresie częstotliwości. Obejmie na pewno jedną dekadę.


    Jeśli to jest możliwe, możesz podać szkielet takiej procedury?
    Strasznie się z tym gryzę i za choinkę nie potrafię nic konkretnego wymyślić.
    Może znasz jakieś książki lub stronki z opisem sposobów realizacji mnożenia.
    Pozdrawiam
  • Pomocny post
    #6 6245411
    Konto nie istnieje
    Poziom 1  
  • #7 6245644
    karlos79
    Poziom 33  
    Witam
    Dzięki za odzew :)
    Na moje szczęście mnożenie ma być przez liczby całkowite :)
    Pętla PLL odpada, bo kontroler poza mnożeniem musi jeszcze sprawdzać stany wejść i dokonywać odpowiednich akcji.
    Jeszcze raz dziękuję za przykład :)
    Wkrótce postaram się pokazać wyniki doświadczeń i jakiś kod.
    Pozdrawiam
  • Pomocny post
    #8 6246020
    Konto nie istnieje
    Poziom 1  
  • #9 6246218
    wd40
    Poziom 21  
    Dzielenie przez liczbę inną niż wielokrotność 2 też jest łatwe - trzeba liczyć zarówno stany wysokie jak i niskie.
  • #10 6246267
    janbernat
    Poziom 38  
    Nie, jeszcze 162 i 64 ma po dwa 16-bitowe
  • #11 6246300
    karlos79
    Poziom 33  
    Witam
    atom1477 napisał:

    I powiedz czy wymagana jest stuprocentowa synchronizacja przebiegów (tak jak w mnożeniu za pomocą PLL).

    Tak synchronizacja jest wymagana.
    Chodzi o to że nie można gubić impulsów, a na wyjściu mają się pojawiać w sposób ciągły.
    Pozdrawiam
  • Pomocny post
    #12 6246319
    Konto nie istnieje
    Poziom 1  
  • #13 6255444
    wd40
    Poziom 21  
    Przy mnożeniu przecież wystarczy mierzyć czas poszczególnych stanów. i w następnym generować dokładną częstotliwość.
    Jedynym minusem, będzie to, że będzie przesunięcie o 180 stopni w fazie w stosunku do oryginalnego przebiegu (a w zasadzie to będzie opóźniony).
    Zresztę DLL też na to raczej nic nie pomoże.
    A mnożenie PLL to chyba nie jest do przebiegów cyfrowych.
  • #14 6257568
    karlos79
    Poziom 33  
    atom1477 napisał:

    Co do synchronizacji to chodziło mi o to czy musi być 100%-owa zgodność częstotliwości wejściowej i wyjściowej*mnożnik.

    Np. Jak wejściowa ma 100kHz a mnożnik ma być równy 5, to czy wyjściowa ma być konieczne 500kHz czy może być na przykład 499kHz.


    Na wyjściu ma być to co na wejściu razy mnożnik.
    Pod warunkiem, że to jest w ogóle wykonalne :)
    Pozdrawiam
  • Pomocny post
    #15 6257600
    Konto nie istnieje
    Poziom 1  
  • #16 6257737
    karlos79
    Poziom 33  
    Witam
    Rozwiązanie z 4046 i dodatkowym dzielnikiem odpada.
    Trzeba kombinować z przeróbką Twojego patentu, lub z PLL.
    Dziś wieczorem będę robić coś w tym kierunku.
    Na warsztat biorę ATmega8 z zegarem 8Mhz, zobaczymy co z tego wyjdzie.
    Pozdrawaim
  • Pomocny post
    #17 6258687
    Konto nie istnieje
    Poziom 1  
  • #18 6258745
    Konto nie istnieje
    Poziom 1  
  • Pomocny post
    #19 6259101
    Konto nie istnieje
    Poziom 1  
  • #20 6260010
    karlos79
    Poziom 33  
    Witam
    Kolego -> atom1477 , dziękuję Ci bardzo za niesienie mi pomocy w bardzo nowej dziedzinie jak dla mnie :)
    Ledwo potrafię ogarnąć podstawowe sprawy związane z programowaniem kontrolerów.
    No nic uczę się.
    Z assemblerem będzie bardzo duży problem, dlatego, że ni w ząb tego nie kapuję :(
    No i jakoś nie miałem czasu się za niego zabrać- jak do tej pory nie potrzebowałem go.
    Jeszcze nie miałem okazji sprawdzić kodów które dostarczyłeś- właśnie składam generator do testów.
    Pozdrawiam
  • Pomocny post
    #21 6260066
    Konto nie istnieje
    Poziom 1  
  • #22 6260601
    karlos79
    Poziom 33  
    Witam
    Ten kod:

    $regfile = "M8def.dat"
    $crystal = 8000000
    $hwstack = 64
    '-------------------------------------------------------------------------------
    Dim A As Byte
    Dim B As Byte
    Dim Licznik As Byte
    '-------------------------------------------------------------------------------
    On Int0 Int0_handler
    On Oc2 Oc2_handler
    '-------------------------------------------------------------------------------
    Config Portb = &B00001000
    Config Portc = &B00000000
    Config Portd = &B00000000
    
    Portb = &B00000000
    Portc = &B00000000
    Portd = &B00000000
    
    
    Config Timer0 = Timer , Prescale = 8
    Config Timer2 = Timer , Prescale = 8 , Compare = Disconnect
    Stop Timer2
    
    Config Int0 = Rising                                        'Wejście impulsów
    Enable Interrupts
    Enable Int0
    Enable OC2
    
    
    
    Do
    Loop
    '-------------------------------------------------------------------------------
    Int0_handler:                                               'Mnożnik = 5
      A = Timer0
    
      Timer0 = 0
    
      B = A / 10                                                '<---- 2*5 = 10
                                                                '-----_____
      Ocr2 = B                                                  '-_-_-_-_-_
      Tcnt2 = 1  ' tu zmieniłem
      Portb.3 = 1  ' tu zmieniłem
      Licznik = 0
      Start Timer2
    Return
    '-------------------------------------------------------------------------------
    Oc2_handler:
        Portb.3 = Not Portb.3                                   'Zamiast negować PortB.3 lepiej wklepywać
                                                                'mu najmłodszy bit zmiennej Licznik
        Incr Licznik
    
        If Licznik >= 9 Then                                    '<---- 2*5-1 = 9
          Stop Timer2
        End If
    Return
    '------------------------------------------------------------------------------- 


    Działa tak, że jak się pojawi zbocze narastające na wejściu to dioda na Portb.3 błyśnie na ułamek sekundy- przez większość okresu nie świeci.
    Nie jestem szczęśliwym posiadaczem oscyloskopu, jedynie w szkole na pracowni mogę pracować na tym sprzęcie.
    Zrobiłem prosty generator, na jego wyjściu siedzi dioda LED i wejście kontrolera.
    Na wyjście kontrolera włączyłem diodę LED.
    Częstotliwość generatora to jakiś maksimum 2hz.
  • Pomocny post
    #23 6260795
    Konto nie istnieje
    Poziom 1  
  • #24 6261963
    karlos79
    Poziom 33  
    Witam
    I tu mamy problem, dlatego, że program powinien pracować od 0Hz do powiedzmy 100kHz.
    Pozdrawiam
  • Pomocny post
    #25 6263370
    Konto nie istnieje
    Poziom 1  
  • #26 6263590
    karlos79
    Poziom 33  
    Witam
    Zacznijmy od powiedzmy 10Hz w górę.
    Pozdrawiam
  • Pomocny post
    #27 6263604
    Konto nie istnieje
    Poziom 1  
  • #28 6263660
    karlos79
    Poziom 33  
    Mnożnik ma być regulowany( parzyste liczby całkowite)
    Dzielnik z resztą tak samo, w przypadku dzielenia.
    Do czego to ma być?
    To ma być taka wprawka do wykonania przestrajanego generatora częstotliwości.
  • Pomocny post
    #29 6263766
    Konto nie istnieje
    Poziom 1  
  • #30 6263972
    karlos79
    Poziom 33  
    Witam
    Niestety do oscyloskopu mam dostęp tylko w soboty i niedziele.
    Czasu nie mogę Ci dać bo sam mam braki.
    Co do mnożnika spokojnie wystarczy 2...20.
    Pozdrawiam
    P.S
    Czy mogę podesłać Ci Twój kod z moimi komentarzami?
    Chodzi o to żeby sprawdzić czy wszystko dobrze rozumiem i żeby przy problematycznych linijkach wstawić z mojej strony pytanie.
REKLAMA