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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-08-02T08:51:44+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=23863&amp;mode</id>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2021-08-02T08:51:44+01:00</updated>
<published>2021-08-02T08:51:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233136#p233136</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233136#p233136"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233136#p233136"><![CDATA[
Przyznaję, że z tym prev_ICR masz chyba rację, ale nie do końca. Przyznaję, że się pomyliłem się (prawdopodobnie z pośpiechu - lepiej chyba nie wdawać się w dyskusję będąc na urlopie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ).Tak naprawdę ta zmienna jest zbędna i należy ją pominąć. Gwarantuję Ci, że poniższa wersja ISR musi dać prawidłowe wyniki (i dla mnie jest czytelniejsza):<br />[syntax=c]ISR(TIMER1_CAPT_vect) {<br />    static uint32_t current_ts = 0;<br />    static uint32_t prev_ts = 0;<br />    uint16_t current_ICR;<br />    <br />    current_ICR = ICR1;<br />    current_ts = 65536 * ovf_cnt + current_ICR;<br />    period_cycles = current_ts - prev_ts;<br />    prev_ts = current_ts;<br />}[/syntax]<br />Jeśli natomiast chodzi o czas trwania procedury obsługi przerwania, to będzie porównywalny z Twoim. Zresztą ten czas ma znaczenie tylko przy wyższych częstotliwościach, przy których (jak sam zauważyłeś) błąd i tak jest dość spory, więc lepiej zastosować inną metodę pomiaru.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 2 sie 2021, o 08:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jachimo]]></name></author>
<updated>2021-08-01T20:55:22+01:00</updated>
<published>2021-08-01T20:55:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233135#p233135</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233135#p233135"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233135#p233135"><![CDATA[
Witam<br />To prawda - kompilacja była poprawna ale jak wpisałem Twój kod do procesora wynik był:<br />-1.16000 i nie zmieniał się bez względu na mierzoną częstotliwość.<br /><br />Zmienna &quot;prev_ICR&quot; nie brała udziału w obliczeniach ponieważ przy definicji nadano jej wartość zero i nigdzie nie zmieniono.<br />Analizujmy dalej:<br /><br />&quot;period_cycles = current_ts - prev_ts;&quot;<br /><br />Podstawmy wartości pod zmienne &quot;current_ts&quot; i &quot;prev_ts&quot;.<br />Ponieważ mierzona częstotliwość jest stała różnica &quot;current_ICR - prev_ICR&quot; nie zmieni się w kolejnym przerwaniu. Zmieni się tylko &quot;ovf_cnt&quot; co zaznaczyłem nadając indeksy 1 i 2. <br /><br />current_ts = 65536 * ovf_cnt_1 + (current_ICR - prev_ICR);<br />prev_ts = 65536 * ovf_cnt_2 + (current_ICR - prev_ICR);<br /><br />Więc po wpisaniu wartości &quot;curent_ts&quot; i &quot;prev_ts&quot; dostaniemy<br /><br />&quot;period_cycles = 65536 * (ovf_cnt_1 - ovf_cnt_2)<br /><br />i nie jest to raczej pożądana wartość.<br />Tobie jednak należy się cześć i chwała za inny sposób podejścia do tematu pozwalający na napisanie bezbłędnego kodu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20829">Jachimo</a> — 1 sie 2021, o 20:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2021-08-01T20:10:39+01:00</updated>
<published>2021-08-01T20:10:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233134#p233134</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233134#p233134"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233134#p233134"><![CDATA[
<div class="quotetitle">Jachimo napisał(a):</div><div class="quotecontent"><br />Kolega &quot;andrews&quot; zaproponował nową metodę. Kod zawiera błędy ale ma potencjał.<br /></div>To ciekawe, bo u mnie kompilowało się bez błędów i symulacja przebiegała prawidłowo. Nie bardzo rozumiem, skąd stwierdzenie, że kod zawiera błędy.<br /><br /><div class="quotetitle">Jachimo napisał(a):</div><div class="quotecontent"><br />... zmienna &quot;prev_ICR&quot; nie bierze udziału w obliczeniach...<br /></div>Gdyby nie brała udziału, to wynik nie byłby prawidłowy.<br /><br /><div class="quotetitle">Jachimo napisał(a):</div><div class="quotecontent"><br />...zmienna &quot;period_cycles = current_ts - prev_ts;&quot; tak naprawdę równa się Δ(ovf_cnt)*65536 ponieważ reszta wyzeruje się...<br /></div>Nie chce mi się teraz tego analizować dokładnie. Pisząc kod koncentrowałem się na tym, żeby był przejrzysty i  łatwy do analizy. Nie mam jednak zbyt dużo wolnego czasu na takie zadania, więc przepraszam najmocniej, że tego zadania nie wykonałem należycie. Ale OK, nawet jeśli znalazłeś sposób, żeby skrócić obliczenia, to wcale nie oznacza, że mój kod był błędny, może co najwyżej nieco mniej optymalny (za to być może łatwiejszy do zrozumienia). Jestem za to pewien, że działał prawidłowo.<br /><br /><div class="quotetitle">Jachimo napisał(a):</div><div class="quotecontent"><br />Maksymalna mierzona częstotliwość ok. 32kHz.<br /></div>Ta granica może się zmniejszyć, jeśli w programie użyjesz jeszcze innych przerwań.<br /><br /><div class="quotetitle">Jachimo napisał(a):</div><div class="quotecontent"><br />Taki licznik można wykorzystać jako fragment większej całości do pomiarów niskich częstotliwości a do pomiarów wyższych częstotliwości trzeba stosować inne metody.<br /></div><br />Do pomiaru niższych częstotliwości używa się pomiaru czasu trwania okresu, do pomiaru większych częstotliwości raczej należy zliczać ilość okresów w jednostce czasu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 1 sie 2021, o 20:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jachimo]]></name></author>
<updated>2021-08-01T16:01:52+01:00</updated>
<published>2021-08-01T16:01:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233131#p233131</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233131#p233131"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233131#p233131"><![CDATA[
Masz rację - nie zwróciłem uwagi. Zagadka wyjaśniona.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20829">Jachimo</a> — 1 sie 2021, o 16:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[tonygryps]]></name></author>
<updated>2021-08-01T15:52:49+01:00</updated>
<published>2021-08-01T15:52:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233130#p233130</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233130#p233130"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233130#p233130"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Przy próbach wyświetlałem na LCD wartość licznika &quot;ovf_cnt&quot;. Nie wiem dlaczego wartość narasta od zera do 32768 zmienia znak -32768 i dalej narasta do zera. A przecież zadeklarowana jest jako uint16_t.<br /></div><br />Jeśli używasz Mirka funkcji lcd_int to to normalne zachowanie ponieważ ta funkcja wyświetla liczby z zakresu int.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12014">tonygryps</a> — 1 sie 2021, o 15:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jachimo]]></name></author>
<updated>2021-08-01T15:46:59+01:00</updated>
<published>2021-08-01T15:46:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233129#p233129</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233129#p233129"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233129#p233129"><![CDATA[
Witam<br />Zerowanie TNCT1 nic nie dało - a wręcz przeciwnie wzrosła liczba błędnych pomiarów.<br />Kolega &quot;andrews&quot; zaproponował nową metodę. Kod zawiera błędy ale ma potencjał. Umożliwia pozbycie się instrukcji &quot;if else&quot; i usuwa problemy z liczeniem przepełnień.<br />Błędy to: zerowanie zmiennych przy deklaracji w &quot;ISR(TIMER1_CAPT_vect)&quot;, zmienna &quot;prev_ICR&quot; nie bierze udziału w obliczeniach, natomiast zmienna &quot;period_cycles = current_ts - prev_ts;&quot; tak naprawdę równa się Δ(ovf_cnt)*65536 ponieważ reszta wyzeruje się.<br />Uwzględniając powyższe funkcja obsługi przerwania wygląda jak niżej.<br />[syntax=c]ISR(TIMER1_CAPT_vect) {<br /><br />uint16_t current_ICR;<br />uint16_t current_ovf_cnt;<br />static uint16_t prev_ICR;<br />static uint16_t prev_ovf_cnt;<br /><br />current_ICR = ICR1;<br />current_ovf_cnt = ovf_cnt;<br />period_cycles = 65536 * (current_ovf_cnt - prev_ovf_cnt) + current_ICR - prev_ICR;<br />prev_ICR = current_ICR;<br />prev_ovf_cnt = current_ovf_cnt;<br />}[/syntax]<br />W pierwszej wersji obliczenie wartości &quot;period_cycles&quot; wyciągnąłem do &quot;main&quot; ale po próbach okazało się, że obliczenie wartości w przerwaniu nie wprowadza błędów. <br />Przy próbach wyświetlałem na LCD wartość  licznika &quot;ovf_cnt&quot;. Nie wiem dlaczego wartość narasta od zera do 32768 zmienia znak -32768 i dalej narasta do zera. A przecież zadeklarowana jest jako uint16_t.<br />Maksymalna mierzona częstotliwość ok. 32kHz. Minimalnej nie znam bo mój generator daje najmniej 1.5Hz. Sądzę, że przy najwyższych mierzonych częstotliwościach będą największe błędy wynikające z niewielkiej liczby impulsów policzonych w jednym okresie. Np. dla częstotliwości 32kHz liczba impulsów to tylko 500 (F_MCU=16MHz) Jeśli liczba impulsów zmaleje do 499 to obliczona częstotliwość będzie 32064Hz. Skok o 64 Hz. Błąd ok. 0,2%. Jednak taki błąd nie pozwala na użycie takiego miernika przy precyzyjnych pomiarach.<br />Taki licznik można wykorzystać jako fragment większej całości do pomiarów niskich częstotliwości  a do pomiarów wyższych częstotliwości trzeba stosować inne metody.<br />Teraz zostaje dorobienie wodotrysków aby powstała całość.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20829">Jachimo</a> — 1 sie 2021, o 15:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamma25]]></name></author>
<updated>2021-07-31T13:21:00+01:00</updated>
<published>2021-07-31T13:21:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233120#p233120</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233120#p233120"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233120#p233120"><![CDATA[
No tak, błąd będzie, ale można go skorygować (nie trzeba zerować, ale wpisać początkowe wartości metodą prób)).   <br /><br />Kolego Jahimo nie mówię tu o ingerencji w rejestr przechwytywania, tylko w rejestr licznika. Rejestr licznika możesz w każdej chwili wyzerować, lub wpisać tam dowolną wartość. Pozdrawiam.  ✋<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21692">adamma25</a> — 31 lip 2021, o 13:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2021-07-31T11:14:35+01:00</updated>
<published>2021-07-31T11:14:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233118#p233118</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233118#p233118"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233118#p233118"><![CDATA[
Kolega <strong>adamma25</strong> ma rację, że problemem będzie tutaj niewłaściwa ilość przepełnień, jednak pomysł z zerowaniem TCNT1 nie jest zbytnio trafiony, ze względu na wprowadzenie pewnego błędu pomiaru. Z drugie strony autor wątku nie zadeklarował ani oczekiwanego zakresu pomiaru, ani oczekiwanej dokładności pomiaru. Być może taki błąd będzie akceptowalny.<br /><br />Ja pokażę, jak ja próbowałbym to zrobić. Timer 1 pracuje cały czas, a przerwania zliczają impulsy kolejnych okresów (w zmiennej <em>period_cnt</em> znajduje się zawsze ostatnio zmierzony okres w taktach). W procedurze obsługi przerwania od  przepełnienia odmierzany jest okres odświeżania wyświetlacza (zmienna/flaga <em>new_measure</em>). Okres odświeżania powinien wynieść ok.0,5s dla częstotliwości taktowania 16MHz.<br /><br />Okres obliczany jest w ten sposób, że tworzone są dwa znaczniki czasowe 32-bitowe - aktualny i poprzedni, a następnie są od siebie odejmowane.<br /><br />Nie jest to gotowy program, jeszcze wiele kwestii trzeba rozwiązać. Przykładowo w przypadku zaniku sygnału na wejściu przerwania ICP nie będą wykonywane, a wyświetlacz będzie pokazywał ostatnio obliczoną wartość zamiast 0 (zresztą problem ten dotyczy chyba również programu autora wątku). Same wartości częstotliwości powinny być obliczane prawidłowo. Program po skompilowaniu powinien działać prawidłowo, jednak ze względu na czas wykonywania przerwań poprawnie mierzona częstotliwość może być ograniczona do ok. 50kHz. Można ewentualnie spróbować przenieść część obliczeń  do pętli głównej, ale to raczej niewiele zmieni, ponieważ część operacji i tak musi być wykonywana atomowo, czyli z wyłączonymi przerwaniami.<br /><br />OBROT_ustaw.h<br />[syntax=c]/*<br /> * OBROT_ustaw.h<br /> *<br /> *  Created on: 27 lip 2021<br /> *      Author: Zbych<br /> */<br /> <br />#ifndef OBROT_USTAW_H_<br />#define OBROT_USTAW_H_<br /><br /> <br />//#include &quot;LCD/lcd44780.h&quot;<br />//#include &quot;I2C_TWI/i2c_twi.h&quot;<br /> <br />#define LED1 (1&lt;&lt;PC0)<br />#define LED2 (1&lt;&lt;PC1)<br /> <br />#define LED1_TOG PORTC ^= LED1<br />#define LED1_OFF PORTC |= LED1<br />#define LED1_ON PORTC &amp;= ~LED1<br />#define LED2_TOG PORTC ^= LED2<br />#define LED2_OFF PORTC |= LED2<br />#define LED2_ON PORTC &amp;= ~LED2<br /> <br /> <br />//void wykonaj_pomiar(void);<br /> <br />#endif /* OBROT_USTAW_H_ */[/syntax]<br /><br />main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 26 lip 2021<br /> *      Author: Zbych<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />//#include &lt;stdio.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/atomic.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;OBROT_ustaw.h&quot;<br /><br />volatile uint32_t period_cycles;            // liczba policzonych impulsów<br />volatile uint16_t ovf_cnt = 0;<br />volatile uint8_t new_measure;<br /><br />int main(void) {<br /> <br />    volatile uint32_t czestotliwosc = 0;<br />    uint32_t local_period_cycles = 0;<br />    <br />    DDRC |= (LED1|LED2);<br />//    PORTB |= (1&lt;&lt;PB0);                      //włącz pullup transoptora<br />    LED1_OFF;<br /> <br />    lcd_init();                          //inicjalizacja LCD i napis początkowy<br />    lcd_str(&quot;Czestosciomierz&quot;);<br />    //Ustawienie Timer1<br />    TCCR1A = 0;<br />    TCCR1B = (1&lt;&lt;CS10) | (1&lt;&lt;ICES1);        //preskaler 1, bez noise canceler, zbocze narastające<br />    TIMSK1 |= (1&lt;&lt;ICIE1) | (1&lt;&lt;TOIE1);<br />    <br />    sei();  //włącz przerwania globalne<br /> <br />    while(1){<br />        if (new_measure) {<br />            LED2_TOG;<br />            ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />                local_period_cycles = period_cycles;<br />            }<br />            if (local_period_cycles) {<br />                czestotliwosc = F_CPU / local_period_cycles;<br />                lcd_locate(1, 0);<br />                lcd_int(czestotliwosc);<br />                lcd_char('.');<br />                lcd_int( ( F_CPU % local_period_cycles)/1000 );<br />                lcd_str(&quot;   &quot;);<br />//                lcd_locate(1, 13);<br />//                lcd_int(local_period_cycles);<br />            }<br />            new_measure = 0;<br />        }        <br /><br />    }<br />}<br /><br />ISR(TIMER1_CAPT_vect) {<br />    static uint16_t prev_ICR = 0;<br />    static uint32_t current_ts = 0;<br />    static uint32_t prev_ts = 0;<br />    uint16_t current_ICR;<br />    <br />    current_ICR = ICR1;<br />    current_ts = 65536 * ovf_cnt + current_ICR - prev_ICR;<br />    period_cycles = current_ts - prev_ts;<br />    prev_ts = current_ts;<br />}<br /> <br />ISR(TIMER1_OVF_vect) {<br />    ovf_cnt += 1;                   //powiększ licznik przepełnień Timera1<br />    if ( !(ovf_cnt % 122) ) new_measure = 1;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 31 lip 2021, o 11:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jachimo]]></name></author>
<updated>2021-07-31T09:36:15+01:00</updated>
<published>2021-07-31T09:36:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233117#p233117</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233117#p233117"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233117#p233117"><![CDATA[
Witam.<br />Ten program wykorzystuje &quot;Input Capture Unit&quot;. Wg PDFa licznik TNCT1 jest niejako poza modułem a do przechwytywania jego wartości służy rejestr ICR1. Więc do obliczenia częstotliwości trzeba przechwycić stan licznika TCNT1 przy  pierwszym zboczu narastającym/opadającym na ICP1 i stan licznika przy następnym zboczu. W PDF-ie stoi (przynajmniej ja tak to rozumiem), że nie należy ingerować w pracę modułu &quot;Input Capture Unit&quot;.<br /><div class="quotetitle">adamma25 napisał(a):</div><div class="quotecontent"><br />Acha czyli większość czasu w pętli głównej program spędza w funkcji _delay_ms.<br /></div><br />Program tak ale w tym czasie pracują liczniki przygotowując dane do wyświetlenia. Przypuszczam (sprawdzę to) ,że jeśli mierzona częstotliwość będzie mniejsza niż 1/delay() to zostanie zdezorganizowana praca całego programu. Po prostu liczniki nie zdążą w tym czasie zaliczyć dwóch przerwań od pierwszego i następnego zbocza.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20829">Jachimo</a> — 31 lip 2021, o 09:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamma25]]></name></author>
<updated>2021-07-30T20:37:31+01:00</updated>
<published>2021-07-30T20:37:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233112#p233112</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233112#p233112"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233112#p233112"><![CDATA[
Według mnie jest błąd w obliczeniach, bo zauważ, że gdy start_A= np. 6553, czyli wypadnie przy końcu zakresu, a koniec_B wypadnie gdzieś na początku i będzie mniejszy niż Start_A to ich różnica będzie równa Zero,  i tu już jest błąd.  Spróbuj wyzerować licznik przy pierwszym wejściu. Wpisz po prostu do TCNT1 zero i wtedy wyeliminujesz Start_A ze wzoru i jeśli wypadnie gdzieś przy końcu zakresu, to wyeliminujesz również pierwsze niepotrzebne przepełnienie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21692">adamma25</a> — 30 lip 2021, o 20:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2021-07-30T20:21:17+01:00</updated>
<published>2021-07-30T20:21:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233111#p233111</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233111#p233111"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233111#p233111"><![CDATA[
<div class="quotetitle">Jachimo napisał(a):</div><div class="quotecontent"><br />na jakiej podstawie &quot;można spodziewać się fałszywego wyniku&quot;<br /></div><br />Możliwe, że nic takiego nie zajdzie. Sprawa jest dosyć &quot;krucha&quot;, w grę wchodzi współzależność priorytetów przerwań, momentu &quot;łapania&quot; danych i wykonywania obliczeń. Trzeba by to uważnie przeanalizować. <br /><br />Widzę, że uwagi o zabezpieczeniu dostępu do danych współdzielonych zignorowałeś. Cóż...z tym kodem (delay i inne takie) możliwe, że nic się nie stanie, ale z bardziej zbornym algorytemem z pewnością to zaniedbanie wybuchnie Ci prosto w twarz.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 30 lip 2021, o 20:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jachimo]]></name></author>
<updated>2021-07-30T18:03:32+01:00</updated>
<published>2021-07-30T18:03:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233109#p233109</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233109#p233109"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233109#p233109"><![CDATA[
Głowy nie dam ale po ostatnim eksperymencie wygląda na to, że jest Ok. A eksperyment - przed obliczeniem liczby impulsów wstawiłem instrukcję odejmowania. Teraz wygląda to tak:<br />[syntax=c]ilosc_przepelnien -= 1;<br />ilosc_cykli = (uint32_t)(65536 * ilosc_przepelnien) + (koniec_B - start_A);[/syntax]<br />Okazało się, że teraz pomiary w zakresie 100Hz - 10kHz są prawie prawidłowe. Przy czym im niższa mierzona częstotliwość to ilość błędnych pomiarów wzrasta. Przy 10kHz błąd jest sporadyczny ale przy 100Hz ilość błędnych pomiarów to 50-60 %.<br />Przy 100Hz powinny być 2 przepełnienia i tak jest gdy wyświetlany jest prawidłowy pomiar. Przy błędnych pomiarach liczba przepełnień jest 1 albo 3. <br />Wygląda na to, że jest błąd przy liczeniu przepełnień tylko nie mogę wyczaić gdzie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20829">Jachimo</a> — 30 lip 2021, o 18:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamma25]]></name></author>
<updated>2021-07-30T17:39:05+01:00</updated>
<published>2021-07-30T17:39:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233108#p233108</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233108#p233108"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233108#p233108"><![CDATA[
Acha czyli większość czasu w pętli głównej program spędza w funkcji _delay_ms. <br /> Może to prymitywne pytanie, ale czy na pewno wszystko dobrze styka, wyłapuje wszystkie zbocza prawidłowo?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 22 minutach ]</span></strong><br /><br />Może spróbuj przy pierwszym wejściu gdy start_stop==1 wyzerować licznik tak aby liczył od zera, wtedy obliczenia ilości taktów będą prostsze , odpadnie zmienna start_A zostanie tylko ilosc_cykli = 65536 * ilosc_przepelnien + koniec_B;  ale to tylko taka moja uwaga.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21692">adamma25</a> — 30 lip 2021, o 17:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jachimo]]></name></author>
<updated>2021-07-30T12:25:41+01:00</updated>
<published>2021-07-30T12:25:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233104#p233104</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233104#p233104"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233104#p233104"><![CDATA[
Witam<br /><br /><div class="quotetitle">adamma25 napisał(a):</div><div class="quotecontent"><br />Nie miej za złe że zwróciłem uwagę na sposób gaszenia flagi<br /></div><br />Nie mam nikomu za złe za odpowiedzi i podpowiedzi. Jak gasić tą flagę - po prostu nie doczytałem PDFa. Twoja uwaga pozwoliła stwierdzić, że jej ustawienie/skasowanie nie ma wpływu na pomiar. Jednak pomiar jest wykonywany co pół sekundy. Rzeczywiście start pomiaru następuje po ustawieniu przerwania ICP ale kończy się po skasowaniu przerwań w wektorze &quot;TIMER1_CAPT_vect&quot; a później jest delay. Po wyświetleniu wyniku następny start.<br />Zmiana sposobu obliczania ilości cykli nic nie zmienia.<br /><div class="quotetitle">fofex napisał(a):</div><div class="quotecontent"><br />No i na koniec - przy tej metodzie raz na jakiś czas można się spodziewać fałszywego wyniku z powodu zliczenia za małej/za dużej liczby przepełnień<br /></div><br />Ne rozumiem na jakiej podstawie &quot;można spodziewać się fałszywego wyniku&quot;. Przecież po załączeniu przerwania  &quot;TIMER1_CAPT_vect&quot; wykonuje się procedura obsługi. Jeśli są jakieś przepełnienia to powinny być zliczone. <br />Przy takim stwierdzeniu nie można być pewnym co , kiedy i jak wykona procesor.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20829">Jachimo</a> — 30 lip 2021, o 12:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamma25]]></name></author>
<updated>2021-07-30T08:25:52+01:00</updated>
<published>2021-07-30T08:25:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233098#p233098</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233098#p233098"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233098#p233098"><![CDATA[
Witam. Nie miej za złe że zwróciłem uwagę na sposób gaszenia flagi, ponieważ może ci się to kiedyś przydać i warto wiedzieć jak to zrobić poprawnie.  Kolega fofex rzucił kilka trafnych spostrzeżeń.  Jeszcze ten _delay_ms(500) na końcu nie sprawia że pomiar jest robiony co pół sekundy,  bo pomiar wykonuje się natychmiast po włączeniu przetrwania od ICP,  tylko wyświetla się co pół sekundy.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 6 minutach ]</span></strong><br /><br />Nie wiem czy to będzie miało znaczenie, ale może zmień sposób obliczania ilosc_cykli = uint32(65536 * ilosc_przepelnien ) + (koniec_B - start_A)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21692">adamma25</a> — 30 lip 2021, o 08:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2021-07-29T21:23:07+01:00</updated>
<published>2021-07-29T21:23:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233091#p233091</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233091#p233091"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233091#p233091"><![CDATA[
Bez nadmiernego zagłębiania się w kod:<br /><div class="quotetitle">Jachimo napisał(a):</div><div class="quotecontent"><br />ilosc_cykli = 65536 * ilosc_przepelnien - start_A + koniec_B;<br /></div><br />Dostęp do współdzielonych zmiennych 16 bitowych musi być w sekcji krytycznej. Tu dodatkowo jest kilka zmiennych współdzielonych.<br /><br /><div class="quotetitle">Jachimo napisał(a):</div><div class="quotecontent"><br />                if(pomiar_gotowy){<br /> //...<br />                }<br /> <br />//...<br />                pomiar_gotowy = 0;                              //zerujemy flagę końca pomiaru<br /></div><br />Gaszenie współdzielonej flagi poza blokiem uwarunkowanym tą flagą. Tu z pewnością można się spodziewać nieprawidłowego działania.<br /><br />No i na koniec - przy tej metodzie raz na jakiś czas można się spodziewać fałszywego wyniku z powodu zliczenia za małej/za dużej liczby przepełnień<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 29 lip 2021, o 21:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jachimo]]></name></author>
<updated>2021-07-29T19:51:04+01:00</updated>
<published>2021-07-29T19:51:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233088#p233088</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233088#p233088"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233088#p233088"><![CDATA[
Witam<br />Obojętnie czy gaszę flagę wpisując &quot;1&quot; czy &quot;0&quot; lub likwidując to ustawienie nic nie zmienia się. LCD nadal wyświetla liczby losowe za wyjątkiem pierwszego pomiaru. Czasami można zauważyć, że jest wyświetlona wartość poprawna ale to może raz na 50-100 pomiarów. Zauważyłem również, że wszystkie wyświetlone liczby są w prawie 100% większe od mierzonej częstotliwości. Tak jest dla częstotliwości ok. 9Hz. Jeśli ustawię  900Hz mam dwa wyniki. Czasem jest 900Hz a reszta to 192 Hz. dla 9kHz sporadycznie pojawia się wartość poprawna a wyświetlone jest 237Hz.<br />Odnoszę wrażenie, że procesor nie reaguje na każde zbocze pojawiające się na wejściu ICP1. Może o tym świadczyć za duża liczba przepełnień licznika T1.<br /><br />Pozdrawiam<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 49 minutach ]</span></strong><br /><br />Nawiązując do mojego poprzedniego postu &quot;za duża liczba przepełnień&quot;.<br />Generator ustawiłem na 9180Hz. LCD pokazuje - f = 237.55Hz liczba przepełnień = 1 a F_CPU = 16MHz.<br />Kalkulator  pokazuje: 16000000Hz/9180Hz = 1744 impulsów i powinno być 0 przepełnień. ( może wystąpić 1 przepełnienie jeśli licznik T1 zacznie liczyć w pobliżu swojej maksymalnej [TOP] wartości).<br />Teraz 16000000Hz/237.55Hz = 67354 impulsów - 65536[TOP] = 1818 impulsów. Czyli dla wyświetlenia 237.55Hz potrzebne jest jedno przepełnienie i 1818 impulsów. Tu powstaje pytanie skąd wzięło się to przepełnienie i liczba impulsów 1818 jeśli do wyświetlenia prawidłowej wartości potrzeba tylko 1744 impulsów.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 57 minutach ]</span></strong><br /><br />Zapomniałem dodać, że powyższe obserwacje i obliczenia wykonano bez ustawiania/kasowania flagi w przerwaniu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20829">Jachimo</a> — 29 lip 2021, o 19:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-07-29T19:15:08+01:00</updated>
<published>2021-07-29T19:15:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233087#p233087</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233087#p233087"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233087#p233087"><![CDATA[
<div class="quotetitle">adamma25 napisał(a):</div><div class="quotecontent"><br />a po drugie żeby ją &quot;zgasić&quot; to chyba trzeba wpisać tam logiczną jedynkę.<br /></div><br />Nie chyba a napewno <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zatem prawdę powiadasz<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 lip 2021, o 19:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamma25]]></name></author>
<updated>2021-07-29T15:26:02+01:00</updated>
<published>2021-07-29T15:26:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233085#p233085</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233085#p233085"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233085#p233085"><![CDATA[
Zastanawia mnie po co &quot;gasić&quot; flagę przerwania w procedurze obsługi, a po drugie żeby ją &quot;zgasić&quot; to chyba trzeba wpisać tam logiczną jedynkę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21692">adamma25</a> — 29 lip 2021, o 15:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jachimo]]></name></author>
<updated>2021-07-29T13:53:57+01:00</updated>
<published>2021-07-29T13:53:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233084#p233084</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233084#p233084"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233084#p233084"><![CDATA[
To akurat ma najmniejsze znaczenie ponieważ steruję z generatora TTL.<br /><br /> Pozdrawiam Zbych<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20829">Jachimo</a> — 29 lip 2021, o 13:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jarecki]]></name></author>
<updated>2021-07-29T09:07:49+01:00</updated>
<published>2021-07-29T09:07:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233083#p233083</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233083#p233083"/>
<title type="html"><![CDATA[Re: ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233083#p233083"><![CDATA[
[syntax=c]//      PORTB |= (1&lt;&lt;PB0);                                              //włącz pullup transoptora[/syntax] Czemu wyłączyłeś podciąganie?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2511">Jarecki</a> — 29 lip 2021, o 09:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jachimo]]></name></author>
<updated>2021-07-29T08:53:02+01:00</updated>
<published>2021-07-29T08:53:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233082#p233082</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233082#p233082"/>
<title type="html"><![CDATA[ATmega328P wyszło dziwne]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23863&amp;p=233082#p233082"><![CDATA[
Witam<br />Na płytce stykowej skleciłem układ wg schematu. Napisałem krótki program mający na celu pomiar częstotliwości podłączonego sygnału. Edytor sygnalizuje błędy przy ustawianiu rejestru TIMSK1 ale kompilacja jest bezbłędna. Nie wiem dlaczego ale takie sygnalizacje błędów występują w jednym kadzie a w innym nie. Po wgraniu do procka LCD wyświetla mi liczby losowe tak na pozycji &quot;częstotliwość&quot; jak i &quot;ilość przepełnień&quot;. Stosowałem LED-debadżery jak i osyloskop ale nie odkryłem przyczyny takiego działania programu. W tym momencie program zaliczam do kategorii &quot;dziwne&quot;.<br />Może ktoś w wolnej chwili spojrzy na program i odkryje to czego mi nie udało się.<br /><br />[syntax=c]/*<br /> * OBROT_ustaw.h<br /> *<br /> *  Created on: 27 lip 2021<br /> *      Author: Zbych<br /> */<br /><br />#ifndef OBROT_USTAW_H_<br />#define OBROT_USTAW_H_<br /><br />#include &lt;avr/io.h&gt;<br />//#include &lt;stdio.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd44780.h&quot;<br />#include &quot;I2C_TWI/i2c_twi.h&quot;<br /><br />#define LED1 (1&lt;&lt;PC0)<br />#define LED2 (1&lt;&lt;PC1)<br /><br />#define LED1_TOG PORTC ^= LED1<br />#define LED1_OFF PORTC |= LED1<br />#define LED1_ON PORTC &amp;= ~LED1<br />#define LED2_TOG PORTC ^= LED2<br />#define LED2_OFF PORTC |= LED2<br />#define LED2_ON PORTC &amp;= ~LED2<br /><br />volatile uint32_t ilosc_cykli;// liczba policzonych impulsów<br />volatile uint16_t ilosc_przepelnien;// liczba przepełnień w czasie pomiaru<br />volatile uint8_t        start_stop;// flaga początek- koniec pomiaru<br />volatile uint8_t        pomiar_gotowy;// flaga zakończenia pomiaru i wyświetlenia wyniku<br /><br />volatile uint16_t        start_A;// stan licznika ICR1 na początku pomiaru<br />volatile uint16_t        koniec_B;// stan licznika ICR1 na końcu pomiaru<br /><br />//void wykonaj_pomiar(void);<br /><br />#endif /* OBROT_USTAW_H_ */<br />&#91;syntax=c&#93;/*<br /> * main.c<br /> *<br /> *  Created on: 26 lip 2021<br /> *      Author: Zbych<br /> */<br />#include &quot;OBROT_ustaw.h&quot;<br /><br /><br />int main(void){<br /><br />uint32_t czestotliwosc = 0;<br /><br /><br />DDRC |= (LED1|LED2);<br />//PORTB |= (1&lt;&lt;PB0);   //włącz pullup transoptora<br />LED1_OFF;<br /><br />lcd_init();       //inicjalizacja LCD i napis początkowy<br />lcd_str(&quot;Czestosciomierz&quot;);<br />//Ustawienie Timer1<br />TCCR1A = 0;<br />TCCR1B = (1&lt;&lt;CS10) | (1&lt;&lt;ICES1);   //preskaler 1, bez noise canceler, zbocze narastające<br />//TCCR1B = (1&lt;&lt;CS10) | (1&lt;&lt;ICNC1) | (1&lt;&lt;ICES1); //preskaler 1, włącz noise canceler, zbocze narastające<br /><br />sei();       //włącz przerwania globalne<br /><br />while(1){<br />LED2_TOG;<br />if(pomiar_gotowy){<br />ilosc_cykli = 65536 * ilosc_przepelnien - start_A + koniec_B;<br />czestotliwosc = F_CPU / ilosc_cykli;<br /><br />lcd_locate(1, 0);<br />lcd_int(czestotliwosc);<br />lcd_char('.');<br />lcd_int( ( F_CPU % ilosc_cykli)/1000 );<br />lcd_str(&quot;   &quot;);<br />lcd_locate(1, 13);<br />lcd_int(ilosc_przepelnien);<br />}<br /><br />start_stop = 1;                 //ustawiamy początek pomiaru<br />pomiar_gotowy = 0;         //zerujemy flagę końca pomiaru<br />TIMSK1 |= (1&lt;&lt;ICIE1);        //włącz przerwania z ICP1 Timer1<br />_delay_ms(500);//pomiary co pół sekundy<br />}<br />}<br /><br />ISR(TIMER1_CAPT_vect){ //Obsługa zdarzenia na ICP1<br /><br />static uint16_t ICR1_aktualny;         //zmienna = wartość ICR1<br />ICR1_aktualny = ICR1;//odczytaj stan licznika<br />if ( start_stop == 1){//czy to początek pomiaru?<br />//uruchamiamy zliczanie przepełnień Timer1<br />//TIFR1 &amp;= ~(1&lt;&lt;TOV1); //zgaś flagę przerwania od przepełnienia<br />TIMSK1 |= (1&lt;&lt;TOIE1);//włącz przerwania od przepełnienia Timer1<br />ilosc_przepelnien = 0;//zeruj licznik przepełnień Timera1<br />start_A = ICR1_aktualny;        //zapamiętujemy stan licznika na początku pomiaru (start_A)<br />} else<br />if ( start_stop == 2){        // początek następnego okresu i koniec pomiaru<br />TIMSK1 &amp;= ~( (1&lt;&lt;ICIE1) | (1&lt;&lt;TOIE1) );        //wyłączamy przerwania z Input Capture Unit oraz przepełnienia Timer1<br />koniec_B  = ICR1_aktualny;           //zapamiętujemy stan licznika na końcu pomiaru<br />pomiar_gotowy  = 1;                                         //zakończono pomiar -  pokaż wynik pomiaru<br />}<br />start_stop += 1;<br />}<br /><br />ISR(TIMER1_OVF_vect){<br />TIFR1 &amp;= ~(1&lt;&lt;TOV1); //zgaś flagę przerwania od przepełnienia<br />ilosc_przepelnien += 1; //powiększ licznik przepełnień Timera1<br />}[/syntax][/syntax]<br /><br />Pozdrawiam Zbych<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=20829">Jachimo</a> — 29 lip 2021, o 08:53</p><hr />
]]></content>
</entry>
</feed>