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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-11-05T19:37:52+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=13445&amp;mode</id>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2015-11-05T19:37:52+01:00</updated>
<published>2015-11-05T19:37:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144497#p144497</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144497#p144497"/>
<title type="html"><![CDATA[Re: Atmega8, mostek H, przerwania i silniki DC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144497#p144497"><![CDATA[
Teraz rozumiem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Dziękuję uprzejmie za odpowiedź i pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 5 lis 2015, o 19:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2015-11-04T21:07:26+01:00</updated>
<published>2015-11-04T21:07:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144393#p144393</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144393#p144393"/>
<title type="html"><![CDATA[Re: Atmega8, mostek H, przerwania i silniki DC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144393#p144393"><![CDATA[
Przerwania zewnętrzne INT0 i INT1 mogą działać jednocześnie. INT0 i INT1 to dwa osobne moduły, a nie tak jak w przypadku Timera1 - jeden timer, kilka trybów pracy, które to tryby nie zawsze mogą działać jednocześnie. A to, że bity konfiguracyjne obu przerwań leżą w tych samych rejestrach nie ma żadnego znaczenia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 4 lis 2015, o 21:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2015-11-04T20:52:57+01:00</updated>
<published>2015-11-04T20:52:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144391#p144391</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144391#p144391"/>
<title type="html"><![CDATA[Re: Atmega8, mostek H, przerwania i silniki DC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144391#p144391"><![CDATA[
Aa, no tak. Na INT0 działa elegancko.<br />Mam jednak jeszcze jedno pytanie - jeśli spróbuję użyć dwóch przerwań, które korzystają z tych samych rejestrów (tak jak próbowałem z PWM i ICP1) to ZAWSZE jedno przerwanie po prostu nie zostanie włączone?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 4 lis 2015, o 20:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2015-11-04T18:06:46+01:00</updated>
<published>2015-11-04T18:06:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144376#p144376</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144376#p144376"/>
<title type="html"><![CDATA[Re: Atmega8, mostek H, przerwania i silniki DC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144376#p144376"><![CDATA[
Używasz ICR1 jako maksymalną wartość timera, a to powoduje, że funkcja ICP1 jest odłączona i nie wywoła przerwania. Masz do dyspozycji INT0 i INT1 spróbuj z nich skorzystać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 4 lis 2015, o 18:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dawid75_75]]></name></author>
<updated>2015-11-03T09:39:25+01:00</updated>
<published>2015-11-03T09:39:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144192#p144192</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144192#p144192"/>
<title type="html"><![CDATA[Atmega8, mostek H, przerwania i silniki DC.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=13445&amp;p=144192#p144192"><![CDATA[
Dzień dobry.<br />Mam taki problem - otóż chcę za pomocą Atmegi8 sterować mostkiem H i silnikami DC. Chcę to zrobić przy pomocy zwykłego pilota z odbiornikiem. Pilot ma 4 przyciski i każdemu przyciskowi odpowiada jeden pin na odbiorniku pilota. Po wciśnięciu przycisku A na pilocie, na pinie A pojawia się stan wysoki, jak puszczam przycisk to pojawia się stan niski, itd. dla każdego przycisku. Odbiornik zasilany z 5V. Na początku, do celów testowych, korzystam z jednego przycisku pilota<br />Algorytm jest prosty - odbiornik wysyła stan wysoki na pin PB0 to silnik ma zacząć się kręcić. Pojawia się stan niski - silnik przestaje się kręcić.<br />Kiedy obsługuję to wydarzenie poprzez najprostsze podanie na pin PB0 stanu wysokiego to działa jak należy. Silniki obsługiwane przy pomocy mostka L293DNE i z jego obsługą nie ma żadnego problemu. Oto kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br /><br />#define PWMPB1// pin z sygnałem PWM<br />#define WE_APD0// pin sterujący 1<br />#define WE_BPD1// pin sterujący 2<br />#define PILOTPB0// definicja pinu, na który jest wysyłany impuls zwrotny z informacją o odległości<br /><br />// definicje poleceń sterujących pracą silnika<br />#define DC_LEWO PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD |=  (1&lt;&lt;WE_B)<br />#defineDC_PRAWO PORTD |= (1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)<br />#define DC_STOP PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)<br /><br />#define PILOT_IN_LOWPORTB &amp;= ~(1&lt;&lt;PILOT)// ustawia PILOT w stan niski<br />#define DIR_PILOT_INDDRB  &amp;= ~(1&lt;&lt;PILOT)// ustawia PILOT jako wejście<br /><br />int main(void)<br />{<br />DDRB |=  (1&lt;&lt;PWM);// ustawienie wyjścia na pin sygnału PWM<br /><br />DIR_PILOT_IN;<br />PILOT_IN_LOW;<br /><br />DDRD |=  (1&lt;&lt;WE_A) | (1&lt;&lt;WE_B);// piny sterujące mostkiem H jako wyjścia<br /><br />// INICJALIZACJA PWM<br />TCCR1A |= (1&lt;&lt;COM1A1) | (1&lt;&lt;COM1A0) // zmiana stanu wyjścia na wysoki przy porównaniu A<br />   |  (1&lt;&lt;WGM11);// tryb 14, FAST PWM, TOP = ICR1<br />   <br />    TCCR1B |= (1&lt;&lt;WGM13) | (1&lt;&lt;WGM12)// tryb 14, FAST PWM, TOP = ICR1<br />   |  (1&lt;&lt;CS11);// preskaler 8<br /><br />OCR1A = 500;// wartość początkowa porównania A (Wyjście OC1A - PB1), zmiana duty cycle<br />ICR1  = 1000;// wartość maksymalna dla trybu 14, więc częstotliwość CLK/ICR1 = 1kHz; ICR1 - TOP<br /><br />    while (1) <br />    {<br />// obsługa silników za pomocą stanu na pinie - podanie stanu wysokiego obudzi silniki<br />if(PINB &amp; (1&lt;&lt;PILOT)){<br />OCR1A = 600;<br />DC_PRAWO;<br />}else{<br />OCR1A = 1000;<br />DC_STOP;<br />}<br /><br />    }<br />}[/syntax]<br /><br />Program zrobiony jak powyżej działa dobrze, silniki się kręcą. Ale chciałbym to umieścić w przerwaniu. Algorytm również prosty: wysyłam pilotem stan wysoki na pin PB0 -&gt; przerwanie od zbocza narastającego -&gt; włączenie/wyłączenie silników -&gt; zmiana zbocza wywołującego przerwania. Jednak tu mam problem, bo atmega w ogóle nie reaguje mi na podanie zbocza narastającego. Oto kod:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define PWMPB1// pin z sygnałem PWM<br />#define WE_APD0// pin sterujący 1<br />#define WE_BPD1// pin sterujący 2<br />#define PILOTPB0// definicja pinu, na który jest wysyłany impuls zwrotny z informacją o odległości<br /><br />// definicje poleceń sterujących pracą silnika<br />#define DC_LEWO PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD |=  (1&lt;&lt;WE_B)<br />#defineDC_PRAWO PORTD |= (1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)<br />#define DC_STOP PORTD &amp;= ~(1&lt;&lt;WE_A); PORTD &amp;= ~(1&lt;&lt;WE_B)<br /><br />#define PILOT_IN_LOWPORTB &amp;= ~(1&lt;&lt;PILOT)// ustawia PILOT w stan niski<br />#define DIR_PILOT_INDDRB  &amp;= ~(1&lt;&lt;PILOT)// ustawia PILOT jako wejście<br /><br />int main(void)<br />{<br />DDRB |=  (1&lt;&lt;PWM);// ustawienie wyjścia na pin sygnału PWM<br /><br />DIR_PILOT_IN;<br />PILOT_IN_LOW;<br /><br />DDRD |=  (1&lt;&lt;WE_A) | (1&lt;&lt;WE_B);// piny sterujące mostkiem H jako wyjścia<br />DDRC &amp;=~ (1&lt;&lt;ADCIN);// ustawienie Wejścia ADC<br /><br />// INICJALIZACJA PWM<br />TCCR1A |= (1&lt;&lt;COM1A1) | (1&lt;&lt;COM1A0) // zmiana stanu wyjścia na wysoki przy porównaniu A<br />   |  (1&lt;&lt;WGM11);// tryb 14, FAST PWM, TOP = ICR1<br />   <br />    TCCR1B |= (1&lt;&lt;WGM13) | (1&lt;&lt;WGM12)// tryb 14, FAST PWM, TOP = ICR1<br />   |  (1&lt;&lt;CS11);//  | (1&lt;&lt;CS10);// preskaler 1024<br /><br />OCR1A = 1000;// wartość początkowa porównania A (Wyjście OC1A - PB1), zmiana duty cycle<br />ICR1  = 1000;// wartość maksymalna dla trybu 14, więc częstotliwość CLK/ICR1 = 1kHz; ICR1 - TOP<br /><br />// WYKRYWANIE ZBOCZA I URUCHOMIENIE PRZERWANIA DLA WYKRYCIA ZBOCZA<br />TCCR1B |= (1&lt;&lt;ICES1);// zbocze narastające wywoła przerwanie<br />TIMSK  |= (1&lt;&lt;TICIE1);// zezwolenie na przerwanie od ICP*/<br /><br />sei();<br /><br />    while (1) <br />    {<br />    }<br />}<br /><br />// obsługa silników za pomocą przerwania<br />ISR(TIMER1_CAPT_vect)<br />{<br />if (TCCR1B &amp; (1&lt;&lt;ICES1))<br />{<br />OCR1A = 600;<br />DC_PRAWO;<br />} <br />else<br />{<br />OCR1A = 1000;<br />DC_STOP;<br />}<br />TCCR1B ^= (1&lt;&lt;ICES1);// zmienia zbocze wywołujące przerwanie po to, aby puszczenie przycisku, czyli podanie stanu niskiego wyłączyło silnik<br />}[/syntax]<br />No i powyższy kod nie działa, zero reakcji. Gdzie może być błąd?<br />Proszę uprzejmie o wskazówki i pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11277">dawid75_75</a> — 3 lis 2015, o 09:39</p><hr />
]]></content>
</entry>
</feed>