<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    <p><font face="Arial">To je na mě moc složité, já byl zvyklý
        programovat především PC i když kdysi i sálový počítač v
        assembleru. Ale tam byl všechno jinak.</font></p>
    <p><font face="Arial">Je to Arduino Mega2560. Potřebuji udělat
        přerušení každých 100uS (Nemusí to být přesně a hodilo by se mi,
        kdybych změnou nějaké konstanty mohl zvolit optimální hodnotu
        někde mezi 60 - 200 uS.</font></p>
    <p><font face="Arial">V přerušení bude tato sekvence:</font></p>
    <p><font face="Arial"><br>
      </font></p>
    <p><font face="Arial">byte hodA[50],</font><font face="Arial">hodC[50],</font><font
        face="Arial">hodL[50];</font></p>
    <div style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;"><div><span style="color: #95a5a6;">// Obsluha přerušení od časovače Timer/Counter1</span></div><div><span style="color: #d35400;">ISR</span><span style="color: #434f54;">(</span><span style="color: #4e5b61;">TIMER1_OVF_vect</span><span style="color: #434f54;">)</span><span style="color: #4e5b61;"> </span><span style="color: #434f54;">{</span></div><span style="color: #4e5b61;"></span><span style="color: #4e5b61;"> </span><span style="color: #728e00;">for</span><span style="color: #4e5b61;"> </span><span style="color: #434f54;">(</span><span style="color: #4e5b61;">byte i=</span>0<span style="color: #4e5b61;">;i<=</span><span style="color: #005c5f;">50</span><span style="color: #4e5b61;">;i++</span><span style="color: #434f54;">)</span><span style="color: #4e5b61;"> </span><span style="color: #434f54;">{</span><div><span style="color: #4e5b61;">   PORTA=</span><span style="color: #d35400;">hodA</span><span style="color: #4e5b61;">[i];</span></div><div><span style="color: #4e5b61;">   PORTC=</span><span style="color: #d35400;">hodC</span><span style="color: #4e5b61;">[i];</span></div><div><span style="color: #4e5b61;">   PORTL=</span><span style="color: #d35400;">hodL</span><span style="color: #4e5b61;">[i];</span></div><div><span style="color: #4e5b61;"> </span><span style="color: #434f54;">}</span><span style="color: #4e5b61;">   </span></div><div><span style="color: #4e5b61;"> PORTA=</span><span style="color: #005c5f;">0</span><span style="color: #4e5b61;">;</span></div><div><span style="color: #4e5b61;"> PORTC=</span><span style="color: #005c5f;">0</span><span style="color: #4e5b61;">;</span></div><div><span style="color: #4e5b61;"> PORTL=</span><span style="color: #005c5f;">0</span><span style="color: #4e5b61;">;</span></div><span style="color: #434f54;">}</span>
</div>
    <div style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;">
</div>
    <font face="Arial">To přerušení jsem změřil, že trvá 28uS, takže by
      na ostatní mělo zbýt dost času. I když pole naplním hodnotami, aby
      vznikl široký pulz, cuká to stále, takže osciloskop za to nemůže.<br>
    </font>
    <p><font face="Arial">A potřebuji aby alespoň jeden další port byl
        schopen klasické PWM, frekvence celkem není důležitá, vyhovuje
        cokoli mezi 200 Hz až 1kHz.</font></p>
    <p><font face="Arial">Ale hodiny mi běží na 16Mhz, proto těch 10kHz,
        jinak není šance to stihnout. <br>
      </font></p>
    <p><font face="Arial">Já vlastně potřebuji udělat různě široké pulzy
        na 24 portech s opakovací frekvencí cca 5 - 20 kHz. Stačí mi ale
        50 kroků. Nic lepšího mě nenapadlo, než přerušení časovačem a v
        obsluze to, co jsem popsal. Naplnění, těch polí už je snadné.
        Funkce je asi jasná, prostě příslušné bity prvků pole naplním 1
        podle toho, jak dlouhý ten pulz má být. Jkmile má skončit, bity
        až do konce pole [50] jsou nulové. <br>
      </font></p>
    <p><font face="Arial">Ty pulzy mi to generuje a šířka je stabilní,
        takže je vidět, že přerušovací rutina proběhne spojitě, ale pak
        ta prodleva je nestejná, ač by měla být ovlivněna jen nastavením
        časovače.<br>
      </font></p>
    <p><font face="Arial">Jak mám změnit defaultní nastavení časovače1?
        To moje nastavení je zjevně blbě, ale nevím proč?</font><br>
    </p>
    <pre class="moz-signature" cols="72">Martin Záruba</pre>
    <div class="moz-cite-prefix">Dne 11.10.2023 v 0:29 Pavel Hudeček
      napsal(a):<br>
    </div>
    <blockquote type="cite"
      cite="mid:56e98722-d07d-4e9e-a2d1-ac24e4516b06@seznam.cz">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <a class="moz-txt-link-freetext"
href="https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf"
        moz-do-not-send="true">https://ww1.microchip.com/downloads/en/devicedoc/atmel-2549-8-bit-avr-microcontroller-atmega640-1280-1281-2560-2561_datasheet.pdf</a><br>
      <b>10.3.1 Default Clock Source </b><br>
      The device is shipped with internal RC oscillator at 8.0MHz and
      with the fuse CKDIV8 programmed, <b>resulting in 1.0MHz</b>
      system clock. The startup time is set to maximum and time-out
      period enabled. (CKSEL = "0010", SUT = "10", CKDIV8 = "0"). The
      default setting ensures that all users can make their desired
      clock source setting using any available programming interface.<br>
      <br>
      Takže "nic nenastavoval" znamená 1 MHz<br>
      <br>
      Pustil jsem wizard c codevisionu, naklikal 1 MHz CLK, mode CTC,
      přerušení od OCR1A a nechal vygenerovat:<br>
      (Používá jinou syntaxi přerušení, ale zbytek by měl fungovat)<br>
      --------------<br>
      // Timer/Counter 0 initialization<br>
      // Clock source: System Clock<br>
      // Clock value: 1000,000 kHz<br>
      // Mode: CTC top=OCR0A<br>
      // OC0A output: Disconnected<br>
      // OC0B output: Disconnected<br>
      // Timer Period: 0,1 ms<br>
      TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) |
      (0<<COM0B0) | (1<<WGM01) | (0<<WGM00);<br>
      TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) |
      (1<<CS00);<br>
      TCNT0=0x00;<br>
      OCR0A=0x63;<br>
      OCR0B=0x00;<br>
      <br>
      // Timer/Counter 0 Interrupt(s) initialization<br>
      TIMSK0=(0<<OCIE0B) | (1<<OCIE0A) | (0<<TOIE0);<br>
      <br>
      <br>
      // Timer 0 output compare A interrupt service routine<br>
      interrupt [TIM0_COMPA] void timer0_compa_isr(void)<br>
      {<br>
      // Place your code here<br>
      <br>
      }<br>
      ----------------<br>
      Takhle bych postupoval já, kdybych chtěl přerušení 10 kHz.<br>
      <br>
      Kdybych chtěl fast PWM na 10 kHz a k tomu přerušení, tak:<br>
      // Timer/Counter 0 initialization<br>
      // Clock source: System Clock<br>
      // Clock value: 1000,000 kHz<br>
      // Mode: Fast PWM top=OCR0A<br>
      // OC0A output: Disconnected<br>
      // OC0B output: Non-Inverted PWM<br>
      // Timer Period: 0,1 ms<br>
      // Output Pulse(s):<br>
      // OC0B Period: 0,1 ms Width: 0,049495 ms<br>
      TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) |
      (0<<COM0B0) | (1<<WGM01) | (1<<WGM00);<br>
      TCCR0B=(1<<WGM02) | (0<<CS02) | (0<<CS01) |
      (1<<CS00);<br>
      TCNT0=0x00;<br>
      OCR0A=0x63;<br>
      OCR0B=0x31;<br>
      <br>
      Ale pak je otázka, co teda dělá to Vaše:<br>
      Pokud by to byla opravdu default nastavená 2560, tak by to po tom
      dělení 64 a ještě 24 mělo dávat 651,... Hz. Není to Arduino, tedy
      2560 je již nastavená dle Arduino zvyklostí?<br>
      <br>
      Ještě je otázka, jak bylo zobrazeno to<br>
      "cca 100uS ale chaoticky kolísá"<br>
      Protože krátké pulzíky dělají synchronizacím některých osciloskopů
      potíže. Zkusil bych do toho přerušení dát<br>
      PORTA=~PORTA;<br>
      Pak bude poloviční frekvence a střída 50 %, to snad žádný
      osciloskop nezkazí.<br>
      <br>
      PH<br>
      <br>
      <div class="moz-cite-prefix">Dne 10.10.2023 v 21:33 Martin Záruba
        napsal(a):<br>
      </div>
      <blockquote type="cite"
        cite="mid:eda214c0-c53b-d43b-40d0-0edbdf599456@volny.cz">
        <meta http-equiv="Content-Type" content="text/html;
          charset=UTF-8">
        <p><font face="Arial">ATMega2560.</font></p>
        <p><font face="Arial">Jak zjistím CLK? Nic jiného jsem
            nenastavoval.</font><br>
        </p>
        <pre class="moz-signature" cols="72">Martin Záruba</pre>
        <div class="moz-cite-prefix">Dne 10.10.2023 v 20:26 Pavel
          Hudeček napsal(a):<br>
        </div>
        <blockquote type="cite"
          cite="mid:d30af353-683c-4414-9bcd-6c660520f7a1@seznam.cz">
          <meta http-equiv="Content-Type" content="text/html;
            charset=UTF-8">
          Přerušení se samo zakáže vstupem do jeho obsluhy a samo povolí
          jejím ukončením, takže cli a sei vyhodit.<br>
          <br>
          Dále by to chtělo vědět, která ATmega, případně i zda/jak má
          nastavené s CLK související fuse bity.<br>
          <br>
          PH<br>
          <br>
          <div class="moz-cite-prefix">Dne 10.10.2023 v 19:52 Martin
            Záruba napsal(a):<br>
          </div>
          <blockquote type="cite"
            cite="mid:63cfec33-7063-d988-2ae0-05e1663eea4b@volny.cz">
            <meta http-equiv="content-type" content="text/html;
              charset=UTF-8">
            <p>Nastavil jsem</p>
            <div style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;"><div><span style="color: #4e5b61;">  TCCR1A = </span><span style="color: #005c5f;">0</span><span style="color: #4e5b61;">;</span><span style="color: #95a5a6;"> // Vynulování registru TCCR1A</span></div><div><span style="color: #4e5b61;">  TCCR1B = </span><span style="color: #005c5f;">0</span><span style="color: #4e5b61;">;</span><span style="color: #95a5a6;"> // Vynulování registru TCCR1B</span></div>
