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.

Generator dźwięku, którego częstotliwość ma się zmniejszać co 2 sekundy.

mateusz76 14 Kwi 2012 17:25 1913 3
  • #1 14 Kwi 2012 17:25
    mateusz76
    Poziom 10  

    Witam,

    Mam następujący problem otóż jako projekt na zaliczenie z przedmiotu Systemy wbudowane muszę napisać projekt taki jak w tytule, układ to PIC18F6720. Idea jego jest prosta generowany jest dźwięk o jakiejś częstotliwości powiedzmy f i co dwie sekundy tą częstotliwość muszę zmniejszać samo generowanie dźwięku jest banalnie proste i zgodnie z wolą prowadzącego ma wyglądać tak:

    Code:
    ;;--- Glośnik, częstotliwość 400 Hz 
    
    ;; 400 Hz ==>2500 mks ==>1250 mks+1250 mks ==> 125 * 10 mks + 125 * 10 mks
    glosnik:   
       movlw D'14'     ; 14 * 10,5 mks = 147 mks                         
       movwf licz1, 0
    g1:
       movlw D'21'   ; 21 * 0,5 mks = 10,5 mks   
       movwf opoz, 0
    dcykl1:
       nop
       nop
    decfsz opoz, 1, 0
       bra dcykl1   ;powtór po 5 cykli maszynowych: 5 * 100ns = 0,5 mks
       decfsz licz1, 1, 0
       bra g1

       bsf PORTA, 5, 0

       movlw D'14'             
       movwf licz2, 0
    g2:
       movlw D'21'             
       movwf opoz, 0
    dcykl2:   
       nop
       nop
       decfsz opoz, 1, 0
       bra dcykl2
       decfsz licz2, 1, 0
       bra g2
       bcf PORTA, 5, 0

    Czyli na wyjściu co określony czas zmieniamy stan z 0 na 1.Żądaną częstotliwość uzyskuje poprzez odpowiednią długość trwania programu , poniżej zamieszczam obliczenia do powyższego kodu dla lepszego zrozumienia :

    f=400+6*500=3400Hz
    T=1/f=1/3400=0,294 ms = 294 mks
    294mks/2 =147 mks

    Pierwsza pętla :
    Powtórz 21 razy :
    2 x nop = 2x100ns = 200ns
    1 x decfsz = 100ns
    1 x skok = 200ns
    200+100+200 = 500ns
    Druga pętla
    Powtórz 2 razy:
    1 x Pierwsza pętla =21*0,5mks=10,5mks
    Ostatecznie :
    14*10,5mks =147mks
    T = 147mks + 147mks = 294mks = 0,000294s
    T = 1/T = 1/0,000294 = 3401Hz = 3400Hz


    Niestety prowadzący nie posiadł w stopniu zrozumiałym dla studentów umiejętności mówienia po polsku, tak więc na powyższym kawałku kodu mój projekt się zakończył, gdyż nie jestem w stanie zrozumieć jego tłumaczeń.Generalnie proponował mi skorzystanie z Timera żeby dźwięk trwał 2s albo jakoś to zapętlić, niestety nie bardzo się w tym orientuje,w googlach też niczego nie znalazłem dla tego prosiłbym Was o jakąkolwiek pomoc.Zaznaczam od razu że nie chce gotowego kodu tylko jakieś ogólne przykłady, ew kursy które mogłyby mi pomóc.Z góry dziękuje.W razie niejasności proszę pytać wszystko bardzo chętnie wyjaśnie .

    0 3
  • #2 14 Kwi 2012 17:57
    gaskoin
    Poziom 38  

    Mikrokontroler jest wyposażony w układ licznikowo-czasowy i zapewne prowadzący chciał, żeby tego właśnie użyć zamiast czarować z pętlami. Ma to tą zaletę, że nie trzeba liczyć żadnych cykli (no może tylko do ustawienia). Ustawiasz raz i timer działa.

    http://ww1.microchip.com/downloads/en/devicedoc/39609b.pdf tu masz notę katalogową, są nawet przykłady w assemblerze.

    Nie wiem, jakie tryby ma ten timer, bo nie używałem nigdy PICa, ale generalnie pomysł jest taki, żeby go odpalić tak, aby odliczał połówkę okresu, po czym się zerował. Po odliczeniu powinień zgłosić jakąś flagę, którą należy sprawdzać w pętli. Jeśli zostanie zgłoszona - zmienić stan pinu na przeciwny. To tak ogólnie bez konkretów żebyś trochę sam pogłówkował :)
    Nie wiem jak tu, ale są też takie tryby jak PWM. Po ustawieniu takiego trybu (konfiguracja w 3 linijkach) nie musisz się martwić diodą. No ale poczytaj i poszukaj bo ja nie wiem co te timery w tych PICach mają.

    0
  • #4 19 Cze 2012 18:47
    94075
    Użytkownik usunął konto