Aktywne Wpisy
Dollcel +38
ZenujacaDoomerka +13
wysokie dziewczyny kochają wysokich chłopców
Niskie dziewczyny kochają wysokich chłopców
Niscy chłopcy kochają niskich chłopców
Tak jak matka natura chciala
Niskie dziewczyny kochają wysokich chłopców
Niscy chłopcy kochają niskich chłopców
Tak jak matka natura chciala
Głośnik jest sterowany przez PWM, na wyjście uC podaje wynik z algorytmu, konkretnie z tego. Cały kod programu tutaj. Przy tym taktowaniu częstotliwość próbkowania powinna wynieść
8000000/256 = 31250 Hz
. Czyli teoretycznie przy włączeniu układu do zasilania odgrywana melodia powinna być kilkukrotnie szybsza niż na wideo z youtube. A jest całkiem na odwrót - jest około dwukrotnie wolniejsza. Dlaczego tak jest, co przeoczyłem?#avr #elektronika
@a231: właśnie zastanawiałem się, jaki wpływ ma ta pozornie krótka linijka na sam procesor, bo dodanie jej spowodowało przyrost binarki o kilkaset (!) bajtów. Próbowałem przenosić kod z ISR do maina, ale nic to nie zmieniało. Nie mam za bardzo pomysłu jak sprawdzić, czy proc "wyrabia".
@Feargan: uruchom program w symulatorze i sprawdź czy przerwanie ma szansę się wykonać w 256 cykli (symulator powinien pokazywać cykle zegarowe). Możesz też na początku przerwania ustawić jakiś pin i na końcu go zgasić i sprawdzić wypełnienie takiego przebiegu na oscyloskopie.
@Analityk: To nie arduino
t
nauint32_t
uszczupla kod assemblera o jakieś 80 linijek, teraz dźwięk odtwarza się (chyba) tak jak powinien ( ͡° ͜ʖ ͡°) ale baboldzięki za naprowadzenie ( ͡° ͜ʖ ͡°)
@Analityk: ocr0a jest 8 bitowy, ale kluczową kwestią są tu obliczenia wykonywane na większym zakresie
Komentarz usunięty przez autora
Komentarz usunięty przez autora
@Feargan: ultradźwięki modulowane częstotliwościami akustycznymi ( ͡~ ͜ʖ ͡°)
a skoro w tym setupie słyszysz dźwięk to znaczy, że masz ustawiony fusebot dzielący główny zegar przez osiem. wtedy słyszałbyś dźwięk rzędu pojedynczych kiloherców ale #!$%@? bo nie pokazałeś całego kodu.
t
jest zawsze równe0
?t
musi być 32-bitowe, inaczej program odtwarzałby jedynie super krótki fragment melodyjki. Po drugie, podczas przypisywania wartościt
doOCR0A
następuje niejawna konwersja nauint8_t
, która w zasadzie polega na przypisaniu do tego rejestru wartości równejt&0xff
lubt%256
.@Feargan: Na podstawie linii kodu numer 27 z listingu, który zamieściłeś:
@Feargan: Do rejestrów powinieneś wpisywać takie wartości, jakie powinny się tam znaleźć. Niejawna konwersja w tym momencie to domaganie się nieokreślonych zachowań.
To powiedz mi jaka wartość znajdzie się w OCRA w tym przypadku:
OCR1A
static storage duration - przecież wyraźnie widać, że
t
jeststatic
, czyli przy pierwszym przerwaniu tworzona jest jedyna instancja tej zmiennej i istnieje do końca działania programu. Inicjalizacja wartości też występuje tylko raz.Zgodnie ze standardem C takie