<div><span style="color: #95a5a6;">  // Nastavení režimu Fast PWM (TOP = ICR1)</span></div><div><span style="color: #4e5b61;">  TCCR1A |= </span><span style="color: #434f54;">(</span><span style="color: #005c5f;">1</span><span style="color: #4e5b61;"> << WGM11</span><span style="color: #434f54;">)</span><span style="color: #4e5b61;">;</span></div><div><span style="color: #4e5b61;">  TCCR1B |= </span><span style="color: #434f54;">(</span><span style="color: #005c5f;">1</span><span style="color: #4e5b61;"> << WGM13</span><span style="color: #434f54;">)</span><span style="color: #4e5b61;"> | </span><span style="color: #434f54;">(</span><span style="color: #005c5f;">1</span><span style="color: #4e5b61;"> << WGM12</span><span style="color: #434f54;">)</span><span style="color: #4e5b61;">;</span></div>
<div><span style="color: #95a5a6;">  // Nastavení hodinového děliče na 64 (frekvence časovače = frekvence CPU / 64)</span></div><div><span style="color: #4e5b61;">  TCCR1B |= </span><span style="color: #434f54;">(</span><span style="color: #005c5f;">1</span><span style="color: #4e5b61;"> << CS11</span><span style="color: #434f54;">)</span><span style="color: #4e5b61;"> | </span><span style="color: #434f54;">(</span><span style="color: #005c5f;">1</span><span style="color: #4e5b61;"> << CS10</span><span style="color: #434f54;">)</span><span style="color: #4e5b61;">;</span></div>
<div><span style="color: #95a5a6;">  // Nastavení intervalu pro generování přerušení (100 us) - pro frekvenci CPU 16 MHz</span></div><div><span style="color: #95a5a6;">  // ICR1 = (F_CPU / (časový interval * hodinový dělič)) - 1</span></div><div><span style="color: #4e5b61;">  ICR1 = </span><span style="color: #005c5f;">24</span><span style="color: #4e5b61;">;</span><span style="color: #95a5a6;"> // 100 us při frekvenci CPU 16 MHz a hodinovém děliči 64</span></div>
<div><span style="color: #95a5a6;">  // Povolení přerušení od časovače Timer/Counter1</span></div><div><span style="color: #4e5b61;">  TIMSK1 |= </span><span style="color: #434f54;">(</span><span style="color: #005c5f;">1</span><span style="color: #4e5b61;"> << TOIE1</span><span style="color: #434f54;">)</span><span style="color: #4e5b61;">;</span></div>
</div>
            <div style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;">
