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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-01-13T21:22:53+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=17277&amp;mode</id>
<entry>
<author><name><![CDATA[radeksss]]></name></author>
<updated>2017-01-13T21:22:53+01:00</updated>
<published>2017-01-13T21:22:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179795#p179795</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179795#p179795"/>
<title type="html"><![CDATA[Re: Licznik czasu - problem z dokładnością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179795#p179795"><![CDATA[
Wyszło mi coś takiego i wszystko już wydaję się okej  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />  Co do częstego wysyłania zmiennych na wyświetlacz to już tak musi zostać, jest to zachcianka mojego promotora <br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />volatile uint8_t ms; // zadeklarowanie zmiennej ms odpowiadającej milisekundom<br />volatile uint8_t s; // zadeklarowanie zmiennej s odpowiadającej sekundom<br />volatile uint8_t start; // zmienna sprawdzająca stan ADC<br /><br />uint16_t pomiar(uint8_t kanal); // deklaracja funkcji pomiaru<br /><br />int main(void)<br />{<br />  DDRD &amp;= ~(1&lt;&lt;PD2); //ustawienia dla potrzeb przerwania INT0<br />  PORTD |= (1&lt;&lt;PD2);<br />// inicjalizacja timera<br /> TCCR1B |= (1 &lt;&lt; WGM12); // Ustawia timer w tryb CTC<br />OCR1A = 1249;// Ustawia wartość pożądaną do rejestru 0CR1A dla 0.01s<br />TCCR1B |= ((1 &lt;&lt; CS10) | (1 &lt;&lt; CS11)); // Ustawia timer z preskalerem Fcpu/64<br />TIMSK |= (1 &lt;&lt; OCIE1A);<br /><br />// inicjalizacja przerwania INT0<br />GICR |= (1 &lt;&lt; INT0); // przerwanie zewnętrzne INT0<br /><br />// inicjalizacja ADC<br />ADCSRA |= (1&lt;&lt;ADEN); // włącz ADC<br />ADCSRA |= (1&lt;&lt;ADPS2); // | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS0);  // preskaler = 128<br /><br />ADMUX = (1&lt;&lt;REFS0); // napięcie referencyjne VCC<br /><br />s=0;<br /><br />lcd_init(); //inicjacja wyświetlacza<br />lcd_cls(); //czyszczenie wyświetlacza<br /><br /><br />sei(); // Zezwolenie globalne na przerwania<br />        //pętla główna programu<br />while(1){<br />//wyświetlanie wyniku<br />lcd_locate(0,0);<br />lcd_str(&quot;POMIAR CZASU:&quot;);<br />            lcd_locate(1,1);<br />if( s &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(s);<br />lcd_str(&quot; &quot;);<br />lcd_locate(1,5);<br />lcd_str(&quot;:&quot;);<br />lcd_locate(1,7);<br />if( ms &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(ms);<br />lcd_str(&quot; &quot;);<br /><br />                uint16_t wynik = 0;          //Zmienna lokalna<br />                wynik = pomiar(PA7);<br /><br /><br />                if (wynik &gt; 514)<br />                {                    //Jeżeli napięcie ADC jest większe od 2,45<br />                start = start+2;<br />                }<br />                      _delay_us(1);<br />        }<br />}<br /><br />uint16_t pomiar(uint8_t kanal){<br /><br />        ADMUX = (ADMUX &amp; 0b11111000) | kanal;<br /><br />        ADCSRA |= (1&lt;&lt;ADSC);                            //Start konwersji<br /><br />        while(ADCSRA &amp; (1&lt;&lt;ADSC));<br /><br />        return ADCW;<br />}<br /><br />ISR(TIMER1_COMPA_vect)<br />{<br />if(start &gt;= 1){<br />ms++;<br />if(ms==100){<br />ms = 0;<br />s++;<br />if(s==60)<br />{<br /> s = 0;<br /> ms = 0;<br />}<br />}<br />}<br />}<br />ISR(INT0_vect)<br />{<br />TCCR1B &amp;= ~((1 &lt;&lt; CS10) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS12)); // wyłączenie sygnału taktującego zwarciem do GND<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15439">radeksss</a> — 13 sty 2017, o 21:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wonsz]]></name></author>
<updated>2017-01-09T00:17:01+01:00</updated>
<published>2017-01-09T00:17:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179439#p179439</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179439#p179439"/>
<title type="html"><![CDATA[Re: Licznik czasu - problem z dokładnością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179439#p179439"><![CDATA[
Polecałbym sprawdzać co przerwanie czy wynik adc &gt; 512 i jeśli tak to inkrementujesz jakaś zmienną wewnątrz przerwania jeśli zbocze na int0 sie pojawi to przypisujesz ta wewnętrzną inkrwmentowana zmienną do zewnetrznej jakiejś na przykład czas. A żeby ja wyświetlić to mnożysz przez to co jaki czas jest przerwanie. Jeśli coś niezrozumiałe pisz. Mądrzejsi poprawcie. Peace  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br />Wysłane z mojego GT-I9301I przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2311">wonsz</a> — 9 sty 2017, o 00:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[43kuku]]></name></author>
<updated>2017-01-08T23:04:00+01:00</updated>
<published>2017-01-08T23:04:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179432#p179432</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179432#p179432"/>
<title type="html"><![CDATA[Re: Licznik czasu - problem z dokładnością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179432#p179432"><![CDATA[
Po co tak często wysyłasz dane na wyświetlacz?<br />Zmieniających się ms ciężko obserwować, zwłaszcza na lcd.<br />Nie lepiej byłoby gdybyś zerował timer w przerwaniu, bo na moje zerowanie w pętli jest problemem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3190">43kuku</a> — 8 sty 2017, o 23:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[radeksss]]></name></author>
<updated>2017-01-08T20:39:44+01:00</updated>
<published>2017-01-08T20:39:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179420#p179420</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179420#p179420"/>
<title type="html"><![CDATA[Licznik czasu - problem z dokładnością]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=17277&amp;p=179420#p179420"><![CDATA[
Witam, mam problem z dokładnością licznika czasu. Licznik ma mierzyć czas pomiędzy pojawieniem się napięcia większego od 512 na pinie PA7 a pojawieniem się zbocza narastającego na INT0. Licznik zlicza setne sekundy i sekundy. Późni się około 10 sekund na minutę. Korzystam z Atmegi32 o taktowaniu 8MHz. Wynik wyświetlam na wyświetlaczu. Napiecię na pin PA7 pobieram z czujnika ACS712. Jestem początkujący w programowaniu i myślę że to napisany przeze mnie kod jest przyczyną niedokładności  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />volatile uint8_t ms; // zadeklarowanie zmiennej ms odpowiadającej setnym sekundom<br />volatile uint8_t s; // zadeklarowanie zmiennej s odpowiadającej sekundom<br /><br />uint16_t pomiar(uint8_t kanal); // deklaracja funkcji pomiaru<br /><br />int main(void)<br />{<br />// inicjalizacja timera<br /> TCCR1B |= (1 &lt;&lt; WGM12); // Ustawia timer w tryb CTC<br />OCR1A = 1249;// Ustawia wartość pożądaną do rejestru 0CR1A dla 0.01s<br />TCCR1B |= ((1 &lt;&lt; CS10) | (1 &lt;&lt; CS11)); // Ustawia timer z preskalerem Fcpu/64<br /><br />// inicjalizacja przerwania INT0<br />GICR |= (1 &lt;&lt; INT0); // przerwanie zewnętrzne INT0<br />MCUCR |= ((1 &lt;&lt; ISC01) | (1 &lt;&lt; ISC00)); // przerwanie zboczem narastającym<br /><br />// inicjalizacja ADC<br />ADCSRA |= (1&lt;&lt;ADEN); // włącz ADC<br />ADCSRA |= (1&lt;&lt;ADPS2); // | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS0);  // preskaler = 128<br /><br />ADMUX = (1&lt;&lt;REFS0); // napięcie referencyjne VCC<br /><br />s=0;<br /><br />lcd_init(); //inicjacja wyświetlacza<br />lcd_cls(); //czyszczenie wyświetlacza<br /><br /><br />sei(); // Zezwolenie globalne na przerwania<br />        //pętla główna programu<br />while(1){<br />//wyświetlanie wyniku<br />lcd_locate(0,0);<br />lcd_str(&quot;POMIAR CZASU:&quot;);<br />            lcd_locate(1,1);<br />if( s &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(s);<br />lcd_str(&quot; &quot;);<br />lcd_locate(1,5);<br />lcd_str(&quot;:&quot;);<br />lcd_locate(1,7);<br />if( ms &lt; 10 ) lcd_str(&quot;0&quot;);<br />lcd_int(ms);<br />lcd_str(&quot; &quot;);<br /><br />                uint16_t wynik = 0;          //Zmienna lokalna<br />                wynik = pomiar(PA7);<br /><br /><br />                if (wynik &gt; 512)<br />                {                    //Jeżeli napięcie ADC jest większe od 2,45<br /><br />                if (TIFR &amp; (1 &lt;&lt; OCF1A))<br />                {<br />                ms++;<br />                TIFR = (1 &lt;&lt; OCF1A); // Wyzerowanie flagi CTC poprzez wpisanie do niej jedynki<br />                if(ms==100){<br />                ms=0;<br />                s++;<br />                if(s==60){<br />                ms=0;<br />                s=0;<br />                }<br />                }<br />                }<br />                }<br /><br />                      _delay_us(1);<br /><br />        }<br />}<br /><br />uint16_t pomiar(uint8_t kanal){<br /><br />        ADMUX = (ADMUX &amp; 0b11111000) | kanal;<br /><br />        ADCSRA |= (1&lt;&lt;ADSC);                            //Start konwersji<br /><br />        while(ADCSRA &amp; (1&lt;&lt;ADSC));<br /><br />        return ADCW;<br />}<br /><br />ISR(INT0_vect)<br />{<br />TCCR1B &amp;= ~((1 &lt;&lt; CS10) | (1 &lt;&lt; CS11) | (1 &lt;&lt; CS12)); // wyłączenie sygnału taktującego<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=15439">radeksss</a> — 8 sty 2017, o 20:39</p><hr />
]]></content>
</entry>
</feed>