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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=10010&amp;mode</id>
<entry>
<author><name><![CDATA[komandorebombardiero]]></name></author>
<updated>2015-01-04T13:00:16+01:00</updated>
<published>2015-01-04T13:00:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10010&amp;p=112182#p112182</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10010&amp;p=112182#p112182"/>
<title type="html"><![CDATA[Re: Zliczanie impulsów z czujnika koloru - proszę o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10010&amp;p=112182#p112182"><![CDATA[
Zadeklarowałem zmienne jako volatile i program zaczął działać. Częstotliwość taktowania zmienię niebawem, ponieważ używałem WinAVR i nie wiem jak tam się przestawia częstotliwość. Spróbuję przerzucić się na środowisko Eclipse i tam zmienić tą częstotliwość w ustawieniach projektu. Mam nadzieję, że obędzie się bez większych problemów - używam programatora typu usbasp. Bardzo dziękuję za pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Planuję później móc dokładnie zmierzyć natężenie składowej RGB danej barwy, dlatego też chciałbym wiedzieć czy w jednym cyklu czujnik zliczy maksymalnie 4096 impulsów, tak jak napisałem w pierwszym poście (0 impulsów -&gt; G (lub R, B) = 0 ; 4096 impulsów --&gt; G = 255)? Aktualnie próbuję zapalać i gasić diodę w zależności od przyłożonej do czujnika barwy. Według tych obliczeń, np. chcąc zapalać diodę przy wykrytej barwie o składowej zielonej &gt;50%, czujnik powinien zliczyć min. 2048 impulsów. Jednak teraz np. aby dioda zapalała się przy przyłożeniu białej, bądź zielonej kartki do czujnika, wystarczy, że czujnik zliczy kilkaset impulsów (np. 200, 300), natomiast przy wpisaniu wartości ok. 2000 układ w ogóle nie reaguje. Zastanawiam się czy moje obliczenia są błędne, czy układ działa tak, ze względu na źle ustawioną częstotliwość taktowania (sprawdzę niebawem), czy też w programie są jeszcze jakieś błędy.<br /><br />EDIT: Pracuję teraz na Eclipse Luna - zgodnie z poradnikiem z yt: &quot;AVR jak zacząć z Eclipse LUNA &quot;. Częstotliwość została ustawiona na 8MHz. Program działa tak samo - czujnik reaguje, gdy liczba zliczonych impulsów w cyklu zanim nastąpi przepełnienie wynosi kilkaset. Ponawiam zatem pytanie - czy program posiada jeszcze jakieś błędy, czy też mój tok rozumowania w wyliczaniu max. liczby impulsów w cyklu jest zły?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7605">komandorebombardiero</a> — 4 sty 2015, o 13:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zaba]]></name></author>
<updated>2015-01-03T18:04:56+01:00</updated>
<published>2015-01-03T18:04:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10010&amp;p=112012#p112012</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10010&amp;p=112012#p112012"/>
<title type="html"><![CDATA[Re: Zliczanie impulsów z czujnika koloru - proszę o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10010&amp;p=112012#p112012"><![CDATA[
dwie rzeczy które zauważyłem<br /><br />1.wyrzuć z kodu #define F_CPU<br />częstotliwość ustaw w właściwościach projektu<br /><br />2.Zmienne których używasz w przerwaniu deklaruj jako volatile<br />a masz takich co najmniej trzy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1044">Zaba</a> — 3 sty 2015, o 18:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[komandorebombardiero]]></name></author>
<updated>2015-01-03T17:45:09+01:00</updated>
<published>2015-01-03T16:52:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10010&amp;p=111994#p111994</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10010&amp;p=111994#p111994"/>
<title type="html"><![CDATA[Zliczanie impulsów z czujnika koloru - proszę o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10010&amp;p=111994#p111994"><![CDATA[
Witam, próbuję nauczyć się zliczać impulsy z zewnętrznego źródła - w tym przypadku czujnika koloru. Dokumentacja: botland.com.pl/attachment.php?id_attachment=185<br /><br />Wykorzystany procesor: ATMEGA8<br />Napisałem następujący program (dioda ma się zapalać gdy zostanie zliczony chociaż jeden impuls z czujnika):<br /><br />[syntax=c]//BIBLIOTEKI<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt; //przerwania<br /><br />//DEFINICJE<br />#define F_CPU 8000000UL //taktowanie 8MHz<br />#define SYGNAL (1&lt;&lt;PB0) //port ICP1 - sygnał z czujnika<br />#define DIODA (1&lt;&lt;PC5)  //port z diodą<br />#define OE (1&lt;&lt;PC4) //port aktywujący czujnik<br />#define CZEST_S0 (1&lt;&lt;PC3) //programowalny wybór częstotliwości - S0<br />#define CZEST_S1 (1&lt;&lt;PC2) //programowalny wybór częstotliwości - S1<br />#define CZESTOTLIWOSC PORTC |= CZEST_S0 ; PORTC |= CZEST_S1 //zakres 0-500kHz<br />#define DIODA_S2 (1&lt;&lt;PC1) //programowalny wybór fotodiody - S2<br />#define DIODA_S3 (1&lt;&lt;PC0) //programowalny wybór fotodiody - S3<br />#define ZIELONY PORTC |= DIODA_S2 ; PORTC |= DIODA_S3 //pomiar koloru zielonego<br /><br />//DEKLARACJA ZMIENNYCH<br />short int przepelnienie;<br />short int przechwycenie;<br />short int zbocza;<br /><br />//PRZERWANIA<br />ISR(TIMER1_OVF_vect) //przerwanie - przepełnienie licznika<br />{<br />przepelnienie=1; //ustawienie flagi przepełnienia<br />}<br /><br />ISR(TIMER1_CAPT_vect) //przerwanie - przechwycenie<br />{<br />zbocza++; //zliczenie wykrytego zbocza<br />przechwycenie=1;<br /><br />}<br /><br />//FUNKCJA GŁÓWNA PROGRAMU<br />int main(void)<br />{<br />przepelnienie=0;<br />przechwycenie=0;<br />zbocza=0;<br /><br />sei(); //aktywacja przerwań<br /><br />//LICZNIK<br />//tryb pracy &quot;normalny&quot; - nie trzeba ustawiać żadnych bitów<br />TCCR1B |= (1&lt;&lt;CS10); //preskaler = 1<br />TCCR1B |= (1&lt;&lt;ICNC1); //aktywacja cyfrowego filtru dla ICP<br />TCCR1B |= (1&lt;&lt;ICES1); //reakcja ICP na zbocze narastające<br />TIMSK |= (1&lt;&lt;TOIE1); //odblokowanie przerwania przepełnienia<br />TIMSK |= (1&lt;&lt;TICIE1); //odblokowanie przerwania przechwycenia<br /><br />//USTAWIENIA PORTÓW<br />DDRB &amp;= ~SYGNAL; //port ICP1 (sygnał czujnika) - port wejściowy<br />DDRC |= OE; //port aktywujący czujnik - port wyjściowy<br />DDRC |= DIODA; //port aktyjący czujnik - port wyjściowy<br />PORTC &amp;= ~OE; //stan niski - czujnik aktywny<br />CZESTOTLIWOSC; //ustawienie wybranego zakresu częstotliwości<br />ZIELONY; //ustawienie wybranego koloru fotodiody<br /><br />//ZNACZNIKI PRZERWAŃ<br />TIFR |= (1&lt;&lt;ICF1); //&quot;1&quot; - znacznik żądania - przechwycenie<br />TIFR |= (1&lt;&lt;TOV1); //&quot;1&quot; - znacznik żądania - przepełnienie<br /><br />//PĘTLA GŁÓWNA<br />while(1)<br />{<br />if(przepelnienie==1)<br />{<br />if(zbocza&gt;0) //warunek - wykrycie impulsów<br />{<br />PORTC |= DIODA; //zapalenie diody<br />}<br />else<br />{<br />PORTC &amp;= ~DIODA; //zgaszenie diody<br />}<br />przepelnienie=0; <br />zbocza=0;<br />TIFR |= (1&lt;&lt;TOV1); //&quot;1&quot; - znacznik żądania - przepełnienie<br /><br />}<br /><br />if(przechwycenie==1)<br />{<br />TIFR |= (1&lt;&lt;ICF1); //&quot;1&quot; - znacznik żądania - przechwycenie<br />przechwycenie=0;<br />} <br /><br />}<br /><br />return 0;<br /><br />}[/syntax]<br /><br />Układ nie działa. Mógłby ktoś spróbować mi pomóc i jakby była możliwość, wytłumaczyć jakie błędy zrobiłem? Układ został podłączony następująco:<br />- zasilanie +5V na VCC, AVCC oraz RESET przez rezystor 10k<br />- masa na wszystkich pinach GND<br />- kondensator 100nF pomiędzy VCC i GND<br />- zewnętrzny rezonator kwarcowy 8MHz (podłączony z kondensatorami 22pF, Fuse-Bity przestawione)<br />- PB0 (ICP1) - wyjście OUT czujnika<br />- PC5 - dioda z rezystorem 1k podłączona katodą do masy<br />- PC4 - wejście czujnika aktywujące OUT stanem niskim<br />- PC3, PC2 - wyprowadzenia czujnika S0 i S1 (stan wysoki na obu - zakres częst. 500kHz)<br />- PC1, PC0 - wyprowadzenia czujnika S2 i S3 (stan wysoki na obu - zielona fotodioda)<br /><br />Dodatkowo mam pytanie, czy mój tok rozumowania jest dobry? Jeżeli ustawiłem czujnik na zakres pomiarowy 500kHz, natomiast częstotliwość taktowania procesora to 8MHz (preskaler = 1), to w takiej sytuacji mogę zliczyć maksymalnie 4096 impulsów ze źródła zewnętrznego zanim nastąpi przepełnienie po zliczeniu 65536 impulsów z sygnału taktującego? Wyliczyłem to następująco:<br />Czas do przepełnienia tp = ( 1 / 8MHz ) * 65536 impulsów = 0,008192s<br />Najkrótszy czas pomiędzy impulsami z czujnika (największe natężenie barwy) tc = 1 / 500kHz = 0,000002s<br />Maks. liczba zewnętrznych impulsów zliczonych aż do przepełnienia = tp / tc = 4096.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7605">komandorebombardiero</a> — 3 sty 2015, o 16:52</p><hr />
]]></content>
</entry>
</feed>