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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-04-18T14:26:14+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=23&amp;t=2875&amp;mode</id>
<entry>
<author><name><![CDATA[mk94]]></name></author>
<updated>2015-04-18T14:26:14+01:00</updated>
<published>2015-04-18T14:26:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=126846#p126846</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=126846#p126846"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=126846#p126846"><![CDATA[
Witam, napisałem wczoraj kod i nie działa, dopiero teraz znalazłem ten post i zobaczyłem że mam napisane to tak samo jak autor tematu.<br />Mam nadzieję że jeszcze ktoś tu zagląda i może mi coś podpowie.<br /><br />Sprawdzałem wszystko na 1000 sposobów i problem leży w przerwaniu z Tim1. Odkryłem to kiedy wrzuciłem do instrukcji przerwania  PORTD ^= (1&lt;&lt;1); i _delay_ms żeby sprawdzić za pomocą diody czy to przerwanie się wykonuje no i niestety nie. <br /><br />Pacjent Atmega 88P 16 MHz<br />Do sprawdzenia podaję syg z PWM z pinu atmegi albo z zewnętrznego źródła, np czujnik światła generujący impuls prostokątny.<br /><br />Czuję że błąd jest banalny, a ja już się zakręciłem w poszukiwaniu tego.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;lcd/hd44780.h&quot;<br /><br />volatile uint16_t ilosc_impulsow;<br />volatile uint16_t przepelnienia_zegara;<br />volatile uint8_t flaga_zegara;<br />// zmienne do obliczeń<br />volatile int czestotliwosc;<br />volatile int reszta;<br /><br />void timer_init();<br /><br />ISR(TIMER1_OVF_vect)<br />{<br />ilosc_impulsow++;<br />PORTD ^= (1&lt;&lt;1);<br />_delay_ms(200);<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />przepelnienia_zegara++;<br />if (przepelnienia_zegara ==61)   // odmierzanie jednej sekundy<br />{<br />PORTD ^= (1&lt;&lt;0);<br />flaga_zegara = 1;<br />przepelnienia_zegara = 0;<br />}<br />}<br /><br />int main(void)<br />{<br />PORTB |= (1&lt;&lt;0);<br />DDRD  |= (1&lt;&lt;3)|(1&lt;&lt;0)|(1&lt;&lt;1);<br /><br />sei();// włączamy globalny wektor przerwań<br /><br /><br />timer_init();<br />lcd_init();// ustawianie lcd<br />lcd_cls();<br />lcd_locate(0,0);<br />lcd_str(&quot;FREQ F&#91;Hz&#93;&quot;);<br /><br /><br />while(1)<br />{<br />if(flaga_zegara == 1)<br />{<br /><br />TCNT1 = reszta;<br />TCNT1 = 0;<br />czestotliwosc = ilosc_impulsow * 65536;//liczba złapanych impulsów * pojemnosc timera1<br />czestotliwosc = czestotliwosc + reszta;// reszta to wartośc licznika T1 w chwili zrobienia<br />//pomiaru<br /><br />//wyswietlanie wyniku<br />lcd_str(&quot;          &quot;);<br />lcd_locate(1,0);<br />lcd_int(czestotliwosc);<br />lcd_locate(1,7);<br />lcd_int(ilosc_impulsow);<br /><br />flaga_zegara = 0;//zerowanie flagi zegara<br />ilosc_impulsow = 0;<br />//PORTD ^= (1&lt;&lt;1);<br />}<br /><br />}<br /><br />}<br /><br />void timer_init(void)<br />{//Timer do zegara<br />TCCR0B |= (1&lt;&lt;CS00)|(1&lt;&lt;CS02);//Prescaler 1024 Timer0 czyli zegar<br />TIMSK0 |= (1&lt;&lt;TOIE0);//Timer overflow interrupt eneble<br /><br />// licznik<br />TCCR1B |= (1&lt;&lt;CS10)|(1&lt;&lt;CS12)|(1&lt;&lt;CS11)|(1&lt;&lt;ICES1);//wyzwalany z zewnątrz rissing edge Timer 1 licznik impulsow<br />TIMSK1 |= (1&lt;&lt;TOIE1);//Timer/Counter1, Overflow Interrupt Enable<br /><br /><br />//Timer do PWM<br />TCCR2A |= (1&lt;&lt;WGM21)|(1&lt;&lt;WGM20)|(1&lt;&lt;COM2B1)|(1&lt;&lt;COM2B0);<br />TCCR2B |= (1&lt;&lt;CS22); //Prescaler 64<br />OCR2B  = 50;<br />}[/syntax]<br /><br />Czekam na krytykę i podpowiedzi.<br />Pozdrawiam serdecznie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8267">mk94</a> — 18 kwi 2015, o 14:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janeczqu]]></name></author>
<updated>2013-05-02T10:12:25+01:00</updated>
<published>2013-05-02T10:12:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=35865#p35865</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=35865#p35865"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=35865#p35865"><![CDATA[
<div class="quotetitle">matisek1233 napisał(a):</div><div class="quotecontent"><br />karte do klocka<br /></div> <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><br /><br />Przez głośniki aktywne ustawione na maxa- z wyjścia na słuchawki poprzez rezystor 470R i dwie diody jedna do masy druga do Vcc.<br /><br />Przy testowaniu kwarców generator był zrealizowany na bramce NAND 4093 plus pozostałe jako bufor- przy zasilaniu takim jak procesor &quot;po drodze&quot; już nic nie  wstawiałem.<br /><br /><br />Co ciekawe, przy kwarcu 4,000 wynik na wyświetlaczu to 3,998 czyli błąd procentowy na poziomie 0,05% <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=823">janeczqu</a> — 2 maja 2013, o 10:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matisek1233]]></name></author>
<updated>2013-05-02T08:49:25+01:00</updated>
<published>2013-05-02T08:49:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=35859#p35859</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=35859#p35859"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=35859#p35859"><![CDATA[
w jaki sposob podlaczyles karte do klocka?? tzn.. w jaki sposob wzmocniles sygnal??<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=945">matisek1233</a> — 2 maja 2013, o 08:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janeczqu]]></name></author>
<updated>2013-04-17T18:53:13+01:00</updated>
<published>2013-04-17T18:53:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34556#p34556</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34556#p34556"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34556#p34556"><![CDATA[
[syntax=c]/*<br /> * main1.c<br /> *<br /> *  Created on: 2013-04-16<br /> *       Autor: janeczqu<br /> *v3 <br /> *lcd 2x16<br /> */<br />    #include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;lcd44780.h&quot;<br /><br />volatile uint16_t licznik ;        //liczba przepełnień Timera1<br />volatile uint16_t reszta ;//reszta impulsów przed przepełnieniem Timera1 =1;<br />volatile uint32_t czestotliwosc ;//mierzona czestotliwosc<br />volatile uint8_t przepelnienie =61;    //liczba przerwań Timera0 w ciągu 1s<br />volatile uint8_t sekunda_flaga;<br /><br />volatile uint16_t tysiace;<br />volatile uint16_t jednosci;<br />volatile uint8_t zakres;<br /><br />int main(void)<br />{<br />DDRB &amp;= ~(1&lt;&lt;PB1);<br />PORTB |= (1&lt;&lt;PB1);    //PB1  wejście podciagnięte do plusa<br /><br />     //Timer0  zegar<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);   // preskaler = 1024<br />TIMSK |= (1&lt;&lt;TOIE0) | (1&lt;&lt;TOIE1); //przerwanie na przepełnienie<br /><br />//Timer1  licznik<br />TCCR1B |= (1&lt;&lt; CS12) |(1&lt;&lt; CS11);  //zrodło zewnętrzne - zbocze opadające<br />TIMSK |= (1&lt;&lt;TOIE1);                     //przepełnienie<br /><br />        lcd_init();          //inicjacja<br />lcd_cls();   //czyszczeine<br />lcd_locate(0,0);<br />lcd_str(&quot;Miernik&quot;);   <br />lcd_locate(1,2);<br />lcd_str(&quot;czestotliwosci&quot;);    //miejsce na reklame ;)<br />_delay_ms(1000);<br />lcd_locate (0,0);<br />lcd_str(&quot;F-meter&quot;);<br />lcd_locate (1,0);<br />lcd_str(&quot;F=              &quot;);<br /><br />sei();  //wlaczenie przerwan<br /><br />    while(1)<br />{<br />if (sekunda_flaga==1)<br />{<br />sekunda_flaga=0;<br />reszta = TCNT1; //pobieranie wartości z licznika<br />TCNT1=0; //zerowanie licznika<br />czestotliwosc = licznik * 65536;                      //liczba przepełnień Timera1* pojemność Timera1<br />czestotliwosc = czestotliwosc + reszta;         //obliczam częstotliwosc<br />licznik = 0;<br />lcd_locate (1,0);<br />lcd_str(&quot;                &quot;);<br />if (czestotliwosc&lt;=1000)<br />{<br />lcd_locate (1,0);<br />lcd_str(&quot;F=&quot;);<br />lcd_int(czestotliwosc);<br />lcd_str(&quot;Hz&quot;);<br />}<br />else<br />{<br />if (czestotliwosc&gt;100000)<br />{<br />czestotliwosc=czestotliwosc/1000;<br />zakres=1;<br />}<br />else zakres=0;<br />tysiace=czestotliwosc/1000;<br />jednosci=czestotliwosc%1000;<br /><br />lcd_locate (1,0);<br />lcd_str(&quot;F=&quot;);<br />lcd_int(tysiace);<br />lcd_str(&quot;,&quot;);<br />if (jednosci&lt;100)<br />lcd_str(&quot;0&quot;);<br />if (jednosci&lt;10)<br />lcd_str(&quot;0&quot;);<br />lcd_int(jednosci);<br />if (zakres==0)<br />{<br />lcd_str(&quot;kHz&quot;);<br />}<br />else<br />{<br />lcd_str(&quot;MHz&quot;);<br />}<br />}<br />}<br /><br />}<br />}<br />ISR(TIMER0_OVF_vect)    //odmierzanie 1 sek<br />{<br />przepelnienie--;<br />if (przepelnienie == 0)<br />{<br />sekunda_flaga=1;<br />przepelnienie = 61;<br />}<br />}<br />ISR(TIMER1_OVF_vect)<br />{<br />licznik++;<br />}[/syntax]<br /><br /><br />Po poprawkach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=823">janeczqu</a> — 17 kwi 2013, o 18:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janeczqu]]></name></author>
<updated>2013-04-16T20:58:15+01:00</updated>
<published>2013-04-16T20:58:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34507#p34507</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34507#p34507"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34507#p34507"><![CDATA[
<div class="quotetitle">gufim napisał(a):</div><div class="quotecontent"><br />akbyś troche rozszeżył możliwości biblioteki od wyświetlacza i dopisał sobie funkcje wyświetlającą uint32_t było by O.K<br /></div> to jeszcze nie mój lvl -próbowałem ale na razie odpuszczam, zrobię to w inny sposób, nawet czytelność się zwiększy <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Ale to zapewne jutro dopiero ujrzy światło dzienne .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=823">janeczqu</a> — 16 kwi 2013, o 20:58</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gufim]]></name></author>
<updated>2013-04-16T20:43:26+01:00</updated>
<published>2013-04-16T20:43:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34505#p34505</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34505#p34505"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34505#p34505"><![CDATA[
Nie ma sprawy myśle że jakbyś troche rozszeżył możliwości biblioteki od wyświetlacza i dopisał sobie funkcje wyświetlającą uint32_t było by O.K co się może przydać w przyszłości .<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=126">gufim</a> — 16 kwi 2013, o 20:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janeczqu]]></name></author>
<updated>2013-04-16T20:36:01+01:00</updated>
<published>2013-04-16T20:36:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34503#p34503</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34503#p34503"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34503#p34503"><![CDATA[
<img src="https://forum.atnel.pl/images/smilies/icon_redface.gif" alt=":oops:" title="Zawstydzony" /> masz rację- tak to jest jak się nie przetestuje wszystkich parametrów...<br /><br />Dzięki za zwrócenie na to uwagi, popracuję nad tym <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=823">janeczqu</a> — 16 kwi 2013, o 20:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[gufim]]></name></author>
<updated>2013-04-16T19:50:34+01:00</updated>
<published>2013-04-16T19:50:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34492#p34492</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34492#p34492"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34492#p34492"><![CDATA[
Witam chcialbym coś wtracić jeśli mogę , z tego co zuważyłem masz zadeklarowane<br />[syntax=c]volatile uint32_t czestotliwosc ;               //mierzona czestotliwosc[/syntax]<br />a wyświetlasz funkcją<br />[syntax=c]lcd_int(czestotliwosc);[/syntax]<br />i tak chyba mi sie wydaje że coś tu nie tak jest gdyż uint32_t to troche wiecej niż int chyba że się myle.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=126">gufim</a> — 16 kwi 2013, o 19:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Domanoid]]></name></author>
<updated>2013-04-16T08:40:31+01:00</updated>
<published>2013-04-16T08:40:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34428#p34428</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34428#p34428"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34428#p34428"><![CDATA[
Zauważ, że jednak większość ma wyświetlacze 2x16. Tutaj zastosowałeś wyświetlacz z 4 liniami, ale jak ktoś będzie chciał zrobić to na mniejszym wyświetlaczu? Musi przerobić kod <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Możesz dodać kilka linijek aby program był bardziej uniwersalny. Np. tak:<br />[syntax=c]// Zakomentuj wyświetlacz którego nie posiadasz:<br />//#define WYSW_2X16<br />#define WYSW 4X20<br /><br />#ifdef WYSW_2X16<br />... kod obsługujący wyświetlacz 2x16<br />#else<br />... kod obsługujący większy wyświetlacz<br />#endif[/syntax]<br /><br />Ale to już rozwinięcie programu. Do tego co jest teraz nie mam więcej zastrzeżeń.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=750">Domanoid</a> — 16 kwi 2013, o 08:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janeczqu]]></name></author>
<updated>2013-04-16T08:11:05+01:00</updated>
<published>2013-04-16T08:11:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34427#p34427</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34427#p34427"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34427#p34427"><![CDATA[
Wersja poprawiona:<br />[syntax=c]*<br /> * main1.c<br /> *<br /> *  Created on: 2013-04-16<br /> *       Autor: janeczqu<br /> *v2<br /> */<br />    #include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;lcd44780.h&quot;<br /><br />volatile uint16_t licznik ;    //liczba przepełnień Timera1<br />volatile uint16_t reszta ;//reszta impulsów przed przepełnieniem Timera1 =1;<br />volatile uint32_t czestotliwosc ;//mierzona czestotliwosc<br />volatile uint8_t przepelnienie =61;    //liczba przerwań Timera0 w ciągu 1s<br />volatile uint8_t sekunda_flaga;<br />int main(void)<br />{<br />DDRB &amp;= ~(1&lt;&lt;PB1);<br />PORTB |= (1&lt;&lt;PB1);//PB1  wejście podciagnięte do plusa<br /><br />     //Timer0  zegar<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);    // preskaler = 1024<br />TIMSK |= (1&lt;&lt;TOIE0) | (1&lt;&lt;TOIE1);   //przerwanie na przepełnienie<br /><br />//Timer1  licznik<br />TCCR1B |= (1&lt;&lt; CS12) |(1&lt;&lt; CS11);       //zrodło zewnętrzne - zbocze opadające<br />TIMSK |= (1&lt;&lt;TOIE1);                    //przepełnienie<br />sei();//wlaczenie przerwan<br /><br />lcd_init();//inicjacja<br />lcd_cls();//czyszczeine<br />lcd_locate(0,0);<br />lcd_str(&quot;Miernik&quot;);//&quot;oprawa graficzna ;)<br />lcd_locate(1,2);<br />lcd_str(&quot;czestotliwosci&quot;);<br />lcd_locate(2,0);<br />lcd_str(&quot; janeczqu Atnel &quot;);<br />lcd_locate(3,0);<br />lcd_str (&quot;F&#91;Hz&#93;=&quot;);<br />    while(1)<br />{<br />if (sekunda_flaga==1)<br />{<br />reszta = TCNT1; //pobieranie wartości z licznika<br />TCNT1=0; //zerowanie licznika<br />czestotliwosc = licznik * 65536;     //liczba przepełnień Timera1* pojemność Timera1<br />czestotliwosc = czestotliwosc + reszta;//obliczam częstotliwosc<br />licznik = 0;<br />lcd_locate(3,6);<br />lcd_str(&quot;          &quot;);//wymazywanie wczesniejszego wyniku<br />lcd_locate(3,6);<br />lcd_int(czestotliwosc);<br />sekunda_flaga=0;<br />}<br /><br />}<br />}<br />ISR(TIMER0_OVF_vect)    //odmierzanie 1 sek<br />{<br />przepelnienie--;<br />if (przepelnienie == 0)<br />{<br />sekunda_flaga=1;<br />przepelnienie = 61;<br />}<br />}<br />ISR(TIMER1_OVF_vect)<br />{<br />licznik++;<br />}[/syntax]<br /><br />To mnie Mirku zabiłeś z tymi włączeniami i wyłączeniami przerwań <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Nie miałem o tym pojęcia nawet. <br />Inne rzeczy też poprawiłem- teraz będę walczył z bardziej &quot;ludzkim&quot; wyświetlaniem częstotliwości.<br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />na zakończenie - to co napisałem, to nie żadna tam jakaś kocia krytyka, tylko takie hinty (podpowiedzi) z mojej strony - mam nadzieję, że w jakimś stopniu przydadzą się, i życzę powodzenia w dalszym kodowaniu<br /></div><br />Ależ nawet konstruktywna krytyka jest mile widziana, a uwagi &quot;wklepuję&quot; w elementarz <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=823">janeczqu</a> — 16 kwi 2013, o 08:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2013-04-16T06:40:57+01:00</updated>
<published>2013-04-16T06:40:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34423#p34423</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34423#p34423"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34423#p34423"><![CDATA[
janeczqu --&gt; takie uwagi:<br /><br />1. wyłączenie przerwań cli(); PODCZAS rozpoczęcia procedury obsługi przerwania jest ZAWSZE robione automatycznie przez procesor AVR - a zatem nie rób tego w kodzie przerwania<br /><br />2. włączenie przerwań sei(); na zakończenie procedury obsługi przerwania jest robione AUTOMATYCZNIE przez procesor, więc tego też nie rób w kodzie przerwania. Przy czym o ile powyższe cli(); z pkt.1 akurat niczemu nie zaszkodzi - ot po prostu zbędny rozkaz, to już twój sei() pod koniec przerwania może czasem przynieść sieczkę w niektórych programach, płacz i zgrzytanie zębów - ponieważ odpalasz sei() przed epilogiem przerwania. Musisz bowiem pamiętać że makro przerwania ISR() wygląda mniej więcej tak<br /><br />[syntax=c]ISR( vect ) {<br />//..... prolog ......<br /><br />// .... twój kod obsł. przerwania<br /><br />// .... epilog .......<br />}[/syntax]<br /><br />przy czym prolog i epilog składający się z rozkazów push i pop w asemblerze dodaje sam kompilator, a więc widzisz teraz że twoje sei() odpala się przez epilogiem i może narazić np stos procka na pokrębasienie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 3 minutach ]</span></strong><br /><br />kolejna rzecz, zmiennych globalnych nigdy nie inicjalizuje się ZEREM jak to robisz<br /><br />[syntax=c]volatile uint16_t licznik =0;                   //liczba przepełnień Timera1<br />        volatile uint16_t reszta =0;                    //reszta impulsów przed przepełnieniem Timera1 =1;<br />        volatile uint32_t czestotliwosc =0;             //mierzona czestotliwosc[/syntax]<br /><br />zapamiętaj sobie po prostu, że one ZAWSZE są zerowane automatycznie przez kompilator. Czyli oczywiście to że zrobiłeś = 0 przy każdej z nich - nic nie zaszkodzi ale tak na prawdę jest ZUPEŁNIE niepotrzebne. Dopiero gdy potrzebujesz inicjalizować inną wartością niż zero - tak jak ostatnia ze zmiennych globalnych = 61 - wtedy jest OK<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 7 minutach ]</span></strong><br /><br />Następna uwaga, po RESECIE procka WSZYSTKIE piny są WEJŚCIAMI ponieważ rejestry DDRx są wyzerowane, a zatem pisanie takiej linii nie jest konieczne:<br /><br />[syntax=c]DDRB &amp;= ~(1&lt;&lt;PB1);[/syntax]<br /><br />ale oczywiście to tylko informacyjnie bo nie wpływa to na jakieś złe działanie programu, ot po prostu niepotrzebnie zajęta pamięć FLASH. Chociaż dla porządku jak się zaczyna programować może być - ale ja często wtedy też komentuję sobie taką linię<br /><br />[syntax=c]//DDRB &amp;= ~(1&lt;&lt;PB1);[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 11 minutach ]</span></strong><br /><br />na koniec, ZDECYDOWANIE ale to ZDECYDOWANIE - nigdy nie używaj jakichkolwiek poleceń do obsługi LCD w jakimkolwiek przerwaniu. To mniej więcej tak samo jakbyś użył tam _delay_ms(). Pamiętaj obsługa LCD jest bardzo powolna .... i tak jak podpowiadał ci już kolega wyżej można było po prostu zamiast tego bloku poleceń<br /><br />[syntax=c]lcd_locate(3,6);<br />                        lcd_str(&quot;          &quot;);                                   //wymazywanie wczesniejszego wyniku<br />                        lcd_locate(3,6);<br />                        lcd_int(czestotliwosc);[/syntax]<br /><br />ustawić po prostu jakąś zmienną globalną (flagę), np:<br /><br />[syntax=c]display_flag=1;[/syntax]<br /><br />natomiast w pętli nieskończonej while(1) w funkcji main dać:<br /><br />[syntax=c]if( display_flag ) {<br /><br />                        lcd_locate(3,6);<br />                        lcd_str(&quot;          &quot;);                                   //wymazywanie wczesniejszego wyniku<br />                        lcd_locate(3,6);<br />                        lcd_int(czestotliwosc);<br /><br />   display_flag=0;<br />}[/syntax]<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 13 minutach ]</span></strong><br /><br />na zakończenie - to co napisałem, to nie żadna tam jakaś kocia krytyka, tylko takie hinty (podpowiedzi) z mojej strony - mam nadzieję, że w jakimś stopniu przydadzą się, i życzę powodzenia w dalszym kodowaniu <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=54">mirekk36</a> — 16 kwi 2013, o 06:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janeczqu]]></name></author>
<updated>2013-04-15T23:38:59+01:00</updated>
<published>2013-04-15T23:38:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34420#p34420</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34420#p34420"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34420#p34420"><![CDATA[
Pomysł godny zastanowienia z tą flagą <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />To pierwsza wersja, zapewne będzie ewoluowała. Jak na razie oprócz generatora na PC nie mam jak sprawdzić pomiarów, jutro pewnie jakiś kwarcowy na czas testów zbuduję i zobaczę jak z dokładnością.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=823">janeczqu</a> — 15 kwi 2013, o 23:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[swierku]]></name></author>
<updated>2013-04-15T20:48:55+01:00</updated>
<published>2013-04-15T20:48:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34407#p34407</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34407#p34407"/>
<title type="html"><![CDATA[Re: Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34407#p34407"><![CDATA[
witam!<br /><br />pomysł fajny, przejrzałem i sam napisałem podobny. To co zmieniłem i mogę się doczepić to wrzucenie wszystkiego w przerwanie, głownie obsługi wyświetlacza. rozumiem że po to wyłączasz przerwania, żeby nic nie zakłóciło wykonywania tego jednego:) tylko mam wtedy wrażenie, może źle myślę, że na czas wyłączenia przerwań do obsługi lcd itp. uC nie liczy kolejnych impulsów i wynik może być nieprawidłowy. Ja osobiście w przerwaniu od timera0 bym tylko ustawiał flagę sprawdzaną w pętli głównej<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=864">swierku</a> — 15 kwi 2013, o 20:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[janeczqu]]></name></author>
<updated>2013-04-15T12:51:07+01:00</updated>
<published>2013-04-15T12:51:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34355#p34355</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34355#p34355"/>
<title type="html"><![CDATA[Prosty miernik częstotliwości]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2875&amp;p=34355#p34355"><![CDATA[
Witajcie;<br />To mój pierwszy post w tym dziale wiec proszę o wyrozumiałość <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br />Poniżej przedstawiam program napisany wczoraj- pierwsze testy wykazały poprawny pomiar do  20kHz (generator -program na  PC wyjście karta dźwiękowa).<br />Zachęcam do komentowania jak i testowania, program napisany dla M32, 16MHz- reszta w komentarzach <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />[syntax=c]/*<br /> * main1.c<br /> *<br /> *  Created on: 2013-04-14  Buszkolandia<br /> *       Autor: janeczqu<br /> *<br /> */<br />        #include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;lcd44780.h&quot;<br /><br />volatile uint16_t licznik =0;    //liczba przepełnień Timera1<br />volatile uint16_t reszta =0;//reszta impulsów przed przepełnieniem Timera1 =1;<br />volatile uint32_t czestotliwosc =0;   //mierzona czestotliwosc<br />volatile uint8_t przepelnienie =61;    //liczba przerwań Timera0 w ciągu 1s<br /><br />int main(void)<br />{<br />DDRB &amp;= ~(1&lt;&lt;PB1);           //PB1  wejście podciagnięte do plusa<br />PORTB |= (1&lt;&lt;PB1);<br /><br />     //Timer0  zegar<br />TCCR0 |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);    //preskaler = 1024<br />TIMSK |= (1&lt;&lt;TOIE0) | (1&lt;&lt;TOIE1);    //przerwanie na przepełnienie<br /><br />//Timer1  licznik<br />TCCR1B |= (1&lt;&lt; CS12) |(1&lt;&lt; CS11);          //zrodło zewnętrzne - zbocze opadające<br />TIMSK |= (1&lt;&lt;TOIE1);                             //przepełnienie<br />sei();   //wlaczenie przerwan<br /><br />lcd_init();    //inicjacja<br />lcd_cls();   //czyszczeine<br />lcd_locate(0,0);<br />lcd_str(&quot;Miernik&quot;);          //&quot;oprawa graficzna ;)<br />lcd_locate(1,2);<br />lcd_str(&quot;czestotliwosci&quot;);<br />lcd_locate(2,0);<br />lcd_str(&quot; janeczqu Atnel &quot;);<br />lcd_locate(3,0);<br />lcd_str (&quot;F&#91;Hz&#93;=&quot;);<br />    while(1)<br />{<br />lcd_locate(3,6);<br />}<br />}<br />ISR(TIMER0_OVF_vect)                 //odmierzanie 1 sek<br />{<br />przepelnienie--;<br />if (przepelnienie == 0)<br />{<br />cli(); //zatrzymanie przerwań na czas obliczen i wyswietlania<br />reszta = TCNT1; //pobieranie wartości z licznika<br />TCNT1=0; //zerowanie licznika<br />czestotliwosc = licznik * 65536;                       //liczba przepełnień Timera1* pojemność Timera1<br />czestotliwosc = czestotliwosc + reszta;         //obliczanie częstotliwosci<br />licznik = 0;<br />przepelnienie = 61;<br />lcd_locate(3,6);<br />lcd_str(&quot;          &quot;);         //wymazywanie wczesniejszego wyniku<br />lcd_locate(3,6);<br />lcd_int(czestotliwosc);<br />sei();         //wlaczenie przerwan<br />}<br />}<br />ISR(TIMER1_OVF_vect)<br />{<br />licznik++;<br />}[/syntax]<br /><br /><br /><br />Rozjechały się komentarze :/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=823">janeczqu</a> — 15 kwi 2013, o 12:51</p><hr />
]]></content>
</entry>
</feed>