marek1707 Grudzień 22, 2020 Udostępnij Grudzień 22, 2020 To może zacznijmy od tego w jaki sposób funkcja beep() generuje dźwięk. Opisz nam to własnymi słowami. Tak w 5 zdaniach. Jeśli się skupisz, zrozumiesz to i opiszesz, to nagle cała sprawa okaże się prosta. Cytuj Link do komentarza Share on other sites More sharing options...
jankowalskijfk Grudzień 22, 2020 Udostępnij Grudzień 22, 2020 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 🙂 Cytuj Link do komentarza Share on other sites More sharing options...
marek1707 Grudzień 22, 2020 Udostępnij Grudzień 22, 2020 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. 1 1 Cytuj Link do komentarza Share on other sites More sharing options...
Pomocna odpowiedź
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!