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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-06-01T14:45:41+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=18409&amp;mode</id>
<entry>
<author><name><![CDATA[Mufinek]]></name></author>
<updated>2017-06-01T14:45:41+01:00</updated>
<published>2017-06-01T14:45:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=190128#p190128</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=190128#p190128"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=190128#p190128"><![CDATA[
Witam.<br /><br />dziękuję wszystkim za pomoc. Urządzonko jak na razie działa z mniejszym silnikiem bez problemu, a niedługo sprawdzę go w samochodzie. jeżeli kogoś interesuje schemat tego urządzenia to mogę go udostępnić na forum. poniżej kod programu po poprawkach. W razie jakichkolwiek zastrzeżeń co do poprawności programu uwagi jak najbardziej wskazane.<br /><br />[syntax=c]/*<br /> * main.c<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 KEY_PIN1 (1&lt;&lt;PB3)<br />#define KEY_PIN2 (1&lt;&lt;PB4)<br />#define KEY_DOWN1 !(PINB &amp; KEY_PIN1)<br />#define KEY_DOWN2 !(PINB &amp; KEY_PIN2)<br /><br />//uint8_t klawisz_wcisniety(void);// deklaracja funkcji<br />//uint8_t klawisz_wcisniety1(void);// deklaracja funkcji<br /><br />#define LED_PIN (1&lt;&lt;PB2)// definicja pinu do którego dołączona jest dioda<br />#define LED_ON PORTB &amp;= ~LED_PIN// makrodefinicja załączenia diody<br />#define LED_OFF PORTB |= LED_PIN// makrodefinicja wyłączenia diody<br />#define LED_TOG PORTB ^= LED_PIN// makrodefinicja zmiana stanu diody<br /><br />volatile uint8_t PWM_1, PWM_2;<br /><br /><br />int main(void)<br />{<br /><br />DDRB |= (1&lt;&lt;PB0) | (1&lt;&lt;PB1);//kierunek pinu PB0 i PB1 - WYJŚCIE<br /><br />//ustawienia TIMER0 w tryb PWM<br />TCCR0A |= (1&lt;&lt;WGM01); // tryb CTC<br />TCCR0B |= (1&lt;&lt;CS00);// preskaler = 1<br />OCR0A = 160;// 30kHz<br /><br /><br />TIMSK0 |= (1&lt;&lt;OCIE0A);  // zezwolenie na przerwanie Compare Match<br /><br /><br />// ****** inicjalizacja *********<br />DDRB |= LED_PIN;// kierunek pinu PB2 wyjściowy<br /><br />sei();<br /><br />// ****** Pętla główna programu *********<br />    while(1){<br />    if( KEY_DOWN1 )<br />    {<br />    PWM_1 = 150;<br />    PWM_2 = 50;<br />    }<br />    else<br />    {<br />    PWM_1 = 0;<br />    PWM_2 = 0;<br />    LED_OFF;<br />    }<br />    } // END while<br />} // END main<br /><br />ISR(TIM0_COMPA_vect){<br />static uint8_t clock;<br />static uint8_t pwm_clock;<br />if( KEY_DOWN1 )<br /><br />if(clock ==10){<br />  clock =0;<br />  LED_TOG;<br />}<br /><br />clock++;<br />pwm_clock++;<br /><br />(pwm_clock &gt;= PWM_1) ? (PORTB |= (1 &lt;&lt; PB0)) : (PORTB &amp;= ~(1 &lt;&lt; PB0));<br />(pwm_clock &gt;= PWM_2) ? (PORTB |= (1 &lt;&lt; PB1)) : (PORTB &amp;= ~(1 &lt;&lt; PB1));<br /><br />}<br /><br /><br /><br />//******************************************************** koniec main()<br /><br />// definicja funkcji<br />//uint8_t klawisz_wcisniety(void)<br />//{<br />//if( KEY_DOWN1 )// klawisz wciiśnięty ?<br />//{<br />//_delay_us(500);// czas drgania styków<br />//if( KEY_DOWN1 ) return 1; // jeżeli wciśnięty - rezultat = 1<br />//}<br /><br />//return 0;// jeżeli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br /><br />//}<br /><br />// definicja funkcji<br />//uint8_t klawisz_wcisniety1(void)<br />//{<br />//if( KEY_DOWN2 )// klawisz wciśnięty ?<br />//{<br />//_delay_ms(1);// czas drgania styków<br />//if( KEY_DOWN2 ) return 1; // jeżeli wciśnięty? zakończ funkcję - rezultat = 1<br />//}<br /><br />//return 0;// jeĹ›li nie wciśniety klawisz, zakończ funkcję, rezultat = 0<br /><br />//}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17073">Mufinek</a> — 1 cze 2017, o 14:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2017-05-21T17:39:18+01:00</updated>
<published>2017-05-21T17:39:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189610#p189610</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189610#p189610"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189610#p189610"><![CDATA[
<div class="quotetitle">Mufinek napisał(a):</div><div class="quotecontent"><br />Jednakże nie wiem w jaki sposób na wyjściach PB0 i PB1 uzyskuję sygnał około 300Hz. Jeżeli chodzi o sygnał PWM to także nie do końca &quot;kumam&quot; jak to działa.<br /></div><br />Masz 2 zmienne globalne PWM_1 i PWM_2 - są to zmienne od których zależy wypełnienie PWM odpowiednio PWM_1 dla pinu PB0, PWM_2 dla pinu PB1.<br />Dodatkowo w obsłudze przerwania masz zmienną pwm_clock która działa jak licznik. Co każde wywołanie przerwania zmienna jest zwiększana o 1 a następnie porównywana z dwiema zmiennymi PWM_1 i PWM_2. <br />Dla skrócenia wywodu rozpatrzmy tylko jeden kanał PWM:<br />Jeżeli pwm_clock jest większa lub równa PWM_1 to na pinie PB0 ustawiany jest stan wysoki, jeżeli mniejsza to jest ustawiany stan 0. Czyli jak zmienna PWM_1 będzie równa 0 to będziesz miał pełne wypełnienie dodatnie, jeśli natomiast PWM_1 będzia miało wartość 255 to będzie minimalne wypełnienie.<br />Licznik pwm_clock w ciągu sekundy przelatuje z przepełnieniem 300 razy , stąd mówimy że PWM pracuje z częstotliwością 300Hz, z kolei same zmienne pwm_clock, PWM_1 i PWM_2 mogą przyjmować wartości od 0 do 255 w systemie binarnym możliwe do zapisania za pomocą 8 bitów, stąd mówimy że PWM ma rozdzielczość 8-bitową co oznacza że możemy ustawić 256 różnych wartości wypełnienia.<br /><br /><div class="quotetitle">kicajek napisał(a):</div><div class="quotecontent"><br />[syntax=c](pwm_clock &gt;= PWM_1) ? (PORTB |= (1 &lt;&lt; PB0)) : (PORTB &amp;= ~(1 &lt;&lt; PB0));<br />(pwm_clock &gt;= PWM_2) ? (PORTB |= (1 &lt;&lt; PB1)) : (PORTB &amp;= ~(1 &lt;&lt; PB1));[/syntax]<br /></div>Powyższe warunki to taka odmiana if/else - jak warunek w pierwszym nawiasie spełniony wykonywany jest kod zaraz po znaku zapytanie do dwukropka, jeżeli jest niespołniony to wykonuje się kod od dwukropka do średnika.<br />Analogicznie druga linia jest dla drugiego kanału PWM.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 21 maja 2017, o 17:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mufinek]]></name></author>
<updated>2017-05-21T16:13:23+01:00</updated>
<published>2017-05-21T16:13:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189603#p189603</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189603#p189603"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189603#p189603"><![CDATA[
Witam.<br /><br />Dzisiaj miałem trochę czasu i uruchomiłem urządzenie dzięki waszej wydatnej pomocy. Dla uściślenia urządzenie to ma zastąpić rezystor zamontowany w wentylatorze mojego Opla Astry III. Samego rezystora nie można kupić, jedynie razem z wentylatorem, a to koszt około 500 zł. Pomyślałem, że lepiej będzie zrobić urządzenie na tranzystorze MOSFET, który to tranzystor będzie sterowany poprzez PWM i załączany po podaniu impulsu z jednostki centralnej komputera pokładowego. Ponieważ w tym urządzeniu wykorzystuję tranzystor MOSFET z kanałem typu N, a obciążenie - wentylator - jest włączone pomiędzy źródło, a masę pojazdu więc potrzebowałem dodatkowe zasilanie bramki MOSFET-a napięciem wyższym o około 10V niż zasilanie z samochodu (12-14V). Zrobiłem to na &quot;podwajaczu&quot; napięcia i do tego potrzebny mi był sygnał prostokątny  ale o wyższej częstotliwości niż kanał PWM. Tak więc teraz pozostaje mi uruchomić urządzenie i przetestować na wentylatorze. Dzisiaj już tego nie będę robił tylko wziąłem się za analizowanie kodu programu bo mam jeszcze problemy z pełnym zrozumieniem. Rozumiem jak uzyskuje się częstotliwość podstawową - nawiązując do kodu kolegi &quot;Kicajek&quot; - dla taktowania Timera0 - wartość zegara 9600000/1/(OCR0A=124)= 77419 Hz -, aby uzyskać na wyjściu PB2 sygnału 3kHz to dzielimy przy pomocy zmiennej &quot;clock&quot; w obsłudze przerwania porównującego Timera0 przez 12 i przez 2. Jednakże nie wiem w jaki sposób na wyjściach PB0 i PB1 uzyskuję sygnał około 300Hz. Jeżeli chodzi o sygnał PWM to także nie do końca &quot;kumam&quot; jak to działa.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17073">Mufinek</a> — 21 maja 2017, o 16:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2017-05-14T19:33:21+01:00</updated>
<published>2017-05-14T19:33:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189215#p189215</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189215#p189215"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189215#p189215"><![CDATA[
Witam<br />Takie coś na szybko, tylko sobie coś z tymi Twoimi przyciskami pokombinuj.<br />Wypełnienie zmienia się zmieniając PWM_1 i PWM_2:<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 KEY_PIN1 (1&lt;&lt;PB3)<br />#define KEY_PIN2 (1&lt;&lt;PB4)<br />#define KEY_DOWN1 !(PINB &amp; KEY_PIN1)<br />#define KEY_DOWN2 !(PINB &amp; KEY_PIN2)<br /><br />uint8_t klawisz_wcisniety(void);// deklaracja funkcji<br />uint8_t klawisz_wcisniety1(void);// deklaracja funkcji<br /><br />#define LED_PIN (1&lt;&lt;PB2)// definicja pinu do którego podłączona jest dioda<br />#define LED_ON PORTB &amp;= ~LED_PIN// makrodefinicja – załączenie diody<br />#define LED_OFF PORTB |= LED_PIN// makrodefinicja – wyłączenie diody<br />#define LED_TOG PORTB ^= LED_PIN// makrodefinicja – zmiana stanu diody<br /><br />volatile uint8_t PWM_1, PWM_2;<br /><br /><br />int main(void)<br /><br />{<br /><br />DDRB |= (1&lt;&lt;PB0) | (1&lt;&lt;PB1);//kierunek pinu PB0 i PB1 - WYJŚCIE<br /><br />//ustawienia TIMER0 w tryb PWM<br />TCCR0A |= (1&lt;&lt;WGM01); // tryb CTC<br />TCCR0B |= (1&lt;&lt;CS00);// preskaler = 1 <br />OCR0A = 124;// 76,5kHz<br /><br />TIMSK0 |= (1&lt;&lt;OCIE0A);<br /><br /><br /><br /><br /><br />// ****** inicjalizacja *********<br />DDRB |= LED_PIN;// kierunek pinu PB2 – wyjściowy<br /><br />sei();<br />// ****** pętla główna programu *********<br />    while(1){<br /><br />    PWM_1 = 100;<br />    PWM_2 = 50;<br /><br />    } // END while<br />} // END main<br /><br /><br />ISR(TIM0_COMPA_vect){<br />static uint8_t clock;<br />static uint8_t pwm_clock;<br />if(clock ==12){<br />  clock =0;<br />  LED_TOG;<br />}<br />clock++;<br />pwm_clock++;<br /><br />(pwm_clock &gt;= PWM_1) ? (PORTB |= (1 &lt;&lt; PB0)) : (PORTB &amp;= ~(1 &lt;&lt; PB0));<br />(pwm_clock &gt;= PWM_2) ? (PORTB |= (1 &lt;&lt; PB1)) : (PORTB &amp;= ~(1 &lt;&lt; PB1));<br /><br /><br />}<br /><br /><br />//******************************************************** koniec main()<br /><br />// definicja funkcji<br />uint8_t klawisz_wcisniety(void)<br />{<br />if( KEY_DOWN1 )// klawisz wciśnięty ?<br />{<br />_delay_ms(1);// czas drgań styków<br />if( KEY_DOWN1 ) return 1; // jeśli wciśnięty? zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br /><br />}<br /><br />// definicja funkcji<br />uint8_t klawisz_wcisniety1(void)<br />{<br />if( KEY_DOWN2 )// klawisz wciśnięty ?<br />{<br />_delay_ms(1);// czas drgań styków<br />if( KEY_DOWN2 ) return 1; // jeśli wciśnięty? zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 14 maja 2017, o 19:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2017-05-14T19:20:55+01:00</updated>
<published>2017-05-14T19:20:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189213#p189213</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189213#p189213"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189213#p189213"><![CDATA[
<div class="quotetitle">Mufinek napisał(a):</div><div class="quotecontent"><br />a mianowicie czy w trybie CTC lub Normal uzyskam osobno generator 3kHz i PWM 300Hz<br /></div>Co do kwestii PWM to odsyłam do książki Mirka, co do generatora 3kHz to co za problem w przerwaniu oprócz procedur odpowiedzialnych za sterowanie programowym PWM-em dopisać parę linijek kodu do zmiany stanu pinu na którym chcesz uzyskać 3kHz. Jedyne co musisz zrobić to odpowiednio wszystko przeliczyć (prawdopodobnie będziesz musiał utworzyć dodatkową zmienną na potrzeby tego sygnału tak by dopasować sobie tę częstotliwość)<br />Tak na szybko to jeśli PWM chcesz mieć z częstotliwością 300Hz i z 256bitową rozdzielczością, to przerwanie powinno być wywoływane z częstotliwością 300x256=76800Hz czyli dużo więcej niż twoje 3kHz, więc w przerwaniu musisz inkrementować zmienną i porównywać jej wartość z wyliczoną dla 3kHz stałą czyli w twoim przypadku 76800/3000=~25. Czyli jak zmienna osiągnie wartość 25 zmieniasz stan pinu generującego 3kHz i zerujesz zmienną (liczone tak na szybko i tylko dla pokazania zasady - nie daję głowy czy wyliczenia są w 100% poprawne).<br />W ten sposób generowany będzie przebieg PWM i sygnał 3kHz - tylko na koniec musisz przeanalizować ile się będzie wykonywać całe przerwanie żeby się zmieścić w taktowaniu procka - ale to już w mirkowej księdze, w rozdziale o PWM jest ładnie wyjaśnione.<br /><br />Więc odpowiadając na pytanie - TAK bez problemu da się to zrobić w obu trybach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 14 maja 2017, o 19:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tonygryps]]></name></author>
<updated>2017-05-14T19:19:56+01:00</updated>
<published>2017-05-14T19:19:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189212#p189212</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189212#p189212"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189212#p189212"><![CDATA[
W trybie CTC da się to uzyskać.<br />Ja bym próbował tak przerwanie co 16us i w tym przerwaniu zmieniał stan pinu (tego od 3kHz) oraz zaimplementował bym w tym przerwaniu timer programowy <br />w pętli while zrobił bym programowy PWM w W niebieskiej książce jest opisane jak to zrobić i żadnych _delay_ w pętli while.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12014">tonygryps</a> — 14 maja 2017, o 19:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mufinek]]></name></author>
<updated>2017-05-14T18:40:51+01:00</updated>
<published>2017-05-14T18:40:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189210#p189210</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189210#p189210"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189210#p189210"><![CDATA[
Już poprawiłem post i mam pytanie do kolegi XENTIS, a mianowicie czy w trybie CTC lub Normal uzyskam osobno generator 3kHz i PWM 300Hz bo w moim urządzeniu są właśnie potrzebne 2 różne częstotliwości. Co do porady kolegi TONYGRYPS to postaram się także zgłębić to zagadnienie z &quot;drganiem styków&quot;. Zabieram się już do pracy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17073">Mufinek</a> — 14 maja 2017, o 18:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tonygryps]]></name></author>
<updated>2017-05-14T18:25:35+01:00</updated>
<published>2017-05-14T18:25:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189208#p189208</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189208#p189208"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189208#p189208"><![CDATA[
Oprócz tego polecam zajrzeć na blog Mirka<a href="http://mirekk36.blogspot.com/"  class="postlink">http://mirekk36.blogspot.com/</a><br />i odnaleźć tam artykuł &quot;Drgania styków to bajki?&quot; tam Mirek wyjaśnia kwestię prawidłowej obsługi klawiszy bez funkcji _delay_ms.<br />poza tym masz jeszcze babola bo ustawiasz dwa razy preskaler w timerze 0 na na 8 i na 1 co w efekcie ustawia ci na 64 no chyba że tak ma być.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12014">tonygryps</a> — 14 maja 2017, o 18:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xentis]]></name></author>
<updated>2017-05-14T17:13:53+01:00</updated>
<published>2017-05-14T17:13:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189207#p189207</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189207#p189207"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189207#p189207"><![CDATA[
Na początek wyedytuj swój post i popraw wstawiony kod zgodnie z postem kolegi powyżej, i nie chodzi tu o czepialstwo tylko o to, że kod wklejony zgodnie z takimi wytycznymi jest ładnie formatowany przez co dużo bardziej przejrzysty.<br /><br />Co do twojego problemu to sygnał 3kHz generujesz w pętli głównej zmieniając stan pinu a pomiędzy zmianami masz opóźnienia zgodne z połową okresu - i tu by było wszystko ok, tylko zauważ że twoje funkcje które sprawdzają stan przycisków zawierają procedury eliminacji drgań styków które również zawierają opóźnienia (i to rzędu ms) które wpływają na wykonywanie pętli głównej, dla tego częstotliwość 3kHz się rozjeżdża!<br />Dodatkowym problemem jest fakt, iż procesorek attiny13 ma tylko jeden timer sprzętowy, który już wykorzystujesz do generowania sygnału PWM.<br />Jednakże da się to mimo wszystko zrobić.<br />Możesz np. uaktywnić przerwanie od przepełnienia licznika (wydaje mi się że pomimo trybu fastPWM takie przerwanie będzie działać - jak jest inaczej niech ktoś mnie poprawi) i w obsłudze tego przerwania obsłużyć timer programowy który to dopiero będzie generował Ci sygnał 3kHz.<br /><br />Jeśli jednak przerwanie od przepełnienia przy fastPWM nie będzie działać to możesz zrezygnować z trybu fastPWM, ustawić licznik w tryb CTC, ewentualnie w tryb NORMAL dobrać sobie częstotliwoś tego licznika tak by dopasować sobie generator 3kHZ i programowy PWM.<br />W przerwaniu od licznika (czy to od porównania czy przepełnienia to już zależy od wybranego trybu) generować sygnał 3kHZ (jeśli częstotliwość będzie za duża to poprzez dodatkowy timer programowy) oraz sygnał PWM.<br />Piszesz że masz niebieską książkę - tam w rozdziale PWM masz również opis programowego rozwiązania takiego generatorka.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6265">xentis</a> — 14 maja 2017, o 17:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2017-05-14T13:29:00+01:00</updated>
<published>2017-05-14T13:29:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189197#p189197</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189197#p189197"/>
<title type="html"><![CDATA[Re: Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189197#p189197"><![CDATA[
<!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic7402.html" >topic7402.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 14 maja 2017, o 13:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mufinek]]></name></author>
<updated>2017-05-14T18:31:54+01:00</updated>
<published>2017-05-14T10:29:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189183#p189183</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189183#p189183"/>
<title type="html"><![CDATA[Attiny13 PWM i drugi port z inną czestotliwością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18409&amp;p=189183#p189183"><![CDATA[
Witam.<br /><br />Jest to mój pierwszy post na tym forum. Na starość (mam 59 lat) coś mnie podkusiło aby spróbować programowania mikrokontrolerów AVR. Elektroniką zajmuję się ponad 30 lat ale w większości analogową. W czasach mojej młodości &quot;królowały&quot; komputery typu Commodore i ZX Spectrum, a technika cyfrowa była mało znana. Zakupiłem niebieską książkę Pana M.Kardasia i na jej podstawie próbuję nauczyć się programowania procesorów AVR w języku C. Tak więc proszę o cierpliwość i wyrozumiałość jeżeli moje pytania będą dla was banalnie proste, a czasami może i głupie. Z językiem angielskim też jest u mnie słabo bo w moich czasach młodości &quot;królował&quot; język rosyjski. Obecnie buduję sobie urządzonko na bazie ATTINY13, który to procesor ma na jednym porcie dawać sygnał PWM - częstotliwość około 300Hz -, a na drugim stały sygnał prostokątny o częstotliwości około 3kHz. Sygnał PWM ma być uruchamiany kiedy na jednym z wejść procesora pojawi się &quot;0&quot;, a na jednym z wyjść ma być cały czas sygnał prostokątny około 3kHz z wypełnieniem 50%. Poniższy program, który napisałem z pomocą &quot;niebieskiej książki&quot; powoduje, że na wyjściu PB2 jest sygnał prostokątny około 3 kHz z wypełnieniem 50%, a na wyjściach PB0 i PB1 sygnały PWM różnym wypełnieniem w zależności od stanu wejść na pinach PB3 i PB4. Problem jest w tym, że kiedy nacisnę jeden z przycisków to częstotliwość na PB2 zmienia się na 63 Hz z wypełnieniem  około 95% i nie wiem jak to zrobić aby na PB2 częstotliwość się nie zmieniała bez względy na stan wejść PB3 i PB4.<br /><br />Poniżej przedstawiam listing mojego programu.<br /><br /> [syntax=c]* main.c<br />  *<br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define KEY_PIN1 (1&lt;&lt;PB3)<br />#define KEY_PIN2 (1&lt;&lt;PB4)<br />#define KEY_DOWN1 !(PINB &amp; KEY_PIN1)<br />#define KEY_DOWN2 !(PINB &amp; KEY_PIN2)<br /><br />uint8_t klawisz_wcisniety(void);// deklaracja funkcji<br />uint8_t klawisz_wcisniety1(void);// deklaracja funkcji<br /><br />#define LED_PIN (1&lt;&lt;PB2)// definicja pinu do którego podłączona jest dioda<br />#define LED_ON PORTB &amp;= ~LED_PIN// makrodefinicja – załączenie diody<br />#define LED_OFF PORTB |= LED_PIN// makrodefinicja – wyłączenie diody<br />#define LED_TOG PORTB ^= LED_PIN// makrodefinicja – zmiana stanu diody<br /><br /><br />int main(void)<br /><br />{<br /><br />DDRB |= (1&lt;&lt;PB0) | (1&lt;&lt;PB1);//kierunek pinu PB0 i PB1 - WYJŚCIE<br /><br />//ustawienia  TIMER0 w tryb PWM<br />TCCR0A |= (1&lt;&lt;WGM00) | (1&lt;&lt;WGM01); // tryb FAST  PWM<br />TCCR0A |= (1&lt;&lt;COM0A0) | (1&lt;&lt;COM0A1);// clear OC2A  at  TOP<br />TCCR0B |= (1&lt;&lt;CS01);// preskaler = 8<br /><br />OCR0A = 255;// minimalne wypełnienie i jasnośc diody LED<br /><br />TCCR0A |= (1&lt;&lt;COM0B1) | (1&lt;&lt;COM0B0);// clear  OC2B  at top<br />TCCR0B |= (1&lt;&lt;CS00);// preskaler = 1<br />OCR0B = 255;// wypełnienie<br /><br />// ****** inicjalizacja *********<br />DDRB |= LED_PIN;// kierunek pinu PB2 – wyjściowy<br /><br />// ****** pętla główna programu  *********<br />while(1)<br />{<br />LED_ON;// zapal diodę<br />_delay_us(10);// oczekiwanie 10us<br />LED_OFF;// zgaś diodę<br />_delay_us(10);// oczekiwanie 10us<br />//}<br /><br />//while (1)<br />//{<br /><br />if(  klawisz_wcisniety() ) // jeśli klawisz &quot;1&quot; wciśnięty<br />{<br />  OCR0A = 102;// wartośc współczynnika wypełnienia<br />  OCR0B = 0;// wartośc współczynnika wypełnienia<br />}<br /> else<br /> {<br /> if(  klawisz_wcisniety1() )   // jeśli klawisz &quot;2&quot; wciśnięty<br /> {<br /> OCR0A = 160;  //OCR0A = 204;// wartoc wspólczynnika wypełnienia<br /> }<br />  else// jeżeli żaden klawisz nie jest wciśnięty<br />  {<br />  OCR0A = 255;// minimalny współczynnik wypełnienia<br />  OCR0B = 255;// współczynnik wypełnienia<br />     }<br /><br />  }<br />}<br />}<br />//}<br /><br /><br />//******************************************************** koniec main()<br /><br />// definicja funkcji<br />uint8_t klawisz_wcisniety(void)<br />{<br />if( KEY_DOWN1 )// klawisz wciśnięty ?<br />{<br />_delay_ms(1);// czas drgań styków<br />if( KEY_DOWN1 ) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br /><br />}<br /><br />// definicja funkcji<br />uint8_t klawisz_wcisniety1(void)<br />{<br />if( KEY_DOWN2 )// klawisz wciśnięty ?<br />{<br />_delay_ms(1);// czas drgań styków<br />if( KEY_DOWN2 ) return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=17073">Mufinek</a> — 14 maja 2017, o 10:29</p><hr />
]]></content>
</entry>
</feed>