</div>
            <div style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;">a rutina přerušení je zatím zcela triviální</div>
            <div style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;">
</div>
            <div style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;">
</div>
            <div style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;"><div style="color: #4e5b61;background-color: #ffffff;font-family: Consolas, 'Courier New', monospace;font-weight: normal;font-size: 14px;line-height: 19px;white-space: pre;"><div><span style="color: #d35400;">ISR</span><span style="color: #434f54;">(</span><span style="color: #4e5b61;">TIMER1_OVF_vect</span><span style="color: #434f54;">)</span><span style="color: #4e5b61;"> </span><span style="color: #434f54;">{</span></div><div><span style="color: #4e5b61;"> </span><span style="color: #d35400;">cli</span><span style="color: #434f54;">()</span><span style="color: #4e5b61;">;</span><span style="color: #95a5a6;"> // Vypnutí globálních přerušení</span></div><span style="color: #4e5b61;"> PORTA=</span><span style="color: #005c5f;">0</span><span style="color: #4e5b61;">;</span><div><span style="color: #4e5b61;"> PORTA=</span><span style="color: #4e5b61;"></span><span style="color: #005c5f;">0xFF</span><span style="color: #4e5b61;">;</span></div><span style="color: #4e5b61;"> </span><span style="color: #d35400;">sei</span><span style="color: #434f54;">()</span><span style="color: #4e5b61;">;</span><span style="color: #95a5a6;"> // Zapnutí globálních přerušení</span><div><span style="color: #434f54;">}</span></div>
Na všech bitech portu A jsou krásné obdélnikové pulzy. Ale perioda vyvolání pulzů je sice cca 100uS ale chaoticky kolísá. Co dělám blbě?
</div></div>
            <span style="white-space: pre-wrap">
</span><span style="white-space: pre-wrap">
</span></blockquote>
        </blockquote>
      </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>