Generowanie pojedyńczego dźwięku

Pytania, kody i porady dotyczące nie tylko Bascom.
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Generowanie pojedyńczego dźwięku

Post autor: sp3ots » 07 gru 2018, 13:23

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
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Generowanie pojedyńczego dźwięku

Post autor: niveasoft » 07 gru 2018, 13:37

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.
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Re: Generowanie pojedyńczego dźwięku

Post autor: sp3ots » 08 gru 2018, 10:37

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 ?
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Generowanie pojedyńczego dźwięku

Post autor: niveasoft » 08 gru 2018, 10:40

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ć ;)
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Re: Generowanie pojedyńczego dźwięku

Post autor: sp3ots » 08 gru 2018, 11:13

Ok, będę korzystał tylko z kalkulatora.
Jako generator - ATmega8 rezonatory do wyboru:
są na Goldpinach, 8, 10, 12, 14.7456 i 16MHz
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Generowanie pojedyńczego dźwięku

Post autor: niveasoft » 08 gru 2018, 11:17

Mi dajesz wybierać rezonator? No daj spokój :D
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" :D
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Re: Generowanie pojedyńczego dźwięku

Post autor: sp3ots » 08 gru 2018, 12:31

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.
Awatar użytkownika
niveasoft
Posty: 1213
Rejestracja: 17 sie 2015, 12:13
Kontakt:

Re: Generowanie pojedyńczego dźwięku

Post autor: niveasoft » 08 gru 2018, 12:42

Okay, przepraszam jeśli mój ton wydał się szorstki. Miało być śmiesznie, zapewniam :D

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 :D

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
sp3ots
Posty: 42
Rejestracja: 08 wrz 2018, 10:26

Re: Generowanie pojedyńczego dźwięku

Post autor: sp3ots » 08 gru 2018, 13:00

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
  1.  
  2. $regfile = "m8adef.dat"
  3. $crystal = 8000000
  4. Config Portb.0 = Output
  5. Ton Alias Portb.0
  6.  
  7. Config Timer0 = Timer , Prescale = 8.                       '1, 8, 64, 256
  8. Enable Timer0
  9. On Timer0 Czas
  10. Enable Interrupts
  11.  
  12. 'na generowanie tonu
  13. do
  14. loop
  15. end
  16.  
  17. Prztimer0:                                                  'co 4ms
  18. Timer0 = 131       '131 bo   256=131=125
  19. Set F4ms                                                    '4ms = 125Hz
  20. Toggle Ton
  21. return
  22.  
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
Ostatnio zmieniony 08 gru 2018, 13:23 przez sp3ots, łącznie zmieniany 1 raz.
Awatar użytkownika
Henryk
Posty: 348
Rejestracja: 22 sty 2018, 17:20

Re: Generowanie pojedyńczego dźwięku

Post autor: Henryk » 09 gru 2018, 11:03

Witam sp3ots - Stefan :D

W ramach nudy zmajstrowałem krótki program w oparciu o instrukcję Sound .
  1. $regfile = "m8def.dat"
  2. $crystal = 8000000
  3. $hwstack = 64
  4. $swstack = 64
  5. $framesize = 128
  6.  
  7. Config Portb.0 = Output       'wyjście
  8. Config Pinb.1 = Input : Set Portb.1       'wejście
  9. Config Pinb.2 = Input : Set Portb.2
  10. Config Pinb.3 = Input : Set Portb.3
  11. Config Pinb.4 = Input : Set Portb.4
  12. Config Pinb.5 = Input : Set Portb.5
  13. Config Pinb.6 = Input : Set Portb.6
  14. Do
  15.  
  16.     If Pinb.1 = 0 Then : Sound Portb.0 , 100 , 100 : End If
  17.     If Pinb.2 = 0 Then : Sound Portb.0 , 200 , 200 : End If
  18.     If Pinb.3 = 0 Then : Sound Portb.0 , 300 , 300 : End If
  19.     If Pinb.4 = 0 Then : Sound Portb.0 , 400 , 400 : End If
  20.     If Pinb.5 = 0 Then : Sound Portb.0 , 500 , 500 : End If
  21.     If Pinb.6 = 0 Then : Sound Portb.0 , 600 , 600 : End If
  22.      Waitms 100
  23.    ' Sound Portb.0 , 100 , 1000
  24.    ' Sound portb.0 ....pin wyjścia
  25.    ' 100....ilość impulsów na wyjściu
  26.    ' 1000....czas trwania pojedynczego impulsu
  27. Loop
  28.  
  29.  
  30. o   'podłączenie głośnika tak jak podano w linku  https://wiki.mcselec.com/bavr/SOUND
Pozdrawiam Henryk .
ODPOWIEDZ