Strona 1 z 2
Generowanie pojedyńczego dźwięku
: 07 gru 2018, 13:23
autor: sp3ots
Witam !
Szukam przykładu jak obliczy i wygenerować pojedynczy dźwięk w przerwaniu np. na Atmega8 + rwzonator ?
Dźwięk np. 1047Hz ( nie musi to być sinusoida ).
Pozdrawiam. Stefan
Re: Generowanie pojedyńczego dźwięku
: 07 gru 2018, 13:37
autor: niveasoft
Na to jest więcej przepisów. Do obliczeń najprościej jest wykorzystać jakiś pierwszy z brzegu kalkulator. Przykładowy kalkulator jest dołączony do MkAVRcalculator`a.
Częstotliwość na wyjściu to, w najprostszej formie, odwrócenie stanu pinu który to generuje. Dlatego częstotliwość musi być dwukrotnie wyższa.
Widać to na dołączonym obrazku. Czestotliwość przerwania i niżej częstotliwość generowana którą wpisałem z palca.
W drugą stronę -> chcesz mieć coś na pinie, np. 100Hz to mnożysz sobie razy dwa i obliczasz przerwanie na 200Hz.
Myślę jednak że Timer2 lub Timer1 mają rejestry Compare i może nawet nie potrzebujesz przerwań. Timer sam będzie odwracał stan pinu wyjściowego. Jedyne tu ograniczenie to to że wtedy musi to być pin przypisany sprzetowo do Timera (pin opisany w Datasheet jako OC2, OC1A lub OC1B)
Z drugiej strony widać że ewentualne przerwanie będzie się odbywać co 477us i tu możesz sobie też odliczać czas do zakończenia pojedynczego dźwięku...
Nie przedstawiłem wszystkich a sam widzisz że jest już trochę możliwości.
Re: Generowanie pojedyńczego dźwięku
: 08 gru 2018, 10:37
autor: sp3ots
Witam !
Dziękuję za wyjaśnienie, kalkulator już pobrałem.
Dzisiaj rozpocznę zabawę, tylko nie wiem jak się do tego zabrać, nigdy nie miałem do czynienia z "OC2, OC1A lub OC1B".
Zacznę od zaprogramowania miernika częstotliwości na ATtiny2313, potem połączę z Atmega8 mam je na jednej płycie testowej.
Czy wiecie Państwo jak długo program "MkAVRcalculator" będzie działał bez rejestracji pobrany z ATnel ?
Re: Generowanie pojedyńczego dźwięku
: 08 gru 2018, 10:40
autor: niveasoft
Program sobie będzie działał.. to nie trial. To okrojona wersja i główną funkcjonalność proponuje dla kilku procesorków (chyba trzech).
Timer kalkulator działa bez licencji . Nic nie bój.
Napisz lepiej jaki procesor, która noga i jaki kwarc a postaram się nie napisać wszystkiego za Ciebie tylko napisać jak to można zrobić
Re: Generowanie pojedyńczego dźwięku
: 08 gru 2018, 11:13
autor: sp3ots
Ok, będę korzystał tylko z kalkulatora.
Jako generator - ATmega8 rezonatory do wyboru:
są na Goldpinach, 8, 10, 12, 14.7456 i 16MHz
Re: Generowanie pojedyńczego dźwięku
: 08 gru 2018, 11:17
autor: niveasoft
Mi dajesz wybierać rezonator? No daj spokój
Rezonator sie wybiera do zadania. Jak coś może być zrobione przy 4MHz to się taki daje i procesor mniej żre prądu.
Jak już naprawdę coś od niego potrzebujesz to dajesz 16MHz...
Więcej się w tym temacie nie odezwę jak nie napiszesz "czegoś konkretniej"
Re: Generowanie pojedyńczego dźwięku
: 08 gru 2018, 12:31
autor: sp3ots
Pytasz o rezonator to napisałem, skąd mam wiedzieć jaki nada się jeśli jeszcze tego nie robiłem ?
W tej chwili poznaję zależność waitus - częstotliwość.
Teraz pobawię się przerwaniami.
Re: Generowanie pojedyńczego dźwięku
: 08 gru 2018, 12:42
autor: niveasoft
Okay, przepraszam jeśli mój ton wydał się szorstki. Miało być śmiesznie, zapewniam
Waitms, Wait, Waitus to są opóxnienia niezależne od procesora..jeśli go zadeklarujesz poprawnie.
Chodzi o to że jeśli Bascomowi napiszesz $crystal = 1000000 (1MHz) a potem napiszesz Wait 1 to Bascom czyta : zrób opóźnienie/odlicz jedną sekundę przy 1MHz i wie że procek smiga 1MHz to wystarczy cos zrobic jeden milion razy i gotowe bo minie sekunda
Jak go oszukasz i napiszesz &crystal = 1000000 a będziesz miał ustawiony kwarc 16MHz to na sto procent wszystko sie skończy piętnaście razy szybciej
Także : wszystkie wait, Waitms i Waitus bazują na tym że podajesz właściwe dane kompilatorowi który za Ciebie liczy/wstawia opóźnienia.
Teraz może inaczej. Nowa Atmega ma 1MHz. Można ja przełaczyć na 8MHz. Może nie jest Tobie potrzebny żaden rezonator i da wszystko radę zrobić przy 1MHz lub 8MHz wewnętrznym.
Nie piszesz co chcesz osiągnąć.. Nie wiem czy wiesz że jest taka Bascomowa funkcja Sound
https://wiki.mcselec.com/bavr/SOUND
Re: Generowanie pojedyńczego dźwięku
: 08 gru 2018, 13:00
autor: sp3ots
Wiem o souund, się tym bawiłem,tam są dwa parametry, (niby) częstotliwość długość tonu, jeśli dobrze pamiętam to oba miały wpływ na częstotliwość.
Dlatego bawię się inaczej, może tak nie powinno się robić ale ja dziadek nie znający j.angielskiego inaczej nie umiem.
Teraz sprawdzam jaki ma wpływ preskaler
$regfile = "m8adef.dat"
$crystal = 8000000
Config Portb.0 = Output
Ton Alias Portb.0
Config Timer0 = Timer , Prescale = 8. '1, 8, 64, 256
Enable Timer0
On Timer0 Czas
Enable Interrupts
'na generowanie tonu
do
loop
end
Prztimer0: 'co 4ms
Timer0 = 131 '131 bo 256=131=125
Set F4ms '4ms = 125Hz
Toggle Ton
return
W tej konfiguracji mam 3788Hz, zaznaczam że nie mam skalibrowanego miernika częstotliwości.
Cel zadania- wykonanie prostego instrumentu klawiszowego podobnego do elek 144, który by miał więcej niż jedną oktawę.
Jeden pin wejściowy uP jeden ton, wszystkie tony na jednym pinie wyjściowym, teraz na PB.0
Re: Generowanie pojedyńczego dźwięku
: 09 gru 2018, 11:03
autor: Henryk
Witam sp3ots - Stefan
W ramach nudy zmajstrowałem krótki program w oparciu o instrukcję Sound .
$regfile = "m8def.dat"
$crystal = 8000000
$hwstack = 64
$swstack = 64
$framesize = 128
Config Portb.0 = Output 'wyjście
Config Pinb.1 = Input : Set Portb.1 'wejście
Config Pinb.2 = Input : Set Portb.2
Config Pinb.3 = Input : Set Portb.3
Config Pinb.4 = Input : Set Portb.4
Config Pinb.5 = Input : Set Portb.5
Config Pinb.6 = Input : Set Portb.6
Do
If Pinb.1 = 0 Then : Sound Portb.0 , 100 , 100 : End If
If Pinb.2 = 0 Then : Sound Portb.0 , 200 , 200 : End If
If Pinb.3 = 0 Then : Sound Portb.0 , 300 , 300 : End If
If Pinb.4 = 0 Then : Sound Portb.0 , 400 , 400 : End If
If Pinb.5 = 0 Then : Sound Portb.0 , 500 , 500 : End If
If Pinb.6 = 0 Then : Sound Portb.0 , 600 , 600 : End If
Waitms 100
' Sound Portb.0 , 100 , 1000
' Sound portb.0 ....pin wyjścia
' 100....ilość impulsów na wyjściu
' 1000....czas trwania pojedynczego impulsu
Loop
o 'podłączenie głośnika tak jak podano w linku https://wiki.mcselec.com/bavr/SOUND
Pozdrawiam Henryk .