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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-07-10T18:46:10+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=18407&amp;mode</id>
<entry>
<author><name><![CDATA[Wojtek Apel]]></name></author>
<updated>2017-07-10T18:46:10+01:00</updated>
<published>2017-07-10T18:46:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=191905#p191905</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=191905#p191905"/>
<title type="html"><![CDATA[Re: Odczyt PWM z wykorzystaniem Input Capture Pin (ICP)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=191905#p191905"><![CDATA[
Wszystko jest ok, się zakręciłem trochę. Myślałem że w zależności czy mierze względem masy czy plusa, będą inne wyniki. Okazuje sie, że dla multimetru to bez znaczenia, zawsze pokazuje 70%.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15298">Wojtek Apel</a> — 10 lip 2017, o 18:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-07-08T14:30:17+01:00</updated>
<published>2017-07-08T14:30:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=191829#p191829</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=191829#p191829"/>
<title type="html"><![CDATA[Re: Odczyt PWM z wykorzystaniem Input Capture Pin (ICP)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=191829#p191829"><![CDATA[
Podłącz oscyloskop i porównaj oba przebiegi.<br /><br />Sent from my Mi-4c using Tapatalk<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 8 lip 2017, o 14:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Wojtek Apel]]></name></author>
<updated>2017-07-02T11:09:37+01:00</updated>
<published>2017-07-02T11:09:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=191559#p191559</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=191559#p191559"/>
<title type="html"><![CDATA[Re: Odczyt PWM z wykorzystaniem Input Capture Pin (ICP)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=191559#p191559"><![CDATA[
Witajcie!<br /><br />Mam do Was pytanie dotyczące tematu postu. <br />Buduję wskaźnik procentowego wypełnienia PWM. Wykorzystałem do tego bibliotekę z Blue Booka, RC5. <br />Wszystko pięknie działa, ale...<br />Mierzę wypełnienie z multiwibratora z podłączonym równolegle miernikiem fabrycznym i jest ok. Wcałym zakresia pomiary są identyczne. Kiedy jednak podłączę w miejsce generatora sterownik ECU, który też generuje PWM na wyjściu diagnostycznym, wynik na moim wskaźniku jest odwrotny, w czasie kiedy miernik fabryczny wskazuje poprawny wynik. Czyli na fabrycznym mierniku mam 70%, a na moim wskaźniku jest 30%. <br />Domyśla się może ktoś gdzie leży przyczyna?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15298">Wojtek Apel</a> — 2 lip 2017, o 11:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sp2ews]]></name></author>
<updated>2017-05-20T23:21:00+01:00</updated>
<published>2017-05-20T23:21:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=189575#p189575</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=189575#p189575"/>
<title type="html"><![CDATA[Re: Odczyt PWM z wykorzystaniem Input Capture Pin (ICP)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=189575#p189575"><![CDATA[
<div class="quotetitle">taszyn napisał(a):</div><div class="quotecontent"><br />jednocześnie proszę o uwagi i komentarze.<br /></div><br />Ze swojej strony moge powiedzieć, że w Green Booku jest bardzo ładnie opisane jak podchodzić do komunikacji tego typu. Bez delay`ów, bez zawalania pętli głównej. Jeżeli chciałbyś napisać coś w ten deseń, poczytaj o callbackach i eventach. No i warto, mimo wszystko, podzielić projekt na osobne pliki (main, pliki .c, oraz headery) to naprawdę ułatwia życie. <br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5540">sp2ews</a> — 20 maja 2017, o 23:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[taszyn]]></name></author>
<updated>2017-05-14T05:22:13+01:00</updated>
<published>2017-05-14T05:22:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=189161#p189161</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=189161#p189161"/>
<title type="html"><![CDATA[Odczyt PWM z wykorzystaniem Input Capture Pin (ICP)]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=18407&amp;p=189161#p189161"><![CDATA[
W ramach nauki napisałem testowy kod do odczytu wartości sygnału PWM, wysyłanego np. przez odbiorniki modelarskie. Program działa bardzo ładnie, także przy różnych źródłach i częstotliwościach taktowania. Trzeba tylko uważać, aby timer nie pracował w zakresie zbyt bliskim zakresu zmiennych (int16_t), bo wtedy czasem występuje przepełnienie licznika. W sumie nie wiem dlaczego, ale może zdarza się, że ICP nie wyłapie poprawnie zbocza opadającego. To jednak zasadniczo nieistotne. Jeśli trzyma się wartości licznika w rozsądnych granicach, takie zachowanie nie występuje wcale.<br /><br />Kod załączam poniżej - może komuś się przyda, a jednocześnie proszę o uwagi i komentarze. Na pewno coś można zrobić lepiej / szybciej, a dla mnie okazja do nauki.<br /><br />[syntax=c]#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;lcd44780.h&quot;<br /><br />#define LED_DDR DDRC<br />#define LED_PORT PORTC<br /><br />#define LED1_PIN (1&lt;&lt;PC0)<br />#define LED1_ON LED_PORT &amp;= ~LED1_PIN<br />#define LED1_OFF LED_PORT |= LED1_PIN<br />#define LED1_TOG LED_PORT ^= LED1_PIN<br /><br />#define LED2_PIN (1&lt;&lt;PC1)<br />#define LED2_ON LED_PORT &amp;= ~LED2_PIN<br />#define LED2_OFF LED_PORT |= LED2_PIN<br />#define LED2_TOG LED_PORT ^= LED2_PIN<br /><br />#define PWM_DDR DDRD<br />#define PWM_PORT PORTD<br />#define PWMin_PIN (1&lt;&lt;PD6)<br /><br />// Define PWM_SCALE, used to divide PWMvalue by. Best is to keep PWM_SCALE close to 1 by using proper timer prescaler<br />//#define PWM_SCALE 1.382 // PWM_SCALE = FCPU / TIMER_PRESCALER / 1000000, i.e. 1.398 @ 11.0592MHz<br />//#define PWM_SCALE 4 // PWM_SCALE = FCPU / TIMER_PRESCALER / 1000000, i.e. 4 @ 4MHz<br />//#define PWM_SCALE 8 // PWM_SCALE = FCPU / TIMER_PRESCALER / 1000000, i.e. 8 @ 8MHz<br />#define PWM_SCALE 1 // PWM_SCALE = FCPU / TIMER_PRESCALER / 1000000, i.e. 1 @ 1MHz<br /><br />// PWM accepted range. Range outside this range will trigger health check alarm<br />#define PWM_RANGE_LOW 850<br />#define PWM_RANGE_HIGH 2150<br /><br />volatile int16_t PWMvalue, PWMdisplay;<br /><br />int main(void) {<br /><br />// LED Setup<br />LED_DDR |= LED1_PIN | LED2_PIN; // output pins<br />LED1_OFF;<br />LED2_OFF;<br /><br />// PWM Input Capture Pin setup<br />PWM_DDR &amp;= ~(PWMin_PIN); // input pin<br /><br />// Timer setup - NORMAL + ICP + OVERFLOW<br />TCCR1B |= (1 &lt;&lt; ICES1); // ICP mode, trigger on rising edge<br />TCCR1B |= (1 &lt;&lt; CS10); // Timer start + prescaler setup (currently prescaler 1)<br />TIMSK |= (1 &lt;&lt; TICIE1 ); // Input Capture Interrupt Enable<br />TIMSK |= (1 &lt;&lt; TOIE1 ); // Overflow Interrupt Enable<br /><br />// Enable global interrupts<br />sei();<br /><br />// LCD initialization<br />lcd_init();<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str(&quot;Welcome!&quot;);<br />_delay_ms(1000);<br />lcd_cls();<br />lcd_str(&quot;PWM value in us&quot;);<br /><br />while(1) {<br /><br />// Main loop START<br /><br />// Some delay<br />_delay_ms(200);<br /><br />// Converting PWMvalue to ca. 1000-2000us range<br />#if PWM_SCALE == 1<br />PWMdisplay = PWMvalue;<br />#else<br />PWMdisplay = (int16_t) PWMvalue / PWM_SCALE;<br />#endif<br /><br />// Display current PWMdisplay<br />lcd_locate(1,0);<br />lcd_str(&quot;      &quot;);<br />lcd_locate(1,0);<br />lcd_int(PWMdisplay);<br /><br />// Health check - PWM within accepted range?<br />if (PWMdisplay &lt; PWM_RANGE_LOW || PWMdisplay &gt; PWM_RANGE_HIGH) {<br />LED1_ON; // Signal PWMdisplay out of accepted range<br />}<br /><br />// Main loop END<br />}<br />// THE END<br />}<br /><br />// Event capture interrupt<br />ISR(TIMER1_CAPT_vect) {<br />if (TCCR1B &amp; (1&lt;&lt;ICES1)) { // If capture is set for rising edge<br />TCCR1B &amp;= ~(1 &lt;&lt; ICES1); // Set capture to falling edge<br />TCNT1 = 0; // Reset counter to start measure of PWM width<br />} else { // If capture is set for falling edge<br />PWMvalue = ICR1; // Record counts from last counter reset<br />TCCR1B |= (1 &lt;&lt; ICES1); // Set capture back to rising edge, to catch next PWM cycle<br />TCNT1 = 0; // Reset counter to avoid overflow<br />}<br />}<br /><br />// Overflow interrupt<br />ISR(TIMER1_OVF_vect) {<br />TCCR1B |= (1 &lt;&lt; ICES1); // Back to rising edge, just in case<br />PWMvalue = 0;<br />LED2_ON; // Signal Overflow<br />}[/syntax]<br /><br />Planuję napisać podobny program, ale z wykorzystaniem zwykłych przerwań zewnętrznych - tak by działał na ATtiny, które we większości nie mają ICP. Jakieś sugestie jak podejść to takiego zadania? Wydaje się to w miarę proste, choć prawdopodobnie dokładność pomiaru będzie mniejsza.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13747">taszyn</a> — 14 maja 2017, o 05:22</p><hr />
]]></content>
</entry>
</feed>