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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-11-06T13:49:46+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=4781&amp;mode</id>
<entry>
<author><name><![CDATA[marrrtyn]]></name></author>
<updated>2013-11-15T14:50:53+01:00</updated>
<published>2013-11-15T14:50:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56970#p56970</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56970#p56970"/>
<title type="html"><![CDATA[Re: Atmega32 - Pomiar czasu między zboczami narastającymi na]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56970#p56970"><![CDATA[
Faktycznie, mój błąd. Postanowiłem jeszcze raz napisać kod od początku:<br /><br />[syntax=c]#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 />#include &quot;HD44780.c&quot;  <br /> <br />volatile unsigned long int okres;  <br />volatile unsigned int       przepelnienia;  <br />volatile unsigned char      cykl;  <br />volatile unsigned char      koniec_pomiaru;<br />volatile unsigned int       czas1;  <br />volatile unsigned int       czas2;  <br />char  wynik&#91;10&#93;;<br /><br /> <br />ISR(TIMER1_CAPT_vect)<br />{  <br />  <br />static unsigned int zlapany_czas;  <br />zlapany_czas = ICR1;<br />cykl++;  <br />   <br />if(cykl == 1)<br />{  <br />TIFR |= (1&lt;&lt;TOV1);  //zgaś flagę przerwania od przepełnienia  <br />TIMSK |= (1&lt;&lt;TOIE1);//włącz przerwania od przepełnienia Timer1 <br />przepelnienia = 0;  <br />czas1 = zlapany_czas;  <br />} <br />if(cykl ==  2)<br />{  <br />TIMSK &amp;= ~( (1&lt;&lt;TICIE1) | (1&lt;&lt;TOIE1) );  //wyłącz przerwania z Input Capture Unit oraz przepełnienia Timer1    <br />czas2  = zlapany_czas;  <br />koniec_pomiaru  = 1;  <br />}  <br /><br />}  <br /> <br /> <br />ISR(TIMER1_OVF_vect)<br />{  <br /><br />przepelnienia++;  <br /> <br />}  <br /> <br /> <br />void wykonaj_pomiar(void)<br />{  <br /><br />przepelnienia = 0;  <br />cykl = 1;  <br />koniec_pomiaru = 0;  <br />TIMSK |= (1&lt;&lt;TICIE1);  //włącz przerwania z ICP1 Timer1 <br /><br />}  <br /> <br /> <br />int main(void)<br />{  <br />PORTD |= (1&lt;&lt;PD6);<br /><br />LCD_Initalize(); <br />LCD_Clear();  <br /> <br />TCCR1A = 0;  <br />TCCR1B = (1&lt;&lt;CS10);   //preskaler 1  <br /> <br />sei();<br /> <br />wykonaj_pomiar(); <br /> <br />while(1)<br />{  <br />if(koniec_pomiaru==1)<br />{  <br />okres  = 65536 * przepelnienia + (czas2 - czas1); <br /><br />LCD_Clear(); <br />ultoa(okres,wynik,10);  <br />LCD_GoTo(0, 0);  <br />LCD_WriteText(wynik);<br /><br />wykonaj_pomiar();<br />}  <br />}  <br />}[/syntax]<br /><br />Pod port PD6 mam podpięty kontaktron (teraz w fazie testów microswitch). Jedna nóżka jest podpięta do portu PD6, druga do masy. Dodałem do kodu również linię:<br /><br />[syntax=c]PORTD |= (1&lt;&lt;PD6);[/syntax]<br /><br />Jeśli chodzi o kod, to zamieniając linię <br /><br />[syntax=c]okres  = 65536 * przepelnienia + (czas2 - czas1);[/syntax]<br /><br />na<br /><br />[syntax=c]okres  = czas1[/syntax]<br /><br />na wyświetlaczu mam ciągle 0, czyli do zmiennej czas1 nie zapisuje mi się aktualny czas wystąpienia impulsu zapisany w ICR1. Gdy podmienię zmienną na czas2, podczas wystąpienia impulsu wartość zostaje wyświetlona na wyświetlaczu. <br /><br />Postanowiłem wykonać taki test:<br /><br />[syntax=c]while(1)<br />{  <br />if(koniec_pomiaru==1)<br />{  <br />okres  = 65536 * przepelnienia + (czas2 - czas1); <br />okres2 = czas2;<br /><br />LCD_Clear(); <br />ultoa(okres,wynik,10);  <br />LCD_GoTo(0, 0);  <br />LCD_WriteText(wynik);<br />ultoa(okres2,tym,10);<br />LCD_GoTo(0,1);<br />LCD_WriteText(tym);<br /><br />_delay_ms(500);  <br /><br />wykonaj_pomiar();<br />}[/syntax]<br /><br />i obie wartości (wynik oraz tym) pokazują to samo na wyświetlaczu - czyli &quot;czas2&quot;. Widać, że działanie nie wykonuje się. Co zrobić w tej sytuacji?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2032">marrrtyn</a> — 15 lis 2013, o 14:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-11-06T13:49:46+01:00</updated>
<published>2013-11-14T11:38:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56787#p56787</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56787#p56787"/>
<title type="html"><![CDATA[Re: Atmega32 - Pomiar czasu między zboczami narastającymi na]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56787#p56787"><![CDATA[
<span style="color: #BFFFBF">.</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 14 lis 2013, o 11:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marrrtyn]]></name></author>
<updated>2013-11-14T11:11:59+01:00</updated>
<published>2013-11-14T11:11:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56784#p56784</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56784#p56784"/>
<title type="html"><![CDATA[Re: Atmega32 - Pomiar czasu między zboczami narastającymi na]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56784#p56784"><![CDATA[
Nawet jak usunę mnożenie przez 65536, to wynik jest taki sam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2032">marrrtyn</a> — 14 lis 2013, o 11:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-11-06T13:49:23+01:00</updated>
<published>2013-11-14T11:02:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56780#p56780</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56780#p56780"/>
<title type="html"><![CDATA[Re: Atmega32 - Pomiar czasu między zboczami narastającymi na]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56780#p56780"><![CDATA[
<span style="color: #BFFFBF">.</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 14 lis 2013, o 11:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marrrtyn]]></name></author>
<updated>2013-11-14T10:54:55+01:00</updated>
<published>2013-11-14T10:54:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56779#p56779</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56779#p56779"/>
<title type="html"><![CDATA[Re: Atmega32 - Pomiar czasu między zboczami narastającymi na]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56779#p56779"><![CDATA[
Liczba jest cały czas taka sama (w tym przedziale), nie zmienia się gdy występują różne czasy pomiędzy zboczami narastającymi.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2032">marrrtyn</a> — 14 lis 2013, o 10:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xor]]></name></author>
<updated>2015-11-06T13:49:02+01:00</updated>
<published>2013-11-14T10:43:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56777#p56777</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56777#p56777"/>
<title type="html"><![CDATA[Re: Atmega32 - Pomiar czasu między zboczami narastającymi na]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56777#p56777"><![CDATA[
<span style="color: #BFFFBF">.</span><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1774">xor</a> — 14 lis 2013, o 10:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marrrtyn]]></name></author>
<updated>2013-11-14T09:47:35+01:00</updated>
<published>2013-11-14T09:47:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56774#p56774</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56774#p56774"/>
<title type="html"><![CDATA[Re: Atmega32 - Pomiar czasu między zboczami narastającymi na]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56774#p56774"><![CDATA[
Niestety, nie posiadam jeszcze bluebooka. Na pewno go zakupię, gdyż słyszałem wiele pozytywnych opinii na jego temat. Jednak, wracając do kodu przedstawionego przeze mnie - czy ktoś zauważył błąd i może naprowadzić mnie, w którym miejscu jest coś nie tak? Dodam, że kod ma docelowo mierzyć prędkość obrotową w metrach na sekundę, lecz nie mogę prawidłowo wyłapać czasu między dwoma narastającymi zboczami na ICP1.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2032">marrrtyn</a> — 14 lis 2013, o 09:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-11-13T21:41:08+01:00</updated>
<published>2013-11-13T21:41:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56747#p56747</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56747#p56747"/>
<title type="html"><![CDATA[Re: Atmega32 - Pomiar czasu między zboczami narastającymi na]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56747#p56747"><![CDATA[
Jeśli masz Bluebooka: <!-- m --><a class="postlink" href="http://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >http://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><br /><br />to zajrzyj do rozdziału o dekodowaniu RC5 zrealizowanego właśnie na ICP1 ... gdzie robione są pomiary z dokładnością co do mikrosekund<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 13 lis 2013, o 21:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[marrrtyn]]></name></author>
<updated>2013-11-13T20:29:38+01:00</updated>
<published>2013-11-13T20:29:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56731#p56731</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56731#p56731"/>
<title type="html"><![CDATA[Atmega32 - Pomiar czasu między zboczami narastającymi na ICP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=4781&amp;p=56731#p56731"><![CDATA[
Witam.<br /><br />Chciałbym zmierzyć czas pomiędzy dwoma impulsami (stanami wysokimi) występującymi na pinie ICP1. Używam do tego celu timera1 oraz kodu znalezionego w internecie, zmodyfikowanego na własne potrzeby:<br /><br />[syntax=c]#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 />#include &quot;HD44780.h&quot;  <br />  <br />volatile unsigned int czas_miedzy_impulsami;  <br />volatile unsigned int       ilosc_przepelnien;  <br />volatile unsigned char      pomiar_zbocze_nr;  <br />volatile unsigned char      pomiar_gotowy;  <br />  <br />volatile unsigned int       ICR1_moment_A;  <br />volatile unsigned int       ICR1_moment_B;  <br />  <br />char  wynik&#91;10&#93;;        //bufor wyświetlacza  <br />  <br />//------------------------------------------------------  <br />  <br />ISR(TIMER1_CAPT_vect){  <br />  <br /> //Obsługa zdarzenia na ICP1   <br />  <br /> static unsigned int ICR1_aktualny; //wartość ICR1 złapana w aktualnie   <br />                                    //złapanym zboczu  <br />  <br /> //odczytaj złapany stan licznika  <br /> ICR1_aktualny = ICR1;  <br />  <br /> //czy to pierwsze złapane zbocze?  <br /> if(pomiar_zbocze_nr == 1){  <br />    <br />  //tak, pierwsze zbocze pomiarowe,   <br />    <br />  //uruchamiamy zliczanie przepełnień Timer1  <br />  <br />  //zgaś flagę przerwania od przepełnienia  <br />  TIFR |= (1&lt;&lt;TOV1);  <br />    <br />  //włącz przerwania od przepełnienia Timer1  <br />  TIMSK |= (1&lt;&lt;TOIE1);  <br />  <br />  //zeruj licznik przepełnień Timera1  <br />  ilosc_przepelnien = 0;  <br />  <br />  //zapamiętujemy stan licznika początku obrotu (moment A)  <br />  ICR1_moment_A = ICR1_aktualny;  <br />  <br /> }<br /> else<br /> {  <br />      if(pomiar_zbocze_nr ==  2)<br />  {  <br />  //następne (ostatnie) zbocze pomiarowe <br />  <br />  //czyli wykonał się pełny obrót  <br />  <br />   //wyłączamy przerwania z Input Capture Unit   <br />   //oraz przepełnienia Timer1  <br />   TIMSK &amp;= ~( (1&lt;&lt;TICIE1) | (1&lt;&lt;TOIE1) );  <br />     <br />   //zapamiętujemy zmienne dla main()  <br />   ICR1_moment_B  = ICR1_aktualny;  <br />   pomiar_gotowy  = 1;  <br /><br /><br />   }<br /> }  <br />  <br /> //zwiększ licznik wykrytych zboczy  <br /> pomiar_zbocze_nr++;  <br />  <br />}  <br />  <br />//------------------------------------------------------  <br />  <br />ISR(TIMER1_OVF_vect){  <br />  <br /> //powiększ licznik przepełnień Timera1  <br /> ilosc_przepelnien++;  <br />  <br />}  <br />  <br />//------------------------------------------------------  <br />  <br />  <br />void wykonaj_pomiar(void){  <br />  <br /> //Funkcja włącza pomiar   <br />  <br /> //zerujemy licznik przepełnień Timer0  <br /> ilosc_przepelnien = 0;  <br />  <br /> //ustawiamy nr pierwszego zbocza  <br /> pomiar_zbocze_nr = 1;  <br />  <br /> //zerujemy flagę gotowości pomiaru  <br /> pomiar_gotowy = 0;  <br />  <br /> //włącz przerwania z ICP1 Timer1  <br /> TIMSK |= (1&lt;&lt;TICIE1);  <br />  <br />}  <br />  <br />  <br />//------------------------------------------------------  <br />  <br />int main(void){  <br />  <br /> //zmienne do obliczeń  <br />  <br /> LCD_Initalize();       //inicjalizacja LCD i napis początkowy  <br /> LCD_Clear();  <br />  <br /> //Ustawienie Timer1  <br /> TCCR1A = 0;  <br /> TCCR1B = (1&lt;&lt;CS10);   //preskaler 1  <br />   <br /> sei();       //włącz przerwania globalne  <br />  <br /> wykonaj_pomiar();     //włącz pierwszy pomiar  <br />  <br /> //pętla główna <br /> <br /> while(1){  <br />    <br />  if(pomiar_gotowy==1){  <br />     <br />   // gdy pomiar został wykonany  <br />  <br />     <br />   czas_miedzy_impulsami  = 65536 * ilosc_przepelnien + (ICR1_moment_B -ICR1_moment_A); <br />  <br />   //wyświetlenie wyników  <br />  <br />   LCD_Clear(); <br />   itoa(czas_miedzy_impulsami,wynik,10);  <br />   LCD_GoTo(0, 0);  <br />   LCD_WriteText(wynik);  <br />    <br />  <br />   //wykonaj następny pomiar  <br />   wykonaj_pomiar();  <br />  <br />  }  <br /> }  <br />}[/syntax]<br /><br />Według mnie kod powinien działać poprawnie, lecz na wyświetlaczu LCD odświeżana jest przez cały czas liczba z przedziału 322**-322** (nie widać dwóch ostatnich cyfr ze względu na ciągłe odświeżanie). Według mnie jest coś nie tak z funkcją &quot;pomiar gotowy&quot;, ponieważ, gdy w pętli głównej programu ustawię &quot;if (pomiar_gotowy==0)&quot;, wyświetlacz przez cały czas jest pusty. Proszę o pomoc w poprawieniu kodu tak, abym mógł odczytywać na wyświetlaczu czas pomiędzy dwoma impulsami.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2032">marrrtyn</a> — 13 lis 2013, o 20:29</p><hr />
]]></content>
</entry>
</feed>