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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-12-11T19:54:28+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1905&amp;mode</id>
<entry>
<author><name><![CDATA[The River]]></name></author>
<updated>2012-12-11T19:54:28+01:00</updated>
<published>2012-12-11T19:54:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20845#p20845</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20845#p20845"/>
<title type="html"><![CDATA[Re: Power Save - problem z wybudzeniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20845#p20845"><![CDATA[
Witam ponownie<br /><br />Mimo że problem o którym pisałem zakładając temat został szybko rozwiązany, ale pojawił się następny (jak to zawsz bywa) również związany z tym nieszczęsnym trybem power save. Schemat jak i program trochę ewoluował, a wszystko zmierza w kierunku RTC (albo czegoś podobnego  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ). Ale do rzeczy, chodzi o to że w programie liczę sobie sekundy które generowane są poprzez podzielenie częstotliwości zewnętrznego kwarcu 32,768 kHz taktującego Timer2. Wyświetlane one są na LCD. I teraz, po przejściu w tryb power save wszystko liczy dobrze, ale już po wybudzeniu licznik przestaje działać i co ciekawe po ponownym uśpieniu zaczyna liczyć dalej kontynuując od wartości na której się zatrzymał. Czyli generalnie mówiąc po starcie w normalnym trybie działa ok ale już po pierwszym uśpieniu działa tylko w trybie uśpienia. Nie mam pojęcia co może być tego przyczyną. <br /><br />kod prezentuje się tak:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#define DIODA_ON PORTD &amp;= ~(1&lt;&lt;PD0)<br />#define DIODA_OFF PORTD |= (1&lt;&lt;PD0)<br />#define DIODA_TOGGLEPORTD ^= (1&lt;&lt;PD0)<br /><br />volatile uint16_t licznik = 0;<br />volatile uint8_t Timer2_flag = 0;<br /><br />int main(void)<br />{<br />/* ustawienia trybu oszczedzania energi */<br />//MCUCR |= (1&lt;&lt;SM1)|(1&lt;&lt;SM0);// tryb POWER SAVE<br />set_sleep_mode(SLEEP_MODE_PWR_SAVE);<br /><br />/* przerwanie INT0 */<br />DDRD &amp;= ~(1&lt;&lt;PD2);// wejscie INT0 do budzenia<br />MCUCR &amp;= ~((1&lt;&lt;ISC01)|(1&lt;&lt;ISC00));// przerwanie INT0 (low level)<br />PORTD |= (1&lt;&lt;PD2);// stan wysoki<br /><br />/* Dioda LED */<br />DDRD |= (1&lt;&lt;PD0);// dioda<br />PORTD |= (1&lt;&lt;PD0);// dioda OFF<br /><br />/* wykrywanie zaniku zasilania */<br />DDRD &amp;= ~(1&lt;&lt;PD1);// PD1 wejscie<br />PORTD |= (1&lt;&lt;PD1);// podciagniecie do Vcc<br /><br />/* zewnetrzny kwarc 32,768 kHz na Timer2 */<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb CTC (Clear Timer on Compare Match<br />TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler 1024<br />OCR2 = 32;// zliczanie tylko 32 razy<br />ASSR |= (1&lt;&lt;AS2);// AS2 ust. na jeden (timer taktowany z TOSC1)<br />TIMSK |= (1&lt;&lt;OCIE2);// zezwolenie na przerwanie w trybie CTC<br /><br />sei();<br />lcd_init();<br /><br />while(1)<br />{<br /><br />if( ( (PIND &amp; 0b00000010)== 0) )// wyłaczenie zasilania<br />{<br />GICR |= (1&lt;&lt;INT0);// zezwolenie na przerwanie INT0<br />sleep_mode();// instrukcja(funkcja) usypiająca<br />}<br />if( Timer2_flag )<br />{<br />lcd_locate(0,4);<br />lcd_int(licznik);<br />DIODA_TOGGLE;<br />Timer2_flag = 0;<br />}<br /><br /><br /><br />}<br />}<br /><br />ISR(INT0_vect) {<br /><br />//GICR &amp;= ~(1&lt;&lt;INT0);<br />//TIMSK |= (1&lt;&lt;OCIE2);<br /><br />}<br /><br />ISR(TIMER2_COMP_vect){<br /><br />licznik++;<br />Timer2_flag = 1;<br />}<br />[/syntax]  <br /><br />schemat: <a href="http://img841.imageshack.us/img841/4178/schematnaforum.png"  class="postlink">http://img841.imageshack.us/img841/4178/schematnaforum.png</a><br /><br />__________ edit:<br /><br />Sory za zawracanie głowy, już wiem co było tego przyczyną, zakomentowałem linię :<br />[syntax=c]//GICR &amp;= ~(1&lt;&lt;INT0);[/syntax]<br />w obsłudze przerwania która czyściła bit zezwalający na przerwanie. A zkomentowałem go dlatego że układ nie chciał mi się budzić, dołożyłem kondensator 22pF do nóżki PD2 i zaczął czasami wstawać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Generalnie problem jest w tym że musiałem zastosować inwerter tak by załączenie zasilania (stan 1 ) generowało przerwanie (stan 0 ) które budzi układ. Ale teraz o dziwo wszystko działa. Zobaczymy jak długo <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=508">The River</a> — 11 gru 2012, o 19:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[p_zag]]></name></author>
<updated>2012-12-11T10:21:53+01:00</updated>
<published>2012-12-11T10:21:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20796#p20796</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20796#p20796"/>
<title type="html"><![CDATA[Re: Power Save - problem z wybudzeniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20796#p20796"><![CDATA[
Witam<br />Właśnie coś na ten temat w internecie szukałem, więc mi się przyda. Dziękuję.<br /><br />Piotr<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=539">p_zag</a> — 11 gru 2012, o 10:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[The River]]></name></author>
<updated>2012-12-10T14:56:21+01:00</updated>
<published>2012-12-10T14:56:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20735#p20735</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20735#p20735"/>
<title type="html"><![CDATA[Re: Power Save - problem z wybudzeniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20735#p20735"><![CDATA[
Dzięki Panowie, działa. <br /><br />Aż mi teraz głupio że nie wpadłem na to, a próbowałem wybudzania zboczem narastającym, opadającym, dowolną zmianą, wprowadzać w uśpienie też robiłem na 2 sposoby. Wogóle za dużo kombinowałem, nawet przez chwilę chciałem spróbować taktowania zewnętrznym kwarcem ale szybko stwierdziłem że to nie jest sposób na rozwiązanie tego problmu. <br /><br />Zamieszczam poprawiony kod bez zbędnych lini, może się komuś kiedyś przyda:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />int main(void)<br />{<br />/* ustawienia trybu oszczedzania energi - Power Save*/<br />set_sleep_mode(SLEEP_MODE_PWR_SAVE);<br /><br />/* przerwanie INT0 */<br />DDRD &amp;= ~(1&lt;&lt;PD2);// wejscie INT0 do budzenia<br />MCUCR &amp;= ~((1&lt;&lt;ISC01)|(1&lt;&lt;ISC00));// przerwanie INT0 (low level)<br />PORTD |= (1&lt;&lt;PD2);// stan wysoki<br /><br /><br />/* wykrywanie zaniku zasilania */<br />DDRD &amp;= ~(1&lt;&lt;PD1);// PD1 wejscie<br />PORTD |= (1&lt;&lt;PD1);// podciagniecie do Vcc<br /><br />sei();<br /><br />while(1)<br />{<br /><br />if( ( (PIND &amp; 0b00000010)== 0) )// wyłaczenie zasilania<br />{<br />GICR |= (1&lt;&lt;INT0);// zezwolenie na przerwanie INT0<br />sleep_mode();<br />}<br /><br /><br />}<br />}<br /><br />ISR(INT0_vect) {<br /><br />GICR &amp;= ~(1&lt;&lt;INT0);<br />}<br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=508">The River</a> — 10 gru 2012, o 14:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-10T13:59:58+01:00</updated>
<published>2012-12-10T13:59:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20727#p20727</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20727#p20727"/>
<title type="html"><![CDATA[Re: Power Save - problem z wybudzeniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20727#p20727"><![CDATA[
Dokładnie jak mówi kolega wyżej, poniżej uwaga z noty PDF, która znajduje się pod tabelką trybów uśpienia i sposobów wybudzania dla wejść typu INTx<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />3. Only INT2 or <strong><span style="color: #0040FF">level interrupt</span></strong> INT1 and INT0.<br /></div><br /><br />a ty sobie zrobiłeś:<br /><br />[syntax=c]MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);              // przerwanie INT0 (rising edge)[/syntax]<br /><br />więc już widzisz gdzie musisz szukać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... ale weź też pod uwagę te inne sugestie kolegi wyżej <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 10 gru 2012, o 13:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[savian86]]></name></author>
<updated>2012-12-10T13:26:41+01:00</updated>
<published>2012-12-10T13:26:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20722#p20722</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20722#p20722"/>
<title type="html"><![CDATA[Re: Power Save - problem z wybudzeniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20722#p20722"><![CDATA[
[syntax=c]ISR(INT0_vect) {<br /><br /> <br /><br />        MCUCR &amp;= ~(1&lt;&lt;SE);<br /><br />        //sleep_disable();<br /><br />        //Timer0_flag = 1;<br /><br />}[/syntax]<br />Wywal to, a w to miejsce zrób DISABLE INTERRUPT INT0.<br /><br />[syntax=c]   <br /><br />                        MCUCR |= (1&lt;&lt;SE);                                                                                       // Sleep enable<br /><br />                        //PORTD &amp;= ~(1&lt;&lt;PD0);                                                                           // dioda ON<br /><br />                        sei();<br /><br />                        sleep_mode();[/syntax]<br /><br />Tutaj zamiast tego daj ENABLE INTERRUPT INT0 i tylko <br />[syntax=c]sleep_mode();[/syntax]<br /><br />A zamiast takich dziwactw:<br />[syntax=c]MCUCR |= (1&lt;&lt;SM1)|(1&lt;&lt;SM0);[/syntax]<br /> <br /><br />napisz ładnie <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> (ustaw tryb jaki potrzebujesz)<br />[syntax=c]set_sleep_mode(SLEEP_MODE_PWR_DOWN);[/syntax]<br /><br />A kluczowym problemem jest to:<br />[syntax=c]MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);[/syntax]<br /><br />Wybudzanie działa tylko na &quot;Low level&quot;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=393">savian86</a> — 10 gru 2012, o 13:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[The River]]></name></author>
<updated>2012-12-10T13:00:31+01:00</updated>
<published>2012-12-10T13:00:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20718#p20718</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20718#p20718"/>
<title type="html"><![CDATA[Power Save - problem z wybudzeniem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1905&amp;p=20718#p20718"><![CDATA[
Witam szanownych forumowiczów <br /><br />Po całym wczorajszym dniu spędzonym w poszukiwaniu rozwiązania stwierdziłem że się poddaje. Rozwiązanie problemu może być całkiem banalne ale ja niestety tego nie widzę. Ale do rzeczy:<br /><br />Zbudowałem sobie taki układ jak mniej więcej na schemacie poniżej:<br /><a href="http://img22.imageshack.us/img22/4178/schematnaforum.png"  class="postlink">http://img22.imageshack.us/img22/4178/schematnaforum.png</a><br /><br /><br />założenie ma być takie że timer2 ma być taktowany zewnętrznym kwarcem, a układ po wykryciu zasilania ma przejść w tryb power-save a po pojawieniu się zasilania ma się wybudzić. Wykrywanie zaniku zasilania działa, ATmega przechodzi w tryb uśpienia (obserwuje prąd na amperomierzu, przy normalnym trybie pracy jest to wartość rzędu kilkudziesięciu mA, po przejściu w tryb power-save około 20 uA ). Budzić w założeniu ma przerwanie INT0 na porcie PD2.<br /><br />ATmega32 takowana jest wewnętrznym zegarem 8 MHz.<br /><br />Oto kod:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />volatile uint8_t Timer0_flag = 0;<br /><br />int main(void)<br />{<br />/* ustawienia trybu oszczedzania energi */<br />MCUCR |= (1&lt;&lt;SM1)|(1&lt;&lt;SM0);// tryb POWER SAVE<br /><br />/* przerwanie INT0 */<br />DDRD &amp;= ~(1&lt;&lt;PD2);// wejscie INT0 do budzenia<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// przerwanie INT0 (rising edge)<br />GICR |= (1&lt;&lt;INT0);// zezwolenie na przerwanie INT0<br />PORTD &amp;= ~(1&lt;&lt;PD2);// stan niski<br /><br />/* Dioda LED */<br />DDRD |= (1&lt;&lt;PD0);// dioda<br />PORTD |= (1&lt;&lt;PD0);// dioda OFF<br /><br />/* wykrywanie zaniku zasilania */<br />DDRD &amp;= ~(1&lt;&lt;PD1);// PD1 wejscie<br />PORTD |= (1&lt;&lt;PD1);// podciagniecie do Vcc<br /><br />sei();<br /><br />while(1)<br />{<br /><br />if( ( (PIND &amp; 0b00000010)== 0) )// wyłaczenie zasilania<br />{<br /><br />MCUCR |= (1&lt;&lt;SE);// Sleep enable<br />//PORTD &amp;= ~(1&lt;&lt;PD0);// dioda ON<br />sei();<br />sleep_mode();<br />}<br />/*else<br />{<br />PORTD |= (1&lt;&lt;PD0);// dioda OFF<br />}*/<br />if (Timer0_flag)<br />{<br />//PORTD ^= (1&lt;&lt;PD0);// dioda ON<br />//Timer0_flag = 0;<br />}<br /><br />}<br />}<br /><br />ISR(INT0_vect) {<br /><br />MCUCR &amp;= ~(1&lt;&lt;SE);<br />//sleep_disable();<br />//Timer0_flag = 1;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=508">The River</a> — 10 gru 2012, o 13:00</p><hr />
]]></content>
</entry>
</feed>