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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-05-04T19:40:54+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3019&amp;mode</id>
<entry>
<author><name><![CDATA[Adam]]></name></author>
<updated>2013-05-04T19:40:54+01:00</updated>
<published>2013-05-04T19:40:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36102#p36102</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36102#p36102"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36102#p36102"><![CDATA[
Rozumiem twój kod i wiem jak on działa. Poprzednie moje pytanie odnosiło się do mojego ostatniego kodu. Twoja idea nie jest zła, też o tym myślałem ale przy taktowaniu 8Mhz i timer0 nie da się tego zrobić żeby na wyjściu była liczba od 0 do 255. Teraz myślę nad twoim pomysłem ale na timerze1 który ma 16 bitów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1061">Adam</a> — 4 maja 2013, o 19:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[vol_up]]></name></author>
<updated>2013-05-04T15:37:29+01:00</updated>
<published>2013-05-04T15:37:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36084#p36084</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36084#p36084"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36084#p36084"><![CDATA[
Może wyjaśnię jeszcze raz. W zmiennej wynik masz zawsze aktualną pozycję serwa. Ponieważ w przerwaniu przy zboczu narastający uruchamiasz timer0 zwiększasz flagę i zmieniasz przerwanie INT0 na zbocze opadające. Wychodzimy z przerwania a timer dalej zlicza długość impulsu od serwa. Impuls ten trwa np. 1,5 ms po tym czasie zmieni się stan z wysokiego na niski i wyzwoli przerwanie INT0 (zbocze opadające )  . W obsłudze przerwania w drugim warunku instrukcji switch zatrzymujemy timer zerujemy flagę i wartość licznika przypisujemy do zmiennej wynik i zmieniamy zbocze na narastają. I cykl się powtarza. Więc  co 20ms masz zawsze nową pozycję serwa  w zmiennej wynik. Przy długości impulsu 1,5 ms timer zliczy do około 187. Przy długości impulsu np.1,25ms licznik zliczy do około 156 ( 0,00125 s / 0,000 008 s ).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=789">vol_up</a> — 4 maja 2013, o 15:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam]]></name></author>
<updated>2013-05-04T14:39:36+01:00</updated>
<published>2013-05-04T14:39:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36081#p36081</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36081#p36081"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36081#p36081"><![CDATA[
50Hz czyli co 20ms idzie impuls od 1ms do 2ms.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 36 minutach ]</span></strong><br /><br />Czym mogą być spowodowane błędy jeśli przypisuje przypisuje do TCNT0 więcej niż 224? (ostatni kod) Poniżej tej wartości wszystko działa jak należy, przy wyższej wartość, odświeżanie wyniku jest ok 2 razy na sekundę a wyniki nie są poprawne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1061">Adam</a> — 4 maja 2013, o 14:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[vol_up]]></name></author>
<updated>2013-05-04T14:10:05+01:00</updated>
<published>2013-05-04T14:10:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36078#p36078</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36078#p36078"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36078#p36078"><![CDATA[
Możesz przybliżyć z jaką częstotliwości pozycja tego serwa się zmienia?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=789">vol_up</a> — 4 maja 2013, o 14:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam]]></name></author>
<updated>2013-05-04T13:03:38+01:00</updated>
<published>2013-05-04T13:03:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36073#p36073</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36073#p36073"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36073#p36073"><![CDATA[
Ok, otrzymam w ten sposób pozycję neutralną ale ja w programie potrzebuje mieć wartości od 0 do 255 i nie mogę na to czekać dłużej niż 50ms.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1061">Adam</a> — 4 maja 2013, o 13:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[vol_up]]></name></author>
<updated>2013-05-04T12:35:13+01:00</updated>
<published>2013-05-04T12:35:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36070#p36070</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36070#p36070"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36070#p36070"><![CDATA[
Spróbuj tak. Ustaw serwo w pozycji skrajną lewo i odczytaj zmienną wynik. Ustaw w pozycję skrajną prawą odczytaj zmienną wynik. Jeśli dodasz te dwie wartości i podzielisz przez dwa to otrzymasz pozycję neutralną.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=789">vol_up</a> — 4 maja 2013, o 12:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam]]></name></author>
<updated>2013-05-04T12:25:51+01:00</updated>
<published>2013-05-04T12:25:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36069#p36069</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36069#p36069"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36069#p36069"><![CDATA[
Rozumiem, tylko problemem jest wynik. Chodzi o to aby w pozycji neutralnej było ok 128 +/- 10. analogicznie wychylanie w prawo, lewo. Będzie mi to później potrzebne.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1061">Adam</a> — 4 maja 2013, o 12:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[vol_up]]></name></author>
<updated>2013-05-04T12:03:32+01:00</updated>
<published>2013-05-04T12:03:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36065#p36065</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36065#p36065"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36065#p36065"><![CDATA[
Chyba się za bardzo nie rozumiemy. Z zastosowaniem mojej koncepcji musi ulec zmianie prawie cała funkcja main (). Nie ma przerwania od timera0. wszystko załatwia INT0. W zmiennej wynik otrzymamy czas trwania impulsu sterującego serwo.<br />Wyjaśnię może co nieco. Jeśli zmienna wynik wyniesie np. 187 to będziesz wiedział, że serwo jest w pozycji neutralnej. Ponieważ 187 * 8 us da nam 1,5 ms.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=789">vol_up</a> — 4 maja 2013, o 12:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam]]></name></author>
<updated>2013-05-04T11:59:13+01:00</updated>
<published>2013-05-04T11:59:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36064#p36064</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36064#p36064"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36064#p36064"><![CDATA[
no tak... całkowicie o tym zapomniałem. Dzięki.<br /><br />Teraz kod wygląda tak:<br />[syntax=c]ISR(INT0_vect)<br />{<br />if(MCUCR &amp; (1&lt;&lt;ISC00))// zbocze narastające<br />{<br />TCNT0 = 224;// zliczaj od 224<br />i = 0;// zewruj licznik<br />}<br />else// zbocze opadające<br />{<br />sgn0 = i;// zapisz wynik<br /><br />}<br /><br />MCUCR ^= (1&lt;&lt;ISC00);// zmiana zbocza na przeciwne<br />}<br /><br />//-------------------------------------------------------------------------------------------------<br />// obsługa przerwania od przepełnienia TIMER0<br />//-------------------------------------------------------------------------------------------------<br />SIGNAL(SIG_OVERFLOW0)<br />{<br />i++;<br />TCNT0 = 224;<br />}[/syntax]<br /><br />I działa o wiele lepiej. <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Jednak nie pojmuje jednej rzeczy. Bo stan wysoki zmienia się od 1ms do 2ms, więc od zmierzonego czasu trzeba odjąć 1ms i mamy przedział od 0 - 1ms. Ale w zależności od tego urządzenia zadającego odpowiedni impuls czas ten może być krótszy lub dłuższy w moim przypadku jest to ok 800us, więc postanowiłem do rejestru TCNT0 przypisywać większą wartość 240 i niestety jest problem. Wynik jest ten sam co przy TCNT0 = 224 i odświeżany ok 2 razy na sekundę. <br />W czym może tkwić problem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1061">Adam</a> — 4 maja 2013, o 11:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[vol_up]]></name></author>
<updated>2013-05-04T11:24:13+01:00</updated>
<published>2013-05-04T11:24:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36059#p36059</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36059#p36059"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36059#p36059"><![CDATA[
panowie mamy tu do czynienia z przerwaniem od INT0 a nie timera0.<br /><br /><div class="quotetitle">Adam napisał(a):</div><div class="quotecontent"><br />....<br />Co do obliczeń, nie rozumiem dlaczego 2 razy dzielisz przez 256? <br />...<br /></div><br />Jeśli licznik zliczy do 256 to minie około 2ms. A zatem jeśli licznik zliczy tylko do 1 to minie 80us. Obliczam w ten sposób czas 1 impulsu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=789">vol_up</a> — 4 maja 2013, o 11:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam]]></name></author>
<updated>2013-05-04T11:03:55+01:00</updated>
<published>2013-05-04T11:03:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36056#p36056</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36056#p36056"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36056#p36056"><![CDATA[
Dzięki za odpowiedź.<br />Co do obliczeń, nie rozumiem dlaczego 2 razy dzielisz przez 256? <br /><br />8 000 000 Hz / 64 = 125 000 Hz<br />125 000 Hz / 256 = 488,281 250 Hz <br />1 s / 488,281 = 0,002 048 s ( około 2 ms ) <br /><br />Przerwanie wykona się co 2ms. Zgadza się?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1061">Adam</a> — 4 maja 2013, o 11:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[vol_up]]></name></author>
<updated>2013-05-04T10:22:01+01:00</updated>
<published>2013-05-04T10:22:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36053#p36053</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36053#p36053"/>
<title type="html"><![CDATA[Re: Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36053#p36053"><![CDATA[
proszę oto jedna z koncepcji<br /><br />[syntax=c]ISR(INT0_vect) <br />{<br />//----------------------------- makrodefinicje ---------------------------------<br />#define start_t0 TCCR0 |= ( 1&lt;&lt; CS01 )|( 1&lt;&lt; CS00 ) ; //-- preskaler 64<br />#define stop_t0 TCCR0 &amp;= ~( 1&lt;&lt; CS01 )|( 1&lt;&lt; CS00 ) ; //- zatrzymujemy timer<br />#define zb_opad MCUCR &amp;= ~( 1&lt;&lt; ISC00 ) ; // ------------ przerwanie na zbocze opadające<br />#define zb_nara MCUCR |= ( 1&lt;&lt; ISC00 ) ; // ------------- przerwanie na zbocze narastające ( ISC01 mamy już ustawione )<br />//----------------------------- koniec makrodefinicji ---------------------------<br /><br />static uint8_t flag_1 ; //zmienna na potrzeby instrukcji switch ( static ponieważ kompilator zainicjuje nam ją zerem )<br /><br />//------------ instrukcja switch<br />switch ( flag_1 )<br />{<br />case 0 : // ---------- przerwanie INT0 na zbocze narastające<br />start_t0 ; // ---- startujemy timer<br />flag_1++ ; // ---- zwiększamy flagę<br />zb_opad ; // ----- ustawiamy  przerwanie INT0 na zbocze opadające<br />break ;<br /><br />case 1 : // ---------- przerwanie INT0 na zbocze opadające<br />stop_t0 ; // ----- zatrzymujemy timer<br />wynik = TCNT0 ; // do zmiennej wynik wartość TCNT0<br />flag_1-- ; // ---- zerujemy flagę<br />zb_nara ; // ----- ustawiamy  przerwanie INT0 na zbocze narastające<br />break ;<br />}<br />// -------------------- koniec instrukcji switch<br />}[/syntax]<br /><br />Jest to tylko kod obsługi przerwania INT0.<br /><br />Preskaler w liczniku ustawiasz na 64. Dzięki temu otrzymamy:<br /><br />8 000 000 Hz / 64 = 125 000 Hz<br />125 000 Hz / 256 = 488,281 250 Hz<br />1 s / 488,281 250 = 0,002 048 s ( około 2 ms ) <br />0,002 048 s / 256 = 0,000 008 s ( 8 us )<br /><br />Tym sposobem, jeżeli zmienna wynik wyniesie np. 200 to wiadomo że, serwo wychylone będzie np. w prawo.<br />Ponieważ 8 us * 200 = 1,6 ms . Jak wiadomo jeśli serwo dostaje impuls około 1,5 ms to jest to pozycja neutralna. Wartości odbiegające od tej normy powodują wychylenie w lewo lub w prawo. <br />Zaznaczam, że mogę wypisywać tu jakieś herezje bo w programowaniu avr-ów jestem średnio początkujący.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=789">vol_up</a> — 4 maja 2013, o 10:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adam]]></name></author>
<updated>2013-05-03T21:47:08+01:00</updated>
<published>2013-05-03T21:47:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36025#p36025</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36025#p36025"/>
<title type="html"><![CDATA[Timer0, Odczytanie pozycji serwa, problem z TCNT0]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3019&amp;p=36025#p36025"><![CDATA[
Witam.<br />Tworzę program który ma za zadanie odczytać pozycję serwa i na wyjściu podać wartość od 0 do 255. <br /><br />Stan wysoki impulsu pojawia się co 20ms i trwa ok 1ms, więc początkowa idea była następująca:<br /><br />Wejście sygnału podłączone do INT0 wyzwala przerwanie gdzie na zboczu narastającym timer zaczyna liczyć ile razy przerwanie od timer-a zostało wykonane, a na opadającym zapisuje wynik do zmiennej. Timer0, tryb normal bez preskalera, wyzwala przerwanie co 4us. (1000/256)<br /><br />1) 1s / 8MHz = 0,125us - co 0,125us timer dostaje impuls do rejestru TCNT0.<br />2) 4us / 0,125 = 32, więc 256 - 32 = 224 czyli timer ma zliczać od TCNT0 = 224.<br /><br />Kod:<br />[syntax=c]volatile int sgn0;// zmienna przechowująca wynik<br />volatile int i;// licznik<br />char wynik&#91;20&#93;;<br /><br /><br />int main (void)<br />{<br />    LCD_Initalize (); // Funkcja inicjalizuje wyswietlacz<br /><br />//---------------------konfiguracja przerwań---------------------------------------------<br />DDRD &amp;= ~(1&lt;&lt;PD2);// ustawienie PD2 jako wejście<br />PORTD |= (1&lt;&lt;PD2);// pullup<br />MCUCR |= (1&lt;&lt;ISC00)|(1&lt;&lt;ISC01);        // przerwanie na zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// uruchomienie przerwania INT0<br />//---------------------------------------------------------------------------------------<br />TCCR0 |= (1&lt;&lt;CS00);// preskaler = 0<br />TIMSK |= (1&lt;&lt;TOIE0);        // przerwanie od przepełnienia licznika<br />TCNT0 = 0;// zliczaj impulsy od 156 (256-100=156)<br />        sei();// globalne zezwolenie na przerwania<br /><br />   while (1)<br />   {<br /><br />//---------------wyświetlenie wyniku-----------------------------------<br />   itoa (sgn0, wynik, 10);<br />   LCD_Clear();<br />   LCD_WriteText (wynik);<br />   _delay_ms (100);<br />   }<br />}<br /><br />//-------------------------------------------------------------------------------------------------<br />// obsługa przerwania INT0<br />//-------------------------------------------------------------------------------------------------<br />SIGNAL(SIG_INTERRUPT0)<br />{<br />if(!(MCUCR &amp; (1&lt;&lt;ISC00)))        // zbocze narastające<br />{<br />TCNT0 = 224;// zliczaj od 224<br />i = 0;// zeruje licznik i<br />}<br />else// zbocze opadające<br />{<br />sgn0 = i;//zapisuje wynik do sgn0<br />}<br /><br />MCUCR ^= (1&lt;&lt;ISC00);        // zmiana zbocza na przeciwne<br />}<br />//-------------------------------------------------------------------------------------------------<br />// obsługa przerwania od przepełnienia TIMER0<br />//-------------------------------------------------------------------------------------------------<br />SIGNAL(SIG_OVERFLOW0)<br />{<br />i++;<br />}[/syntax]<br /><br />Kod ten działa ale problemem jest wynik który jest taki sam jak przy TCNT0 = 0. Cokolwiek bym do tego rejestru nie wpisał wynik jest taki jak powinien być przy TCNT0 = 0. <br /><br />Proszę o pomoc, w rozwiązaniu problemu.<br /><br />Procek to Atmega8 taktowana wewnętrznym oscylatorem 8MHz, dokładności nie ziemskiej się nie spodziewam.<br />Wybrałem przerwanie INT0 ponieważ to jeden z niewielu wolnych pinów na płytce. <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />Z góry dziękuje. Pozdrawiam. <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1061">Adam</a> — 3 maja 2013, o 21:47</p><hr />
]]></content>
</entry>
</feed>