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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-08-19T19:04:29+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=22330&amp;mode</id>
<entry>
<author><name><![CDATA[goslawen]]></name></author>
<updated>2019-08-19T19:04:29+01:00</updated>
<published>2019-08-19T19:04:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=221409#p221409</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=221409#p221409"/>
<title type="html"><![CDATA[Re: Atmega 32u4 - PD0/PD7 w trybie fast PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=221409#p221409"><![CDATA[
Problem rozwiązany. Koledzy z elektrody słusznie zauważyli, że gdy wywalałem z kodu wszystko, żeby sprawdzić na jak najwęższym zakresie co mi nie działa wyrzuciłem też obsługę jednego przerwania. To powodowało dziwne zachowanie przy sei ().<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2353">goslawen</a> — 19 sie 2019, o 19:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[goslawen]]></name></author>
<updated>2019-08-19T15:39:26+01:00</updated>
<published>2019-08-19T15:39:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=221401#p221401</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=221401#p221401"/>
<title type="html"><![CDATA[Re: Atmega 32u4 - PD0/PD7 w trybie fast PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=221401#p221401"><![CDATA[
Męczę temat dalej, jednak kilku rzeczy nie rozumiem.<br />Może uda się Wam mi znowu trochę temat rozjaśnić.<br /><br />W momencie przypisania jakiejkolwiek wartości do rejestru OCR0B program się &quot;resetuje&quot;. Tj wraca na początek funkcji <br />int main(void). Robi tak dokładnie <span style="color: #BF0040"> 3 razy </span> po czym mimo wszystko wartość się wpisuje i PWM zaczyna działać.<br />Miejsce przypisania OCR0B nie ma znaczenia, czy w samej funkcji main czy w innej np. oid parse_nrf_data ( char * buf, uint8_t len ) po otrzymaniu czegoś z NRF24l01.<br /><br />Kod wygląda jak wygląda bo już sobie włosy z głowy rwałem i zamieniałem 0b na 0x itp <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> i inne tego typu pomysłu, które ostatecznie nic nie dały.<br />Myślę że ten błąd może powodować również to, że NRF24l01 raz wysyła komunikaty poprawnie a po pewnym czasie ileś z rzędu zgubi i tak w kółko.<br />Wydawało się, że wszystko &quot;działa poprawnie&quot; do czasu aż zacząłem zatrzymywać program debugerem. (poza tymi ominiętymi komunikatami). Nawet zmiana ilości powtórzeń na 15, czy czasu na oczekiwanie na 3750u niewiele pomogła.<br /><br />[syntax=c]int main(void)<br />{<br />!!!!!!!!!!TUTAJ WRACA PO WPISANIU CZEGOKOLWIEK W OCR0B !!!!!!!<br />// porty <br />DDRC = 0x00; // c jako I<br />DDRD = 0b11110001; // d jako IO<br />DDRB = 0b10000000; // // b jako IO<br />// PWM<br />TCCR0A = (1&lt;&lt;WGM00) | (1&lt;&lt;WGM01) | (1&lt;&lt;COM0B1); // PWM<br />TCCR0B = (1&lt;&lt;CS01); // PWM<br />// pozwolenia na przerwania<br /> <br />//sei();<br />EICRA = 0b00010100;<br />EIMSK = 0b00000110;<br /><br />OCR0B = 128; // wartość PWM<br />_delay_ms(1000);<br />USART_Init( r_baud);<br /><br />encoder=0;<br />mknrf_init( PSTR(&quot;ATNEL&quot;) );<br />register_nrf_rx_callback( parse_nrf_data );<br />set_rx_mode();<br />motor1_start();<br /><br /><br />    while (1) <br />    {<br />MKNRF_RX_EVENT(); // nie używam przerwania od NRF24l01 - zabrakło pinów<br /><br />    }[/syntax]<br />}<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 57 minutach ]</span></strong><br /><br />//      sei(); oczywiście powinno być bez komentarza.<br /><br />// nie udało mi się zedytować postu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2353">goslawen</a> — 19 sie 2019, o 15:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2019-06-16T18:47:40+01:00</updated>
<published>2019-06-16T18:47:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219734#p219734</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219734#p219734"/>
<title type="html"><![CDATA[Re: Atmega 32u4 - PD0/PD7 w trybie fast PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219734#p219734"><![CDATA[
<div class="quotetitle">goslawen napisał(a):</div><div class="quotecontent"><br />Czy mogę jeszcze tylko poprosić o informację z czego wynika że nie da się ustawić wypełniania 0%?<br /></div><br />To raczej pytanie do producenta mikrokontrolera <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Takie jest z założenia działanie w trybie Fast PWM. Wynika to z tego, że rejestr OCR0B jest ośmiobitowy (inny być nie może, bo timer też jest ośmiobitowy). Może więc przechowywać 256 wartości, czyli od 0 do 255. Odliczanie w tym trybie odbywa się tylko w jednym kierunku, więc zrównanie wartości występuje tylko 1 raz na okres zliczania timera wynoszący 256 taktów. Istnieją więc dwie opcje:<br /><ul><li>wypełnienie będzie miało zakres od 0/256 do 255/256, czyli nie da się uzyskać pełnego wypełnienia 100%,</li><li>wypełnienie będzie miało zakres od 1/256 do 256/256, czyli nie da się uzyskać wypełnienia 0%.</li></ul>Można wybrać tylko jedną z tych opcji i producent wybrał akurat tę drugą. Dlaczego? Tego nie wiem <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Jeśli jednak lepiej pasowałaby Ci ta pierwsza opcja, możesz odwrócić polaryzację PWM poprzez ustawienie bitów COM0B1=1 i COM0B0=1. Wypełnienie (stanem wysokim) będzie wtedy równe 255-OCR0B. Wtedy jednak nie da się uzyskać wypełnienia 100%.<br /><br />Inną alternatywą jest użycie innego trybu pracy timera, np. Phase Correct PWM, i wtedy uzyskasz pełen zakres od 0 do 100%, za to częstotliwość będzie o około połowę mniejsza, ponieważ tutaj odliczanie jest dwukierunkowe. Nie będę tutaj już tego tutaj dokładnie wyjaśniał, bo dopuszczalna pojemność postu na forum może być za mała <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Szczegóły można znaleźć w dokumentacji mikrokontrolera.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 16 cze 2019, o 18:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2019-06-16T18:44:57+01:00</updated>
<published>2019-06-16T18:44:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219733#p219733</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219733#p219733"/>
<title type="html"><![CDATA[Re: Atmega 32u4 - PD0/PD7 w trybie fast PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219733#p219733"><![CDATA[
Poczytaj o tzw. glitch. Ale można to obejść stosując 'negację'. Wtedy 0 to max wypełnienia a 255 to idealne 0.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 16 cze 2019, o 18:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[goslawen]]></name></author>
<updated>2019-06-16T17:46:11+01:00</updated>
<published>2019-06-16T17:46:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219731#p219731</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219731#p219731"/>
<title type="html"><![CDATA[Re: Atmega 32u4 - PD0/PD7 w trybie fast PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219731#p219731"><![CDATA[
Bardzo Wam dziękuję za pomoc!<br />Wszystko działa. Niesamowicie dziękuję za tak wyczerpującą odpowiedź.<br /><br />Czy mogę jeszcze tylko poprosić o informację z czego wynika że nie da się ustawić wypełniania 0%?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2353">goslawen</a> — 16 cze 2019, o 17:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2019-06-16T13:02:44+01:00</updated>
<published>2019-06-16T13:02:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219725#p219725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219725#p219725"/>
<title type="html"><![CDATA[Re: Atmega 32u4 - PD0/PD7 w trybie fast PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219725#p219725"><![CDATA[
<div class="quotetitle">goslawen napisał(a):</div><div class="quotecontent"><br />[syntax=c]TCCR0A = (1&lt;&lt;WGM00);<br />TCCR0A = (1&lt;&lt;WGM01);<br />TCCR0B = (1&lt;&lt;CS01);<br />TCCR0A = (1&lt;&lt;COM0A1);[/syntax]<br /></div><br />Po pierwsze, jeśli w trybie Fast PWM chcesz uzyskać sygnał PWM na pinie OC0B (PD0), to musisz w rejestrze <strong>TCCR0A</strong> ustawić bit <strong>COM0B1</strong>, a nie <strong>COM0A1</strong>.<br />Po drugie nie przedstawiłeś całego kodu, więc może to robisz w innym miejscu, ale dla uzyskania na wyjściu OC0B(PD0) sygnału PWM wymagane jest także ustawienie tego pinu jako wyjście:[syntax=c]DDRD |= (1&lt;&lt;0);[/syntax]<br />Dodatkowo w linii 2 Twojego kodu, wpisując nową wartość do rejestru TCCR0A, zerujesz bit WGM00, który wcześniej ustawiłeś w linii 1. Podobnie jest w linii 4. Aby tego uniknąć powinieneś zastosować operator <strong>|=</strong> lub <strong>|</strong> w następujący sposób:[syntax=c]// można tak<br />TCCR0A  = (1&lt;&lt;WGM00);<br />TCCR0A |= (1&lt;&lt;WGM01);<br />TCCR0B  = (1&lt;&lt;CS01);<br />TCCR0A |= (1&lt;&lt;COM0B1);<br /><br />// lub tak<br />TCCR0A = (1&lt;&lt;WGM00) | (1&lt;&lt;WGM01) | (1&lt;&lt;COM0B1);<br />TCCR0B = (1&lt;&lt;CS01);[/syntax]<br />Później wartość wypełnienia regulujesz poprzez wpisanie odpowiedniej wartości do rejestru <strong>OCR0B</strong>. Należy jednak pamiętać o tym, że przy takich ustawieniach timera nie da się uzyskać wypełnienia 0%, czyli nawet wpisując do OCR0B wartość <strong>0</strong> nie da się uzyskać ciągłego stanu niskiego na pinie OC0B. Po każdym przepełnieniu licznika na wyjściu OC0B będzie pojawiać się krótkotrwały impuls.<br /><br /><div class="quotetitle">Lex_ napisał(a):</div><div class="quotecontent"><br />Jeżeli rejestry są poprawne to tylko wpisać wartość od 0 do 255 i oczywiście nie zapomnieć o <br />[syntax=c]TIMSK |= (1&lt;&lt;OCR0B);    // zezwolenie na przerwanie CompareMatch<br />sei();[/syntax]<br /></div><br />Po pierwsze ten mikrokontroler nie ma rejestru TIMSK, tylko np. (między innymi) TIMSK0.<br />OCR0B to nazwa rejestru, a nie bitu. Zezwolenie na przerwanie od porównania realizuje bit OCIE0B w rejestrze TIMSK0.<br />Włączenie przerwań od porównania wcale nie jest konieczne do wygenerowania sygnału PWM.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 16 cze 2019, o 13:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lex_]]></name></author>
<updated>2019-06-16T10:00:13+01:00</updated>
<published>2019-06-16T10:00:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219719#p219719</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219719#p219719"/>
<title type="html"><![CDATA[Re: Atmega 32u4 - PD0/PD7 w trybie fast PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219719#p219719"><![CDATA[
Jeżeli rejestry są poprawne to tylko wpisać wartość od 0 do 255 i oczywiście nie zapomnieć o <br />[syntax=c]TIMSK |= (1&lt;&lt;OCR0B);// zezwolenie na przerwanie CompareMatch<br />sei();[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2676">Lex_</a> — 16 cze 2019, o 10:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[goslawen]]></name></author>
<updated>2019-06-15T23:03:25+01:00</updated>
<published>2019-06-15T23:03:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219705#p219705</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219705#p219705"/>
<title type="html"><![CDATA[Atmega 32u4 - PD0/PD7 w trybie fast PWM]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=22330&amp;p=219705#p219705"><![CDATA[
Cześć,<br />Mózg mi zaraz wyparuje, niewiele zostało <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Chciałbym wygenerować PWM na pin PD0 w atmega32u4.<br /><br />Proszę poprawcie mnie, w którym miejscu coś źle rozumiem:<br /><br />INT0/SCL/OC0B – Port D, Bit 0<br />OC.0B: Timer 0 Output Compare B. This pin can be used to generate a PWM signal from the Timer 0 module.<br /><br />Czyli muszę ustawić Timer0:<br />TCCR0A = (1&lt;&lt;WGM00);<br />TCCR0A = (1&lt;&lt;WGM01);<br />TCCR0B = (1&lt;&lt;CS01);<br />TCCR0A = (1&lt;&lt;COM0A1);<br /><br />a następnie ustawić jakąś wartość w <br /><br />OCR0B ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2353">goslawen</a> — 15 cze 2019, o 23:03</p><hr />
]]></content>
</entry>
</feed>