Skocz do zawartości

Przycisk włączający dźwięk


MortiX

Pomocna odpowiedź

hmm nadal tego nie rozumiem

*/
void beep(unsigned int frequency, unsigned int duration)
{  
  unsigned int i,t,n;  
  t = 125000/frequency;  
  n = (250UL*duration)/t;

  PORTB |= 0x01; /// ustawiony zostanie PB0 na 1
  PORTB &= ~0x02; //ustawienie PB1 na 0
  for(i=0; i < n; i++) 
  {
    PORTB ^= 0x01;  //zmiana stanu na przeciwny na PB0
    PORTB ^= 0X02;  //zmiana stanu na przeciwny na PB1
    _delay_loop_2(t); // opóżnienie 4 cykle zegara razy t
  } 
}
/*

Mam nadzieję że na tyle zrozumiałem koda. funkcja for wykonywana jest n razy dla każdego nowego wywołania częstotliwości(frequency) oraz nowego czasu trwania(duration), ale skąd one wynikają ? z wzoru na częstotliwość mamy frequency= number of cycles/duration, ale skąd te wartości 125000 oraz 250 ?? Siedzę nad tym cały dzień i nie kumam 🙂 Proszę ukrócić moje męki 🙂

 

Link do komentarza
Share on other sites

Autor tego wątku miał procesor z zegarem 1MHz. Jeden takt ma zatem 1us a 4 takty opóźnienia to 4us. Gdybyś chciał wyznaczyć w us okres sygnału, którego częstotliwość podajesz w Hz to miałbyś:

t = 1000000 / frequency

Tutaj kwantem są 4us a liczysz półokres, bo zmiany stanu wyjść następują 2 razy na okres więc powinineś liczyć:

t = 1000000 / frequency / (4*2)

a stąd już prosto do:

t = 125000/frequency 🙂

Ta druga stała służy do zamiany długości trwania dźwięku na liczbę obrotów pętli generatora beep(). W oryginalnym kodzie masz tablicę melodii, gdzie każdy dźwięk opisany jest długością i częstotliwością. Ale długość podawana jest w milisekundach a nie w liczbie półokresów dźwięku - a tę liczbę musisz znać wykonując pętlę for. No i mając zadaną liczbę milisekund trzeba wyznaczyć ile razy trzeba się obrócić w pętli (o już wyliczonym czasie trwania t) by "bipczeć" dokładnie tyle czasu ile trzeba. Przykładowo dla tonu 440Hz dostajesz t = 284. Jeśli chcesz by ten dżwięk trwał pół sekundy (500ms) to liczysz:

n = (250*500) / 284

i wychodzi n = 440. Jeżeli wyprodukujesz tyle półokresów fali 440Hz to zużyjesz na to dokładnie pół sekundy 🙂 

Modyfikując tę drugą stałą możesz zmieniać prędkość odgrywania zakodowanej już muzyczki bez grzebania w tabelce.

  • Lubię! 1
  • Pomogłeś! 1
Link do komentarza
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.