<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=4&amp;t=2020&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-01-02T18:46:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=2020&amp;mode</id>
<entry>
<author><name><![CDATA[tom1988p]]></name></author>
<updated>2013-01-02T18:46:32+01:00</updated>
<published>2013-01-02T18:46:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=23090#p23090</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=23090#p23090"/>
<title type="html"><![CDATA[Re: Buzzer piezo na przerwaniach - rozwiązania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=23090#p23090"><![CDATA[
OC2 (PD7) wolne. Widzisz zaczynam i nie wiem wszystkiego ale staram się... Tak sądziłem, że na pewno można inaczej.<br /><br />Dodano:<br />Po zwerbowaniu informacji dotarłem do takiej co by wyjście OC2 sprzętowo wykorzystać.<br />Zmiany zostały wprowadzone w tych miejscach:<br />[syntax=c]ISR(TIMER0_COMP_vect)// przerwanie do timera programowego<br />{<br />    uint8_t temp;<br /><br />temp = duration;<br />    if( temp ) duration--;<br /> else TCCR2 &amp;= ~(1&lt;&lt;COM20);<br />}[/syntax]<br />[syntax=c]void buzzer(uint16_t frequency, uint16_t czas)<br />{<br />    BUZZER_DIR |= BUZZER_PIN;<br />    BUZZER_PORT |= BUZZER_PIN;<br /><br />duration = czas;<br /><br />OCR2 = (F_CPU/8/frequency);<br /><br />TCCR2 |= (1&lt;&lt;COM20);  //Przełączanie OC2 przy zrównaniu<br />}[/syntax]<br />Oraz zostało wywalone przerwanie <strong>TIMER2_COMP_vect</strong><br />Działa dożo lepiej. Na migającej diodzie nawet widać (mniej ją &quot;muli&quot;).<br />Czy się da to jeszcze uszczuplić?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=746">tom1988p</a> — 2 sty 2013, o 18:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-01-02T18:33:47+01:00</updated>
<published>2013-01-02T18:33:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=23086#p23086</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=23086#p23086"/>
<title type="html"><![CDATA[Re: Buzzer piezo na przerwaniach - rozwiązania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=23086#p23086"><![CDATA[
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) ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 2 sty 2013, o 18:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tom1988p]]></name></author>
<updated>2013-01-02T17:53:58+01:00</updated>
<published>2013-01-02T17:53:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=23073#p23073</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=23073#p23073"/>
<title type="html"><![CDATA[Re: Buzzer piezo na przerwaniach - rozwiązania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=23073#p23073"><![CDATA[
Chłopaki udało mi się &quot;nadziergać&quot; kod do obsługi buzzera.<br /><br />Podobno trafie w ciemne lochy za wykorzystanie aż dwóch timerów sprzętowych do obsługi &quot;piskacza&quot;.<br />Nie jest on idealny bo potrafi odegrać tylko około 100 - 150 częstotliwości z przedziału od 15625Hz<br /> do 61Hz (przy taktowaniu uC 1MHz) ale to wystarczy do piskania przy klawiaturze lub jakiegoś alertu, taki miałem cel.<br /><br />A oto i ten mój kod:<br />[syntax=c]<br />/*<br /> *  main.c<br /> *  Created on: 2-1-2013<br /> *      Author: Tom<br /> *  ATMega16 1MHz<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;common.h&quot;<br /> <br />volatile uint16_t duration;<br /><br />void buzzer(uint16_t frequency, uint16_t duration);<br />void buzzer_init(void);<br />void Timer0_init(void);<br /><br />int main(void)<br />{<br />    buzzer_init();<br />Timer0_init();<br /><br />uint8_t i;<br />DDRD |= (1&lt;&lt;PD6);<br /><br />    sei();<br /><br />while(1)<br />{  <br />buzzer(5000,50);<br />    <br />// sztuczne obciazenie dlatego wpisane na sztywno<br />PORTB &amp;= ~(1&lt;&lt;PD6);<br />for(i=0; i &lt; 50; i++)<br />{<br />  PORTD ^= (1&lt;&lt;PD6);<br />  _delay_ms(50);<br />}<br />_delay_ms(1000);<br />    }<br />}<br /><br /><br />ISR(TIMER0_COMP_vect)// przerwanie do timera programowego<br />{<br />    uint8_t temp;<br /><br />temp = duration;<br />    if( temp ) duration--;<br />}<br /><br />ISR(TIMER2_COMP_vect)// Przerwanie jako &quot;player&quot;<br />{<br />  if( duration ) BUZZER_PORT ^= BUZZER_PIN;//jezeli jest jeszcze czas to piszcz.<br />   else TIMSK &amp;= ~(1&lt;&lt;OCIE2); //zablokowanie przerwania<br />  <br />}<br /><br />inline void Timer0_init(void)<br />{<br />        TCCR0 |= (1&lt;&lt;WGM01);//CTC<br />        TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);//Prescaler 1024<br />        OCR0 = 10;//<br />        TIMSK |= (1&lt;&lt;OCIE0);<br />}<br /><br />inline void buzzer_init(void)<br />{<br />        TCCR2 |= (1&lt;&lt;WGM21);//CTC<br />        TCCR2 |= (1&lt;&lt;CS21); //Prescaler 64<br />}<br /><br />void buzzer(uint16_t frequency, uint16_t czas)<br />{<br />    BUZZER_DIR |= BUZZER_PIN;<br />    BUZZER_PORT |= BUZZER_PIN;<br /><br />duration = czas;<br /><br />OCR2 = (F_CPU/8/frequency);<br /><br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania<br />}[/syntax]<br /><br />Plik nagłówkowy:<br />[syntax=c]<br />/*<br />* common.h<br />*  Created on: 31-12-2012<br />*      Author: Arek<br />*/<br /><br />#ifndef COMMON_H_<br />#define COMMON_H_<br /><br />#define BUZZER_DIR DDRD<br />#define BUZZER_PORT PORTD<br />#define BUZZER_PIN (1&lt;&lt;PD7)<br /><br />#endif /* COMMON_H_ */[/syntax]<br /><br />Swój cel osiągnąłem może komuś przyda się takie podejście.<br />PS. Dzięki koledze Antystatyczny kod rozrósł się w takie coś, dał korzenie...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=746">tom1988p</a> — 2 sty 2013, o 17:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tom1988p]]></name></author>
<updated>2012-12-31T16:07:30+01:00</updated>
<published>2012-12-31T16:07:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22728#p22728</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22728#p22728"/>
<title type="html"><![CDATA[Re: Buzzer piezo na przerwaniach - rozwiązania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22728#p22728"><![CDATA[
@Krauser PD4 i PD5  oraz rejestry OCR1A i OCR1B zajęte, wiec odpada twój kod.<br /><br />@Antystatyczny przetestuje twój kod ale jutro dam znać bo dzisiaj to już szykuje się do wyjścia...<br /><br />@Mirekk36 jeszcze troszkę i ta nieszczęsna definicja (i funkcje ją wykorzystujące) zniknie z mojej świadomości jej istnienia...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=746">tom1988p</a> — 31 gru 2012, o 16:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-31T15:49:12+01:00</updated>
<published>2012-12-31T15:49:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22726#p22726</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22726#p22726"/>
<title type="html"><![CDATA[Re: Buzzer piezo na przerwaniach - rozwiązania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22726#p22726"><![CDATA[
No nie wiem. Za używanie Timera 1 do piskania można trafić do LOCHÓW i samemu potem jęczeć o pigułki  <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" />  <br />Funkcja <em>beep</em> niestety również odblokowuje przerwania. Co przy dużej częstotliwości obciąży procesor. Polecam <em>beep_start </em>i <em>beep_stop</em>, ale wtedy w programie jakoś trzeba to wkomponować w pętlę główną z użyciem timera programowego.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 31 gru 2012, o 15:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-31T15:16:21+01:00</updated>
<published>2012-12-31T15:16:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22722#p22722</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22722#p22722"/>
<title type="html"><![CDATA[Re: Buzzer piezo na przerwaniach - rozwiązania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22722#p22722"><![CDATA[
Inne podejście:<br />[syntax=c]//Procesor ATMEGA16<br />//Taktowanie 1MHz<br />//piezo włączone pomiędzy PD4, PD5<br />//wykorzystuje Timer 1<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />//Prototypy funkcji<br />void beep(uint16_t frequency, uint16_t duration);<br />void beep_start(unsigned int frequency);<br />void beep_stop(void);<br /><br />volatile uint16_t ticks;<br />int main(void)<br />{<br /><br />beep(10000,1000);//1000Hz, 1000ms<br />while(1)<br />{<br /><br />}<br />return 0;<br />}<br /><br /><br />void beep(uint16_t frequency, uint16_t duration) <br />{ <br />  <br />  OCR1A = OCR1B = 1000000/8/frequency; //obliczenie OCR1A i OCR1B dla 1MHz i preskalera 8<br />  DDRD |= (1&lt;&lt;PD4) | (1&lt;&lt;PD5); //jako wyjścia<br />  PORTD |= (1&lt;&lt;PD4); //początkowa konfiguracja<br />  PORTD &amp;= ~(1&lt;&lt;PD5); //początkowa konfiguracja<br />  TCCR1A |= (1&lt;&lt;COM1A0) | (1&lt;&lt;COM1B0); //toggle PD4, PD5<br />  TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;CS11); //CTC mode, start timer, clk/8<br /><br />  ticks = (125UL*duration)/OCR1A;//obliczenie ilości przerwań<br /><br />  TIMSK |= (1&lt;&lt;OCIE1A);//odblokowanie przerwania compare match<br />  sei();<br />  <br />}<br /><br /><br />ISR(TIMER1_COMPA_vect)<br />{<br />uint16_t i;<br /><br />i = ticks;<br />if(i)<br />{<br />ticks = --i;<br />}<br />else<br />{<br /> TCCR1B &amp;= ~(1&lt;&lt;CS11);//wyłącz timer<br />}<br />}<br /><br /><br /><br />void beep_start(unsigned int frequency) <br />{ <br />  <br />  OCR1A = OCR1B = 1000000/8/frequency;<br />  DDRD |= (1&lt;&lt;PD4) | (1&lt;&lt;PD5);<br />  PORTD |= (1&lt;&lt;PD4);<br />  PORTD &amp;= ~(1&lt;&lt;PD5);<br />  TCCR1A |= (1&lt;&lt;COM1A0) | (1&lt;&lt;COM1B0);<br />  TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;CS11);<br />  <br />}<br /><br />void beep_stop(void)<br />{<br />TCCR1B &amp;= ~(1&lt;&lt;CS11);<br />} [/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 31 gru 2012, o 15:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-31T14:53:06+01:00</updated>
<published>2012-12-31T14:53:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22714#p22714</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22714#p22714"/>
<title type="html"><![CDATA[Re: Buzzer piezo na przerwaniach - rozwiązania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22714#p22714"><![CDATA[
Przede wszystkim wyrzuć z kodu od razu ten nieszczęsny <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />#define F_CPU 1000000<br /><br />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?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 31 gru 2012, o 14:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tom1988p]]></name></author>
<updated>2012-12-31T14:25:59+01:00</updated>
<published>2012-12-31T14:25:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22702#p22702</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22702#p22702"/>
<title type="html"><![CDATA[Re: Buzzer piezo na przerwaniach - rozwiązania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22702#p22702"><![CDATA[
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)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=746">tom1988p</a> — 31 gru 2012, o 14:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tom1988p]]></name></author>
<updated>2012-12-31T13:05:19+01:00</updated>
<published>2012-12-31T13:05:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22671#p22671</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22671#p22671"/>
<title type="html"><![CDATA[Buzzer piezo na przerwaniach - rozwiązania]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2020&amp;p=22671#p22671"><![CDATA[
Witam.<br /><br />Boli mnie problem generowania dźwięku za pomocą buzzera piezo. <br />Nie to że samo generowanie ale sposób.<br />Aktualnie gdy odgrywa dźwięk to procesor &quot;wiekami nic nie robi&quot; (_delay_loop_2()) niby szybka funkcja ale za to może długo przetrzymywać w pętli for.<br /><br />Kod jaki wykorzystuję:<br />[syntax=c]<br />#define F_CPU 1000000<br />#include &lt;avr\io&gt;<br />#include &lt;util\delay.h&gt;<br /><br />void beep(unsigned int frequency, unsigned int duration) <br />{ <br />  unsigned int i,t,n;<br />  <br />  t = 125000/frequency;<br />  n = (250UL*duration)/t;<br />  <br />  PORTB |= 0x01;<br />  PORTB &amp;= ~0x02;<br />  <br />  for(i=0; i &lt; n; i++)<br />  {<br />    PORTB ^= 0x01;<br />    PORTB ^= 0X02;<br />    _delay_loop_2(t);<br />  }<br />}<br /><br />/* Definicja funkcji main */<br />int main(void)<br />{ <br />  DDRB = 0xFF;<br /><br />  /* Przykłady wywołanie funkcji beep */<br />  beep(1000,1000);<br />}[/syntax]<br />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 <span style="text-decoration: underline">ostatecznie</span> gotowe rozwiązania jak by to ugryźć.<br />Na dodatek google mi od paru dni nie sprzyja, wiec dlatego idę teraz tą drogą (forum);<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=746">tom1988p</a> — 31 gru 2012, o 13:05</p><hr />
]]></content>
</entry>
</feed>