Witam forumowiczów
! Tworze projekt na zaliczenie - prostą perkusje elektroniczną, która posiada 12 przycisków, czytnik kart SD i wyjście PWM podpięte przez wzmacniacze do gniazda jack. Wszystko do momentu odtwarzania dźwięku działa poprawnie - wartości z pliku czyta prawidłowo (przetestowane na diodzie). Problem pojawia się gdy zaczynam odtwarzać dźwięki. Wydaje mi się, że o czymś zapomniałem konfigurując PWM. Próbowałem już wielu ustawień, starałem się uzyskać 22050Hz ustawiając odpowiedni prescaler, wartość TOP (ICR1) ale efekt jest mizerny - słychać brzęczenie i trzaski.
Format Wave
Schemat układu
Inspiracja do tak stworzonego audio
http://www.gaw.ru/pdf/Atmel/app/at45_to_avr.pdf (strona 5)
Program
Działanie programu
Tablica danych z pliku wave jest wyciągana zewnętrznym programem i zapisywana do pliku txt w formacie :
001 dla 1 058 dla 58 i tak dalej.
Po naciśnięciu odpowiedniego przycisku otwierany jest plik .txt z karty SD i ładowane są wartości do chara, potem przesuwane o 48 i mnożone w zależności od pozycji przez 100, 10 albo 1. Tak uzyskana próbka ląduje na OCR1B.
Ustawienia SPI
SPCR = 0x50;
SPSR = 0x01;
PORTB = 0xb0;
DDRB = 0xbf;
Fuse bity
Atmega została przyśpieszona do 8Mhz aby odczyt z karty SD nie trwał tak długo (ponad sekunde przy standardowym ustawieniu 1Mhz).
....................
Ok PWM wydaje się być ustawione poprawnie. Teraz pozostaje kwestia odtwarzania. Stworzyłem 2 bufory do których ładowane są wartości z karty SD. Chce aby program działał w ten sposób :
czytam dane do 2 buforów i następnie odtwarzam dane z jednego bufora, kiedy się skończą zaczynam czytać z drugiego a pierwszy zapełniam i tak w kółko aż do wyczerpania danych. Niezbędne będzie wykorzystanie przerwania podczas odtwarzania ale nie mam pojęcia jak to ustawić aby działało poprawnie.
Format Wave
Schemat układu
Inspiracja do tak stworzonego audio
http://www.gaw.ru/pdf/Atmel/app/at45_to_avr.pdf (strona 5)
Program
Kod: C / C++
Działanie programu
Tablica danych z pliku wave jest wyciągana zewnętrznym programem i zapisywana do pliku txt w formacie :
001 dla 1 058 dla 58 i tak dalej.
Po naciśnięciu odpowiedniego przycisku otwierany jest plik .txt z karty SD i ładowane są wartości do chara, potem przesuwane o 48 i mnożone w zależności od pozycji przez 100, 10 albo 1. Tak uzyskana próbka ląduje na OCR1B.
Ustawienia SPI
SPCR = 0x50;
SPSR = 0x01;
PORTB = 0xb0;
DDRB = 0xbf;
Fuse bity
Atmega została przyśpieszona do 8Mhz aby odczyt z karty SD nie trwał tak długo (ponad sekunde przy standardowym ustawieniu 1Mhz).
....................
Ok PWM wydaje się być ustawione poprawnie. Teraz pozostaje kwestia odtwarzania. Stworzyłem 2 bufory do których ładowane są wartości z karty SD. Chce aby program działał w ten sposób :
czytam dane do 2 buforów i następnie odtwarzam dane z jednego bufora, kiedy się skończą zaczynam czytać z drugiego a pierwszy zapełniam i tak w kółko aż do wyczerpania danych. Niezbędne będzie wykorzystanie przerwania podczas odtwarzania ale nie mam pojęcia jak to ustawić aby działało poprawnie.