Wpis z mikrobloga

Pracuję nad projektem, do którego chcę zrobić prostego sound chipa. Wszystkim ma sterować atmega88pa-pu, która w tym momencie jest ustawiona na 8 MHz bez xtala (wyłączony dzielnik z fusebitów). Układ widoczny na załączonym obrazku.
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
Pobierz Feargan - Pracuję nad projektem, do którego chcę zrobić prostego sound chipa. Wszystk...
źródło: comment_cWlCbPRWdIe25mF7RoJW70Rxusx1Ig8f.jpg
  • 24
@Gio17: raczej nie jest zniekształcony, tylko wolniejszy
@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: A zobacz co ci wychodzi w assemblerze, bo operacje na uint64 to nie jest coś co atmega zrobi wydajnie. Jako że większość instrukcji wykonuje się w jednym cyklu to wystarczy policzyć instrukcje i zobaczyć czy wychodzi więcej niż te 31250 Hz co próbujesz uzyskać.
@Feargan: skoro ocra jest 16bitowy to po ki grom tam pchasz 4 razy większy zakres zmiennej? błąd numer jeden. No i nic nie robisz z t albo to nie jest cały kod programu a skoro to arduino to wiele rzeczy może cię zaskoczyć.
@a231: @Gio17: @zetisdead: właśnie ogarnąłem, że zmiana typu t na uint32_t uszczupla kod assemblera o jakieś 80 linijek, teraz dźwięk odtwarza się (chyba) tak jak powinien ( ͡° ͜ʖ ͡°) ale babol
dzięki za naprowadzenie ( ͡° ͜ʖ ͡°)

@Analityk: ocr0a jest 8 bitowy, ale kluczową kwestią są tu obliczenia wykonywane na większym zakresie
@a231: w takim razie t jest równe zero, zawsze, i program nie ma sensu. załóżmy ocra=128. wtedy koleś dostaje przerwanie 31k razy na sekundę i, jeśli tylko zmienia stan pd6 to dostaje przebieg o częstotliwości 15.5kHz, wiele osób tego już nie słyszy. kolega ma błąd w kodzie, chce, żebyśmy go znaleźli ale nie pokazuje nam kodu. może to nie jedyna rzecz, jaką pomija.
@Feargan: wychodzi na to, że pokazałeś tylko fragment kodu. w dalszym ciągu upychasz do bajtu 4 bajty.
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.
@Analityk: t musi być 32-bitowe, inaczej program odtwarzałby jedynie super krótki fragment melodyjki. Po drugie, podczas przypisywania wartości t do OCR0A następuje niejawna konwersja na uint8_t, która w zasadzie polega na przypisaniu do tego rejestru wartości równej t&0xff lub t%256.
Na jakiej podstawie stwierdzasz, że t jest zawsze równe 0?


@Feargan: Na podstawie linii kodu numer 27 z listingu, który zamieściłeś:

static uint64t t = 0;

t musi być 32-bitowe


@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ń.

niejawna konwersja na uint8t

To powiedz mi jaka wartość znajdzie się w OCRA w tym przypadku:
OCR1A
@Analityk:

Na podstawie linii kodu numer 27 z listingu, który zamieściłeś


static storage duration - przecież wyraźnie widać, że t jest static, 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.

Do rejestrów powinieneś wpisywać takie wartości, jakie powinny się tam znaleźć. Niejawna konwersja w tym momencie to domaganie się nieokreślonych zachowań.


Zgodnie ze standardem C takie