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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-12-15T19:32:39+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=19761&amp;mode</id>
<entry>
<author><name><![CDATA[mczarny]]></name></author>
<updated>2017-12-11T17:54:36+01:00</updated>
<published>2017-12-11T17:54:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200357#p200357</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200357#p200357"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200357#p200357"><![CDATA[
Kolego <strong>Xmen</strong><br /><br /><span style="color: #0000BF">BB</span> str.236 do 249 masz dokładny opis i zasadę działania PWM sprzętowego i programowego oraz gotowy kod programu dla sześciu kanałów programowych na str.248 i 249.<br />Masz książkę usiądź przeczytaj zrób tak jak autor pisze a jak czegoś nie zrozumiesz to zapytaj.<br />Gwarantuję Ci, że zajmie to mniej czasu niż robienie czegoś w ciemno...<br />pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4651">mczarny</a> — 11 gru 2017, o 17:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-12-11T15:34:16+01:00</updated>
<published>2017-12-11T15:34:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200351#p200351</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200351#p200351"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200351#p200351"><![CDATA[
<div class="quotetitle">Xmen napisał(a):</div><div class="quotecontent"><br />Dzięki wielkie za pomoc i odpowiedzi. Lecz mam jeszcze jedno ostatni pytanie czy w tym przykładzie, które mi ty podałeś będę stanie zmieniać płynie czas powtarzania tego impulsu np. co 1s, 1,5s 2s itp. w zależności od jakiegoś warunku ? Bo z czasem trwania impulsu takiego problemu nie ma.<br /></div><br />Już raz odpowiadałem na to pytanie (<a href="http://forum.atnel.pl/topic19761.html#p200307"  class="postlink">link</a>).<br />Zbyt dużo pisania, żeby opisać to wszystko szczegółowo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 11 gru 2017, o 15:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xmen]]></name></author>
<updated>2017-12-11T15:26:36+01:00</updated>
<published>2017-12-11T15:26:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200350#p200350</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200350#p200350"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200350#p200350"><![CDATA[
Dzięki wielkie za pomoc i odpowiedzi. Lecz mam jeszcze jedno ostatni pytanie czy w tym przykładzie, które mi ty podałeś będę stanie zmieniać płynie czas powtarzania tego impulsu np. co 1s, 1,5s 2s itp. w zależności od jakiegoś warunku ? Bo z czasem trwania impulsu takiego problemu nie ma.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10908">Xmen</a> — 11 gru 2017, o 15:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-12-15T19:32:39+01:00</updated>
<published>2017-12-11T10:33:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200343#p200343</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200343#p200343"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200343#p200343"><![CDATA[
<div class="quotetitle">Xmen napisał(a):</div><div class="quotecontent"><br />Czyli wszystkie operacje na pinach należy przeważnie ZAWSZE wykonywać wewnątrz przerwania ?<br />Jeśli tak to nie wyobrażam sobie na chwilę obecną tak bardzo rozbudowanego projektu gdzie będzie w użyciu np. 20 pin wyjściowych i kilka wejściowych i trzeba na nich wszystko wykonywać wewnątrz procedury przerwania<br /></div><br />A gdzie ja napisałem, że wszystkie piny?<br />Użyłem wprawdzie liczby mnogiej, ale to dlatego, że programowy PWM wykorzystuje się często w sytuacjach, kiedy musisz wygenerować PWM na większej ilości pinów, niż można to zrobić za pomocą wbudowanego sprzętowego generatora PWM, ponieważ ilość sprzętowych kanałów PWM jest ograniczona. Gdybyś poczytał o programowym PWM, to byś pewnie wiedział o co chodzi.<br /><br />Jeżeli chcesz programowo wygenerować sygnał PWM na którymś pinie, używasz zwykle timera do odmierzania czasu. Kiedy ten czas minie i wystąpi przerwanie, musisz stan tego pinu zmienić akurat w tym momencie (czyli od razu w procedurze obsługi tego przerwania), a nie ustawiać jakieś flagi i zmieniać stan pinu dopiero w bliżej nieokreślonej przyszłości. Aby wiedzieć o co chodzi trzeba rozumieć co to jest przerwanie, do czego służy, jak działa system obsługi przerwań itd.<br /><br /><div class="quotetitle">Xmen napisał(a):</div><div class="quotecontent"><br />No tak masz racje - ale nie potrafiłem inaczej tego rozwiązać.<br /></div><br />Przecież podałem Ci przykładowy, gotowy kod programu. Wystarczy go skopiować do IDE jakiego używasz do pisania programów , skompilować, wgrać i już powinno działać. Później można ewentualnie próbować zmieniać coś, aby dostosować program do swoich potrzeb.<br /><br /><div class="quotetitle">Xmen napisał(a):</div><div class="quotecontent"><br />Jestem bardzo początkującym i nie jestem w stanie sobie wyobrazić co by się działo z programem gdyby w głównej pętli było mnóstwo innych funkcji nie wspominając o dodatkowych przerwaniach.<br /></div><br />Dlatego opanuj porządnie podstawy, a dopiero później realizuj trudniejsze zadania, bo mam wrażenie, że próbujesz przeskoczyć kilka poziomów, a tu tak się nie da. Informatyka to nauka ścisła, więc tak jak w matematyce nie da się rozwiązywać układów równań nie znając podstawowych operacji arytmetycznych, czy też zrozumieć rachunku całkowego bez wiedzy, co to jest wielomian, tak i tu należy zachować odpowiednią kolejność, żeby te klocki ułożyły się w jakąś logiczną całość.<br /><br />Masz książki, więc czytaj, czytaj i czytaj. Jak kilka razy coś przeczytasz, a nie zrozumiesz to zadaj konkretne pytanie na forum, a na pewno ktoś wytłumaczy. Póki co, to odpowiedzi na Twoje pytania wymagają użycia pojęć, których nie rozumiesz, więc to rodzi następne pytania i tak w kółko. Nie sądzę, żeby komuś chciało się na forum książkę pisać, tym bardziej, że przecież masz książki, więc dlaczego nie używasz? Ja rozumiem, że to żmudna nauka i efekty przychodzą powoli, ale jeśli chcesz coś osiągnąć, to trzeba ten proces przejść.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 11 gru 2017, o 10:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xmen]]></name></author>
<updated>2017-12-10T19:40:15+01:00</updated>
<published>2017-12-10T19:40:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200314#p200314</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200314#p200314"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200314#p200314"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Widzę, że nadal brniesz w te flagi i funkcje.<br /></div><br />No tak masz racje - ale nie potrafiłem inaczej tego rozwiązać.<br />Jestem bardzo początkującym i nie jestem w stanie sobie wyobrazić co by się działo z programem gdyby w głównej pętli było mnóstwo innych funkcji nie wspominając o dodatkowych przerwaniach.<br />Czyli wszystkie operacje na pinach należy przeważnie ZAWSZE wykonywać wewnątrz przerwania ?<br />Jeśli tak to nie wyobrażam sobie na chwilę obecną tak bardzo rozbudowanego projektu gdzie będzie w użyciu np. 20 pin wyjściowych i kilka wejściowych i trzeba na nich wszystko wykonywać wewnątrz procedury przerwania<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10908">Xmen</a> — 10 gru 2017, o 19:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-12-10T17:27:55+01:00</updated>
<published>2017-12-10T17:27:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200309#p200309</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200309#p200309"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200309#p200309"><![CDATA[
Widzę, że nadal brniesz w te flagi i funkcje.<br />W kodzie, który przedstawiłem nie chodziło tylko o prostotę. Twój sposób ma dość poważne wady.<br />Na przykład w procedurze obsługi przerwania sprawdzasz jakieś warunki, ustawiasz flagi i dopiero w pętli głównej programu uruchamiasz funkcję, która na podstawie tych flag ustawia odpowiednio wartości pinów.<br />Zastanowiłeś się, ile czasu minie pomiędzy wystąpieniem przerwania a zmianą stanu pinów?<br />Pomijając nawet to opóźnienie, na pewno nie będzie ono stałe więc czasy będą nieregularne. Poza tym co będzie, kiedy wewnątrz pętli głównej dodasz jakiś inny kod, dodatkowe funkcje (a zapewne dodasz, no bo gdzie będziesz zmieniał wartości zmiennych decydujących o czasach) i funkcja <strong><em>pompka()</em></strong> będzie musiała poczekać na swoją kolej?<br />A co będzie, jeśli będziesz musiał obsłużyć dodatkowo inne przerwania?<br />Dlatego zmiany stanu pinów powinny być zrealizowane wewnątrz procedury obsługi przerwania i to najlepiej zaraz na początku.<br /><br /><div class="quotetitle">Xmen napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">andrews napisał(a):</div><div class="quotecontent">Należy wtedy pamiętać, że podczas modyfikacji takich zmiennych 16-bitowych w pętli głównej programu należy zapewnić atomowość operacji, czyli tymczasowo wyłączyć przerwania:<br /></div><br />czy w BB była o tym mowa ? W jakim celu zapewnia się tą Atomowość operacji ?</div><br />Nie mam ani BB ani GB, więc nie mam pewności, ale jak obserwuję tematy na forum dotyczące tych książek, to jestem przekonany, że na pewno gdzieś było i o programowym PWM, i o atomowym dostępie do zmiennych. Widzę za to, że Ty posiadasz i BB, i GB, więc może warto przeczytać?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 10 gru 2017, o 17:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xmen]]></name></author>
<updated>2017-12-10T16:37:39+01:00</updated>
<published>2017-12-10T16:37:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200308#p200308</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200308#p200308"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200308#p200308"><![CDATA[
Udało mi się uzyskać wystawianie sygnału dla różnego czasu powtarzania i czasu trwania impulsu.<br />Zmieniłem występowania przerwania co 1ms.<br />A czy w przyszłości mógłbym do tej funkcji pompka() zamiast tych zmiennych &quot;czas&quot; i t_impuls&quot; przekazywać jakieś wskaźniki do jakiejś zmiennej ?<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define POMPKA (1&lt;&lt;PC0)<br />#define WIAT (1&lt;&lt;PC1)<br />#define PLO (1&lt;&lt;PC2)<br /><br /><br />volatile uint8_t sekundy;<br />volatile uint8_t s1_flag;<br />volatile uint8_t ms1_flag;<br /><br />uint8_t czas;<br />uint8_t t_impuls;<br /><br /><br />void pompka( uint8_t t_odstep, uint8_t t_impulsu); // zmienna t_odstęp -&gt; częstotliwośc co ile zostanie wzbudzony impuls<br />// zmienna t_impulsu -&gt; czas trwania impuslu<br /><br />// --- funkcja main() ------------------------------------------------<br />int main(void) {<br /><br /><br />    DDRC |= (POMPKA | WIAT | PLO);<br /><br />    // --- konfiguracja timera 0 -------------------------------------<br />    // przerwanie co 1ms<br />    //<br />    TCCR0A  = (1&lt;&lt;WGM01);               // tryb ctc<br />    TCCR0B  = (1&lt;&lt;CS02) ;    // preskaler 256<br />    OCR0A   = 42;                       // dodatkowy podział<br />    TIMSK0  = (1&lt;&lt;OCIE0A);              // zezwolenie na przerwanie<br />                                        // od porównania OCR0A<br />    //----------------------------------------------------------------<br /><br />    czas=3;// co 3 sekundy<br />    t_impuls=20; // 20ms<br /><br /><br />    // globalne zezwolenie na przerwania<br />    sei();<br /><br />    while(1) {<br /><br />    pompka(czas, t_impuls);<br />    }<br /><br />}<br /><br />// --- procedura obsługi przerwania od porównania OCR0A --------------<br />ISR (TIMER0_COMPA_vect){<br /><br />    // zmienna statyczna zliczająca przerwania<br />    static uint16_t cnt = 0;<br /><br />if(++cnt==999){<br /><br />s1_flag=1;<br />cnt=0;<br />}<br />if(s1_flag){<br />sekundy++;<br />s1_flag=0;<br />if (sekundy&gt;59) sekundy=0;<br /><br />}<br />ms1_flag++;<br /><br /><br />    // ---------------------------------------------------------<br />    PORTC ^=WIAT;   // sygnał na PC1 dla sprawdzenie pętli - OK.<br />}<br /><br />void pompka( uint8_t t_odstep, uint8_t t_impulsu){<br /><br />if(sekundy==t_odstep){<br />ms1_flag=0;<br />PORTC |= POMPKA;<br />sekundy=0;<br />}<br />if (ms1_flag==t_impulsu) PORTC &amp;= ~POMPKA;<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />Dodałem post chwile po twoim <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Należy wtedy pamiętać, że podczas modyfikacji takich zmiennych 16-bitowych w pętli głównej programu należy zapewnić atomowość operacji, czyli tymczasowo wyłączyć przerwania:<br /></div> czy w BB była o tym mowa ? W jakim celu zapewnia się tą Atomowość operacji  ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10908">Xmen</a> — 10 gru 2017, o 16:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-12-10T16:36:37+01:00</updated>
<published>2017-12-10T16:36:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200307#p200307</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200307#p200307"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200307#p200307"><![CDATA[
<div class="quotetitle">Xmen napisał(a):</div><div class="quotecontent"><br />Jeszcze pytanie w twoim przykładzie jeśli chciałbym regulować czas trwania impulsu wystarczyło by w warunku <strong>else if (cnt==czas)</strong> gdzie zmienna &quot;czas&quot; byłaby zmienną typu volatile i czas trwania byłby wielokrotnością 5ms dobrze myślę ?<br /></div><br />Dobrze. Oczywiście zmienna <strong><em>czas</em></strong> (trwania impulsu, czyli stanu wysokiego) musiałaby być zmienną globalną.<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />A co z czasem np. co 2s, 2.5s, itp ?<br /></div><br />W warunku <strong><em>if (++cnt==200)</em></strong>, wartość 200 zamieniasz na zmienną globalną volatile (np. o nazwie <strong><em>okres</em></strong>).<br />W celu osiągnięcia dłuższych okresów trwania impulsu przy zachowaniu rozdzielczości 5ms musiałbyś użyć zmiennych o większym zakresie, czyli np. typu <strong><em>uint16_t</em></strong>. Dotyczy to zmiennych: globalnej <strong><em>okres</em></strong> i lokalnej statycznej <strong><em>cnt</em></strong>. Jeżli czas załączenia nie będzie przekraczał ok. 1,25s Twoja zmienna <strong><em>czas</em></strong> może pozostać bez zmian. Należy wtedy pamiętać, że podczas modyfikacji takich zmiennych 16-bitowych w pętli głównej programu należy zapewnić atomowość operacji, czyli tymczasowo wyłączyć przerwania:<br />[syntax=c]//<br />    // wyłączenie przerwań<br />    cli();<br />    // tutaj przypisanie nowej wartości<br />    okres = 300;<br />    // ponowne włączenie przerwań<br />    sei();[/syntax]<br /><br />Poza tym poza tym, aby zmieniać częstotliwość i wypełnienie &quot;w locie&quot; należałoby użyć buforowania, czyli aktualizować wartości zmiennych synchronicznie z osiągnięciem przez zmienną <strong><em>cnt</em></strong> wartości 0. Zapobiegnie to pewnym nieregularnościom przebiegu, które w tym przypadku będą dość wyraźnie widoczne ze względu długie czasy. Przy większych częstotliwościach np. przy sterowaniu jasnością LED może to być niezauważalne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 10 gru 2017, o 16:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xmen]]></name></author>
<updated>2017-12-10T12:38:11+01:00</updated>
<published>2017-12-10T12:38:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200299#p200299</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200299#p200299"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200299#p200299"><![CDATA[
Z początku chciałem mieć możliwość załączenia PORTu co określony &quot;CZAS&quot; i różną długością tego impulsu lecz odpuściłem sobie to z tego względu gdyż dla stałych wartości miałem problem napisać program.<br />Ten sposób który podałeś jest faktycznie bardzo uproszczony, nie wpadłem na taki sposób - szkoda.<br />Jeszcze pytanie w twoim przykładzie jeśli chciałbym regulować czas trwania impulsu wystarczyło by w warunku else if (cnt==czas) gdzie zmienna &quot;czas&quot; byłaby zmienną typu volatile i czas trwania byłby wielokrotnością 5ms dobrze myślę ?<br />A co z czasem np. co 2s, 2.5s, itp ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10908">Xmen</a> — 10 gru 2017, o 12:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-12-10T11:39:32+01:00</updated>
<published>2017-12-10T11:39:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200295#p200295</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200295#p200295"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200295#p200295"><![CDATA[
Nie bardzo rozumiem, bo najpierw piszesz, że chcesz zmieniać częstotliwość i wypełnienie. Później piszesz, że chcesz po prostu impuls 25ms co 1 sekundę, więc jak to właściwie jest?<br /><br /><div class="quotetitle">Xmen napisał(a):</div><div class="quotecontent"><br />Koledzy pomóżcie mi doprowadzić to tego momentu gdy co sekundę port PC0-POMPKA zostanie załączona na 25ms.<br /></div><br />Jeśli tyko o to chodzi...<br />Generowanie programowego PWM wiąże się zwykle z pewnymi minimalnymi niedokładnościami w generowanym sygnale, jednak przy tej wartości preskalera i generowanej częstotliwości jest to praktycznie bez znaczenia, dlatego metoda której użyłeś jest odpowiednia. Myślę jednak, że niepotrzebnie to tak skomplikowałeś. Można na przykład tak:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define POMPKA (1&lt;&lt;PC0)<br />#define WIAT (1&lt;&lt;PC1)<br />#define PLO (1&lt;&lt;PC2)<br /><br /><br />// --- funkcja main() ------------------------------------------------<br />int main(void) {<br />    <br />    // DLA KANAŁÓW PROGRAMOWYCH PWM<br />    DDRC |= (POMPKA | WIAT | PLO);<br />    <br />    // --- konfiguracja timera 0 -------------------------------------<br />    // przerwanie co 5ms<br />    //   <br />    TCCR0A  = (1&lt;&lt;WGM01);               // tryb ctc<br />    TCCR0B  = (1&lt;&lt;CS02) | (1&lt;&lt;CS00);    // preskaler 1024<br />    OCR0A   = 53;                       // dodatkowy podział<br />    TIMSK0  = (1&lt;&lt;OCIE0A);              // zezwolenie na przerwanie<br />                                        // od porównania OCR0A<br />    //----------------------------------------------------------------<br /><br />    // globalne zezwolenie na przerwania<br />    sei();<br />    <br />    while(1) {<br />        <br />    }<br />}<br /><br />// --- procedura obsługi przerwania od porównania OCR0A --------------<br />ISR (TIMER0_COMPA_vect){<br />    <br />    // zmienna statyczna zliczająca przerwania<br />    static uint8_t cnt = 0;<br />    <br />    if (cnt==0) {<br />        // na początku zliczania pin PC0 = 1<br />        PORTC |= POMPKA;<br />    }<br />    else if (cnt==5) {<br />        // po pięciu przerwaniach (5 * 5ms = 25ms) pin PC0 = 0<br />        PORTC &amp;= ~POMPKA;<br />    }<br />    <br />    // po 200 przerwaniach (200 * 5ms = 1s)<br />    // zaczynamy zliczanie od początku<br />    if (++cnt==200) {<br />        cnt = 0;<br />    }<br />    <br />    // ---------------------------------------------------------<br />    PORTC ^=WIAT;   // sygnał na PC1 dla sprawdzenie pętli - OK.<br />}[/syntax]<br /><br />Taki sam efekt można również uzyskać na przykład za pomocą 16-bitowego timera 1 generując sygnał całkowicie sprzętowo, bez konieczności zliczania przerwań i programowej zmiany stanu pinu wyjściowego, ale w komentarzach do Twojego kodu zauważyłem coś o programowym PWM, więc tego rozwiązania nie podaję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 10 gru 2017, o 11:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xmen]]></name></author>
<updated>2017-12-09T22:13:48+01:00</updated>
<published>2017-12-09T22:13:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200279#p200279</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200279#p200279"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200279#p200279"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Koledzy pomóżcie mi doprowadzić to tego momentu gdy co sekundę port PC0-POMPKA zostanie załączona na 25ms.<br /></div><br /><br />Procesor ATMega 644 PA<br />Co sekundę załączenie PC0 na 25ms:<br />Poradziłem sobie w ten sposób jakoś mi się to udało po wielu próbach błędów, choć chciałbym zobaczyć jak można zrobić to dużo prościej, przyjmując, że częstotliwość 1Hz i czas trwania impulsu załączonego portu PC0 to 25ms.<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 />#define co_ile 7<br />#define wypelnienie 120<br /><br />#define POMPKA (1&lt;&lt;PC0)<br />#define WIAT (1&lt;&lt;PC1)<br />#define PLO (1&lt;&lt;PC2)<br /><br />//volatile uint8_t flaga;  // flaga tyknięcie zegara co 5ms<br />//volatile uint8_t set; // ustawienie wyjścia dla pompki<br />volatile uint8_t s1_flag; //flaga tyknięcia sekundy<br />volatile  uint8_t ms25_flag; // flaga 25ms<br /><br /><br /><br />void pompka(uint8_t flaga);// funkcja sterowania pompki paliwa<br /><br />int main(void){<br /><br /><br />// DLA KANAŁÓW PROGRAMOWYCH PWM<br />DDRC |= (POMPKA | WIAT | PLO);<br /><br />/**************************TIMER 0 5ms 200Hz zegar 11.059MHz****************************/<br /><br />TCCR0A |= ((1&lt;&lt;WGM01));   // tryb ctc<br />TCCR0B |= ((1&lt;&lt;CS02)|(1&lt;&lt;CS00)); //preskaler 1024<br />OCR0A = 53;// dodatkowy podział<br />TIMSK0 |= (1&lt;&lt;OCIE0A); // zezwolenie od porównania<br />/*******************************************************************/<br /><br /><br />sei();<br />while(1){<br /><br />pompka(s1_flag);<br /><br />}<br /><br /><br />}<br /><br /><br />//PRZERWANIE TIMER0<br />ISR (TIMER0_COMPA_vect){<br /><br />static uint8_t ms;<br />static uint8_t s;<br /><br />if(s==200){<br />s1_flag=1;// ustawienie flagi równo co sekundę<br />s=0;<br />ms=0;// zerowanie w zliczania ms od zera<br />}<br />s++;<br /><br />if(ms==5) {<br />ms25_flag=1;// ustawienie flagi 25ms<br />}<br />ms++;<br />PORTC ^=WIAT;// sygnał na PC1 dla sprawdzenie pętli - OK.<br />}<br /><br /><br />void pompka(uint8_t flaga){<br /><br />if(flaga) PORTC |= POMPKA; //wywołanie co jedną sekundę<br />if(ms25_flag){<br />s1_flag=0;<br />ms25_flag=0;<br />PORTC &amp;= ~POMPKA;<br />}<br /><br />}[/syntax]<br /><br />Jednego nie rozumie gdybym chciał załączać port co dwie sekundy - (utworzyłem taką zmienna w przerwaniu) i później przekazuję ją do funkcji pompka() gdzie w pierwszym warunku if(flaga==2) (sprawdzam czy zmienna jest równa 2 - minęły dwie sekundy), program dalej wysyła impuls co sekundę. Czemu tak się dzieje ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10908">Xmen</a> — 9 gru 2017, o 22:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2017-12-09T20:53:29+01:00</updated>
<published>2017-12-09T20:53:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200273#p200273</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200273#p200273"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200273#p200273"><![CDATA[
<div class="quotetitle">Xmen napisał(a):</div><div class="quotecontent"><br />Witam, chciałbym wygenerować przebieg z określoną częstotliwością (którą można by zmieniać) oraz zmiennym wypełnieniem.<br /></div><br />Jak pewnie zauważyłeś, nie ma chętnych do odpowiedzi. Najprawdopodobniej wynika to z tego, że podałeś za mało danych.<br /><br /><div class="quotetitle">Xmen napisał(a):</div><div class="quotecontent"><br />Koledzy pomóżcie mi doprowadzić to tego momentu gdy co sekundę port PC0-POMPKA zostanie załączona na 25ms.<br /></div><br />Taki efekt można uzyskać na wiele różnych sposobów. Który sposób będzie najbardziej odpowiedni w danej sytuacji zależy od tego, jakie konkretnie są inne wymogi.<br />W Twoim przypadku istotne będzie:<br /><ol style="list-style-type: decimal"><li>Jaka to jest &quot;określona częstotliwość&quot; (1Hz?) i w jakim zakresie ma być zmieniana?</li><li>Jaka dokładność i rozdzielczość regulacji częstotliwości i wypełnienia jest wymagana?</li><li>Jakiego mikrokontrolera dotyczy pytanie? (różne timery w różnych mikrokontrolerach mają różne zestawy trybów pracy i różne zestawy wartości preskalera)</li><li>Czy możesz poświęcić do wykonania zadania timer 16-bitowy, czy jest Ci potrzebny do czegoś innego?</li><li>Czy sygnał wyjściowy musi być na pinie PC0, czy może być na innym?</li></ol>Częstotliwość taktowania widzę, że podana jest gdzieś w kodzie, ale na przyszłość nie zaszkodziłoby, gdybyś podawał taką informację także w opisie, szczególnie w przypadku, gdy problem dotyczy timerów.<br /><br />Podejrzewam, że niepotrzebnie robisz takie kombinacje. Być może nawet zadanie można wykonać wykorzystując wyłącznie sprzętowe generowanie sygnału PWM, bez konieczności stosowania flag, dodatkowych zmiennych zliczających przerwania, może nawet bez obsługi przerwań, ale musisz konkretnie się określić co do wymagań.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 9 gru 2017, o 20:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xmen]]></name></author>
<updated>2017-12-09T15:56:51+01:00</updated>
<published>2017-12-09T15:56:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200258#p200258</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200258#p200258"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200258#p200258"><![CDATA[
Koledzy pomóżcie mi doprowadzić to tego momentu gdy co sekundę port PC0-POMPKA zostanie załączona na 25ms.<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 7 gru 2017<br /> *      Author: XXX<br /> */<br /><br /><br />#include&lt;avr/io.h&gt;<br />#include&lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define co_ile 7<br />#define wypelnienie 120<br /><br />#define POMPKA (1&lt;&lt;PC0)<br />#define WIAT (1&lt;&lt;PC1)<br />#define PLO (1&lt;&lt;PC2)<br /><br />//volatile uint8_t flaga;  // flaga tyknięcie zegara co 5ms<br />//volatile uint8_t set; // ustawienie wyjścia dla pompki<br />volatile uint8_t s1_flag; //flaga tyknięcia sekundy<br />volatile  uint8_t ms25_flag; // flaga 25ms<br /><br /><br />void pompka(uint8_t flaga);// funkcja sterowania pompki paliwa<br /><br />int main(void){<br /><br /><br />// DLA KANAŁÓW PROGRAMOWYCH PWM<br />DDRC |= (POMPKA | WIAT | PLO);<br /><br />/**************************TIMER 0 5ms 200Hz zegar 11.059MHz****************************/<br /><br />TCCR0A |= ((1&lt;&lt;WGM01));   // tryb ctc<br />TCCR0B |= ((1&lt;&lt;CS02)|(1&lt;&lt;CS00)); //preskaler 1024<br />OCR0A = 53;// dodatkowy podział<br />TIMSK0 |= (1&lt;&lt;OCIE0A); // zezwolenie od porównania<br />/*******************************************************************/<br /><br /><br />sei();<br />while(1){<br /><br />pompka(s1_flag);<br /><br />}<br /><br /><br />}<br /><br /><br />//PRZERWANIE TIMER0<br />ISR (TIMER0_COMPA_vect){<br /><br />static uint8_t ms;<br />static uint8_t s;<br /><br />if(s==200){<br />ms=0;<br />s1_flag=1;// ustawienie flagi równo co sekundę<br />s=0;<br />}<br />s++;<br /><br />if(ms==5) ms25_flag=1;<br />ms++;<br />PORTC ^=WIAT;// sygnał na PC1 dla sprawdzenie pętli - OK.<br />}<br /><br /><br /><br />void pompka(uint8_t flaga){<br /><br />if(flaga){//wywołanie co jedną sekundę<br />if(ms25_flag){<br />PORTC |= POMPKA;<br />//_delay_ms(20);// z delay DZIAŁA<br />s1_flag=0;<br />}<br /><br />}<br />else PORTC &amp;= ~POMPKA;<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10908">Xmen</a> — 9 gru 2017, o 15:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xmen]]></name></author>
<updated>2017-12-09T15:57:39+01:00</updated>
<published>2017-12-07T19:51:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200155#p200155</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200155#p200155"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200155#p200155"><![CDATA[
[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 7 gru 2017<br /> *      Author: XXX<br /> */<br /><br /><br />#include&lt;avr/io.h&gt;<br />#include&lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /> <br /><br /><br /><br /><br />#define co_ile 7<br />#define wypelnienie 120<br /><br /><br /><br />#define POMPKA (1&lt;&lt;PC0)<br />#define WIAT (1&lt;&lt;PC1)<br />#define PLO (1&lt;&lt;PC2)<br /><br /><br /><br />volatile uint8_t flaga;  // flaga tyknięcie zegara co 5ms<br />volatile uint8_t set; // ustawienie wyjścia dla pompki<br />volatile uint8_t s1_flag; //flaga tyknięcia sekundy<br />volatile  uint8_t ms5_flag; // flaga 5ms<br /><br /><br /><br />int main(void){<br /><br /><br />// DLA KANAŁÓW PROGRAMOWYCH PWM<br />DDRC |= (POMPKA | WIAT | PLO);<br /><br /><br /><br />/**************************TIMER 0 5ms 200Hz zegar 11.059MHz****************************/<br /><br />TCCR0A |= ((1&lt;&lt;WGM01));   // tryb ctc<br />TCCR0B |= ((1&lt;&lt;CS02)|(1&lt;&lt;CS00)); //preskaler 1024<br />OCR0A = 53;// dodatkowy podział<br />TIMSK0 |= (1&lt;&lt;OCIE0A); // zezwolenie od porównania<br />/*******************************************************************/<br /><br /><br /><br /><br /><br />sei();<br />while(1){<br /><br /><br />if(s1_flag){<br /><br />if(ms5_flag&lt;3){// zał na 20ms<br />PORTC |= POMPKA;<br />s1_flag=0; <br />ms5_flag=0;<br />}<br />else PORTC &amp;= ~POMPKA;<br />}<br />}<br /><br /><br /><br />}<br /><br /><br />//PRZERWANIE TIMER0<br />ISR (TIMER0_COMPA_vect){<br /><br />static uint8_t ms;<br />static uint8_t s;<br /><br />if(s==200){<br />s1_flag=1;<br />s=0;<br />}<br />s++;<br /><br />if(ms&lt;=3) ms5_flag=1;<br />ms++;<br /><br />}[/syntax]<br /><br />To jednak nie działa przez przypadek wgrywałem program który zrobiony był na delay<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10908">Xmen</a> — 7 gru 2017, o 19:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2017-12-07T17:36:10+01:00</updated>
<published>2017-12-07T17:36:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200143#p200143</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200143#p200143"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200143#p200143"><![CDATA[
Jeżeli w tym przypadku chcesz zmienić wypełnienie, a &quot;tyknięcie&quot; masz co 20 ms, to możesz zrobić dowolny sygnał który będzie miała częstotliwość i wypełnienie jako wielokrotności 20 ms.<br />Jako okres możesz wziąć na przykład 200 wywołań przerwania - Ty inkrementujesz zmienną s, możesz dołożyć drugą zmienną i ją też inkrementować.<br />Natomiast wypełnienie określasz jako część z tych (przykładowo) 200 &quot;tyknięć&quot;.<br />Jeżeli zmienna &lt; wypełnienia -&gt; ustawiasz 1<br />Jeżeli zmienna &gt;= wypełnienie -&gt; ustawiasz 0<br />Prościej nie potrafię tego wytłumaczyć<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 7 gru 2017, o 17:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xmen]]></name></author>
<updated>2017-12-07T17:28:01+01:00</updated>
<published>2017-12-07T17:28:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200142#p200142</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200142#p200142"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200142#p200142"><![CDATA[
Mczarny mi nie chodzi o gotowca, wręcz przeciwnie chciałbym samemu jakoś to napisać. W takim razie pokaże co mam i może ktoś podpowie co dalej, wtedy będzie łatwiej.<br />Jak wygenerować impuls 20ms co określony czas nie używając delay.<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 /><br />#define co_ile 7<br />#define wypelnienie 120<br /><br />#define POMPKA (1&lt;&lt;PC0)<br />#define WIAT (1&lt;&lt;PC1)<br />#define PLO (1&lt;&lt;PC2)<br /><br />volatile uint8_t flaga;  // flaga tyknięcie zegara co 20ms ---&gt;100 tykniec 2s<br />volatile uint8_t set; // ustawienie wyjścia dla pompki<br />volatile uint8_t s1_flag; //flaga tyknięcia sekundy<br /><br /><br />int main(void){<br /><br /><br />// DLA KANAŁÓW PROGRAMOWYCH PWM<br />DDRC |= (POMPKA | WIAT | PLO);<br /><br /><br /><br />/**************************TIMER 0 20ms 50Hz zegar 11.059MHz****************************/<br /><br />TCCR0A |= ((1&lt;&lt;WGM01));   // tryb ctc<br />TCCR0B |= ((1&lt;&lt;CS02)|(1&lt;&lt;CS00)); //preskaler 1024<br />OCR0A = 215;// dodatkowy podział<br />TIMSK0 |= (1&lt;&lt;OCIE0A); // zezwolenie od porównania<br />/*******************************************************************/<br /><br /><br /><br /><br /><br />sei();<br />while(1){<br /><br />// w tym przypadku &quot;prawda&quot; co sekundę<br />if(s1_flag){<br />//Szerokoś Impulsu 20ms I JAK TO MOGE ZREALIZOWAĆ<br />PORTC |= POMPKA;// POTRZEBUJE TO ZAŁĄCZYĆ co 1s/2s/3s - okres zmienny z tym nie ma problemu %.<br />s1_flag=0; // wyzerowac flage<br />}<br />}<br /><br /><br /><br />}<br /><br /><br />//PRZERWANIE TIMER0 CO 20ms<br />ISR (TIMER0_COMPA_vect){<br /><br /><br />static uint8_t s;<br /><br />if(s==49){<br />s1_flag=1;<br />s=0;<br />}<br /><br />s++;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10908">Xmen</a> — 7 gru 2017, o 17:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mczarny]]></name></author>
<updated>2017-12-07T15:31:04+01:00</updated>
<published>2017-12-07T15:31:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200136#p200136</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200136#p200136"/>
<title type="html"><![CDATA[Re: Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200136#p200136"><![CDATA[
cześć<br /> Nie piszesz jaki procesor więc nie dostaniesz gotowca, ale poczytaj o pracy timera sprzętowego w trybie PWM i masz to co chcesz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4651">mczarny</a> — 7 gru 2017, o 15:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Xmen]]></name></author>
<updated>2017-12-07T14:33:48+01:00</updated>
<published>2017-12-07T14:33:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200134#p200134</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200134#p200134"/>
<title type="html"><![CDATA[Przebieg prostokątny z wypełnieniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19761&amp;p=200134#p200134"><![CDATA[
Witam, chciałbym wygenerować przebieg z określoną częstotliwością (którą można by zmieniać) oraz zmiennym wypełnieniem. i Nie wiem w jaki sposób to ugryźć. O ile wygenerować przebieg o danej częstotliwości nie będzie problemu (np. Timer0 tryb CTC) to dołożyć mu konkretne wypełnienie to już dla Mnie bardzo duży problem.<br />Proszę o jakąś poradę w jaki sposób mogę się do tego zabrać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10908">Xmen</a> — 7 gru 2017, o 14:33</p><hr />
]]></content>
</entry>
</feed>