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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-11-29T23:00:40+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=19699&amp;mode</id>
<entry>
<author><name><![CDATA[Valirys]]></name></author>
<updated>2017-11-29T23:00:40+01:00</updated>
<published>2017-11-29T23:00:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19699&amp;p=199723#p199723</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19699&amp;p=199723#p199723"/>
<title type="html"><![CDATA[Re: Miernik częstotliwości zliczający dt+ dt- ATMega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19699&amp;p=199723#p199723"><![CDATA[
Próbowałem zliczać impulsy na T0 i T1 odpowiednio dla dt+ i dt- niestety wynik był podobny. Myślę że po prostu ATMega8 jest za słaba na ten program i trzeba wybrać lepszy mikrokontroler.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18283">Valirys</a> — 29 lis 2017, o 23:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[APAP75]]></name></author>
<updated>2017-11-29T20:50:13+01:00</updated>
<published>2017-11-29T20:50:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19699&amp;p=199720#p199720</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19699&amp;p=199720#p199720"/>
<title type="html"><![CDATA[Re: Miernik częstotliwości zliczający dt+ dt- ATMega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19699&amp;p=199720#p199720"><![CDATA[
Nie jestem zbyt dobry w analizowaniu kodów, ale przy takim mierzeniu częstotliwości wyżej niż pewna granica nie przejdziesz - u Ciebie jest to 90kHz. Podejrzewam, że program będąc w obsłudze przerwania dostaje następne, a przy wzroście częstotliwości po prostu je gubi.<br />Do pomiaru częstotliwości użyj licznika zliczając impulsy na wejściu uC. Dla atmega8 jest to wejście T0 i T1 - odpowiednio dla timera 0 i 1.<br />Możesz wówczas zmierzyć częstotliwość maksymalnie do 1/2 zegara.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6195">APAP75</a> — 29 lis 2017, o 20:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Valirys]]></name></author>
<updated>2017-11-27T20:38:59+01:00</updated>
<published>2017-11-27T20:38:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19699&amp;p=199633#p199633</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19699&amp;p=199633#p199633"/>
<title type="html"><![CDATA[Miernik częstotliwości zliczający dt+ dt- ATMega8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19699&amp;p=199633#p199633"><![CDATA[
Witam, zadaniem programu jest zliczanie czasu stanu wysokiego oraz niskiego, potem przez dodawanie, dzielenie itp. otrzymujemy okres i częstotliwość. Problemem jest że program zlicza dobrze ale tylko do ok. 90kHz. Dt+ i dt- mają maksymalnie 5-6us i mimo podania wyższej częstotliwości nie zmieniają się. Jestem początkujący w programowaniu mikrokontrolerów więc każda wskazówka się przyda.<br /><br />[syntax=c]#include &lt;util/delay.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;lcd44780.h&quot;<br /><br />#define KEY_L !(PIND &amp; (1&lt;&lt;PD6))<br />#define KEY_R !(PIND &amp; (1&lt;&lt;PD7))<br /><br />volatile long int up, count_rising, count_falling, ovf_down, ovf_up, D_HIGH&#91;10&#93;, D_LOW&#91;10&#93;, duty_low, duty_high;<br /><br />int main(void)<br />{<br />MCUCR |= (1&lt;&lt;ISC00); // Ustawienie przerwania INT0 na oba zbocza<br />GICR |= (1&lt;&lt;INT0); // Zezwolenie na przerwanie INT0<br /><br />TCCR0 |= (1&lt;&lt;CS00); // Ustawienie Timera0 bez preskalera<br />TIMSK |= (1&lt;&lt;TOIE0); // Zezwolenie na przerwania Timera0<br /><br />DDRD &amp;= ~(1&lt;&lt;PD6); // Ustawianie pinu PD6 na wejście<br />PORTD |= (1&lt;&lt;PD6); // PD6 pull-up<br />DDRD &amp;= ~(1&lt;&lt;PD7); // Ustawianie pinu PD7 na wejście<br />PORTD |= (1&lt;&lt;PD7); // PD7 pull-up<br /><br />lcd_init();<br />lcd_cls();<br /><br />int pozycja=0;<br />double czestotliwosc=0, okres=0;<br />while(1)<br />{<br />sei(); // zezwolenie na przerwania globalne<br />while(count_falling&lt;10 &amp;&amp; count_rising&lt;10) //pętla zlicza 10 przerwań<br />{<br /><br />}<br />cli(); // zablokowanie przerwań<br />count_falling=0; //zerowanie zliczonych przerwań<br />count_rising=0;<br />for(int i=0; i&lt;10; i++) //obliczanie średniej arytmetycznej duty+ duty-<br />{<br />duty_high+=D_HIGH&#91;i&#93;;<br />duty_low+=D_LOW&#91;i&#93;;<br />}<br />duty_high/=10;<br />duty_low/=10;<br /><br />duty_low*=62; //Zamiana taktów zegara na ns<br />duty_high*=62;<br /><br />okres=duty_low+duty_high; // obliczenie okresu<br />czestotliwosc=1/(okres/1000000000); // Obliczanie częstotliwości;<br /><br />if(KEY_R) // Czy klawisz wciśnięty?<br />{<br />_delay_ms(80); //drgania styków<br />if(KEY_R) // Czy klawisz wciśnięty?<br />{<br />pozycja ++;<br />if(pozycja&gt;3)<br />pozycja=0; // Jeśli LCD pozycja 4 przesuń na poz. 0<br />}<br />}<br /><br />if(KEY_L) // Czy klawisz wciśnięty?<br />{<br />_delay_ms(80); //drgania styków<br />if(KEY_L)<br />{<br />pozycja --;<br />if(pozycja&lt;0)<br />pozycja=3; // Jeśli LCD pozycja -1 przesuń na poz. 3<br />}<br />}<br /><br />switch(pozycja)<br />{<br />case 0:<br />lcd_cls();<br />lcd_locate(0,1);<br />lcd_str(&quot;Czestotliwosc:&quot;);<br />lcd_locate(1,13);<br />if(czestotliwosc&gt;=1000)<br />{<br />czestotliwosc/=1000;<br />lcd_str(&quot;kHz&quot;);<br />}<br />else<br />lcd_str(&quot;Hz &quot;);<br />lcd_locate(1,4);<br />lcd_int(czestotliwosc);<br />break;<br /><br />case 2:<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str(&quot;Stan wysoki w &quot;);<br />lcd_locate(0,14);<br />if (duty_high&gt;1000000)<br />{<br />duty_high/=1000000.0;<br />lcd_str(&quot;ms&quot;);<br />}<br />else if (duty_high&gt;1000)<br />{<br />duty_high/=1000.0;<br />lcd_str(&quot;us&quot;);<br />}<br />else<br />lcd_str(&quot;ns&quot;);<br />lcd_locate(1,4);<br />lcd_int(duty_high);<br />break;<br /><br />case 1:<br />lcd_cls();<br />lcd_locate(0,2);<br />lcd_str(&quot;Okres w &quot;);<br />lcd_locate(0,10);<br />if (okres&gt;1000000)<br />{<br />okres/=1000000.0;<br />lcd_str(&quot;ms&quot;);<br />}<br />else if (okres&gt;1000)<br />{<br />okres/=1000.0;<br />lcd_str(&quot;us&quot;);<br />}<br />else<br />{<br />lcd_str(&quot;ns&quot;);<br />}<br />lcd_locate(1,4);<br />lcd_int(okres);<br />break;<br /><br />case 3:<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str(&quot;Stan niski w &quot;);<br />lcd_locate(0,13);<br />if (duty_low&gt;1000000)<br />{<br />duty_low/=1000000.0;<br />lcd_str(&quot;ms&quot;);<br />}<br />else if (duty_low&gt;1000)<br />{<br />duty_low/=1000.0;<br />lcd_str(&quot;us&quot;);<br />}<br />else<br />lcd_str(&quot;ns&quot;);<br />lcd_locate(1,4);<br />lcd_int(duty_low);<br />break;<br />}<br />_delay_ms(1000);<br />}<br /><br />}<br />ISR(INT0_vect)<br />{<br />if(!(PIND &amp; (1&lt;&lt;PD2))) //sprawdza czy sygnał na pinie narastający<br />{<br />up=1; // flaga sygnał narastający<br />duty_low=ovf_down+TCNT0; // dodawanie do wyniku wartosc licznika oraz zliczone przepełnienia<br />D_LOW&#91;count_rising&#93;=duty_low; // dodanie do tablicy wartosc duty-<br />count_rising++; // zliczanie zboczy narastających<br />ovf_down=0; // wyzerowanie zliczonych przepełnień<br />TCNT0=0; // wyzerowanie stanu licznika<br />}<br />else // sygnał na pinie malejący<br />{<br />up=0; // flaga sygnał opadający<br />duty_high=ovf_up+TCNT0; // zlicznie wart. licznika oraz sumę przepełnień<br />D_HIGH&#91;count_falling&#93;=duty_high; // dodanie do tablicy wartosc duty+<br />count_falling++; // zliczanie zboczy opadających<br />ovf_up=0; // wyzerowanie przepełnień<br />TCNT0=0; // wyzerowanie licznika<br />}<br />}<br />ISR(TIMER0_OVF_vect)<br />{<br />if(up==1) // zwiększenie zmiennej od przepełnienia zboczy narastających<br />ovf_down+=256;<br />else // opadających<br />ovf_up+=256;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18283">Valirys</a> — 27 lis 2017, o 20:38</p><hr />
]]></content>
</entry>
</feed>