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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-02-04T18:39:25+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=14393&amp;mode</id>
<entry>
<author><name><![CDATA[tec-dive]]></name></author>
<updated>2016-02-04T18:39:25+01:00</updated>
<published>2016-02-04T18:39:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152646#p152646</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152646#p152646"/>
<title type="html"><![CDATA[Re: ATmega88 - zasilanie bateryjne - ADC problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152646#p152646"><![CDATA[
Hmmm... jeśli to rozumieć tak, że wykonuj tą pętlę do czasu aż bit TCR2UB w rejestrze ASSR się nie wyzeruje to chyba o to chodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Tylko moja jeszcze skromna wiedza nie pozwala mi ogarnąć zapisu &quot;_BV&quot;... Coś mi świta, że jest to jakieś makro Bit Value. Czy to jest zapis równoważny takiemu:<br /><br />[syntax=c]while ((ASSR &amp; (1&lt;&lt;TCR2UB)) != 0)[/syntax]<br /><br />To już odpowiem sobie sam... oczywiście o to chodziło <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> tylko w przypadku ATmega88 zamiast TCR2UB mamy TCR2BUB.<br />A o _BV już doczytałem na <a href="http://forum.atnel.pl/topic4426.html"  class="postlink">http://forum.atnel.pl/topic4426.html</a><br />Niestety albo STETY <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> jak człowiek poczyta BB i oglądnie Mirkowe poradniki o przesunięciach bitowych to potem już nie wie co to znaczy _BV <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Dziękuję wszystkim za pomoc<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4916">tec-dive</a> — 4 lut 2016, o 18:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[icer_cmg]]></name></author>
<updated>2016-02-04T17:28:29+01:00</updated>
<published>2016-02-04T17:28:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152643#p152643</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152643#p152643"/>
<title type="html"><![CDATA[Re: ATmega88 - zasilanie bateryjne - ADC problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152643#p152643"><![CDATA[
<div class="quotetitle">tec-dive napisał(a):</div><div class="quotecontent"><br />i pojęcia nie mam jak to zamienić na pętlę oczekującą na wyzerowanie tej flagi.<br /></div>[syntax=c]while ((ASSR &amp; _BV(TCR2UB)) != 0) {;}[/syntax] o to chodzi?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1636">icer_cmg</a> — 4 lut 2016, o 17:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tec-dive]]></name></author>
<updated>2016-02-04T15:20:14+01:00</updated>
<published>2016-02-04T15:20:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152637#p152637</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152637#p152637"/>
<title type="html"><![CDATA[Re: ATmega88 - zasilanie bateryjne - ADC problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152637#p152637"><![CDATA[
No oczywiście  <img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> <br />to był ten błąd. Teraz już wszystko działa tak jak powinno. <br />Przy okazji zapytam o jeszcze jedną rzecz związaną z trybem asynchronicznym Timera2.<br />Inicjalizuję go tak:<br /><br />[syntax=c]void soft_timer_init(void)// inicjalizacja timerów programowych<br />{<br />/* Timer2 ATmega88 – inicjalizacja przerwania co 8000 ms */<br /><br />ASSR |= (1&lt;&lt;AS2);// Tryb asynchroniczny<br />//TCCR2B |= (1&lt;&lt;CS20);// preskaler = No prescaling<br />//TCCR2B |= (1&lt;&lt;CS21);// preskaler = 8<br />//TCCR2B |= (1&lt;&lt;CS22)|(1&lt;&lt;CS20);// preskaler = 128<br />TCCR2B |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);// preskaler = 1024<br /><br />while( ASSR &amp; (1&lt;&lt;TCR2BUB) );<br /><br />TIFR2 |= (1&lt;&lt;TOV2);// zerowanie flegi przerwania Timer2<br /><br />TIMSK2 |= (1&lt;&lt;TOIE2);// Odblokowanie przerwania Overflow<br />}[/syntax]<br /><br />I teraz zgodnie z notą:<br /><br />If Timer/Counter2 is used to wake the device up from Power-save or ADC Noise Reduction<br />mode, precautions must be taken if the user wants to re-enter one of these modes: If reentering<br />sleep mode within the TOSC1 cycle, the interrupt will immidiately occur and the<br />device wake up again. The result is multiple interrupts and wake-ups within one TOSC1 cycle<br />from the first interrupt. If the user is in doubt whether the time before re-entering Power-save or<br />ADC Noise Reduction mode is sufficient, the following algorithm can be used to ensure that<br />one TOSC1 cycle has elapsed:<br />a. Write a value to TCCR2x, TCNT2, or OCR2x.<br />b. Wait until the corresponding Update Busy Flag in ASSR returns to zero.<br />c. Enter Power-save or ADC Noise Reduction mode.<br /><br />trzeba poczekać na wyzerowanie flagi Update Busy Flag<br />Z paskudnym delayem wygląda to u mnie tak:<br /><br />[syntax=c]ISR(TIMER2_OVF_vect)<br />{<br />flaga_8sek = 1;<br />_delay_us(200);// oczekiwanie na ustawienie bitów w rejestrze ASSR<br />}[/syntax]<br /><br />i pojęcia nie mam jak to zamienić na pętlę oczekującą na wyzerowanie tej flagi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4916">tec-dive</a> — 4 lut 2016, o 15:20</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[rskup]]></name></author>
<updated>2016-02-04T14:55:54+01:00</updated>
<published>2016-02-04T14:55:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152636#p152636</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152636#p152636"/>
<title type="html"><![CDATA[Re: ATmega88 - zasilanie bateryjne - ADC problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152636#p152636"><![CDATA[
Ale tutaj w pętli while wchodzisz w ADC Noise Reduction Mode a nie w Power Save Mode, bo w adc_init() zmieniasz mode dla sleep_mode().<br /><br />-- <br />Pozdrawiam,<br />Robert<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3427">rskup</a> — 4 lut 2016, o 14:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tec-dive]]></name></author>
<updated>2016-02-04T13:44:05+01:00</updated>
<published>2016-02-04T13:44:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152629#p152629</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152629#p152629"/>
<title type="html"><![CDATA[Re: ATmega88 - zasilanie bateryjne - ADC problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152629#p152629"><![CDATA[
Niestety nie udało mi się wieczorem wstawić kodu - okazuje się, że czasami elektronika przegra w starciu z codziennością <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Poniżej zamieszczam kod programu testowego, który uruchomiony bez zainicjalizowania ADC zużywa ~2-3uA prądu, a po zainicjalizowaniu około 800uA.<br />W pętli głównej (procek wybudza się co 8 sekund - tryb asynchroniczny - rezonator 32kHz i wewnętrzny 8MHz) staram się wyłączyć przetwornik ale bez efektu <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br />Wykorzystanie rejestru PRR podobnie nie daje spodziewanego efektu. Nie potrafię się doszukać swojego błędu.<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 />#include &quot;common.h&quot;<br /><br />volatile uint16_t count;<br />uint8_t get_time;<br />uint8_t key_lock;<br />uint8_t five_pulses;<br /><br />int main(void)<br />{<br /><br />DDRB = 0x00;// PORTB jako wyjścia<br />DDRC = 0x00;// PORTC jako wyjścia<br />DDRD = 0x00;// PORTD jako wyjścia<br />PORTB = 0xFF;<br />PORTC = 0xFF;<br />PORTD = 0x3F;<br /><br />/* ustalamy kierunki pinów */<br />LED_G_DDR |= LED_G;// dioda zielona jako wyjście<br />LED_R_DDR |= LED_R;// dioda czerwona jako wyjście<br />BUZZER_DDR |= BUZZER;// buzzer jako wyjście<br />SENSEN_EN_DDR |= SENSEN_EN;// włączenie czujnika jako wyjście<br /><br />ACSR |= (1&lt;&lt;ACD);// wyłączenie komparatora analogowego<br /><br />WDTCSR = 0x00;// wyłączenie watchdog-a<br /><br />//set_sleep_mode(SLEEP_MODE_ADC);<br />//set_sleep_mode(SLEEP_MODE_IDLE);<br />set_sleep_mode(SLEEP_MODE_PWR_SAVE);<br />//set_sleep_mode(SLEEP_MODE_STANDBY);<br />//set_sleep_mode(SLEEP_MODE_PWR_DOWN);<br /><br />//PRR |= (1&lt;&lt;PRTWI)|(1&lt;&lt;PRTIM0)|(1&lt;&lt;PRTIM1)|(1&lt;&lt;PRSPI)|(1&lt;&lt;PRUSART0);// wyłączenie TWI, Timer/Counter0, Timer/Counter1, SPI, USART0<br /><br /><br /><br />_delay_ms(10);<br /><br />BUZZER_OFF;<br />LED_R_OFF;<br />LED_G_OFF;<br />SENSEN_EN_OFF;<br /><br />soft_timer_init();<br />fast_pwm_init();<br />adc_init();<br />interrupts_init();<br /><br />sei();<br /><br />while(1)<br />{<br /><br />/* Wciśnięcie przycisku TEST */<br />if(flaga_INT1)<br />{<br />flaga_INT1=0;<br />test();<br />EIMSK |= (1&lt;&lt;INT1);<br /><br />}<br /><br />ADCSRA &amp;= ~(1&lt;&lt;ADEN);<br />sleep_mode();<br />}<br />}[/syntax]<br /><br />oraz inicjalizacja ADC:<br /><br />[syntax=c]void adc_init(void)<br />{<br />ADMUX |= (1&lt;&lt;REFS1) | (1&lt;&lt;REFS0) | (1&lt;&lt;ADLAR);// wybór napięcia odniesienia - wewnętrzne 1.1V, oraz ustawienie odczytu tylko 8 bitów (sam ADCH)<br />//ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADPS2) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADIE);// włączenie ADC i ustawienie preskalera na 64, oraz włączenie przerwania od ADC<br />ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADPS2) | (1&lt;&lt;ADPS1);// włączenie ADC i ustawienie preskalera na 64<br /><br />set_sleep_mode(SLEEP_MODE_ADC);<br />sleep_enable();<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4916">tec-dive</a> — 4 lut 2016, o 13:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tec-dive]]></name></author>
<updated>2016-02-03T17:54:57+01:00</updated>
<published>2016-02-03T17:54:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152549#p152549</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152549#p152549"/>
<title type="html"><![CDATA[Re: ATmega88 - zasilanie bateryjne - ADC problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152549#p152549"><![CDATA[
Może nie doprecyzowałem ale komparator mam wyłączony i do czasu zainicjalizowania ADC pobór prądu jest OK (na poziomie 3 uA) w momencie uruchomienia ADC rośnie. I wtedy jak gdyby nie ma reakcji na jego wyłączenie. <br />Wieczorem wrzucę kod programu to może wtedy będzie można konkretniej podyskutować <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=4916">tec-dive</a> — 3 lut 2016, o 17:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2016-02-03T17:14:17+01:00</updated>
<published>2016-02-03T17:14:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152541#p152541</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152541#p152541"/>
<title type="html"><![CDATA[Re: ATmega88 - zasilanie bateryjne - ADC problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152541#p152541"><![CDATA[
<div class="quotetitle">tec-dive napisał(a):</div><div class="quotecontent"><br />Czy coś pominąłem?<br /></div><br />pewnie<br /><br />domyślnie ADC jest wyłączony więc po pomiarze - oczywiście poprawnie go wyłączasz<br /><br /><br />ale zapomniałeś że z kolei domyślnie włączony jest KOMPARATOR i jego trzeba wyłączyć gdy się nie używa - od razu spada pobór prądu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 3 lut 2016, o 17:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[icer_cmg]]></name></author>
<updated>2016-02-03T16:42:28+01:00</updated>
<published>2016-02-03T16:42:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152539#p152539</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152539#p152539"/>
<title type="html"><![CDATA[Re: ATmega88 - zasilanie bateryjne - ADC problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152539#p152539"><![CDATA[
Pisząc z pamięci - poszukaj PRR (PRR |= (1&lt;&lt;PRADC); )<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1636">icer_cmg</a> — 3 lut 2016, o 16:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tec-dive]]></name></author>
<updated>2016-02-03T16:04:24+01:00</updated>
<published>2016-02-03T16:04:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152535#p152535</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152535#p152535"/>
<title type="html"><![CDATA[ATmega88 - zasilanie bateryjne - ADC problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14393&amp;p=152535#p152535"><![CDATA[
Witam,<br /><br />po raz pierwszy buduję układ bateryjny i do tej pory dobrze sobie radziłem z utrzymaniem prądu na poziomie 2-3uA. Jednak przyszedł czas na pomiar napięcia przy pomocy wbudowanego ADC. No i wiadomo, że włączam pomiar - prąd skacze ostro w górę więc chcę wyłączyć ADC i tu pojawia się problem. Prawdopodobnie brakuje mi wiedzy... czytam notę i wygląda na to, że wystarczy wyzerować bit 7 (ADEN) rejestru ADCSRA i przetwornik powinien się wyłączyć. Robię to tak:<br />[syntax=c]ADCSRA &amp;= ~(1&lt;&lt;ADEN);[/syntax]<br />Niestety prąd nie maleje. Czy coś pominąłem? Czy mój tok rozumowanie jest prawidłowy? Będę wdzięczny za wszelkie sugestie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4916">tec-dive</a> — 3 lut 2016, o 16:04</p><hr />
]]></content>
</entry>
</feed>