<?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=18518&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-06-05T18:45:33+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18518&amp;mode</id>
<entry>
<author><name><![CDATA[WoodPaker]]></name></author>
<updated>2019-06-05T18:45:33+01:00</updated>
<published>2019-06-05T18:45:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=219538#p219538</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=219538#p219538"/>
<title type="html"><![CDATA[Re: Regulator PID na atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=219538#p219538"><![CDATA[
<div class="quotetitle">krzysssztof napisał(a):</div><div class="quotecontent"><br />Podepnij sobie jakiegoś leda i zmieniaj jego stan co te 50ms. Gołym okiem ocenisz, czy częstotliwość mniej więcej się zgadza.<br /></div><br />Serio? Człowiek widzi z częstotliwością 25Hz co daje klatkę czasową o długości 0.04 sekundy czyli jakieś 40 ms. 50 ms jest tylko niewiele więcej. Naprawdę wierzysz, że zauważy?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1425">WoodPaker</a> — 5 cze 2019, o 18:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[beny]]></name></author>
<updated>2019-05-31T21:42:55+01:00</updated>
<published>2019-05-31T21:42:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=219455#p219455</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=219455#p219455"/>
<title type="html"><![CDATA[Re: Regulator PID na atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=219455#p219455"><![CDATA[
struct GLOBAL_FLAGS {<br />  //! True when PID control loop should run one time<br />  uint8_t pidTimer:1;<br />  uint8_t dummy:7;<br />} volatile gFlags = {0, 0};<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5958">beny</a> — 31 maja 2019, o 21:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysssztof]]></name></author>
<updated>2017-05-31T14:23:46+01:00</updated>
<published>2017-05-31T14:23:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190065#p190065</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190065#p190065"/>
<title type="html"><![CDATA[Re: Regulator PID na atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190065#p190065"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />No chyba, że problem jest w ustawianiu flagi i nie ustawiłem jej jak założyłem na 50ms.<br /></div><br />Podepnij sobie jakiegoś leda i zmieniaj jego stan co te 50ms. Gołym okiem ocenisz, czy częstotliwość mniej więcej się zgadza.<br /><br />Kolejna możliwość: zmienne z których korzystasz w programie głównym oraz przerwaniu (czyli tutaj flaga) spróbuj zadeklarować jako &quot;volatile&quot;.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4274">krzysssztof</a> — 31 maja 2017, o 14:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marshall94]]></name></author>
<updated>2017-05-31T14:10:43+01:00</updated>
<published>2017-05-31T14:10:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190063#p190063</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190063#p190063"/>
<title type="html"><![CDATA[Re: Regulator PID na atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190063#p190063"><![CDATA[
<a href="https://obrazkiforum.atnel.pl/16824/de43925ff39513ce4f405967bffb2eea.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16824/de43925ff39513ce4f405967bffb2eea.png" alt="Obrazek" /></a><br /><br />'A' jest wyświetlane poza ifem, jedynka gdy program znajduje się w ifie. Nie wiem jak to zinterpretować ale wydaje mi się, że program nie powinien tak często wchodzić w tego ifa. Układ taktowany jest kwarcem 16MHz czyli cykl zegarowy trwa mniej niż 1/10 us. <br />No chyba, że problem jest w ustawianiu flagi i nie ustawiłem jej jak założyłem na 50ms.<br />Ustawienia timera:<br />[syntax=c]TCCR2 |= (0&lt;&lt;WGM21)|(0&lt;&lt;WGM21); //tryb normal<br />  TIMSK |= (1&lt;&lt;TOIE2); //activate the timer2 overflow interrupts<br />  TCCR2 |= (1&lt;&lt;CS20)|(1&lt;CS21); //preskaler 32<br />  TCNT2 = 0;[/syntax]<br />F_CPU = 16Mhz, preskaler = 32, czyli zliczamy impulsy co 2us. Jest to licznik 8bit czyli przerwanie nastąpi co 510us.<br /><br />Natomiast w przerwaniu mamy:<br />[syntax=c]#define TIME_INTERVAL   98<br />ISR(TIMER2_OVF_vect)<br />{<br />  static uint16_t i = 0;<br />  if(i &lt; TIME_INTERVAL)<br />    i++;<br />  else{<br />    gFlags.pidTimer = TRUE;<br />    i = 0;<br />  }<br />//gFlags.pidTimer = TRUE;<br />}[/syntax]<br />Każde przerwanie inkrementuje licznik, po 98 przerwaniach (0,51ms*98 w przybliżeniu daje 50ms) ustawiamy flagę.<br /><br />Dokonałem paru zmian w tym co zaproponował atmel (ze względu na kompatybilność z kompilatorem)<br />w oryginaly jest:[syntax=c]#pragma vector = TIMER0_OVF_vect   <br />__interrupt void TIMER0_OVF_ISR( void )   <br />{   <br />  static uint16_t i = 0;   <br />  if(i &lt; TIME_INTERVAL)   <br />    i++;   <br />  else{   <br />    gFlags.pidTimer = TRUE;   <br />    i = 0;   <br />  }   <br />}[/syntax]<br />U mnie:<br />[syntax=c]ISR(TIMER2_OVF_vect)<br />{<br />  static uint16_t i = 0;<br />  if(i &lt; TIME_INTERVAL)<br />    i++;<br />  else{<br />    gFlags.pidTimer = TRUE;<br />    i = 0;<br />  }<br />//gFlags.pidTimer = TRUE;<br />}[/syntax]<br /><br />oraz [syntax=c]__enable_interrupt();[/syntax]<br />zamnienilem na [syntax=c]sei();[/syntax]<br /><br />Czy ktoś może wyjaśnić mi dlaczego program ustawia mi wartość flagi na TRUE tak często?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16824">marshall94</a> — 31 maja 2017, o 14:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marshall94]]></name></author>
<updated>2017-05-30T18:28:56+01:00</updated>
<published>2017-05-30T18:28:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190011#p190011</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190011#p190011"/>
<title type="html"><![CDATA[Re: Regulator PID na atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190011#p190011"><![CDATA[
Faktycznie zapomniałem wyzerować flagi, jednak nawet po wyzerowaniu program w każdej iteracji wchodzi do ifa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16824">marshall94</a> — 30 maja 2017, o 18:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krzysssztof]]></name></author>
<updated>2017-05-30T17:53:42+01:00</updated>
<published>2017-05-30T17:53:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190007#p190007</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190007#p190007"/>
<title type="html"><![CDATA[Re: Regulator PID na atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190007#p190007"><![CDATA[
Po wykonaniu warunku musisz wyzerować flagę gFlags.pidTimer - inaczej cały czas będzie jedynką, więc cały czas się będzie wykonywać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4274">krzysssztof</a> — 30 maja 2017, o 17:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marshall94]]></name></author>
<updated>2017-05-30T15:35:05+01:00</updated>
<published>2017-05-30T15:35:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190004#p190004</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190004#p190004"/>
<title type="html"><![CDATA[Regulator PID na atmega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18518&amp;p=190004#p190004"><![CDATA[
Witam, chciałem zaimplementować do mojego układu regulator PID zgodnie z dokumentacją atmela<br /><a href="http://www.atmel.com/Images/Atmel-2558-Discrete-PID-Controller-on-tinyAVR-and-megaAVR_ApplicationNote_AVR221.pdf"  class="postlink">http://www.atmel.com/Images/Atmel-2558-Discrete-PID-Controller-on-tinyAVR-and-megaAVR_ApplicationNote_AVR221.pdf</a><br />Nie wiem czemu ale w nieskończonej pętli program wchodzi do ifa za każdym razem, a powinien zgodnie z czasem próbkowania. Próbkowanie powinno odbywać się z co 50ms, Time_interver został wyliczony zgodnie ze wzorem którym był w przykładowym pliku źródłowym main.c.<br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />* Specify the desired PID sample time interval  <br /> * With a 8-bit counter (255 cylces to overflow), the time interval value is calculated as follows:  <br /> * TIME_INTERVAL = ( desired interval [sec] ) * ( frequency [Hz] ) / 255<br /></div><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#include&quot;uart.h&quot;<br />#include&quot;pid.h&quot;<br /><br />struct GLOBAL_FLAGS {<br />  //! True when PID control loop should run one time<br />  uint8_t pidTimer:1;<br />  uint8_t dummy:7;<br />} gFlags = {0, 0};<br /><br />struct PID_DATA pidData;<br /><br />//TIME_INTERVAL = ( desired interval &#91;sec&#93; ) * ( frequency &#91;Hz&#93; ) / 255<br />//TIME_INTERVAL = ( 0.05 &#91;sec&#93; ) * ( 16MHz/32(preskaler) &#91;Hz&#93; ) / 255<br />#define TIME_INTERVAL   98<br /><br />ISR(TIMER2_OVF_vect)<br />{<br />  static uint16_t i = 0;<br />  if(i &lt; TIME_INTERVAL)<br />    i++;<br />  else{<br />    gFlags.pidTimer = TRUE;<br />    i = 0;<br />  }<br />}<br /><br />//UART<br />#define UART_BAUD 38400<br />#define __UBRR F_CPU/16/UART_BAUD-1<br /><br />//********FUNKCJE**********//<br />void Init(void);<br />//*************************//<br /><br /><br />int main(void)<br />{<br />    //*********INICJALIZACJA***********<br />    USART_Init( __UBRR );<br />    Init();  //inicjalizacja PIDA<br />    //*********************************<br /><br />    sei();//globalne zezwolenie na przerwanie<br /><br />    while(1)<br />    {<br />    uart_puts(&quot;test1&quot;)<br />        if(gFlags.pidTimer)<br />        {<br />        uart_puts(&quot;test2&quot;);<br />        }<br />    }<br />}<br />void Init(void)<br />{<br />  // Set up timer, enable timer/counte 0 overflow interrupt<br /><br />  TCCR2 |= (0&lt;&lt;WGM21)|(0&lt;&lt;WGM21); //tryb normal<br />  TIMSK |= (1&lt;&lt;TOIE2); //activate the timer2 overflow interrupts<br />  TCCR2 |= (1&lt;&lt;CS20)|(1&lt;CS21); //preskaler 32<br />  TCNT2 = 0;<br />}[/syntax]<br /><a href="https://obrazkiforum.atnel.pl/16824/0a20a04d5a673457d736135af8484495.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/16824/0a20a04d5a673457d736135af8484495.png" alt="Obrazek" /></a><br /><br /><br />W listingu zostawiłem tylko znaczącą część. Czy ktoś potrafi mi wyjaśnić w czym tkwi problem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=16824">marshall94</a> — 30 maja 2017, o 15:35</p><hr />
]]></content>
</entry>
</feed>