Witam, piszę ostatnio program na Atmega16, odtwarzający melodie midi, przy wolniejszych utworach wszystko działa wspaniale, przesyłałem nawet informację na terminal i bajty wspaniale się zgadzają. Generalnie przychodzą 3 bajty, z których pierwszy jeśli jest równy 90, gram nutkę występującą po nim, jak 80 to ją wyłączam, jak 0xC0 i wyżej do 0xC9 to znaczy że zmienia się program i jak 0xB0 do 0xB9 to bajt kontrolny, który jest do niczego nie potrzebny w mojej aplikacji, przykładowa informacja midi:
C0 51 90 46 78 80 46 40 90 46 5A
Oznacza zmień program na 55 (jedyna dwubajtowa informacja w ciągu danych), dalej włącz nutkę (90) o numerze 46 (jakis tam dzwiek, mam to w tablicy) i 78 to siła naciśnięcia klawisza. To jest koniec kompletnej informacji. Dalej po 80 mamy 46 co nie oznacza nic innego, jak wyłącz dźwięk o numerze 46, całość powtarza się aż do końca piosenki, dla zainteresowanych kody midi są tutaj: http://www.onicos.com/staff/iz/formats/midi-event.html Mój problem jest następujący:
Dane są zadeklarowane ( w mainie zainicjalizowane zmienne typu volatile ):
Fragment kodu przerwania:
W mainie pętla nic nie robi, timer pracuje w trybie CTC, zegar 16Mhz, jak wspomniałem wszystkie dźwięki odtwarzane są płynnie, póki nie ma szybkozmiennych szesnastek itd, wtedy jakby gubił dźwięki i niektóre przedłużał. Pytanie moje dotyczy tego, jak szybko i bezpiecznie sprawdzać warunki na przychodzący bajt w przerwaniu? Czy instrukcja switch/case rozpisana na kilkadziesiąt przypadków jest szybsza niż zastosowane przeze mnie ify? Ogólnie zależy mi na tym, żeby po nadejściu bajtów z serii 0xB0..B9 wyłączało granie, 0xC0 ładowało tylko dwa bajty i żeby zawsze bajty kolejne (z serii 3-bajtowych wartościowych) były ładowane tak, że środkowy z bufora jest jednocześnie indeksem do tablicy.
C0 51 90 46 78 80 46 40 90 46 5A
Oznacza zmień program na 55 (jedyna dwubajtowa informacja w ciągu danych), dalej włącz nutkę (90) o numerze 46 (jakis tam dzwiek, mam to w tablicy) i 78 to siła naciśnięcia klawisza. To jest koniec kompletnej informacji. Dalej po 80 mamy 46 co nie oznacza nic innego, jak wyłącz dźwięk o numerze 46, całość powtarza się aż do końca piosenki, dla zainteresowanych kody midi są tutaj: http://www.onicos.com/staff/iz/formats/midi-event.html Mój problem jest następujący:
Dane są zadeklarowane ( w mainie zainicjalizowane zmienne typu volatile ):
Kod: C / C++
Fragment kodu przerwania:
Kod: C / C++
W mainie pętla nic nie robi, timer pracuje w trybie CTC, zegar 16Mhz, jak wspomniałem wszystkie dźwięki odtwarzane są płynnie, póki nie ma szybkozmiennych szesnastek itd, wtedy jakby gubił dźwięki i niektóre przedłużał. Pytanie moje dotyczy tego, jak szybko i bezpiecznie sprawdzać warunki na przychodzący bajt w przerwaniu? Czy instrukcja switch/case rozpisana na kilkadziesiąt przypadków jest szybsza niż zastosowane przeze mnie ify? Ogólnie zależy mi na tym, żeby po nadejściu bajtów z serii 0xB0..B9 wyłączało granie, 0xC0 ładowało tylko dwa bajty i żeby zawsze bajty kolejne (z serii 3-bajtowych wartościowych) były ładowane tak, że środkowy z bufora jest jednocześnie indeksem do tablicy.
