ATNEL tech-forum
https://forum.atnel.pl/

Buzzer piezo na przerwaniach - rozwiązania
https://forum.atnel.pl/topic2020.html
Strona 1 z 1

Autor:  tom1988p [ 31 gru 2012, o 13:05 ]
Tytuł:  Buzzer piezo na przerwaniach - rozwiązania

Witam.

Boli mnie problem generowania dźwięku za pomocą buzzera piezo.
Nie to że samo generowanie ale sposób.
Aktualnie gdy odgrywa dźwięk to procesor "wiekami nic nie robi" (_delay_loop_2()) niby szybka funkcja ale za to może długo przetrzymywać w pętli for.

Kod jaki wykorzystuję:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

I tak myślę sobie, że zgodnie z regułą nie blokowania programu można by do tego wykorzystać timer, niestety genialne pomysły mnie omijają. Liczę na wasze podpowiedzi ostatecznie gotowe rozwiązania jak by to ugryźć.
Na dodatek google mi od paru dni nie sprzyja, wiec dlatego idę teraz tą drogą (forum);

Autor:  tom1988p [ 31 gru 2012, o 14:25 ]
Tytuł:  Re: Buzzer piezo na przerwaniach - rozwiązania

Tak od 0,5s do 3s, częstotliwości jeszcze nie znam. Dobieram na zasadzie prób i błędów ale tak do około 10kHz (możliwe ze mniej)

Autor:  mirekk36 [ 31 gru 2012, o 14:53 ]
Tytuł:  Re: Buzzer piezo na przerwaniach - rozwiązania

Przede wszystkim wyrzuć z kodu od razu ten nieszczęsny :(

#define F_CPU 1000000

ok ? to masakra - no i kod źródłowy dawaj w znacznikach [ syntax = c ] zamiast code, zaraz ci poprawię pierwszy post to wyedytuj sobie i zobacz jak się to robi ok?

Autor:  Krauser [ 31 gru 2012, o 15:16 ]
Tytuł:  Re: Buzzer piezo na przerwaniach - rozwiązania

Inne podejście:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Autor:  Krauser [ 31 gru 2012, o 15:49 ]
Tytuł:  Re: Buzzer piezo na przerwaniach - rozwiązania

No nie wiem. Za używanie Timera 1 do piskania można trafić do LOCHÓW i samemu potem jęczeć o pigułki :?
Funkcja beep niestety również odblokowuje przerwania. Co przy dużej częstotliwości obciąży procesor. Polecam beep_start i beep_stop, ale wtedy w programie jakoś trzeba to wkomponować w pętlę główną z użyciem timera programowego.

Autor:  tom1988p [ 31 gru 2012, o 16:07 ]
Tytuł:  Re: Buzzer piezo na przerwaniach - rozwiązania

@Krauser PD4 i PD5 oraz rejestry OCR1A i OCR1B zajęte, wiec odpada twój kod.

@Antystatyczny przetestuje twój kod ale jutro dam znać bo dzisiaj to już szykuje się do wyjścia...

@Mirekk36 jeszcze troszkę i ta nieszczęsna definicja (i funkcje ją wykorzystujące) zniknie z mojej świadomości jej istnienia...

Autor:  tom1988p [ 2 sty 2013, o 17:53 ]
Tytuł:  Re: Buzzer piezo na przerwaniach - rozwiązania

Chłopaki udało mi się "nadziergać" kod do obsługi buzzera.

Podobno trafie w ciemne lochy za wykorzystanie aż dwóch timerów sprzętowych do obsługi "piskacza".
Nie jest on idealny bo potrafi odegrać tylko około 100 - 150 częstotliwości z przedziału od 15625Hz
do 61Hz (przy taktowaniu uC 1MHz) ale to wystarczy do piskania przy klawiaturze lub jakiegoś alertu, taki miałem cel.

A oto i ten mój kod:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Plik nagłówkowy:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.


Swój cel osiągnąłem może komuś przyda się takie podejście.
PS. Dzięki koledze Antystatyczny kod rozrósł się w takie coś, dał korzenie...

Autor:  Krauser [ 2 sty 2013, o 18:33 ]
Tytuł:  Re: Buzzer piezo na przerwaniach - rozwiązania

Myślę, że można to znacznie ulepszyć. Wykorzystać pin z funkcją alternatywną OC2 i nie używać przerwania ISR(TIMER2_COMP_vect) do zmiany stanu jednego wyprowadzenia. Po to takie tryby pracy zostały wymyślone. Czy do generowania sygnału PWM też angażowałbyś przerwania skoro to wcale nie jest wymagane (ale oczywiście możliwe zwłaszcza jak wszystkie wyjścia OCx są już zajęte) ?

Autor:  tom1988p [ 2 sty 2013, o 18:46 ]
Tytuł:  Re: Buzzer piezo na przerwaniach - rozwiązania

OC2 (PD7) wolne. Widzisz zaczynam i nie wiem wszystkiego ale staram się... Tak sądziłem, że na pewno można inaczej.

Dodano:
Po zwerbowaniu informacji dotarłem do takiej co by wyjście OC2 sprzętowo wykorzystać.
Zmiany zostały wprowadzone w tych miejscach:
Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Składnia: [ Pobierz ] [ Ukryj ]
język c
Musisz się zalogować, aby zobaczyć kod źródłowy. Tylko zalogowani użytkownicy mogą widzieć kod.

Oraz zostało wywalone przerwanie TIMER2_COMP_vect
Działa dożo lepiej. Na migającej diodzie nawet widać (mniej ją "muli").
Czy się da to jeszcze uszczuplić?

Strona 1 z 1 Strefa czasowa: UTC + 1
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/