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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-08-25T14:56:42+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=8188&amp;mode</id>
<entry>
<author><name><![CDATA[Pajda]]></name></author>
<updated>2014-08-25T14:56:42+01:00</updated>
<published>2014-08-25T14:56:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92818#p92818</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92818#p92818"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92818#p92818"><![CDATA[
Trochę pokombinowałem i można powiedzieć że się udało <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Oto końcowy kod:<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 /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//Deklaracje zmiennych<br />volatile uint16_t licznik1, rezultat1;<br />volatile uint8_t flag1, dystans1;<br /><br />//Makra upraszczające<br />#define Trig_PIN (1&lt;&lt;PD4)<br />#define Echo_PIN (1&lt;&lt;PB1)<br />#define LED_PIN (1&lt;&lt;PA0)<br />#define Trig_H PORTD |= Trig_PIN<br />#define Trig_L PORTD &amp;= ~Trig_PIN<br />#define LED_ON PORTA &amp;= ~(LED_PIN)<br />#define LED_OFF PORTA |= (LED_PIN)<br /><br /><br />//######################################      GŁÓWNA FUNKCJA PROGRAMU      ################################################<br />int main(void)<br />{<br />DDRB &amp;= ~Echo_PIN;//PB1 jako wejscie<br />PORTB &amp;= ~Echo_PIN;//stan niski na PB1-Echo<br />DDRD |= Trig_PIN;//PD4 jako wyjscie<br />PORTD &amp;= ~Trig_PIN;//stan niski na PD4-Trig<br />DDRA |= (1&lt;&lt;PA0);//Pin diody jako wyjscie<br />PORTA |= (1&lt;&lt;PA0);//Dioda nie swieci<br /><br />GIMSK |= (1&lt;&lt;PCIE);//odblokowaie przerwania zewnętrznego PCINT<br />PCMSK |= (1&lt;&lt;PCINT1);//przerwanie na pinie PB1<br /><br />TCCR0A |= (1&lt;&lt;WGM01);//Timer0 tryb CTC<br />TCCR0B |= (1&lt;&lt;CS00);//preskaler 1<br />OCR0A = 7;//przerwanie co 1us<br />TIMSK |= (1&lt;&lt;OCIE0A);//zezwolanie na przerwanie Compare Match<br /><br /><br />sei();<br /><br />lcd_init();<br />//=================      PĘTLA GŁÓWNA PROGRAMU      ===================<br />while(1)<br />{<br />dystans1 = (rezultat1*34)/100/2;//wzór na odległosc od obiektu<br />if (dystans1 &gt; 100) flag1 = 0;//jesli odleglosc wieksza niz 100cm- zakoncz pomiar<br />lcd_locate(0,0);<br />lcd_int(dystans1);<br />lcd_locate(1,0);<br />lcd_int(rezultat1);<br />if( dystans1 &gt; 80) LED_ON;<br />else LED_OFF;<br /><br />}<br />//============      KONIEC PĘTLI GŁÓWNEJ PROGRAMU      ==============<br />}<br />//###################################      KONIEC GŁÓWNEJ FUNKCJI PROGRAMU      ###########################################<br /><br /><br />ISR(PCINT_vect)//przerwanie zewnętrzne odpowiadające za wykrywanie rozpoczęcia i zakończenia nadawania sygnału Echo<br />{<br />if( PINB &amp; Echo_PIN )<br />{<br />flag1 = 1;//jesli zbocze narastające-flaga1 = 1rozpoczęcie pomiaru<br />licznik1 = 0;<br />}<br />else flag1 = 0;//jeslizbocze opadające-flaga1 = 0koniec pomiaru<br />}<br /><br />ISR(TIMER0_COMPA_vect)//przerwanie wewnętrzne odpowiadające za generowanie sygnału Trig<br />{<br />static uint16_t cnt;//deklaracja zmiennej cnt<br />cnt++;//co 1us zmienna cnt jest zwiekszana o 1<br /><br />if( cnt &lt; 10 ) Trig_H;//co 1us sprawdzany jest ten warunek-jesli jest prawdziwy ustawiamy stan wysoki na PD4 (Trig)<br />else Trig_L;//jesli warunek nie spelniony (po minięciu 10us) ustawiamy stan niski na PD4<br />if( cnt &gt; 30010) cnt = 0;//odczekujemy 30ms i zerujemy zmienną cnt<br />if(flag1) licznik1++;//jesli warunek spelniony mierzymy długosć trwania sygnału Echo zwiekszajac w trakcie jego trwania<br />//zmienną licznik1 o 1<br />else rezultat1 = licznik1;//przypisanie zmiennej rezultat1 wartosci zmiennej licznik1<br />}[/syntax]<br /><br />Kilka słów wyjaśnień;<br />Zamiast dzielić zmienną rezultat1 przez 58 znalazłem inny wzór -&gt; dystans1 = (rezultat1*34)/100/2, w orginale dzielenie było przez 1000 ale dalej coś jest nie tak z podstawą czasu więc dziele przez 100. Wyniki są w zadowalającym stopniu dokładne <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Może kod nie jest super zoptymalizowany ale jak dla mnie (początkującego) to i tak duży sukces <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" />. Potem wrzuce jeszcze wyniki moich eksperymentów z trzema czujnikami (o ile sie uda XD ). Narazie dzięki wszystkim za pomoc <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=4853">Pajda</a> — 25 sie 2014, o 14:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-08-23T20:48:05+01:00</updated>
<published>2014-08-23T20:48:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92635#p92635</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92635#p92635"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92635#p92635"><![CDATA[
Nie bardzo wiem do czego zmierzasz i napiszę na czym to polega.<br />Jak masz wejście ICP i sobie to skonfigurujesz to odpowiednie zbocze powoduje sprzętowe skopiowanie wartości licznika timera, który sobie zlicza w kółko do rejestru przechwytywania. Podglądnij taki program opary na ICP mimo, że nie będziesz wykorzystywał takiego sposobu. Tam w procedurze przerwania od przechwycenia dla jednego zbocza licznik timera jest zerowany, a przy drugim wynik jest gotowy. Przerwanie od przepełnienia włącza się, bo w czasie pomiaru licznik może przekręcić się parę razy. Przerwania ICP zależą od odległości czujnika od przeszkody, a przerwania timera są co 256 cykli zegara.<br /><br />Jak nie korzystasz z ICP tylko przerwania od zmiany stanu na wejściu (PCINT) to tracisz na dokładności, bo licznik timera nie jest automatycznie kopiowany i sam to musisz zrobić. Tylko tym to się różni.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 23 sie 2014, o 20:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Pajda]]></name></author>
<updated>2014-08-23T20:07:43+01:00</updated>
<published>2014-08-23T20:07:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92630#p92630</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92630#p92630"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92630#p92630"><![CDATA[
A czy można by zrobić tak, że użyję trybu NORMAL, wyłącze przerwanie w rejestrze TIMSK (przepełnienie TCNT dalej po 1 us) i zmienna licznik1 będzie się zwiększała nie w procedurze obsługi przerwań a w pętli głównej np tak; <br />[syntax=c]if(TCNT0B == 255) licznik1++;[/syntax]<br />A potem to już analogiczne. Ma to jakiś sens czy wyjdzie na to samo?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4853">Pajda</a> — 23 sie 2014, o 20:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-08-23T19:21:03+01:00</updated>
<published>2014-08-23T19:21:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92615#p92615</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92615#p92615"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92615#p92615"><![CDATA[
Dobrze kombinujesz. Za często masz to przerwanie od timera. Jak masz kwarc 8 MHz to jedna instrukcja trwa 1/8 us i w ciągu jednej mikrosekundy wykona się ich 8. Jak sobie popatrzysz na kod asemblera w pliku *.lss w folderze Release to zobaczysz, że pusta funkcja obsługi przerwania zajmuje 10 instrukcji asemblera, a i tak zajmie więcej niż 10 taktów zegara, bo dochodzą skoki. Twoje przerwanie nie wykonuje się co 1us. Na pewno jest to dłuższy okres czasu. Możesz to sprawdzić jak sobie zamiast tego kodu wrzucisz dwa liczniki po 1000 i będziesz zmieniał stan LED co 1 sekundę. Drugi test: wrzuć sobie do pętli głównej tylko _delay_ms(1000); i również miganie LED. Zobaczysz, że czas się wydłuży a to dlatego, że przez zbyt częste przerwanie procesor będzie co chwila opuszczać główną pętlę i zajmował się wykonywaniem funkcji obsługi przerwania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 23 sie 2014, o 19:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Pajda]]></name></author>
<updated>2014-08-23T14:05:03+01:00</updated>
<published>2014-08-23T14:05:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92571#p92571</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92571#p92571"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92571#p92571"><![CDATA[
W Eclipsie wywala mi błąd &quot;ATOMIC_RESTORESTATE could not be resolved&quot;, pewnie przyczyną jest to że nic jeszcze nie wiem o ATOMIC_BLOCK <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 16 minutach ]</span></strong><br /><br />Dobra, dodałem nagłówek &lt;util/atomic.h&gt;, nie wywala błędu. Wyświetlacz dalej wyświetla głupoty, dioda zapala się po odległości około 1 metra czyli 10 razy większej niż powinna; czyżby zła podstawa czasowa timera, czy coś w tym rodzaju?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4853">Pajda</a> — 23 sie 2014, o 14:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2014-08-23T13:53:16+01:00</updated>
<published>2014-08-23T13:53:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92569#p92569</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92569#p92569"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92569#p92569"><![CDATA[
Być może spowodowane jest to nieatomowym dostępem do zmiennej &quot;rezultat1&quot;...<br /><br />[syntax=c]#include &lt;avr/atomic.h&gt;<br />...<br />uint16_t rezultat;<br />while(1) {<br />ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {<br />rezultat = rezultat1;<br />}<br />rezultat /= 58;// Dla testu możesz zakomentować tę linię<br />lcd_locate(0, 0);<br />lcd_int(rezultat);<br />lcd_locate(1, 0);<br />lcd_int(10);<br />if(rezultat &gt; 10)<br />PORTA &amp;= ~(1&lt;&lt;PA0);<br />else PORTA |= (1&lt;&lt;PA0);<br /> <br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 23 sie 2014, o 13:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Pajda]]></name></author>
<updated>2014-08-23T13:55:27+01:00</updated>
<published>2014-08-23T11:50:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92558#p92558</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92558#p92558"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92558#p92558"><![CDATA[
Aktualny kod wygląda tak :<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//Deklaracje zmiennych<br />volatile uint16_t licznik1, rezultat1;<br />volatile uint8_t flag1;<br /><br /><br />//######################################      GŁÓWNA FUNKCJA PROGRAMU      ################################################<br />int main(void)<br />{<br />DDRB &amp;= ~(1&lt;&lt;PB1);//PB1 jako wejscie<br />PORTB &amp;= ~(1&lt;&lt;PB1);//stan niski na PB1-Echo<br />DDRD |= (1&lt;&lt;PD4);//PD4 jako wyjscie<br />PORTD &amp;= ~(1&lt;&lt;PD4);//stan niski na PD4-Trig<br />DDRA |= (1&lt;&lt;PA0);//Pin diody jako wyjscie<br />PORTA |= (1&lt;&lt;PA0);//Dioda nie swieci<br /><br />GIMSK |= (1&lt;&lt;PCIE);//odblokowaie przerwania zewnętrznego PCINT<br />PCMSK |= (1&lt;&lt;PCINT1);//przerwanie na pinie PB1<br /><br />TCCR0A |= (1&lt;&lt;WGM01);//Timer0 tryb CTC<br />TCCR0B |= (1&lt;&lt;CS00);//preskaler 1<br />OCR0A = 7;//przerwanie co 1us<br />TIMSK |= (1&lt;&lt;OCIE0A);//zezwolanie na przerwanie Compare Match<br /><br /><br />sei();<br /><br />lcd_init();<br />//=================      PĘTLA GŁÓWNA PROGRAMU      ===================<br />while(1)<br />{<br />lcd_locate(0,0);<br />lcd_int(rezultat1/58);<br />lcd_locate(1,0);<br />lcd_int(10);<br />if( (rezultat1 / 58) &gt; 10) PORTA &amp;= ~(1&lt;&lt;PA0);<br />else PORTA |= (1&lt;&lt;PA0);<br /><br />}<br />//============      KONIEC PĘTLI GŁÓWNEJ PROGRAMU      ==============<br />}<br />//###################################      KONIEC GŁÓWNEJ FUNKCJI PROGRAMU      ###########################################<br /><br /><br />ISR(PCINT_vect)//przerwanie zewnętrzne odpowiadające za wykrywanie rozpoczęcia i zakończenia nadawania sygnału Echo<br />{<br />if( (PINB &amp; (1&lt;&lt;PB1) ) )<br />{<br />flag1 = 1;//jesli zbocze narastające-flaga1 = 1<br />licznik1 = 0;<br />}<br />else flag1 = 0;//jeslizbocze opadające-flaga1 = 0<br />}<br /><br />ISR(TIMER0_COMPA_vect)//przerwanie wewnętrzne odpowiadające za generowanie sygnału Trig<br />{<br />static uint16_t cnt;//deklaracja zmiennej cnt<br />cnt++;//co 1us zmienna cnt jest zwiekszana o 1<br />if( cnt &lt; 10 ) PORTD |= (1&lt;&lt;PD4);//co 1us sprawdzany jest ten warunek-jesli jest prawdziwy ustawiamy stan wysoki na PD4 (Trig)<br />else PORTD &amp;= ~(1&lt;&lt;PD4);//jesli warunek nie spelniony (po minięciu 10us) ustawiamy stan niski na PD4<br />if( cnt &gt; 60010) cnt = 0;//odczekujemy 60ms i zerujemy zmienną cnt<br />if(flag1) licznik1++;//jesli warunek spelniony mierzymy długosć trwania sygnału Echo zwiekszajac w trakcie jego trwania<br />//zmienną licznik1 o 1<br />else rezultat1 = licznik1;//przypisanie zmiennej rezultat1 wartosci zmiennej licznik1<br />}[/syntax]<br /><br />Wyrzuciłem przerwanie z OCR0B i połączyłem z OCR0A i faktycznie coś zaczęło się dziać, dzięki Krauser <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> . Szkoda tylko ze wyświetlacz pokazuje głupoty, a dioda świeci losowo mniej więcej około 30 cm od czujnika. Zauważyłem że zmienna rezultat była typu uint_8, i na wyświetlaczu wyświetlały się liczby od 0 do 4, zmieniłem na uint_16 ale dalej są głupoty.<br /><br />Edit:<br />Wyświetla się tylko cyfra dziesiątek centymetrów i to niedokładnie. Np. przy około 20 cm wyświetla się 2, przy mniej niż 10 cm 0 itd.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4853">Pajda</a> — 23 sie 2014, o 11:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2014-08-22T19:42:25+01:00</updated>
<published>2014-08-22T19:42:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92490#p92490</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92490#p92490"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92490#p92490"><![CDATA[
Może pokaż aktualny kod, bo mogę powiedzieć, że PA0 jest wejściem i dlatego dioda nie świeci. Jak do OCR0A i OCR0B wpisujesz to samo to po co ci 2 przerwania?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 22 sie 2014, o 19:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Pajda]]></name></author>
<updated>2014-08-21T20:23:44+01:00</updated>
<published>2014-08-21T20:23:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92353#p92353</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92353#p92353"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92353#p92353"><![CDATA[
Wprowadziłem niektóre z Twoich poprawek. Dodałem również warunek mający zapalić diodę LED jeśli odległość jest mniejsza od 10<br />[syntax=c]if( (rezultat1 / 58) &gt; 10) PORTA &amp;= ~(1&lt;&lt;PA0);[/syntax]<br />Niestety dioda nie świeci <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> . Gdzieś popełniam błąd ale nie wiem gdzie. Macie jakieś pomysły? <br /><br />Jak tylko będę miał czas potestuje trochę z przerwaniami INT i ICP. Może będą jakieś rezultaty.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4853">Pajda</a> — 21 sie 2014, o 20:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[atmel]]></name></author>
<updated>2014-08-19T20:22:49+01:00</updated>
<published>2014-08-19T20:22:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92072#p92072</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92072#p92072"/>
<title type="html"><![CDATA[Re: Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92072#p92072"><![CDATA[
Co prawda nie powinno to stanowić problemu, ale ten zapis jest dość nietypowy dla tego programu:<br /><br />[syntax=c]DDRB &amp;= ~(PINB &amp; (1&lt;&lt;PB1));[/syntax]<br />Powinno być raczej:<br /><br />[syntax=c]DDRB &amp;= ~(1&lt;&lt;PB1);[/syntax]<br />Jeszcze jedna uwaga odnośnie sprawdzania warunków. Nie ma potrzeby dodawania zanegowanego wyrażenia w kolejnej instrukcji warunkowej, od tego jest słówko &quot;else&quot; (niepotrzebny &quot;if&quot;):<br /><br />[syntax=c]else if( !(PINB &amp; (1&lt;&lt;PB1) ) ) ...[/syntax]<br />Właściwie cały kod objęty w ciało funkcji &quot;ISR(PCINT_vect)&quot; można uprościć do:<br /><br />[syntax=c]ISR(PCINT_vect)<br />{<br />if(flag1 = !!(PINB &amp; 1&lt;&lt;PB1))<br />licznik1 = 0;<br />}[/syntax]<br />To samo tyczy się kolejnego fragmentu:<br /><br />[syntax=c]ISR(TIMER0_COMPB_vect)<br />{<br />if (flag1)<br />licznik1++;<br />else rezultat1 = licznik1;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1183">atmel</a> — 19 sie 2014, o 20:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Pajda]]></name></author>
<updated>2014-08-19T18:30:24+01:00</updated>
<published>2014-08-19T18:30:24+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92054#p92054</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92054#p92054"/>
<title type="html"><![CDATA[Czujnik ultradźwiękowy HC-SR04-prośba o pomoc]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=8188&amp;p=92054#p92054"><![CDATA[
Witam,<br /><br />Jakiś czas temu zakupiłem trzy czujniki HC-SR04 i postanowiłem napisać program do ich obsługi. Na początek zabrałem się za testy na jednym czujniku. Procesor jakiego używam to AtTinny2313. Z racji tego, że mam zamiar używać trzech czujników jednocześnie, badanie długości trwania impulsu Echo za pomocą przerwania ICP odpada, gdyż AtTinny2313 posiada tylko jedno wejście ICP, INT też odpada. Postanowiłem więc pobawić się z przerwaniami PCINT. Oto programik jaki udało mi się wymęczyć <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><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 /><br />#include &quot;LCD/lcd.h&quot;<br /><br />//Deklaracje zmiennych<br />volatile uint16_t licznik1;<br />volatile uint8_t flag1;<br />volatile uint8_t rezultat1;<br /><br />//######################################      GŁÓWNA FUNKCJA PROGRAMU      ################################################<br />int main(void)<br />{<br />DDRB &amp;= ~(PINB &amp; (1&lt;&lt;PB1));//PB1 jako wejscie<br />PORTB &amp;= ~(1&lt;&lt;PB1);//stan niski na PB1-Echo<br />DDRD |= (1&lt;&lt;PD4);//PD4 jako wyjscie<br />PORTD &amp;= ~(1&lt;&lt;PD4);//stan niski na PD4-Trig<br /><br />GIMSK |= (1&lt;&lt;PCIE);//odblokowaie przerwania zewnętrznego PCINT<br />PCMSK |= (1&lt;&lt;PCINT1);//przerwanie na pinie PB1<br /><br />TCCR0A |= (1&lt;&lt;WGM01);//Timer0 tryb CTC<br />TCCR0B |= (1&lt;&lt;CS00);//preskaler 8<br />OCR0A = 7;//przerwanie co 1us<br />OCR0B = 7;<br />TIMSK |= ( (1&lt;&lt;OCIE0A) | (1&lt;&lt;OCIE0B) );//zezwolanie na przerwanie Compare Match<br /><br /><br />sei();<br /><br />lcd_init();<br />//=================      PĘTLA GŁÓWNA PROGRAMU      ===================<br />while(1)<br />{<br />lcd_locate(0,0);<br />lcd_int(rezultat1/58);<br />lcd_locate(1,0);<br />lcd_int(10);<br /><br />}<br />//============      KONIEC PĘTLI GŁÓWNEJ PROGRAMU      ==============<br />}<br />//###################################      KONIEC GŁÓWNEJ FUNKCJI PROGRAMU      ###########################################<br /><br /><br />ISR(PCINT_vect)//przerwanie zewnętrzne odpowiadające za wykrywanie rozpoczęcia i zakończenia nadawania sygnału Echo<br />{<br />if( (PINB &amp; (1&lt;&lt;PB1) ) )<br />{<br />flag1 = 1;//jesli zbocze narastające-flaga1 = 1<br />licznik1 = 0;<br />}<br />else if( !(PINB &amp; (1&lt;&lt;PB1) ) )flag1 = 0;//jeslizbocze opadające-flaga1 = 0<br />}<br /><br />ISR(TIMER0_COMPA_vect)//przerwanie wewnętrzne odpowiadające za generowanie sygnału Trig<br />{<br />static uint16_t cnt;//deklaracja zmiennej cnt<br />cnt++;//co 1us zmienna cnt jest zwiekszana o 1<br />if( cnt &lt; 10 ) PORTD |= (1&lt;&lt;PD4);//co 1us sprawdzany jest ten warunek-jesli jest prawdziwy ustawiamy stan wysoki na PD4 (Trig)<br />else PORTD &amp;= ~(1&lt;&lt;PD4);//jesli warunek nie spelniony (po minięciu 10us) ustawiamy stan niski na PD4<br />if( cnt &gt; 60010) cnt = 0;//odczekujemy 60ms i zerujemy zmienną cnt<br /><br />}<br /><br />ISR(TIMER0_COMPB_vect)//przerwanie wewnętrzne odpowiadające za pomiar dlugosci trwania impulsu Echo<br />{<br />if(flag1 == 1)//jesli warunek spelniony mierzymy długosć trwania sygnału Echo zwiekszajac w trakcie jego trwania<br />//zmienną licznik1 o 1<br />{<br />licznik1++;<br />}<br /><br />if(flag1 == 0) rezultat1=licznik1;//przypisanie zmiennej rezultat1 wartosci zmiennej licznik1<br />}[/syntax]<br /><br />Przeczytałem już kilka wątków o obsłudze HC-SR04 na tym forum ale nie natknąłem się na kod posługujący sie przerwaniami PCINT (chyba że źle szukałem ;d). Moje pytanie jest następujące; co złego jest w tym kodzie? Na wyświetlaczu w miejscu gdzie powinna wyświetlić się odległość cały czas jest zero. Nie jestem pewien gdzie może być błąd, więc proszę Was o pomoc. Dodam tylko, że wyświetlacz LCD podłączony jest do Pinów, odpowiednio;  D7-PB0, D6-PB2, D5-PB4, D4-PB6, RS-PD0, RS-PD1, E-PA1.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4853">Pajda</a> — 19 sie 2014, o 18:30</p><hr />
]]></content>
</entry>
</feed>