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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12425&amp;mode</id>
<entry>
<author><name><![CDATA[Maciek_L]]></name></author>
<updated>2015-07-27T16:04:43+01:00</updated>
<published>2015-07-27T16:04:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135620#p135620</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135620#p135620"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135620#p135620"><![CDATA[
Wygląda na to, że po próbie eliminacji potencjalnych błędów sprawa wyjaśniła się:) Kiedy nie miałem już pomysłów dlaczego napisany przeze mnie program nie działa postanowiłem zakupić kolejny czujnik. Włożyłem go, wgrałem wsad i wszystko działa jak należy:) Dla Ciebie Danielu daję plusa za poświęcony czas i chęć pomocy. Pozdrawiam serdecznie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8226">Maciek_L</a> — 27 lip 2015, o 16:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Maciek_L]]></name></author>
<updated>2015-07-26T19:45:41+01:00</updated>
<published>2015-07-26T19:45:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135576#p135576</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135576#p135576"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135576#p135576"><![CDATA[
Myślę, że miałeś na myśli coś takiego jak przedstawiam poniżej. Ustawiłem dowolne zbocze dla przerwania INT0 i wewnątrz niego sprawdzam jaki stan jest na pinie PD2.<br />Efekt jest taki, że program działa identycznie jak wcześniejsze wersje - czyli jak widzi przeszkodę działa wyśmienicie a jak nagle usuniemy przeszkodę to ponowne jej przyłożenie przed czujnikiem nie daje już żadnych rezultatów:(<br />W nowym kodzie chyba błędów nie zrobiłem, bo dobrze się kompiluje i po wgraniu do mikrokontrolera działa tak jak wcześniejsze wersje.<br /><br />[syntax=c]// dołączenie plików nagłówkowych<br /><br />#include &lt;avr/io.h&gt; //dołączenie podstawowej biblioteki<br />#include &lt;avr/interrupt.h&gt; //dołączenie biblioteki z przerwaniami<br />#include &lt;util/delay.h&gt; //dołączenie biblioteki z opóźnieniami<br /><br />volatile uint16_t czas;<br />uint16_t dystans;<br />uint16_t max = 25;<br />uint16_t min = 2;<br />volatile uint8_t licznik;<br /><br />int main(void)<br />{<br />     //ustawienia INT0<br />     GICR |= (1&lt;&lt;INT0); //włączenie przerwania INT0<br />     MCUCR |= (1&lt;&lt;ISC00); //konfiguracja na dowolne zbocze<br /><br />     DDRB = 0xFF; //konfiguracja portu jako wyjścia<br />     DDRC = 0xFF; //konfiguracja portu jako wyjścia<br />     DDRD &amp;= ~(1&lt;&lt;PD2); //konfiguracja pinu PD2 jako wejście<br />     DDRD |= (1&lt;&lt;PD4); //konfiguracja pinu PD4 jako wyjście<br /><br />     TCNT2 = 7; //początkowa wartość licznika w Timer2<br />     TCCR2 |= (1&lt;&lt;CS22); //preskaler 64 w Timer2<br />     TIMSK |= (1&lt;&lt;TOIE2); //reakcja na przepełnienie timera<br /><br />     sei(); //globalne włączenie przerwań<br /><br />     while(1)<br />     {<br />    if(licznik&gt;29) // co 60 ms<br />    {<br />    licznik=0;<br />    TCNT2=7;<br />    PORTD |= (1&lt;&lt;PD4); // stan wysoki dla trigera<br />    _delay_us(10);<br />    PORTD &amp;= ~(1&lt;&lt;PD4); // stan niski dla trigera<br />    }<br />      }<br />}<br /><br />ISR(INT0_vect)  //początek funkcji obsługi przerwania INT0<br />{<br />// zatrzymanie timer2<br />TCNT2 = 0;<br />TCCR2 = 0x00;<br />TIMSK &amp;= ~(1&lt;&lt;TOIE2);<br /><br />licznik=0;<br /><br />if(PIND &amp;(1&lt;&lt;PD2))<br />{<br />czas=0;<br />TCNT0 = 217; //początkowa wartość licznika w Timer0<br />TCCR0 |= (1&lt;&lt;CS01); //preskaler 8 w Timer0<br />TIMSK |= (1&lt;&lt;TOIE0); //reakcja na przepełnienie timera<br />}<br />else<br />{<br />//zatrzymanie timer0<br />TCNT0 = 0;<br />TCCR0=0x00;<br />TIMSK &amp;= ~(1&lt;&lt;TOIE0);<br /><br />dystans=(czas*40)/58;<br /><br />//if((dystans&gt;=max) || (dystans&lt;=min))<br />//{<br />//}<br />if(dystans&lt;21)<br />{<br />PORTB |= (1&lt;&lt;PB1);<br />PORTB &amp;= ~(1&lt;&lt;PB0);<br />PORTC &amp;= ~(1&lt;&lt;PC5);<br />}<br />if((dystans&gt;20) &amp;&amp; (dystans&lt;41))<br />{<br />PORTB |= (1&lt;&lt;PB0);<br />PORTB &amp;= ~(1&lt;&lt;PB1);<br />PORTC &amp;= ~(1&lt;&lt;PC5);<br />}<br />if(dystans&gt;40)<br />{<br />PORTC |= (1&lt;&lt;PC5);<br />PORTB &amp;= ~(1&lt;&lt;PB0);<br />PORTB &amp;= ~(1&lt;&lt;PB1);<br />}<br /><br />TCNT2 = 7; //początkowa wartość licznika w Timer2<br />TCCR2 |= (1&lt;&lt;CS22); //preskaler 64 w Timer2<br />TIMSK |= (1&lt;&lt;TOIE2); //reakcja na przepełnienie timera<br />}<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />czas++; //zwiększanie o 40 us<br />TCNT0 = 217; //początkowa wartość licznika w Timer0<br />}<br /><br />ISR(TIMER2_OVF_vect)<br />{<br />licznik++; // zwiększanie o 2 ms<br />TCNT2 = 7; //początkowa wartość licznika w Timer2<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8226">Maciek_L</a> — 26 lip 2015, o 19:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daniel880]]></name></author>
<updated>2015-07-25T17:26:30+01:00</updated>
<published>2015-07-25T17:26:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135479#p135479</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135479#p135479"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135479#p135479"><![CDATA[
W takim razie spróbuj ustawić przerwanie zarówno na zbocze opadające jak i narastajace i w funkcji obsługi przerwania sprawdzać stan pinu ECHO. Jeśli Echo=1 to było zbocze narastajace, jeśli echo=0 to było zbocze opadające. Małe uproszczenie ale powinieneś rozpocząć właśnie od takich bardziej prymitywnych programów i stopniowo je ulepszać;)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2328">Daniel880</a> — 25 lip 2015, o 17:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Maciek_L]]></name></author>
<updated>2015-07-25T16:52:15+01:00</updated>
<published>2015-07-25T16:52:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135478#p135478</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135478#p135478"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135478#p135478"><![CDATA[
Niestety ale dodanie delaya przed dokonaniem pomiaru nie rozwiązuje problemu. Dodatkowo kiedy widziana jest przeszkoda to poprzez to dodatkowe opóźnienie diody wolniej się przełączają. Więc chyba nie tędy droga ale prawdą jest że wygląda na to, że program nie wywołuje stanu wysokiego na trigger jeżeli wpadnie do pętli, w której &quot;znika przeszkoda&quot;. Kiedy przeszkoda jest to wszystko ładnie wchodzi do INT0 a sygnały na trigger przecież również wysyłane są z pętli while. Trochę tego nie ogarniam:)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8226">Maciek_L</a> — 25 lip 2015, o 16:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daniel880]]></name></author>
<updated>2015-07-25T12:33:03+01:00</updated>
<published>2015-07-25T12:33:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135474#p135474</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135474#p135474"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135474#p135474"><![CDATA[
[syntax=c]while(1)<br />     {<br />            _delay_ms(100);<br />                TCNT2=7;<br />                PORTD |= (1&lt;&lt;PD4); // stan wysoki dla trigera<br />                _delay_us(10);<br />                PORTD &amp;= ~(1&lt;&lt;PD4); // stan niski dla trigera<br />        <br />      }[/syntax]<br /><br />Moze nie najladniejsze rozwiazanie ale wedlug mnie program nie moze wygenerowac sygnalu Triger.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2328">Daniel880</a> — 25 lip 2015, o 12:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Maciek_L]]></name></author>
<updated>2015-07-24T19:26:14+01:00</updated>
<published>2015-07-24T19:26:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135437#p135437</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135437#p135437"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135437#p135437"><![CDATA[
Oczywiście że TCNT2 =0 nie zatrzymuje timera ale pisałem w pierwszym poście, że po prostu próbuję już wszystkiego:) <br />Co do TCCR2 |= 0 to oczywiście była pomyłka i już poprawiłem<br />Poniżej mój obecny kod po małych zmianach jednak dalej nie działa tak jak powinno. Działa tylko jeżeli w momencie włączenia zasilania przeszkoda jest na drodze czujnika. Jeżeli jej nie ma lub zniknie w trakcie to albo trzeba przyłożyć dłoń na odległość około 1 cm od czujnika lub ręcznie podać na ułamek sekundy napięcie na pin trigger.<br /><br />[syntax=c]// dołączenie plików nagłówkowych<br /><br />#include &lt;avr/io.h&gt; //dołączenie podstawowej biblioteki<br />#include &lt;avr/interrupt.h&gt; //dołączenie biblioteki z przerwaniami<br />#include &lt;util/delay.h&gt; //dołączenie biblioteki z opóźnieniami<br /><br />volatile uint16_t czas;<br />uint16_t dystans;<br />uint16_t max = 25;<br />uint16_t min = 2;<br />volatile uint8_t zbocze;<br />volatile uint8_t licznik;<br /><br />int main(void)<br />{<br />     //ustawienia INT0<br />     GICR |= (1&lt;&lt;INT0); //włączenie przerwania INT0<br />     MCUCR |= (1&lt;&lt;ISC00)|(1&lt;&lt;ISC01); //konfiguracja na zbocze narastające<br /><br />     DDRB = 0xFF; //konfiguracja portu jako wyjścia<br />     DDRC = 0xFF; //konfiguracja portu jako wyjścia<br />     DDRD &amp;= ~(1&lt;&lt;PD2); //konfiguracja pinu PD2 jako wejście<br />     DDRD |= (1&lt;&lt;PD4); //konfiguracja pinu PD4 jako wyjście<br /><br />     zbocze=1;<br /><br />     TCNT2 = 7; //początkowa wartość licznika w Timer2<br />     TCCR2 |= (1&lt;&lt;CS22); //preskaler 64 w Timer2<br />     TIMSK |= (1&lt;&lt;TOIE2); //reakcja na przepełnienie timera<br /><br />     sei(); //globalne włączenie przerwań<br /><br />     while(1)<br />     {<br />    if(licznik&gt;29) // co 60 ms<br />    {<br />    licznik=0;<br />    TCNT2=7;<br />    PORTD |= (1&lt;&lt;PD4); // stan wysoki dla trigera<br />    _delay_us(10);<br />    PORTD &amp;= ~(1&lt;&lt;PD4); // stan niski dla trigera<br />    }<br />      }<br />}<br /><br />ISR(INT0_vect)  //początek funkcji obsługi przerwania INT0<br />{<br />TCNT2 = 0; // zatrzymanie timer2<br />TCCR2 = 0x00;<br />TIMSK &amp;= ~(1&lt;&lt;TOIE2);<br />licznik=0;<br /><br />switch(zbocze)<br />{<br />case 1:<br />czas=0;<br />TCNT0 = 217; //początkowa wartość licznika w Timer0<br />TCCR0 |= (1&lt;&lt;CS01); //preskaler 8 w Timer0<br />TIMSK |= (1&lt;&lt;TOIE0); //reakcja na przepełnienie timera<br />zbocze=0;<br />MCUCR &amp;= ~(1&lt;&lt;ISC00); // zamiana INT0 na zbocze opadające<br />break;<br />case 0:<br />TCNT0 = 0; //zatrzymanie timer0<br />TCCR0=0x00;<br />TIMSK &amp;= ~(1&lt;&lt;TOIE0);<br /><br />zbocze=1;<br />MCUCR |= (1&lt;&lt;ISC00)|(1&lt;&lt;ISC01); //konfiguracja na zbocze narastające<br />dystans=(czas*40)/58;<br />//if((dystans&gt;=max) || (dystans&lt;=min))<br />//{<br />//PORTC ^= (1&lt;&lt;PC5);<br />//goto kolejny_pomiar;<br />//}<br />if(dystans&lt;21)<br />{<br />PORTB |= (1&lt;&lt;PB1);<br />PORTB &amp;= ~(1&lt;&lt;PB0);<br />PORTC &amp;= ~(1&lt;&lt;PC5);<br />}<br />if((dystans&gt;20) &amp;&amp; (dystans&lt;41))<br />{<br />PORTB |= (1&lt;&lt;PB0);<br />PORTB &amp;= ~(1&lt;&lt;PB1);<br />PORTC &amp;= ~(1&lt;&lt;PC5);<br />}<br />if(dystans&gt;40)<br />{<br />PORTC |= (1&lt;&lt;PC5);<br />PORTB &amp;= ~(1&lt;&lt;PB0);<br />PORTB &amp;= ~(1&lt;&lt;PB1);<br />}<br /><br />TCNT2 = 7; //początkowa wartość licznika w Timer2<br />TCCR2 |= (1&lt;&lt;CS22); //preskaler 64 w Timer2<br />TIMSK |= (1&lt;&lt;TOIE2); //reakcja na przepełnienie timera<br />break;<br />}<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />czas++; //zwiększanie o 40 us<br />TCNT0 = 217; //początkowa wartość licznika w Timer0<br />}<br /><br />ISR(TIMER2_OVF_vect)<br />{<br />licznik++; // zwiększanie o 2 ms<br />TCNT2 = 7; //początkowa wartość licznika w Timer2<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8226">Maciek_L</a> — 24 lip 2015, o 19:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daniel880]]></name></author>
<updated>2015-07-24T18:11:50+01:00</updated>
<published>2015-07-24T18:11:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135431#p135431</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135431#p135431"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135431#p135431"><![CDATA[
[syntax=c]TCCR2 |= 0x00;[/syntax]<br /><br />Zastanów się co ta linijka robi;)<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 4 minutach ]</span></strong><br /><br />Poza tym ta linijka:<br /><br /><div class="quotetitle">Maciek_L napisał(a):</div><div class="quotecontent"><br />TCNT2 = 0; // zatrzymanie timer2<br /></div><br /><br />nie zatrzymmuje Timera;)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2328">Daniel880</a> — 24 lip 2015, o 18:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Maciek_L]]></name></author>
<updated>2015-07-24T17:59:20+01:00</updated>
<published>2015-07-24T17:59:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135424#p135424</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135424#p135424"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135424#p135424"><![CDATA[
Witam ponownie.<br />Próbowałem już także takich sposobów, bo uważałem że problem może być w tym, że właśnie gubi się gdzieś ta reakcja na zbocze narastające lub zbocze równe 1. Nic jednak nie pomagało a odkryłem jedną ciekawą rzecz:<br />- kiedy program znajduje się w pętli while i co te 60 ms wysyła stan wysoki przez 10 us na trigger nie można wejść do INT0 - natomiast jeśli podepnę sobie wtedy kabelek od vcc i na moment dotknę pinu trigger (trzymając rękę załóżmy w odległości 10 czy 30 cm) to nagle program ożywa i wszystko działa jak należy do momentu aż czujnik ponownie straci sygnał (czyli kiedy nie wraca do niego żaden sygnał bo od niczego się nie odbija).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8226">Maciek_L</a> — 24 lip 2015, o 17:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daniel880]]></name></author>
<updated>2015-07-24T07:10:12+01:00</updated>
<published>2015-07-24T07:10:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135356#p135356</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135356#p135356"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135356#p135356"><![CDATA[
Spróbuj podczas wyzwalania timera ustawiać przerwanie na zbocze narastajace i zmienna zbocze na 1<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2328">Daniel880</a> — 24 lip 2015, o 07:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Maciek_L]]></name></author>
<updated>2015-07-23T19:35:19+01:00</updated>
<published>2015-07-23T19:35:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135336#p135336</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135336#p135336"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135336#p135336"><![CDATA[
Poprawione i przepraszam za nieuwagę.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8226">Maciek_L</a> — 23 lip 2015, o 19:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Jaglarz]]></name></author>
<updated>2015-07-23T19:18:10+01:00</updated>
<published>2015-07-23T19:18:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135333#p135333</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135333#p135333"/>
<title type="html"><![CDATA[Re: Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135333#p135333"><![CDATA[
Najpierw poprawka: <!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic7402.html" >topic7402.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=471">Jaglarz</a> — 23 lip 2015, o 19:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Maciek_L]]></name></author>
<updated>2015-07-23T19:34:39+01:00</updated>
<published>2015-07-23T16:47:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135322#p135322</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135322#p135322"/>
<title type="html"><![CDATA[Problem z HC-SR04 i timerami]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12425&amp;p=135322#p135322"><![CDATA[
Witam<br />Zamieszczam moje pytanie w tym dziale, ponieważ domyślam się, że problem leży w błędnie przeze mnie napisanym programie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Moim celem jest obsługa czujnika ultradźwiękowego HC-SR04 za pomocą Atmegi8 oraz dwóch timerów (timer0 oraz timer2). Od razu zaznaczam, że trybów CTC zamierzałem użyć dopiero na dalszym etapie czyli wtedy jeżeli opanuję programowo działanie tego czujnika na timerach w trybie normalnym.<br />Poniżej zamieszczę kod tego co wymyśliłem, jednak jeszcze kilka słów moich wyjaśnień.<br />Program działa w 100% jak należy i dobrze odmierza odległość zapalając różne diody. Dzieje się to jednak tylko wtedy, kiedy widzi &quot;przeszkodę&quot;. Kiedy usunę przeszkodę a wysłane impulsy nie wracają do czujnika zaczyna się problem i mimo np. przyłożenie dłoni 5cm od czujnika nie umie już on wejść w przerwanie INT0. Pomaga dopiero przysunięcie dłoni na odległość około 1 cm - wtedy wszystko zaczyna działać i mogę poruszać dłonią a świecące diody zmieniają się jak widać w kodzie kiedy dłoń jest przed lub za 20 cm.<br />Uwagi:<br />a)Timer0 odlicza co 40 us (większą dokładność będę próbował robić dopiero gdy wszystko zadziała)<br />b) Wiem że timery można zatrzymać szybciej ale po prostu próbuję już wszystkiego, bo nie mogę zauważyć błędu<br />c) Wejście PD2 jest podciągnięte rezystorem 1 kilo om  do GND.<br /><br />Dodam że taktowanie Atmegi8 zostało ustawione na 8 MHz dzięki MKAvrCalculator<br /><br />[syntax=c]// dołączenie plików nagłówkowych<br /><br />#include &lt;avr/io.h&gt; //dołączenie podstawowej biblioteki<br />#include &lt;avr/interrupt.h&gt; //dołączenie biblioteki z przerwaniami<br />#include &lt;util/delay.h&gt; //dołączenie biblioteki z opóźnieniami<br /><br />volatile uint16_t czas;<br />uint16_t dystans;<br />uint16_t max = 25;<br />uint16_t min = 2;<br />volatile uint8_t zbocze;<br />volatile uint8_t licznik;<br /><br />int main(void)<br />{<br />     //ustawienia INT0<br />     GICR |= (1&lt;&lt;INT0); //włączenie przerwania INT0<br />     MCUCR |= (1&lt;&lt;ISC00)|(1&lt;&lt;ISC01); //konfiguracja na zbocze narastające<br /><br />     DDRB = 0xFF; //konfiguracja portu jako wyjścia<br />     DDRD &amp;= ~(1&lt;&lt;PD2); //konfiguracja pinu PD2 jako wejście<br />     DDRD |= (1&lt;&lt;PD4); //konfiguracja pinu PD4 jako wyjście<br /><br />     zbocze=1;<br /><br />     TCNT2 = 7; //początkowa wartość licznika w Timer2<br />     TCCR2 |= (1&lt;&lt;CS22); //preskaler 64 w Timer2<br />     TIMSK |= (1&lt;&lt;TOIE2); //reakcja na przepełnienie timera<br /><br />     sei(); //globalne włączenie przerwań<br /><br />     while(1)<br />     {<br />    if(licznik&gt;29) // co 60 ms<br />    {<br />    licznik=0;<br />    TCNT2=7;<br />    PORTD |= (1&lt;&lt;PD4); // stan wysoki dla trigera<br />    _delay_us(10);<br />    PORTD &amp;= ~(1&lt;&lt;PD4); // stan niski dla trigera<br />    }<br />      }<br />}<br /><br />ISR(INT0_vect)  //początek funkcji obsługi przerwania INT0<br />{<br />TCNT2 = 0; // zatrzymanie timer2<br />TCCR2 |= 0x00;<br />TIMSK &amp;= ~(1&lt;&lt;TOIE2);<br /><br />switch(zbocze)<br />{<br />case 1:<br />czas=0;<br />TCNT0 = 217; //początkowa wartość licznika w Timer0<br />TCCR0 |= (1&lt;&lt;CS01); //preskaler 8 w Timer0<br />TIMSK |= (1&lt;&lt;TOIE0); //reakcja na przepełnienie timera<br />zbocze=0;<br />MCUCR &amp;= ~(1&lt;&lt;ISC00); // zamiana INT0 na zbocze opadające<br />break;<br />case 0:<br />TCNT0 = 0; //zatrzymanie timer0<br />TCCR0=0x00;<br />TIMSK &amp;= ~(1&lt;&lt;TOIE0);<br /><br />zbocze=1;<br />MCUCR |= (1&lt;&lt;ISC00)|(1&lt;&lt;ISC01); //konfiguracja na zbocze narastające<br />dystans=(czas*40)/58;<br /><br />if(dystans&lt;21)<br />{<br />PORTB |= (1&lt;&lt;PB1);<br />PORTB &amp;= ~(1&lt;&lt;PB0);<br /><br />}<br />if(dystans&gt;20)<br />{<br />PORTB |= (1&lt;&lt;PB0);<br />PORTB &amp;= ~(1&lt;&lt;PB1);<br />}<br /><br />TCNT2 = 7; //początkowa wartość licznika w Timer2<br />TCCR2 |= (1&lt;&lt;CS22); //preskaler 64 w Timer2<br />TIMSK |= (1&lt;&lt;TOIE2); //reakcja na przepełnienie timera<br />break;<br />}<br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />czas++; //zwiększanie o 40 us<br />TCNT0 = 217; //początkowa wartość licznika w Timer0<br />}<br /><br />ISR(TIMER2_OVF_vect)<br />{<br />licznik++; // zwiększanie o 2 ms<br />TCNT2 = 7; //początkowa wartość licznika w Timer2<br />}[/syntax]<br /><br />Będę wdzięczny za wskazówki i wytknięcie błędów <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Pozdrawiam<br />Maciek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=8226">Maciek_L</a> — 23 lip 2015, o 16:47</p><hr />
]]></content>
</entry>
</feed>