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

Atmega8 [C] - Cyfrowy metronom - jak odliczać ilość uderzeń (BPM)?

papachili 10 Maj 2014 18:02 1260 2
REKLAMA
  • #1 13588066
    papachili
    Poziom 9  
    Witam, próbuję zrobić cyfrowy metronom - póki co składa się on z wyświetlacza 7-segmentowego i dwóch przycisków służących do wyboru tempa (BPM). Zegar wewnętrzny ustawiony na 1MHz.
    Mam jednak problem z napisaniem części kodu odpowiedzialnej za "piszczenie" buzzera w wybranym tempie.
    Korzystam z timera 1 w trybie 4 (CTC) z preskalerem 8, co według moich obliczeń daje częstotliwość 1000Hz. W przerwaniu odbywa się zmiana stanu na przeciwny, czyli częstotliwość spada do 500 Hz. Aby uzyskać 60 BPM (1Hz) przerwanie musi wystąpić 500 razy.
    Mam jednak pytanie, czy można to zrobić w jakiś inny sposób, aby zmiana tempa zależała tylko od zmiennej speed?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Poniżej zamieszczam fragment kodu
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • REKLAMA
  • Pomocny post
    #2 13588130
    jarekz_2
    Poziom 16  
    papachili napisał:
    (...)Mam jednak pytanie, czy można to zrobić w jakiś inny sposób, aby zmiana tempa zależała tylko od zmiennej speed?
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    (...)

    Ten sposób jest jak najbardziej odpowiedni. Mam tu następujące sugestie:
    - poprawić dokładność ustawiania tempa poprzez zwiększenie częstotliwości przerwań (ustawienie preskalera na 1),
    - przeliczać zadaną wartość tempa w bpm na wartość zmiennej speed z pomocą tablicy, by uniknąć wykonywania w AVR dzielenia wg wzoru speed = 60 * częstotliwość_przerwań / tempo_bpm; chociaż, jeśli układ nie ma innych funkcji oprócz metronomu, to optymalizacja nie jest taka ważna...
  • #3 13588163
    papachili
    Poziom 9  
    Dzięki za odpowiedź, kod poprawiony i program działa ;)

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Dodano po 20 [minuty]:

    Aj, jednak nie do końca działa tak jak powinno, bo po zwiększeniu tempa bpm szybkość pikania zamiast rosnąć to maleje.
REKLAMA