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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-08-28T23:29:48+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=16086&amp;mode</id>
<entry>
<author><name><![CDATA[nemo]]></name></author>
<updated>2016-08-28T23:29:48+01:00</updated>
<published>2016-08-28T23:29:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167383#p167383</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167383#p167383"/>
<title type="html"><![CDATA[Re: Miernik częstotliwości - wątpliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167383#p167383"><![CDATA[
Nie uda ci się uzyskać dokładności 1Hz przy 8MHz. A to dlatego, że ograniczeniem jest tu dokładność źródła taktowania (o czym zresztą jest napisane na wymienionej stronie). A to dlatego, że przy 1MHZ dokładność  1Hz wymagałaby dokładności źródła taktowania (zegara) lepszej niż 1ppm (ppm=części na milion). Tymczasem tanie kwarce mają dokładność rzędu 100ppm. Lepsze (droższe) kwarce są dokładniejsze okło 20ppm, specjalne termostatowane (TXCO) osiągają kilka ppm. Wyjściem może być zastosowanie scalaka DS3231 o max dokładności 2ppm.<br />Kolejną sprawą są opóźnienia między powstaniem przerwania, wywołaniem i obsługą. A to zajmie kilkanaście cykli zegara, czyli 1-2us co daje kolejne 2ppm.<br />Realnie patrząc - można łatwo uzyskać 4 cyfry znaczące, 5 cyfr znaczących przy pewnym wysiłku, 5 i 1/2 to praktyczny szczyt możliwości. Oczywiście nic nie stoi na przeszkodzie by miernik pokazywał 6,9 czy 12 cyfr. Tylko po co skoro i tak wartości ich będą przypadkowe.<br /><br />Co do projektu, to nie dopatrzyłem się preskalera w liczeniu impulsów. <br />[syntax=basic4gl]Config Timer0 = Counter , Edge = Falling<br />Enable Timer0<br />On Timer0 Count Nosave<br /><br />Config Timer1 = Timer , Prescale = 1024 , Clear Timer = 1<br />On Oc1a 1s Nosave<br />Enable Compare1a<br />Compare1a = Compare[/syntax]<br />Licznik zlicza do 256, a każde przepełnienie zwiększa licznik przepełnień.<br />Sam preskaler pracuje asynchronicznie i wyrabia sie do około 50MHz (z tego co pamiętam - warto sprawdzić).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13966">nemo</a> — 28 sie 2016, o 23:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2016-08-28T16:06:28+01:00</updated>
<published>2016-08-28T16:06:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167349#p167349</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167349#p167349"/>
<title type="html"><![CDATA[Re: Miernik częstotliwości - wątpliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167349#p167349"><![CDATA[
Jeezu, serio będziesz się kłócił o 2 (!) znaki? A może to test na samodzielne myślenie? Jakoś reszta forum nie ma z tym problemu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 28 sie 2016, o 16:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[BoloKonstruktor]]></name></author>
<updated>2016-08-28T15:51:49+01:00</updated>
<published>2016-08-28T15:51:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167345#p167345</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167345#p167345"/>
<title type="html"><![CDATA[Re: Miernik częstotliwości - wątpliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167345#p167345"><![CDATA[
Z informacji zawartych w tym poście (<a href="http://forum.atnel.pl/topic7402.html"  class="postlink">topic7402.html</a>) wynika że powinienem zastosować:<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">syntax=C++</div><br />tym czasem w skrypcie obsługującym to forum zaimplementowano<br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">syntax=cpp</div> co jak się okazało jest prawidłowe<br /><br />Taka nieprecyzyjność i jednocześnie dezinformacja ze strony moderatora w dodatku na forum traktującym o programowaniu powoduje iż wycofuje się z zadanego wcześniej pytania i nie mam więcej pytań oraz wnoszę o zamknięcie lub usunięcie tego wątku.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13609">BoloKonstruktor</a> — 28 sie 2016, o 15:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2016-08-28T15:10:09+01:00</updated>
<published>2016-08-28T15:10:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167341#p167341</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167341#p167341"/>
<title type="html"><![CDATA[Re: Miernik częstotliwości - wątpliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167341#p167341"><![CDATA[
Listingi wstawiamy tak: <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic7402.html" >topic7402.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 28 sie 2016, o 15:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[BoloKonstruktor]]></name></author>
<updated>2016-08-28T15:29:27+01:00</updated>
<published>2016-08-28T15:08:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167340#p167340</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167340#p167340"/>
<title type="html"><![CDATA[Miernik częstotliwości - wątpliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16086&amp;p=167340#p167340"><![CDATA[
Usiłuję napisać program takiego miernika i podczas analizy konfiguracji timer-ów pojawiły się wątpliwości.<br />Do testów używam płytki arduino nano (atmega328p, 16MHz, 5V) i na chwilę obecną napisałem coś takiego:<br />[syntax=cpp]//Inkludowanie arduinowych bibliotek<br />//...<br />//...<br /><br />//Konfiguracja wyświetlacza<br />#define BACKLIGHT_PIN 3<br />LiquidCrystal_I2C  lcd(0x27, 2, 1, 0, 4, 5, 6, 7);<br /><br />volatile bool sekunda;<br />volatile uint16_t licznik;<br />volatile uint32_t czestotliwosc ;<br /><br />String formatstr(String str, String mask = &quot;     &quot;){<br />byte slen = str.length(), mlen = mask.length();<br />  if(mlen &gt; slen)<br />    return mask.substring(0, mlen-slen)+str;<br />return str;<br />}<br /><br />void setup() {<br />DDRB |= _BV(PB5);<br /><br />lcd.begin (20, 4);<br />lcd.setBacklightPin(BACKLIGHT_PIN, POSITIVE);<br />lcd.setBacklight(HIGH);<br />lcd.clear();<br /><br />//Konfiguracja przerwań.<br />cli();<br />//Konfiguracja zegara 1 sekunda (timer1).<br />TCCR1A = 0;<br />TCCR1B = 0;<br />TCNT1  = 0;<br />OCR1A = 15624;// = (16000000) / (1*1024) - 1 <br />TCCR1B |= (1 &lt;&lt; WGM12);  //timer1 w tryb obsługi przerwań (CTC)<br />TCCR1B |=  (1 &lt;&lt; CS12) | (1 &lt;&lt; CS10);     //dzielnik na 1024<br />TIMSK1 |= (1 &lt;&lt; OCIE1A);<br /><br />//Konfiguracja przerwania zewnętrznego (zliczanie impulsów)<br />EICRA |= (1&lt;&lt;ISC01); //Zbocze opadające<br />EIMSK |= (1&lt;&lt;INT0); //Zezwolenie na przerwanie z wejścia INT0<br />sei();<br />}<br /><br />void loop() {<br />  if(sekunda)<br />  {<br />  sekunda = false;<br />  lcd.setCursor(0, 0);<br />  lcd.print(formatstr(String(czestotliwosc), &quot;0000000&quot;));<br />  lcd.print(&quot;Hz&quot;);<br />  PORTB ^= _BV(PB5);<br />  }<br />}<br /><br />ISR(TIMER1_COMPA_vect){<br />czestotliwosc = licznik;<br />licznik = 0;<br />sekunda = true;<br />}<br /><br />ISR(INT0_vect){<br />licznik++;<br />}[/syntax]<br /><br />Powyższy kod działa ale testowałem go przy stosunkowo małej częstotliwości bo sinus/prostokąt 20kHz z karty dźwiękowej.<br />Założeniem moim jest aby wykorzystać maksymalne możliwości sprzętowe mikrokontrolera do pomiaru częstotliwości (czyli przy taktowaniu 16MHz pomiar do ok 8MHz o dokładności 1Hz) aby później przy zastosowaniu preskalera np SAB6456 uzyskać wystarczającą dokładność przy pomiarze wyższych częstotliwości.<br /><br />Moje wątpliwości pojawiły się gdy natknąłem się na projekt miernika częstotliwości z takiej strony: <a href="http://mdiy.pl/miernik-czestotliwosci-na-avr-od-1hz-do-10mhz/"  class="postlink">http://mdiy.pl/miernik-czestotliwosci-na-avr-od-1hz-do-10mhz/</a> który spełniał by moje założenia.<br />Autor powyższego projektu użył również timer1 jako podstawę czasu i timer0 jako licznika impulsów ale z preskalerem 256 co właśnie spowodowało moje wątpliwości co do dokładności pomiaru mojego kodu.<br /><br />I w końcu moje zasadnicze pytanie:<br />czy konfiguracja timer-ów z projektu do którego link wkleiłem powyżej zwiększa dokładność przy pomiarze częstotliwości w stosunku do mojego kodu, a jeśli tak to jak skonfigurować tak timer0 w C?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13609">BoloKonstruktor</a> — 28 sie 2016, o 15:08</p><hr />
]]></content>
</entry>
</feed>