<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><font face="Arial">Ano. A to ten program přesně dělá. Jen fígl je
        v tom, že to dělá pomocí přerušení, takže procesor přitom může
        dělat něco jiného. Na opakovací frekvenci cca 20kHz je to už
        docela honička.</font><br>
    </p>
    <pre class="moz-signature" cols="72">Martin Záruba</pre>
    <div class="moz-cite-prefix">Dne 30.7.2023 v 19:22 Petr Labaj
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:d62398d4-92d3-a17a-8ea6-d1b6985e82f1@volny.cz">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      Nejsem žádný velký arduinista.<br>
      Generování PWM je ale snad principiálně všude stejné, ne?<br>
      Nastaví se co nejvyšší základní frekvence čítaní, opakovací
      frekvence se nastaví<br>
      v nějakém registru pro reload čítače, a šířka pulzu se nastaví v
      nějakém registru<br>
      pro komparaci s aktuálním stavem čítače.<br>
      <br>
      Pokud to ty úplně základní knihovny přímo od Arduina neumí, tak
      skoro určitě<br>
      k nim bude existovat nějaká vylepšená verze.<br>
      Pokud tedy programátor nechce řešit nastavení čítače sám, což je
      nejlepší.<br>
      <br>
      I to nejobyčejnější AVR má čítačů víc, takže se nemusí sahat na
      ten, který se<br>
      používá pro generování TIKů.<br>
      <br>
      Nebo je tady něco zásadního, co jsem přehlídnul?<br>
      <br>
      PL<br>
      <br>
      ********************<br>
      <br>
      <div class="moz-cite-prefix">Dne 30.7.2023 v 19:09 Martin Záruba
        napsal(a):<br>
      </div>
      <blockquote type="cite"
        cite="mid:2a9e4031-b2ec-487c-f08a-f38aa2046b3b@volny.cz">
        <meta http-equiv="Content-Type" content="text/html;
          charset=UTF-8">
        <p><font face="Arial">Nevyhoví, protože já potřebuji frekvenci
            okolo 20kHz.</font></p>
        <p><font face="Arial">Ale snad jsem to vyšrachal. Možná by Vás
            to mohlo zajímat. Zde je ukázka programu, který pomocí
            přerušení od interního časovače generuje dva různé nezávislé
            pulzy na výstupech 9 a 10. Všechny normální funkce (externí
            přerušení, delay) by měly zůstat zachovány.<br>
          </font></p>
        <p><br>
        </p>
        <p><font face="Arial">#include <avr/io.h><br>
            #include <avr/interrupt.h><br>
            <br>
            // Proměnné pro uchování šířky pulzů<br>
            volatile unsigned int pulseWidth1 = 1000; // Výchozí šířka
            pulzu 1 na Counter1 - 1000 us (1 ms)<br>
            volatile unsigned int pulseWidth2 = 500;  // Výchozí šířka
            pulzu 2 na Counter2 - 500 us<br>
            <br>
            void setup() {<br>
              // Nastavení pinů pro výstup pulzů<br>
              pinMode(9, OUTPUT);<br>
              pinMode(10, OUTPUT);<br>
            <br>
              // Nastavení časovače Timer/Counter1<br>
              cli(); // Vypnutí globálních přerušení<br>
              TCCR1A = 0; // Vynulování registru TCCR1A<br>
              TCCR1B = 0; // Vynulování registru TCCR1B<br>
            <br>
              // Nastavení režimu Fast PWM (TOP = ICR1)<br>
              TCCR1A |= (1 << WGM11);<br>
              TCCR1B |= (1 << WGM13) | (1 << WGM12);<br>
            <br>
              // Nastavení hodinového děliče na 64 (frekvence časovače =
            frekvence CPU / 64)<br>
              TCCR1B |= (1 << CS11) | (1 << CS10);<br>
            <br>
              // Nastavení intervalu pro generování přerušení (1 ms) -
            pro frekvenci CPU 16 MHz<br>
              // ICR1 = (F_CPU / (časový interval * hodinový dělič)) - 1<br>
              ICR1 = 249; // 1 ms při frekvenci CPU 16 MHz a hodinovém
            děliči 64<br>
            <br>
              // Povolení přerušení od časovače Timer/Counter1<br>
              TIMSK1 |= (1 << TOIE1);<br>
            <br>
              // Nastavení časovače Timer/Counter2<br>
              TCCR2A = 0; // Vynulování registru TCCR2A<br>
              TCCR2B = 0; // Vynulování registru TCCR2B<br>
            <br>
              // Nastavení režimu Fast PWM (TOP = 255)<br>
              TCCR2A |= (1 << WGM21) | (1 << WGM20);<br>
              TCCR2B |= (1 << CS22); // Hodinový dělič 64 -
            frekvence časovače = frekvence CPU / 64<br>
            <br>
              // Povolení přerušení od časovače Timer/Counter2<br>
              TIMSK2 |= (1 << TOIE2);<br>
            <br>
              sei(); // Zapnutí globálních přerušení<br>
            }<br>
            <br>
            void loop() {<br>
              // V hlavní smyčce (loop) můžete provádět další činnosti<br>
            }<br>
            <br>
            // Obsluha přerušení od časovače Timer/Counter1<br>
            ISR(TIMER1_OVF_vect) {<br>
              // Generování pulzu 1 na pinu 9 (při logické 1)<br>
              digitalWrite(9, HIGH);<br>
              <br>
              // Počkejte na dobu odpovídající šířce pulzu 1<br>
              delayMicroseconds(pulseWidth1);<br>
            <br>
              // Ukončení pulzu 1 (nastavení logické 0)<br>
              digitalWrite(9, LOW);<br>
            }<br>
            <br>
            // Obsluha přerušení od časovače Timer/Counter2<br>
            ISR(TIMER2_OVF_vect) {<br>
              // Generování pulzu 2 na pinu 10 (při logické 1)<br>
              digitalWrite(10, HIGH);<br>
            <br>
              // Počkejte na dobu odpovídající šířce pulzu 2<br>
              delayMicroseconds(pulseWidth2);<br>
            <br>
              // Ukončení pulzu 2 (nastavení logické 0)<br>
              digitalWrite(10, LOW);<br>
            }<br>
          </font><br>
        </p>
        <pre class="moz-signature" cols="72">Martin Záruba</pre>
        <div class="moz-cite-prefix">Dne 30.7.2023 v 16:36 Jaroslav
          Buchta napsal(a):<br>
        </div>
        <blockquote type="cite"
          cite="mid:059308af-82e5-9dc1-bde2-86442186dc29@hascomp.cz">To
          zalezi, jaky mate MCU. Treba ESP32 na generovani prubehu i
          neperiodickych ma super periferii. <br>
          Jinak nevyhovi obecne PWM? To by mely umet vsechny MCU. <br>
          <br>
          Dne 30.07.2023 v 14:59 Martin Záruba napsal(a): <br>
          <blockquote type="cite">Potřeboval bych přimět Arduino
            generovat pulzy o frekvenci cca 20kHz, ale s jinou střídou,
            než 1:1, jak dělá příkaz tone. Jde to nějak? <br>
            <br>
          </blockquote>
          <br>
          _______________________________________________ <br>
          HW-list mailing list  -  sponsored by <a
            class="moz-txt-link-abbreviated" href="http://www.HW.cz"
            moz-do-not-send="true">www.HW.cz</a> <br>
          <a class="moz-txt-link-abbreviated moz-txt-link-freetext"
            href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">Hw-list@list.hw.cz</a>
          <br>
          <a class="moz-txt-link-freetext"
            href="http://list.hw.cz/mailman/listinfo/hw-list"
            moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a>
          <br>
        </blockquote>
        <br>
        <fieldset class="moz-mime-attachment-header"></fieldset>
        <pre class="moz-quote-pre" wrap="">_______________________________________________
HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz" moz-do-not-send="true">www.HW.cz</a>
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:Hw-list@list.hw.cz" moz-do-not-send="true">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list" moz-do-not-send="true">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
      </blockquote>
      <br>
      <br>
      <fieldset class="moz-mime-attachment-header"></fieldset>
      <pre class="moz-quote-pre" wrap="">_______________________________________________
HW-list mailing list  -  sponsored by <a class="moz-txt-link-abbreviated" href="http://www.HW.cz">www.HW.cz</a>
<a class="moz-txt-link-abbreviated" href="mailto:Hw-list@list.hw.cz">Hw-list@list.hw.cz</a>
<a class="moz-txt-link-freetext" href="http://list.hw.cz/mailman/listinfo/hw-list">http://list.hw.cz/mailman/listinfo/hw-list</a>
</pre>
    </blockquote>
  </body>
</html>