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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-02-11T21:05:08+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=4360&amp;mode</id>
<entry>
<author><name><![CDATA[rosol]]></name></author>
<updated>2014-02-11T21:05:08+01:00</updated>
<published>2014-02-11T21:05:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=69990#p69990</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=69990#p69990"/>
<title type="html"><![CDATA[Re: Odświeżone]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=69990#p69990"><![CDATA[
Witam,<br />nie zakładałem nowego tematu ponieważ problem dalej dotyczy Timera, a mianowicie jego konfiguracji jako licznik impulsów przychodzących na pin PB0(T0).<br />Docelowo będzie to rozwiązanie powyższego problemu. Na początek przedstawię kod:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/sleep.h&gt;<br /><br />#define LED_1 (1&lt;&lt;PA0)<br /><br /><br />volatile int przerwanie;<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />przerwanie=0;<br /><br />}<br /><br />ISR(INT0_vect)<br />{<br />przerwanie=1;<br />}<br /><br /><br />int main(void)<br />{<br />DDRA|=LED_1;<br />PORTA|=LED_1;<br />PORTD|=(1&lt;&lt;PD2);<br /><br />MCUCR = ((1&lt;&lt;ISC00) | (1&lt;&lt;ISC01));<br />GICR = (1&lt;&lt;INT0);// Aktywacja przerwania INT0<br /><br />///////////////************* Ustawienia TIMERA0 **************\\\\\\\\\\\\\\\\\\\\\\\<br /><br />TCCR0|=((1&lt;&lt;WGM01)|(1&lt;&lt;CS00)|(1&lt;&lt;CS01)|(1&lt;&lt;CS02));//Ustawienie licznika w tryb CTC oraz liczenie zewnętrznych impulsów na pinie PB0(T0)<br />TIMSK|=(1&lt;&lt;TOIE0);//Włączenie przerwania od przepełnienia Timera/Licznika0 <br />//TCNT0=254;<br />//TIFR=(1&lt;&lt;TOV0);<br /><br />sei();<br />    while(1)<br />    {<br />sleep_mode();<br /> switch (przerwanie)<br />{<br />case 0:<br />{<br />PORTA^=LED_1;<br />}<br />break;<br />case 1:<br />{<br />PORTA^=LED_1;<br />}<br />break;<br />}<br /><br />    }<br /> <br /><br />}[/syntax]<br /><br />Proszę się nie przejmować konfiguracją przerwania INT0, ponieważ stworzyłem ją do testów diody LED. Ogólnym założeniem tego oprogramowania jest  zmiana stanu diody LED za pomocą przepełnienia Licznika0, który zlicza impulsy wywołane przez naciśnięcie mikro-switcha. Nie rozumiem konfiguracji zawartej w nocie katalogowej, która ustawia pin T0 jako zewnętrzne źródło zegara. Myślałem że jeżeli ustawię źródło zegara na pin T0 to licznik będzie zliczał sygnały wygenerowane przez naciskanie mikro-switcha i wrzucał te wartość do rejestru TCNT0, który po przepełnieniu wygeneruje przerwanie i zapali, bądź zgasi diodę. Będę bardzo wdzięczny za poświęcenie kilku minut dla tego postu. Z góry dziękuję za pomoc i pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1465">rosol</a> — 11 lut 2014, o 21:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kidcowboy]]></name></author>
<updated>2013-10-03T17:43:07+01:00</updated>
<published>2013-10-03T17:43:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=51782#p51782</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=51782#p51782"/>
<title type="html"><![CDATA[Re: Problem z Timerem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=51782#p51782"><![CDATA[
[syntax=c]TCCR1B |= (_BV(WGM12) | _BV(CS10) | _BV(CS11));[/syntax] tak ma być zamiast<br />[syntax=c]TCCR1B = (_BV(WGM12) | _BV(CS10) | _BV(CS11));[/syntax] to samo sie tyczy tego:<br /><br />[syntax=c]MCUCR |= (_BV(ISC00) | _BV(ISC01)  | _BV(ISC11));        // Ustawienie reakcji silników na zdarzenia (zbocze narastające) dla przerwań INT0 i INT1<br />MCUCSR |= _BV(ISC2);                                                                                             // -||- tylko dla przerwania INT2<br />GICR |= _BV(INT0) | _BV(INT1)  | _BV(INT2);[/syntax]<br /><br />poza tym zajrzyj do noty <br />i czy tak nie będzie łatwiej ??:<br />[syntax=c]TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;CS10) | (1&lt;&lt;CS11));[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=313">kidcowboy</a> — 3 paź 2013, o 17:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-10-03T13:12:31+01:00</updated>
<published>2013-10-03T13:12:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=51765#p51765</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=51765#p51765"/>
<title type="html"><![CDATA[Re: Problem z Timerem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=51765#p51765"><![CDATA[
A znaczniki SYNTAX to co koza zżarła?<p>Statystyki: Napisane przez Gość — 3 paź 2013, o 13:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rosol]]></name></author>
<updated>2013-11-03T18:04:25+01:00</updated>
<published>2013-10-03T13:10:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=51764#p51764</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=51764#p51764"/>
<title type="html"><![CDATA[Problem z Timerem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4360&amp;p=51764#p51764"><![CDATA[
Cześć, z racji, że nie potrafię rozwiązać problemu z konfiguracją Timera jako dodatkowe wejście przerwania, postanowiłem założyć temat. Chodzi o to, że wszystkie moje przerwania są już zajęte na odpowiednie czynności, dlatego postanowiłem, że wykorzystam Timer i skonfiguruję go, aby pracował identycznie jak przerwanie zewnętrzne reagujące na zbocze opadające. Poniżej podaję swój kod do projektu. Licznik ma pracować tak, aby zliczał tylko jeden raz i od razu generował przerwanie.<br /><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define DC_1_A PC0//Piny silników<br />#define DC_1_B PC1<br />#define DC_2_A PB6<br />#define DC_2_B PB7<br />#define DC_3_A PA4<br />#define DC_3_B PA5<br /><br />#define ZOOM_P 0x01// Działania od aplikacji<br />#define ZOOM_M 0x03<br />#define PION_P 0x07<br />#define PION_M 0x0F<br />#define POZIOM_P 0x1F<br />#define POZIOM_M 0x3F<br />#define RESET 0x7F<br /><br />#define DC_1   10// Zliczanie obrotów silnika nr 1<br />#define DC_2   20// Zliczanie obrotów silnika nr 2<br />#define K      40       // Zmienna warunkowa krańcówki<br /><br />#define DC_1_PRAWO PORTC |= (1&lt;&lt;DC_1_A); PORTC &amp;= ~(1&lt;&lt;DC_1_B) // Makra działania silników<br />#define DC_1_LEWO  PORTC &amp;= ~(1&lt;&lt;DC_1_A); PORTC |= (1&lt;&lt;DC_1_B)<br />#define DC_1_STOP  PORTC &amp;= ~(1&lt;&lt;DC_1_A); PORTC &amp;= ~(1&lt;&lt;DC_1_B)<br />#define DC_2_PRAWO PORTA |= (1&lt;&lt;DC_2_A); PORTA &amp;= ~(1&lt;&lt;DC_2_B)<br />#define DC_2_LEWO  PORTA &amp;= ~(1&lt;&lt;DC_2_A); PORTA |= (1&lt;&lt;DC_2_B)<br />#define DC_2_STOP  PORTA &amp;= ~(1&lt;&lt;DC_2_A); PORTA &amp;= ~(1&lt;&lt;DC_2_B)<br />#define DC_3_PRAWO PORTA |= (1&lt;&lt;DC_3_A); PORTA &amp;= ~(1&lt;&lt;DC_3_B)<br />#define DC_3_LEWO  PORTA &amp;= ~(1&lt;&lt;DC_3_A); PORTA |= (1&lt;&lt;DC_3_B)<br />#define DC_3_STOP  PORTA &amp;= ~(1&lt;&lt;DC_3_A); PORTA &amp;= ~(1&lt;&lt;DC_3_B)<br /><br /><br />volatile int obrot;// Zmienna informująca o ile obrotów ma się przekręcić silnik<br />volatile unsigned char dzialanie;<br />volatile unsigned char zliczanie;// Zdarzenia silników<br />volatile unsigned char krancowka;// Zdarzenia krańcówek<br />volatile unsigned int odczyt;// Zmienna odczytu stanu PINÓW krańcówek<br /><br /><br />ISR(INT0_vect)// Przerwanie od aplikacji ( odebranie wiadomości od aplikacji i wykonanie odpowiedniej operacji)<br /> {<br />  dzialanie = ZOOM_P;// Działanie wysłane przez aplikację<br />  obrot=10;<br />  <br />   <br /> }<br /><br /><br />ISR(INT1_vect)//Przerwanie od krańcówek<br /> {<br />  krancowka=K;<br /> }<br /><br />ISR(INT2_vect)//Przerwanie od transoptora, zliczanie obrotów<br /> {<br /> PORTA ^= (1&lt;&lt;PA1);<br />zliczanie = DC_1;<br /><br /> }<br /><br />ISR(TIMER1_COMPA_vect)//Przerwanie od Timera1 (zliczanie obrotów)<br /> {<br /> obrot=20;<br />zliczanie = DC_2;<br /> }<br /><br /><br /><br />int main(void)<br />{<br />    unsigned int z1 = 0;<br />unsigned int z2 = 0;<br />//DDRA=0xFF;// Ustawienie pinów na wyjście (silniki)<br />DDRC=0xFF;// Ustawienie pinów na wyjście (dane od aplikacji)<br />PORTA=~0;// wyzerowanie ledów na potrzeby testów<br />PORTB=0xFF;<br />PORTD=0xFF;<br />MCUCR = (_BV(ISC00) | _BV(ISC01)  | _BV(ISC11));// Ustawienie reakcji silników na zdarzenia (zbocze narastające) dla przerwań INT0 i INT1<br />MCUCSR = _BV(ISC2);// -||- tylko dla przerwania INT2<br />GICR = _BV(INT0) | _BV(INT1)  | _BV(INT2);// Aktywacja przerwań INT0, INT1, INT2<br />///////////////////**************** Włączenie Timera0 na pinie T0 (PB0)***********************//////////////////////<br />TCCR1B = (_BV(WGM12) | _BV(CS10) | _BV(CS11));// Tryb CTC <br />TIMSK |= _BV(OCIE1A);<br />OCR1B = 1;<br /><br /><br />sei();<br /><br />     <br /><br />while(1)<br />{<br /><br />    sleep_mode(); <br /><br /><br /><br /><br />switch(dzialanie)<br />{<br />case ZOOM_P:<br />{<br />DC_1_PRAWO;<br /><br /><br />}<br />break;<br />case ZOOM_M:<br />{<br />DC_1_LEWO;<br /><br />}<br />break;<br />case PION_P:<br />{<br />DC_2_PRAWO;<br /><br />}<br />break;<br />case PION_M:<br />{<br />DC_2_LEWO;<br /><br />}<br />break;<br />case POZIOM_P:<br />{<br />DC_3_PRAWO;<br /><br />}<br />break;<br />case POZIOM_M:<br />{<br />DC_3_LEWO;<br /><br />}<br />case RESET:<br />{<br /><br /><br />}<br />break;<br /><br />}// Koniec switch'a aplikacji<br /><br /><br />///////////////////////*************** Obsługa zatrzymania silników **************////////////////////////////////<br />switch(zliczanie)<br />{<br /><br />case DC_1: // przerwanie od licznika 1<br />{<br />if(obrot&gt;=0)<br />{<br /><br />z1++;<br />if(z1 == obrot) // Sprawdzić zmienną obrót czy wystarczy jako jedna zmienna<br /> {<br /><br />   DC_1_STOP;<br /> <br /> }<br />} <br />if(obrot&lt;0)<br />{<br />z1--;<br />if(z1 == obrot)<br />{<br />DC_1_STOP;<br />}<br />}<br />}<br />break;<br /><br />case DC_2: // przerwanie od licznika 2<br />{<br />PORTA=~0x02;<br />if(obrot&lt;=0)<br />{<br />z2++;<br />if(z2 == obrot) <br /> {<br /><br />      DC_1_STOP;// Zamienić na DC_2_STOP<br /> }<br />} <br />if(obrot&lt;0)<br />{<br />z2--;<br />if(z2 == obrot)<br />{<br />DC_1_STOP;<br />}<br />}<br />}<br />break;<br /><br />}// Koniec switch'atimerów<br /><br />switch(krancowka)<br />{<br />case K:<br />{<br />odczyt=(PIND&gt;&gt;0);<br />if(odczyt==0)<br />{<br />//DC_1_STOP;<br />}<br /><br />}<br />}// Koniec switch'a krańcówek <br /><br />}// Koniec pętli while<br />return 0;<br />}[/syntax]<br /><br /><span style="color: #FF0000">[ panie rosol <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... panie rosol ... proszę pamiętać na drugi raz o znacznikach syntax ok ? ... możesz sobie edytować ten post i zobaczyć jak to się robi na początku i końcu kodu - mirekk36 ]</span><br /><br />Z góry dziękuję Wam za pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" />. Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1465">rosol</a> — 3 paź 2013, o 13:10</p><hr />
]]></content>
</entry>
</feed>