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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-12-10T19:25:06+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=17022&amp;mode</id>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2016-12-10T19:25:06+01:00</updated>
<published>2016-12-10T19:25:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177044#p177044</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177044#p177044"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177044#p177044"><![CDATA[
W aucie te 4mA to raczej nie problem nawet ze słabym akumulatorem, ale w przyszłości zapamiętam, zakupię i użyję <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Trochę niski prąd wyjściowy, ale jak do tego typu zastosowań powinien wystarczyć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 10 gru 2016, o 19:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-12-10T19:17:03+01:00</updated>
<published>2016-12-10T19:17:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177043#p177043</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177043#p177043"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177043#p177043"><![CDATA[
<div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />podczas uśpienia 4mA z czego 2mA pobiera sam stabilizator 7805<br /></div><br />Dlatego do takich zastosowań lepiej używać stabilizatorów z &quot;Low Quiescent Current&quot;, np. <a href="http://www.ti.com/lit/ds/symlink/lm2936-5.0ep.pdf"  class="postlink">LM2936-5.0</a>. Podejrzewam, że taki układ przy obciążeniu (prądzie wyjściowym) np. 2mA nie zużyje więcej niż ok. 100uA.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 10 gru 2016, o 19:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2016-12-10T18:42:58+01:00</updated>
<published>2016-12-10T18:42:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177040#p177040</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177040#p177040"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177040#p177040"><![CDATA[
Witam i dziękuję za obszerne opisanie problemu, nie każdemu się chce w tych czasach to robić. Ja chyba muszę się nauczyć czytać ze zrozumieniem, albo do okulisty iść <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Flaga PCINT8_flag jest używana do odczytu danych z RTC. Kod mam z poradników Mirka, tyle że Mirek używał tam przerwania INT0, ja ten pin miałem już zajęty więc skonfigurowałem i zamieniłem tylko przerwanie z INT0 na PCINT8 i zmieniłem dla czytelności nazwę flagi.<br /><br />Usypianie teraz działa tak jak chciałem, więc i Pomógł się należy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Pobór prądu w czasie pracy urządzenia to około 25mA a podczas uśpienia 4mA z czego 2mA pobiera sam stabilizator 7805, reszta to wyświetlacz OLED, pull-upy i dzielniki na PCB.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 10 gru 2016, o 18:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-12-10T15:33:34+01:00</updated>
<published>2016-12-10T15:33:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177027#p177027</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177027#p177027"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177027#p177027"><![CDATA[
Napisałem, że trudno precyzyjnie ocenić nie widząc całego kodu, ponieważ w przypadku przedstawienia tylko fragmentów:<ul><li>nie wiadomo, z jakiego miejsca programu dany fragment pochodzi, a to może mieć kluczowe znaczenie</li><li>nie wiadomo, czy w pozostałej części kodu nie ma czegoś, co może spowodować nieprawidłowe działanie pokazanego fragmentu</li><li>jaka jest ogólna struktura/organizacja programu, ponieważ to też może mieć wpływ na prawidłowość działania przedstawionych fragmentów.</li></ul><br />Nadal nie wszystko jest jasne. Przykładowo masz taką linijkę <strong><em>PCINT8_flag=1;</em></strong>, a nigdzie nie widzę deklaracji, co to jest <em>PCINT8_flag</em> i do czego tej zmiennej używasz...<br /><br />...ale już to zostawmy, bo nie o to chodzi, żeby tutaj przedstawiać wszystkie moduły programu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Teraz już lepiej widać, jak to wszystko jest zorganizowane.<br /><br />Niestety nie dysponuję wystarczającą ilością czasu, aby szczegółowo przeanalizować cały kod, więc odniosę się tylko do usypiania, które jest tematem tego wątku.<br /><br />Nadal zerowanie flagi przerwania PCINT8 (PCIF1) masz w nieodpowiednim miejscu. Tak jak wcześniej napisałem, powinno być przed <strong><span style="color: #BF8000">włączeniem</span></strong> zezwolenia na przerwanie, czyli przed <strong><em>PCICR |= (1&lt;&lt;PCIE1);</em></strong> , a nie przed wyłączeniem. Właściwie wygląda na to, że w Twoim przypadku nie trzeba tego robić, więc możesz spróbować to zerowanie flagi w ogóle pominąć. W każdym razie zerowanie w tym miejscu, w jakim jest w tej chwili, i tak nie spełni swojej roli.<br /><br />Ustawienie bitu SE we funkcji <em>sm_power_down()</em> jest zbędne, a nawet niewskazane (ustawienie bitu SE jest realizowane przez makro <em>sleep_mode() )</em>. W pliku &lt;avr/sleep.h&gt; masz gotowe makro wygodniejsze w użyciu, które robi to, co Twoja funkcja, więc w miejscu wywołania funkcji <em>sm_power_down()</em> zrobiłbym tak:[syntax=c]//<br />    // zamiast wywołania funkcji<br />    // sm_power_down();<br />    set_sleep_mode(SLEEP_MODE_PWR_DOWN);[/syntax]<br /><br />To, o czym napisałem, to nie jakieś błędy, które mogą powodować nieprawidłowe działanie. To tylko takie moje uwagi. Ogólnie myślę, że w tej formie usypianie i wybudzanie powinno działać prawidłowo. Reszty szczegółowo nie analizowałem, więc się nie wypowiadam, choć być może też znalazłoby się kilka uwag. Myślę, że powinieneś po prostu solidnie przetestować i w razie problemów zawsze można spróbować poprawić lub pytać na forum.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 10 gru 2016, o 15:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2016-12-09T22:59:50+01:00</updated>
<published>2016-12-09T22:59:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177005#p177005</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177005#p177005"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=177005#p177005"><![CDATA[
Zamieszczam pełny kod i uprzedzam że &quot;miszczem&quot; nie jestem co chyba widać <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />To na razie faza początkowa, jeszcze dużo jest do zrobienia...<br />main.c<br />[syntax=c]/*<br /><br /> *<br /> *  Created on: 2016-12-07<br /> *       Autor: hopek<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/sleep.h&gt;<br /><br />#include &quot;FUNC/func.h&quot;<br />#include &quot;ENCODER/mkencoder.h&quot;<br />#include &quot;1Wire/ds18x20.h&quot;<br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;RTC/rtc.h&quot;<br /><br />#define INT_RTC_DOWN !(PINC &amp; INT_RTC)<br />#define ACC_ON!(PINB &amp; ACC_PIN)<br />#define ACC_OFF(PINB &amp; ACC_PIN)<br /><br />#define VSS_PIN (1&lt;&lt;PD2)//pin z czujnika pomiaru prędkości<br />#define INT_RTC (1&lt;&lt;PC0)//pin wyzwalania RTC<br />#define ACC_PIN(1&lt;&lt;PB2)//pin włączenia stacyjki<br /><br />volatile uint8_t power_var;<br />uint8_t enable_enc=1;<br />uint8_t i_var, i2_var;<br />uint8_t test;//zmienna do testów<br />uint8_t show_clock;<br />volatile uint8_t sec_cnt;<br />volatile uint8_t halfsec_var;<br />volatile uint8_t timer_off_var;<br /><br />uint16_t ADC1_meas;<br />uint16_t ADC7_meas;<br />uint32_t napiecie;<br />uint32_t srednia_u;<br />uint8_t dt2=1;<br />char cz_d &#91;3&#93;;<br />char cz_u &#91;3&#93;;<br /><br /><br /><br />uint16_t stala_drogi=509;<br />volatile uint32_t trip;<br />volatile uint16_t cnt;<br />uint8_t spd;<br /><br />uint16_t startups;<br /><br />int8_t screen;<br />int8_t screen_tmp;<br />uint8_t menu;<br /><br /><br />uint16_t setki_m;<br />uint16_t kilo_m;<br /><br /><br />volatile uint8_t lcd_flag;<br />volatile uint16_t Timer1, timer2;<br /><br /><br />volatile uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br /><br />uint8_t subzero, cel, cel_fract_bits;<br />uint16_t pomiar (uint8_t kanal);<br /><br />void enkoderek (void);<br /><br />int main(void)<br />{<br />//podciągnięcie portu do vcc<br />DDRD &amp;= ~VSS_PIN;<br />PORTD |= VSS_PIN;<br /><br />DDRC &amp;= ~INT_RTC;<br />PORTC |= INT_RTC;<br /><br />DDRB &amp;= ~ACC_PIN;<br /><br />_delay_ms(100);<br />lcd_init();<br />_delay_ms(100);<br /><br />lcd_write_cmd(OLED_PWR_ON);//domyślne włączenie zasilania wyświetlacza<br /><br />TIMER1_init();//inicjalizacja timera1 - przetwanie co 1503ms<br />PCINT_init();//inicjalizacja przerwań PCINT<br />INT0_F_init();//inicjalizacja przerwania zewnętrznego INT0 na zbocze opadające<br />rtc_init();//inicjalizacja zegara czasu rzeczywistego<br />mk_encoder_init();<br />ADC_init();<br />sm_power_down();<br /><br />//definicje znaków<br />uint8_t l&#91;&#93; = {12,4,6,4,12,4,14,32};<br />lcd_defchar(0x80, l);<br /><br /><br />lcd_locate(0,2);<br />lcd_str_P(PSTR(&quot;ROVER&quot;));<br />lcd_locate(1,3);<br />lcd_str_P(PSTR(&quot;214&quot;));<br /><br />_delay_ms(1000);<br />lcd_cls();<br /><br /><br />lcd_locate(0,2);<br />lcd_str_P(PSTR(&quot;TRIP&quot;));<br />lcd_locate(1,2);<br />lcd_str_P(PSTR(&quot;COMP&quot;));<br />_delay_ms(1000);<br />lcd_cls();<br /><br />register_rtc_event_callback(display_datetime);<br />register_enc_event_callback( enkoderek  );<br /><br />czujniki_cnt = search_sensors();<br /><br />/* wysyłamy rozkaz wykonania pomiaru temperatury<br /> * do wszystkich czujników na magistrali 1Wire<br /> * zakładając, że zasilane są w trybie NORMAL,<br /> * gdyby był to tryb Parasite, należałoby użyć<br /> * jako pierwszego prarametru DS18X20_POWER_PARASITE */<br />DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br /><br />//set_rtc_datetime( &amp;datetime, 2016, 12, 7, 0,58,0);<br /><br /><br />//if(ACC_OFF)<br />//{<br />//cld();<br />//i_var=0;<br />//lcd_write_cmd(OLED_PWR_OFF);//wyłączamy zasilanie przetwornicy OLED<br />//sleep_mode();<br />//sleep_cpu();<br />//}<br /><br />sei();<br /><br />while(1)<br />{<br /><br />RTC_EVENT();//zdarzenie RTC<br />ENCODER_EVENT();//zdarzenie enkodera<br /><br /><br /><br />//obliczenia przebytej drogi<br />setki_m=(trip/stala_drogi)%10;<br />kilo_m=(trip/stala_drogi)/10;<br /><br /><br /><br />//pomiary ADC<br />ADC1_meas=pomiar(1);<br />ADC7_meas=pomiar(7);<br /><br />//uśrednianie pomiaru napięcia zasilania<br />srednia_u = srednia_u * dt2;<br />srednia_u = srednia_u + ADC1_meas;<br />srednia_u = srednia_u / (dt2+1);<br /><br />napiecie = (srednia_u * 3050UL) /1023UL;<br />div_t divmod = div (napiecie, 100);<br />itoa (divmod.quot, cz_d, 10);<br />itoa ((divmod.rem /10), cz_u, 10);<br />if (divmod.rem &lt; 10)<br />{<br />cz_u&#91;0&#93;='0';<br />}<br /><br />//zakresy ekranów<br />if(screen&gt;4) screen=0;<br />if(screen==-1) screen=4;<br /><br />if(screen==0) show_clock=1;//gdy ekran = 0 pokazuj datę i czas<br />else show_clock=0;<br /><br />//gdy zapłon włączony<br />if(ACC_ON)<br />{<br />i2_var=0;//zmienna potrzebna do jednorazowego wykonania instrukcji w warunkach<br />if(!i_var)<br />{<br />screen=0;//przeskocz do pierwszego ekranu<br />lcd_flag=1;<br />enable_enc=1;//włącz obsługę enkodera<br />PCICR |= (1&lt;&lt;PCIE1);//włącz zezwolenie na przerwanie PCINT<br />lcd_write_cmd(OLED_PWR_ON);//włącz przetwornicę wyświetlacza<br />i_var++;<br />}<br />}<br /><br />//gdy zapłon wyłączony<br />if(ACC_OFF)<br />{<br />if(!i2_var)<br />{<br />timer_off_var=10;//ustaw jednorazowo timer wyłączenia na 10 sekund<br />i2_var++;<br />}<br /><br /><br />switch(timer_off_var)<br />{<br /><br />//jeśli timer jest równy 0 to uśpij urządzenie<br />case 0:<br />cld();//czyść wyświetlacz<br />i_var=0;//zeruj zmienną<br />lcd_write_cmd(OLED_PWR_OFF);//wyłączamy zasilanie przetwornicy OLED<br />PCIFR = (1&lt;&lt;PCIF1);//zerowanie flagi przerwania<br />PCICR &amp;= ~(1&lt;&lt;PCIE1); //wyłączenie zezwolenia na przerwanie PCINT8<br /><br />sleep_mode();//wchodzi w tryb power down<br />break;<br /><br />case 2:<br />//wiadomość o trybie ekonomicznym<br />if(lcd_flag)<br />{<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;  TRYB  &quot;));<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot; EKONOM &quot;));<br />lcd_flag=0;<br />}<br />break;<br /><br />case 3:<br />enable_enc=0;//wyłącz enkoder<br />if(lcd_flag)<br />{<br />cld();//czyść ekran<br />screen=-2;//przeskocz na pusty ekran<br />lcd_flag=0;//zeruj flagę wyświetlania na LCD<br />}<br />break;<br />}<br />}<br /><br /><br />lcd_char_set(screen);//automatyczna podmiana własnych znaków na LCD<br />if(!menu)<br />{<br />switch(screen)<br />{<br /><br />case -2://pusty ekran<br />break;<br /><br /><br />case -1://pusty ekran - granica zakresu poruszania się po ekranach<br />break;<br /><br /><br />case 0://data i czas<br />if(lcd_flag)<br />{<br />lcd_locate(0,5);<br />if(halfsec_var) lcd_str_P(PSTR(&quot;:&quot;));<br />else lcd_str_P(PSTR(&quot; &quot;));<br />show_clock=1;<br />lcd_flag=0;<br />}<br />break;<br /><br /><br />case 1://paliwo<br />if(lcd_flag)<br />{<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;\x80&quot; &quot;\x81&quot; &quot;\x82&quot; &quot;\x83&quot;));<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;\x84&quot; &quot;\x85&quot; &quot;\x86&quot; &quot;\x87&quot;));<br />//lcd_locate(0,0);<br />//lcd_int(timer_off_var);<br /><br />lcd_flag=0;<br />}<br /><br />break;<br /><br />case 2://temperatury<br />if(lcd_flag)<br />{<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;\x80&quot; &quot;\x81&quot; &quot;\x82&quot;));<br />lcd_str(&quot; 24&quot;);<br />lcd_locate(0,6);<br />lcd_str_P(PSTR(&quot;\x83&quot;));<br />lcd_str_P(PSTR(&quot;c&quot;));<br /><br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;\x84&quot; &quot;\x85&quot; &quot;\x86&quot;));<br />lcd_str(&quot; -1&quot;);<br />lcd_locate(1,6);<br />lcd_str_P(PSTR(&quot;\x83&quot;));<br />lcd_str_P(PSTR(&quot;c&quot;));<br />lcd_flag=0;<br />}<br /><br />break;<br /><br />case 3://zasilanie<br />if(lcd_flag)<br />{<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;\x80&quot; &quot;\x81&quot;));<br /><br />lcd_locate(1,3);<br />  lcd_str(cz_d);<br />  lcd_char('.');<br />  lcd_str(cz_u);<br />  lcd_str_P(PSTR(&quot;V &quot;));<br /><br />  lcd_flag=0;<br />}<br />break;<br /><br />case 4://trip<br />if(lcd_flag)<br />{<br />//zmienna pomocnicza do justowania wyniku<br />static uint8_t spd_y_var;<br />static uint8_t km_y_var;<br /><br /><br />//definicje znaków<br />uint8_t km&#91;&#93; = {20,20,24,20,32,27,21,17};<br />lcd_defchar(0x80, km);<br /><br />uint8_t h&#91;&#93; = {2,4,8,16,4,7,5,5};<br />lcd_defchar(0x81, h);<br /><br /><br />//justowanie prędkości do prawej<br />if(spd &lt;= 9) spd_y_var=4;<br />else if((spd &gt; 9) &amp;&amp; (spd &lt;= 99)) spd_y_var=3;<br />else if(spd &gt; 99) spd_y_var=2;<br /><br />//justowanie przebiegu TRIP do prawej<br />if(kilo_m &lt;= 9) km_y_var=2;<br />else if((kilo_m &gt; 9) &amp;&amp; (kilo_m &lt;= 99)) km_y_var=1;<br />else if(kilo_m &gt; 99) km_y_var=0;<br /><br /><br /><br /><br />//wyświetlanie wartości prędkości i TRIP<br />lcd_locate(0,spd_y_var);<br />lcd_int(spd);<br />lcd_str_P(PSTR(&quot; &quot;));<br />lcd_locate(0,5);<br />lcd_str_P(PSTR(&quot; \x80&quot; &quot;\x81&quot;));<br /><br />lcd_locate(1,km_y_var);<br />lcd_int(kilo_m);<br />lcd_str_P(PSTR(&quot;.&quot;));<br />lcd_int(setki_m);<br />lcd_str_P(PSTR(&quot; km&quot;));<br /><br />//kasowanie cyfr przed wynikiem prędkości<br />lcd_locate(0,spd_y_var-1);<br />lcd_str_P(PSTR(&quot; &quot;));<br /><br />lcd_locate(1,km_y_var-1);<br />lcd_str_P(PSTR(&quot; &quot;));<br /><br /><br />lcd_flag=0;<br />}<br />break;<br /><br />}<br />}<br />}<br />}<br /><br />void display_datetime (TDATETIME * dt)<br />{<br /><br />if(show_clock)<br />{<br /><br /><br />//ikona zegara<br />lcd_locate(0,2);<br />lcd_str_P(PSTR(&quot;\x80&quot;));<br /><br /><br />//czas<br />lcd_locate(0,3);<br />if(dt-&gt;hh &lt;10) lcd_str(&quot;0&quot;);<br />lcd_int(dt-&gt;hh);<br /><br /><br /><br /><br />lcd_locate(0,6);<br />if(dt-&gt;mm &lt;10) lcd_str(&quot;0&quot;);<br />lcd_int(dt-&gt;mm);<br /><br />//lcd_str_P(PSTR(&quot;:&quot;));<br />//<br />//lcd_locate(0,10);<br />//if(dt-&gt;ss &lt;10) lcd_str(&quot;0&quot;);<br />//lcd_int(dt-&gt;ss);<br /><br /><br />//lcd_locate(1,1);<br />//lcd_str_P( &amp;dni &#91;dt-&gt;weekday * 4&#93;);<br /><br />//data<br />lcd_locate(1,0);<br />if(dt-&gt;DD &lt;10) lcd_str(&quot;0&quot;);<br />lcd_int(dt-&gt;DD);<br /><br />lcd_str_P(PSTR(&quot;/&quot;));<br /><br />lcd_locate(1,3);<br />if(dt-&gt;MM &lt;10) lcd_str(&quot;0&quot;);<br />lcd_int(dt-&gt;MM);<br /><br />lcd_str_P(PSTR(&quot;/&quot;));<br /><br />lcd_locate(1,6);<br />lcd_int(datetime.YY);<br /><br /><br />}<br />}<br /><br />uint16_t pomiar (uint8_t kanal)<br />{<br /><br />ADMUX = (ADMUX &amp; 0xc0) | kanal;//włączenie pomiarów na kanale 7 i 1<br />ADCSRA |= (1&lt;&lt;ADSC);<br />while ( ADCSRA &amp; (1&lt;&lt;ADSC));<br />return ADCW;<br /><br />}<br /><br />void enkoderek (void)<br />{<br />if(enable_enc)//gdy zmienna =1 pozwól na pracę enkodera<br />{<br />if(enco_dir == ENC_RIGHT )//gdy kierunek = prawo<br />{<br />screen++;//zmień ekran na następny<br />timer_off_var=30;//nabij licznik autowyłącznika<br />//(potrzebne gdy wyłączymy już stacyjkę a jeszcze przydało by się coś sprawdzić)<br />}<br />else  timer_off_var=30, screen--;<br />cld();//czyść ekran przy każdym obrocie enkodera<br />PCINT8_flag=1;<br />lcd_flag=1;<br />}<br /><br /><br /><br /><br /><br />}<br /><br />//przerwanie INT0 na zbocze opadające<br />ISR(INT0_vect)<br />{<br />trip++;<br />cnt++;<br />}<br /><br /><br />ISR(TIMER1_COMPB_vect)<br />{<br />uint16_t n=0, n1=0;<br />static uint8_t licznik;<br /><br />n = Timer1;<br />if (n) Timer1 = --n;<br /><br />n1 = timer2;<br />if (n1) timer2 = --n1;<br /><br />if(++licznik&lt;4)<br />{<br />spd=cnt/2;<br />cnt=0;<br />licznik=0;<br />}<br />}<br /><br /><br />//przerwanie co pół sekundy z RTC<br />ISR(PCINT1_vect)<br />{<br />static uint8_t i,n;<br /><br />//licznik sekund<br />if(sec_cnt&gt;59) sec_cnt=0;<br /><br />halfsec_var=++i%2;//zmienna pomocnicza do migania separatorem zegara<br /><br />//wykrywamy stan niski na pinie PC0 (PCINT8)<br />if(INT_RTC_DOWN)<br />{<br />s1_flag=1;//ustaw flagę<br />sec_cnt++;//zwiększ wartość (czasomierz ogólny + pomiar DS18B20)<br />PCINT8_flag = 1;//ustaw flagę (RTC)<br /><br />//odliczanie timera do zera<br />n = timer_off_var;<br />if(n) timer_off_var --;<br />}<br /><br /><br /><br />//zmienna globalna pozwalająca na uaktualnienie danych na wyświetlaczu<br />lcd_flag=1;<br /><br />}<br /><br />//puste przerwanie ;)<br />ISR(PCINT0_vect)<br />{<br />//może coś tu wstawię<br /><br />}[/syntax]<br /><br />func.c<br />[syntax=c]/*<br /> * func.c<br /> *<br /> *  Created on: &amp;{date}<br /> *      Author: Michał Koptas<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br /><br /><br />#include &quot;../I2C_TWI/i2c_twi.h&quot;<br />#include &quot;../FUNC/func.h&quot;<br />#include &quot;../LCD/lcd44780.h&quot;<br />#include &quot;../RTC/rtc.h&quot;<br /><br /><br /><br /><br /><br />// inicjalizacja ustawień fabrycznych w pamięci Flash<br />const TCFG pgm_cfg PROGMEM =<br />{<br /><br />};<br /><br />TCFG eem_cfg EEMEM;// dane w pamięci EEPROM<br />TCFG ram_cfg;// dane w pamięci RAM<br /><br /><br /><br />void TIMER1_init(void)<br />{<br />//ustawienia timer1 - przerwanie co 1503ms<br />TCCR1B |= (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13);//tryb CTC<br />TCCR1B |= (1&lt;&lt;CS10)|(1&lt;&lt;CS12);//dodatkowy podział przez 1024<br />ICR1 =16220;//rejestr porównaniaa<br />TIMSK1 |=(1&lt;&lt;OCIE1B);//zezwolenie na przerrwanie od porównania<br />}<br />void INT0_F_init(void)<br />{<br /><br />EICRA |= (ISC01)|(1&lt;&lt;ISC00);//przerwanie INT0 wyzwalane zboczem opadającym<br />EIMSK |= (1&lt;&lt;INT0);<br />}<br /><br />void PCINT_init(void)<br />{<br />PCICR |= (1&lt;&lt;PCIE1)|(1&lt;&lt;PCIE0);//przerwanie<br />PCMSK1 |= (1&lt;&lt;PCINT8);<br />PCMSK0 |= (1&lt;&lt;PCINT2);<br />}<br /><br />void display_temp(uint8_t x)<br />{<br />lcd_locate(0,x);<br />if(subzero) lcd_str(&quot;-&quot;);/* jeśli subzero==1 wyświetla znak minus (temp. ujemna) */<br />else lcd_str(&quot; &quot;);/* jeśli subzero==0 wyświetl spację zamiast znaku minus (temp. dodatnia) */<br />lcd_int(cel);/* wyświetl dziesiętne części temperatury  */<br />lcd_str(&quot;c&quot;); /* wyświetl znak jednostek (C - stopnie Celsiusza) */<br />}<br /><br />void sm_power_down (void)<br />{<br />SMCR |= (1&lt;&lt;SM1); //power down mode<br />SMCR |= (1&lt;&lt;SE);//pozwól na usypianie<br />}<br /><br /><br /><br />void ADC_init (void)<br />{<br />ADMUX |= (1&lt;&lt;REFS0)| (1&lt;&lt;REFS1);//napięcie odniesioenia 1,1V<br />ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0);//zezwolenie na pomiar i ustawienie presklaera na 128<br />}<br /><br /><br /><br /><br />void copy_eem_to_ram( void )<br />{<br />eeprom_read_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );<br />}<br /><br />void copy_ram_to_eem( void )<br />{<br />eeprom_write_block( &amp;ram_cfg, &amp;eem_cfg, sizeof(ram_cfg) );<br />}<br /><br />void copy_pgm_to_ram( void )<br />{<br />memcpy_P( &amp;ram_cfg, &amp;pgm_cfg, sizeof(ram_cfg) );<br />}<br /><br /><br /><br />void check_and_load_defaults( void )<br />{<br />uint8_t i, len = sizeof( ram_cfg );<br />uint8_t * ram_wsk = (uint8_t*)&amp;ram_cfg;<br /><br />copy_eem_to_ram();<br />for(i=0; i&lt;len; i++)<br />{<br />if( 0xff == *ram_wsk++ ) continue;<br />break;<br />}<br /><br />if( i == len ) {<br />load_defaults();<br />}<br /><br />}<br /><br />void load_defaults( void )<br />{<br />copy_pgm_to_ram();<br />copy_ram_to_eem();<br />}<br /><br />void cld (void)//czyszczenie wyświetlacza<br />{<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;         &quot;));<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot;         &quot;));<br />}<br /><br />//funkcja podmieniająca znaki na wyświetlaczu<br />void lcd_char_set (int8_t var)<br />{<br />switch(var)<br />{<br />case 0:<br />if (lcd_flag)<br />{<br />uint8_t Zegar&#91;&#93; = {32,32,14,21,29,17,14,32};<br />lcd_defchar(0x80, Zegar);<br />}<br />break;<br /><br />case 1:<br />if(lcd_flag)<br />{<br />uint8_t A&#91;&#93; = {32,32,32,32,32,15,15,15};<br />lcd_defchar(0x80, A);<br />uint8_t RB&#91;&#93; = {32,32,32,16,24,28,30,31};<br />lcd_defchar(0x81, RB);<br />uint8_t RC&#91;&#93; = {32,15,8,8,8,8,15,15};<br />lcd_defchar(0x82, RC);<br />uint8_t RD&#91;&#93; = {32,24,12,12,12,10,25,29};<br />lcd_defchar(0x83, RD);<br />uint8_t RE&#91;&#93; = {15,15,15,32,32,32,32,32};<br />lcd_defchar(0x84, RE);<br />uint8_t RF&#91;&#93; = {31,30,28,24,16,32,32,32};<br />lcd_defchar(0x85, RF);<br />uint8_t RG&#91;&#93; = {15,15,15,15,15,15,15,32};<br />lcd_defchar(0x86, RG);<br />uint8_t RH&#91;&#93; = {29,29,29,26,24,24,24,32};<br />lcd_defchar(0x87, RH);<br />}<br />break;<br /><br />case 2:<br />if(lcd_flag)<br />{<br /><br />//IKONKA CHMURKI<br />uint8_t TA&#91;&#93; = {32,32,1,2,4,8,16,15};<br />lcd_defchar(0x80, TA);<br />uint8_t TB&#91;&#93; = {32,12,18,1,2,4,32,31};<br />lcd_defchar(0x81, TB);<br />uint8_t TC&#91;&#93; = {32,32,32,16,12,2,1,30};<br />lcd_defchar(0x82, TC);<br /><br />//ZNAK STOPNI<br />uint8_t TD&#91;&#93; = {2,5,2,32,32,32,32,32};<br />lcd_defchar(0x83, TD);<br /><br />//IKONKA AUTA<br />uint8_t TE&#91;&#93; = {32,32,32,32,15,16,16,9};<br />lcd_defchar(0x84, TE);<br />uint8_t TF&#91;&#93; = {32,7,8,16,32,32,32,31};<br />lcd_defchar(0x85, TF);<br />uint8_t TG&#91;&#93; = {32,24,4,2,1,1,1,18};<br />lcd_defchar(0x86, TG);<br />}<br />break;<br /><br />case 3:<br />if (lcd_flag)<br />{<br />uint8_t ZA&#91;&#93; = {12,31,16,20,30,20,16,31};<br />lcd_defchar(0x80, ZA);<br /><br /><br />uint8_t ZB&#91;&#93; = {6,31,1,1,15,1,1,31};<br />lcd_defchar(0x81, ZB);<br />}<br />break;<br />}<br />}[/syntax]<br /><br /><br />func.h<br />[syntax=c]/*<br /> * func.h<br /> *<br /> *  Created on: 29 lis 2016<br /> *      Author: hopek<br /> */<br /><br />#ifndef FUNC_FUNC_H_<br />#define FUNC_FUNC_H_<br /><br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />void TIMER1_init(void);<br />void INT0_F_init(void);<br />void PCINT_init(void);<br />void sm_power_down (void);<br />void ADC_init (void);<br /><br />extern volatile uint8_t lcd_flag;<br /><br />extern volatile uint8_t czujniki_cnt;/* ilość czujników na magistrali */<br />extern volatile uint8_t s1_flag;/* flaga tyknięcia timera co 1 sekundę */<br />extern volatile uint8_t sekundy;/* licznik sekund 0-59 */<br />extern uint8_t subzero, cel, cel_fract_bits;<br /><br />typedef struct {<br /><br /> uint16_t vss_div;//dzielnik ilości impulsów<br /> uint16_t oil_change;//licznik wymiany oleju<br /> uint16_t startups;//licznik uruchomien silnika<br /> int8_t screen;//ostatni ekran<br /><br /><br />} TCFG;<br /><br />extern const TCFG pgm_cfg PROGMEM;// dane w pamięci FLASH<br />extern TCFG eem_cfg EEMEM;// dane w pamięci EEPROM<br />extern TCFG ram_cfg;//dane w pamięci RAM<br /><br /><br />void display_temp(uint8_t x);<br /><br /><br />void check_and_load_defaults( void );// sprawdza i ładuje ustawienia domyślne<br />void copy_eem_to_ram( void );// kopiuje ustawienia<br />void copy_ram_to_eem( void );// kopiuje ustawienia<br />void copy_pgm_to_ram( void );// kopiuje ustawienia<br />void load_defaults( void );// ładuje ustawienia domyślne<br />void cld (void);<br /><br />void lcd_char_set (int8_t var);<br /><br /><br /><br /><br />#endif /* FUNC_FUNC_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 9 gru 2016, o 22:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-12-09T22:04:00+01:00</updated>
<published>2016-12-09T22:04:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176999#p176999</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176999#p176999"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176999#p176999"><![CDATA[
Trudno precyzyjnie ocenić nie widząc całego kodu.<br /><br />Wydaje mi się, że akurat w Twoim przypadku to zerowanie flagi przerwania PCINT2 nie jest bardzo konieczne, ale skoro już jest, to powinno być raczej zaraz przed włączeniem zezwolenia na przerwanie, a nie zaraz po wyłączeniu zezwolenia.<br /><br />Zamiast makra <em>sleep_cpu()</em> użyłbym raczej <em>sleep_mode()</em>, ponieważ to drugie włącza zezwolenie na uśpienie bezpośrednio przed uśpieniem i wyłącza zaraz po wybudzeniu. Nie jest to może konieczne, ale jest zalecane, tak &quot;dobra praktyka&quot;.<br /><br />Tyle mogę powiedzieć na podstawie kodu który przedstawiłeś. Musisz teraz po prostu dobrze całość przetestować i w przypadku zauważenia błędów wprowadzić ewentualne korekty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 9 gru 2016, o 22:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2016-12-09T21:18:52+01:00</updated>
<published>2016-12-09T21:18:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176996#p176996</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176996#p176996"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176996#p176996"><![CDATA[
Więc tak, to jest taki dodatkowy gadżet zamiast fabrycznego zegarka w samochodzie rover 214. Upakowałem w oryginalnej obudowie wyświetlacz 2x8 znaków i jedną płytkę z atmegą. Będzie jeszcze druga mniejsza do reszty zaplanowanych rzeczy. <br />Na tą chwilę zmodyfikowałem kod i wygląda następująco:<br /><br />[syntax=c]//gdy zapłon włączony<br />if(ACC_ON)<br />{<br />i2_var=0;<br />if(!i_var)<br />{<br />screen=0;        //przeskocz do pierwszego ekranu<br />lcd_flag=1;                                 //wstaw 1 do flagi wyświetlacza (aktualizacja)<br />enable_enc=1;//włącz obsługę enkodera<br />PCICR |= (1&lt;&lt;PCIE1);        //włącz zezwolenie na przerwanie PCINT<br />lcd_write_cmd(OLED_PWR_ON);//włącz przetwornicę wyświetlacza<br />i_var++;<br />}<br />}<br /><br /><br />if(ACC_OFF)<br />{<br />if(!i2_var)<br />{<br />timer_off_var=10;         //ustaw jednorazowo timer wyłączenia na 10 sekund<br />i2_var++;<br />}<br /><br /><br />switch(timer_off_var)<br />{<br /><br />//jeśli timer jest równy 0 to uśpij urządzenie<br />case 0:<br />cld();//czyść wyświetlacz<br />i_var=0;//zeruj zmienną<br />lcd_write_cmd(OLED_PWR_OFF);//wyłączamy zasilanie przetwornicy OLED<br />   PCICR &amp;= ~(1&lt;&lt;PCIE1); //wyłączenie zezwolenia na przerwanie PCINT8<br />   PCIFR = (1&lt;&lt;PCIF1);//zerowanie flagi przerwania<br />sleep_cpu();//wchodzi w tryb power down<br />break;<br /><br />case 2:<br />//wiadomość o trybie ekonomicznym<br />if(lcd_flag)<br />{<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;  TRYB  &quot;));<br />lcd_locate(1,0);<br />lcd_str_P(PSTR(&quot; EKONOM &quot;));<br />lcd_flag=0;<br />}<br />break;<br /><br />case 3:<br />enable_enc=0;//wyłącz enkoder<br />if(lcd_flag)<br />{<br />cld();//czyść ekran<br />screen=-2;//przeskocz na pusty ekran<br />lcd_flag=0;//zeruj flagę wyświetlania na LCD<br />}<br />break;<br />}<br />}[/syntax]<br /><br />inicjalizacja przerwań PCINT:<br />[syntax=c]void PCINT_init(void)<br />{<br />PCICR |= (1&lt;&lt;PCIE1)|(1&lt;&lt;PCIE0);<br />PCMSK1 |= (1&lt;&lt;PCINT8);<br />PCMSK0 |= (1&lt;&lt;PCINT2);<br />}[/syntax]<br /><br /><br />inicjalizacja trybu usypiania:<br />[syntax=c]void sm_power_down (void)<br />{<br />SMCR |= (1&lt;&lt;SM1); //power down mode<br />SMCR |= (1&lt;&lt;SE);//pozwól na usypianie<br />}[/syntax]<br /><br />Procedurę przerwania PCINT2 zostawiłem pustą.<br />Nie wiem czy wszystko jest ok, ale wygląda na to że działa. Proszę o weryfikacje <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=1692">hopek</a> — 9 gru 2016, o 21:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-12-09T18:32:14+01:00</updated>
<published>2016-12-09T18:32:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176988#p176988</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176988#p176988"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176988#p176988"><![CDATA[
Po pierwsze, jak już wcześniej napisałem, nie można usypiać mikrokontrolera wewnątrz procedury obsługi przerwania, ponieważ jest wtedy wyłączona flaga globalnego zezwolenia na przerwania, więc nie uda się wybudzić mikrokontrolera. Z drugiej strony włączenie wewnątrz procedury globalnego zezwolenia na przerwania ( <em>sei();</em> ) to w takiej sytuacji zdecydowanie zły pomysł.<br /><br />Po drugie nie rób tak:[syntax=c]//<br />     if(ACC_OFF) //sprawdzanie stanu na pinie PB2<br />       {<br />            sleep_mode();<br />            sleep_cpu();<br />       }[/syntax]<br />Rozwinięcie makra <em>sleep_mode()</em> to:[syntax=c]//<br />    sleep_enable();<br />    sleep_cpu();<br />    sleep_disable();[/syntax]<br />W efekcie otrzymujesz więc:[syntax=c]//<br />    if(ACC_OFF) //sprawdzanie stanu na pinie PB2<br />    {<br />        sleep_enable();<br />        sleep_cpu();<br />        // tutaj oczekiwanie w trybie uśpienia na wybudzenie<br />        sleep_disable();<br />        // tutaj ponownie próbujesz uśpić mikrokontroler<br />        // wprawdzie makro sleep_disable() wyłączyło wcześniej<br />        // zezwolenie na uśpienie (bit SE w rejestrze SMCR), więc<br />        // operacja uśpienia się nie powiedzie, niemniej sleep_cpu()<br />        // w tym miejscu nie ma sensu<br />        sleep_cpu();<br />    }[/syntax]<br /><br /><div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />wybudzanie następowało samoczynnie zaraz po uśpieniu i podejrzewam że przez przerwanie od RTC na pinie PCINT8 co skutkowało wyświetleniem na ułamek sekundy treści na wyświetlaczu OLED.<br /></div>Możesz przed uśpieniem mikrokontrolera wyłączyć zezwolenie na przerwanie od PCINT8, a po wybudzeniu włączyć ponownie. Przerwanie PCINT8 przypisane jest do wektora PCINT1_vect, więc:[syntax=c]//<br />    // wyłączenie zezwolenia na przerwanie PCINT8<br />    PCICR &amp;= ~(1&lt;&lt;PCIE1);<br /><br />    // zapewne co najmniej jedno przerwanie w czasie uśpienia wystąpi<br />    // co spowoduje ustawienie flagi PCIF1 w rejestrze PCIFR<br />    // aby nie pozwolić na niepotrzebne wejście w procedurę obsługi<br />    // tego oczekującego przerwania, można najpierw wyzerować jego flagę<br />    PCIFR = (1&lt;&lt;PCIF1);<br />    // włączenie zezwolenia na przerwanie PCINT8<br />    PCICR |= (1&lt;&lt;PCIE1);[/syntax]To powinno zapobiec wybudzaniu przez PCINT8.<br /><br />No a w procedurze obsługi przerwania od PCINT2 ( <em>ISR(PCINT0_vect)</em> ) modyfikuj tylko wartość jakiejś zadeklarowanej globalnie zmiennej (z atrybutem <em>volatile</em>), a dopiero w pętli głównej na podstawie wartości tej zmiennej usypiaj lub wybudzaj mikrokontroler.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 9 gru 2016, o 18:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2016-12-09T15:52:13+01:00</updated>
<published>2016-12-09T15:52:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176978#p176978</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176978#p176978"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176978#p176978"><![CDATA[
<div class="quotetitle">andrews napisał(a):</div><div class="quotecontent"><br />Nie bardzo to rozumiem. Jak sprawdzasz stan pinu w trybie uśpienia?<br /></div><br /><br />No jasne przecież to nie możliwe... Mój błąd, przepraszam.<br /><br />To wybudzanie procesora poprzez sprawdzenie stanu pinu to jednak zakomentowałem tą część kodu żeby nie robić bałaganu bo to i tak nie działało ale do testu w osobnym przerwaniu PCINT2 umieściłem coś takiego:<br />[syntax=c]ISR (PCINT0_vect)<br />{<br />     if(ACC_OFF) //sprawdzanie stanu na pinie PB2<br />       {<br />            sleep_mode();<br />            sleep_cpu();<br />       }<br /><br />     if(ACC_ON)<br />       {<br />           sleep_disable();<br />       }<br />}[/syntax]<br /><br /><br />Ogólnie próbuję zaprogramować mikrokontroler tak, żeby był usypiany i wybudzany jednym pinem PCINT2 (PB2). Do tej pory robiłem to tak że sprawdzałem stan pinu PCINT2 i jeśli był stan niski to uruchamiałem timer który po 10 sekundach usypiał mi mikrokontroler, ale wybudzanie następowało samoczynnie zaraz po uśpieniu i podejrzewam że przez przerwanie od RTC na pinie PCINT8 co skutkowało wyświetleniem na ułamek sekundy treści na wyświetlaczu OLED. Kod zamieszczę później bo nie mam teraz przy sobie projektu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 9 gru 2016, o 15:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-12-09T14:17:12+01:00</updated>
<published>2016-12-09T14:17:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176974#p176974</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176974#p176974"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176974#p176974"><![CDATA[
<div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />Więc tak odpaliłem sobie na PCINT2 osobne przerwanie i w środku sprawdzam sobie stan na pinie czy niski czy wysoki za pomocą makra i instrukcji sleep_mode(); i sleep_cpu(); gdy pin w stanie niskim usypiam procesor.<br /></div><br />Jeśli usypiasz mikrokontroler wewnątrz procedury obsługi przerwania, to obawiam się, że już go nie wybudzisz, ponieważ flaga I w SREG jest wtedy wyłączona. Globalne zezwolenie na przerwania musi być włączone, aby wybudzić mikrokontroler z uśpienia.<br /><br /><div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />wybudza procesor ale nie poprzez przerwanie tylko przez sprawdzenie stanu na pinie...<br /></div><br />Nie bardzo to rozumiem. Jak sprawdzasz stan pinu w trybie uśpienia?<br /><br /><div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />I chyba mam problem bo każde &quot;zdarzenie&quot; RTC wybudza na ułamek sekundy procesor.<br /></div><br />Sprecyzuj jakiej funkcjonalności oczekujesz.<br /><br />No i dobrze by było, gdybyś pokazał kod, jeśli to nie tajemnica.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 9 gru 2016, o 14:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2016-12-09T12:03:38+01:00</updated>
<published>2016-12-09T12:03:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176963#p176963</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176963#p176963"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176963#p176963"><![CDATA[
To chyba coś robię źle bo uśpić mogę ale wybudzić się już nie chce. Więc tak odpaliłem sobie na PCINT2 osobne przerwanie i w środku sprawdzam sobie stan na pinie czy niski czy wysoki za pomocą makra i instrukcji sleep_mode(); i sleep_cpu(); gdy pin w stanie niskim usypiam procesor. Chcąc wybudzić sprawdzam czy stan pinu wysoki i odpalam instrukcje sleep_disable(); <br />Co w tym przypadku robię źle?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 9 gru 2016, o 12:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-12-09T11:02:20+01:00</updated>
<published>2016-12-09T11:02:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176956#p176956</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176956#p176956"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176956#p176956"><![CDATA[
<div class="quotetitle">hopek napisał(a):</div><div class="quotecontent"><br />Mam pytanie, czy jest możliwość wybudzenia procesora ze śpiączki za pomocą konkretnego przerwania PCINTX?<br /></div><br />a dlaczego miałoby nie być jak jest ... nie rozumiem wręcz pytania - bo w nocie jest mowa o tym że można więc w czym problem ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 9 gru 2016, o 11:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gufim]]></name></author>
<updated>2016-12-09T10:01:52+01:00</updated>
<published>2016-12-09T10:01:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176951#p176951</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176951#p176951"/>
<title type="html"><![CDATA[Re: Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176951#p176951"><![CDATA[
Cześć przejrzyj to może pomoże<br /><!-- m --><a class="postlink" href="https://sites.google.com/site/qeewiki/books/avr-guide/external-interrupts-on-the-atmega328" >https://sites.google.com/site/qeewiki/b ... -atmega328</a><!-- m --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=126">gufim</a> — 9 gru 2016, o 10:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2016-12-09T09:40:30+01:00</updated>
<published>2016-12-09T09:40:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176949#p176949</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176949#p176949"/>
<title type="html"><![CDATA[Atmega328P Power Down - wybudzanie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17022&amp;p=176949#p176949"><![CDATA[
Witam. Mam pytanie, czy jest możliwość wybudzenia procesora ze śpiączki za pomocą konkretnego przerwania PCINTX?<br />Na PCB mam podłączony RTC PCF8583. Odczytuję go przez I2C i przerwanie PCINT8. Z kolei pod PCINT2 mam podłączony transoptor który po podaniu sygnału na wejście wybudza procesor ale nie poprzez przerwanie tylko przez sprawdzenie stanu na pinie... I chyba mam problem bo każde &quot;zdarzenie&quot; RTC wybudza na ułamek sekundy procesor.<br />Czy jest na to jakieś rozwiązanie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 9 gru 2016, o 09:40</p><hr />
]]></content>
</entry>
</feed>