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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-12-09T20:23:13+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=8&amp;t=3090&amp;mode</id>
<entry>
<author><name><![CDATA[robo1973]]></name></author>
<updated>2017-12-09T20:23:13+01:00</updated>
<published>2017-12-09T20:23:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=200272#p200272</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=200272#p200272"/>
<title type="html"><![CDATA[Re: HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=200272#p200272"><![CDATA[
W linku podanym przez kol sz4t4n jaki ma być preskaler dla taktowania 8MHz ? Czy coś jeszcze trzeba zmienić dla tego zegara bo jakieś dziwne wartości pokazuje wyświetlacz<br /><br />[syntax=cpp]#include &lt;avr/io.h&gt;<br />    #include &lt;util/delay.h&gt;<br />    #include &lt;avr/interrupt.h&gt;<br />    #include &quot;lcd44780.h&quot;<br />    <br />    <br />    <br />    void triger(void);<br />    uint8_t licznik_switch=0;<br />    <br />    volatile uint16_t PulseWidth, odlegolsc;<br />    uint16_t licznik_us=0;<br />    <br />    #define KEY_DOWN !(PIND &amp; (1&lt;&lt;PD0))<br />    <br />    int main()<br />    {<br />    <br />    DDRB |= (1&lt;&lt;PB3);       //wyjscie<br />    PORTB &amp;= ~(1&lt;&lt;PB3); //TRIGER<br />    <br />    DDRB &amp;= ~(1&lt;&lt;PB0);      //wejscie ECHO<br />    PORTB &amp;= ~(1&lt;&lt;PB0);     //ICP<br />    <br />  <br /><br />DDRB &amp;= ~(1&lt;&lt;PD0); // wejscie<br />    PORTD |= (1&lt;&lt;PD0); // uSWITCH  podciągnięcie do logicznej jedynki<br />    <br />    lcd_init();<br />    <br />    TCCR1B |= (1&lt;&lt;ICES1);  /* Zbocze narastające wywoła przerwanie*/<br />    TCCR1B |= (1&lt;&lt;CS11);   /* preskaler = 8 */<br />//TCCR1B |=(1&lt;&lt;CS10);                //1 preskalera<br />    //TCCR1B |= (1&lt;&lt;ICNC1); //NOISE CANCELLER<br />    TIMSK |=  (1&lt;&lt;TICIE1);   /* zezwolenie na przerwanie od ICP */<br />    <br />    sei();                 /* globalne zezwolenie na przerwania */<br />    <br />    lcd_cls();<br />    <br />    while(1)<br />    {<br />    licznik_us=(PulseWidth)/2;//7ms opoznienia z przerwań dziele na 2 bo 2MHz<br />    lcd_locate(0,0);<br />    lcd_int(licznik_switch);<br /><br />odlegolsc = PulseWidth/58;<br />lcd_locate(0,5);<br />lcd_int(odlegolsc);<br /><br />    lcd_locate(1,1);<br />    lcd_int(PulseWidth);<br />    lcd_locate(1,10);<br />    lcd_int(licznik_us);<br />    <br />    <br />    if(KEY_DOWN)<br />    {<br />    _delay_ms(80);<br />    if(KEY_DOWN)<br />    {<br />    lcd_cls();<br />    triger(); //wyzwolenie<br />    licznik_switch++;//potwierdzenie wyzwolenia na LCD<br />    }<br />    }<br />    }//koniec while(1)<br />    <br />    <br />    }//koniec main<br />    ISR(TIMER1_CAPT_vect)<br />    {<br />    static uint16_t LastCapture;<br />    <br />    if( !(TCCR1B &amp; (1&lt;&lt;ICES1)) ) PulseWidth = ICR1 - LastCapture;<br />    LastCapture = ICR1;<br />    <br />    TCCR1B ^= (1&lt;&lt;ICES1); //zmiana zbocza<br />    }<br />    <br />    void triger(void)<br />    {<br />    PORTB &amp;= ~(1&lt;&lt;PB3);<br />    _delay_us(2);<br />    PORTB |= (1&lt;&lt;PB3); //wystawienie jedynki na TRIG<br />    _delay_us(10);          //wymagane 10 uS stanu wysokiego<br />    PORTB &amp;= ~(1&lt;&lt;PB3);     //wystawienie zera na TRIG<br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=6554">robo1973</a> — 9 gru 2017, o 20:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Paul Dirac]]></name></author>
<updated>2013-12-10T23:05:46+01:00</updated>
<published>2013-12-10T23:05:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=60522#p60522</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=60522#p60522"/>
<title type="html"><![CDATA[Re: HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=60522#p60522"><![CDATA[
W sumie sporo przydatnych softów. O rezultacie napiszę jutro.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1035">Paul Dirac</a> — 10 gru 2013, o 23:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lukasz89]]></name></author>
<updated>2013-05-12T09:21:41+01:00</updated>
<published>2013-05-12T09:21:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36737#p36737</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36737#p36737"/>
<title type="html"><![CDATA[Re: HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36737#p36737"><![CDATA[
Inicjować czy inkrementować ? A no tak, to pod zerowaniem TCNT0 wyzeruj zmienną licznik.<br />Co do przypadkowego stanu to raczej pojawić się nie powinno. Zerknij jak rozwiązał to SunRiver, link powyżej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=590">Lukasz89</a> — 12 maja 2013, o 09:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Badman]]></name></author>
<updated>2013-05-12T08:30:30+01:00</updated>
<published>2013-05-12T08:30:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36732#p36732</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36732#p36732"/>
<title type="html"><![CDATA[Re: HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36732#p36732"><![CDATA[
<div class="quotetitle">Lukasz89 napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Janadamis napisał(a):</div><div class="quotecontent">Po drugie po co w przerwaniu wyłączasz timer?<br /></div><br />Dokładnie, nie ma takiej potrzeby, preskaler ustaw raz na początku zaś w przerwaniu rób coś innego:<br /></div><br />Jeszcze nie sprawdziłem, ale jeżeli nie zatrzymam TIMER0 to zmienna licznik będzie się wciąż inicjować. Więc na jakiej podstawie ma być prawidłowo odczytany czas ?<br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Poza tym możesz ustawić kombinacje bitów ISC01:0 na 10 i wtedy przerwanie będzie występowało przy zmianie stanu - nie będzie potrzeby ciągłych zmian sposobu wyzwolenia przerwania w samym przerwaniu. Bo jeśli się nie mylę, to przy takim sposobie zmian w trakcie działania programu - przed każdą zmiana należy wyłączać przerwanie z tego źródła, następnie zmienić sposób wyzwalanie, skasować flagę przerwanie - która może się ustawić przy takiej zmianie, i na końcu aktywować przerwanie.<br /></div><br />Zastosuje się do Twojej wskazówki, tyle że należy mieć pewność, że  HC-SR04 na wyjściu echo nie wygeneruje &quot;przypadkowej&quot; zmiany stanu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=916">Badman</a> — 12 maja 2013, o 08:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kiclaw]]></name></author>
<updated>2013-05-11T21:55:44+01:00</updated>
<published>2013-05-11T21:55:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36722#p36722</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36722#p36722"/>
<title type="html"><![CDATA[Re: HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36722#p36722"><![CDATA[
yhh ile ja to się nawalczyłem z tym HC-SR04 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Oczywiście musisz wykorzystać przerwanie od ICP, wtedy preskaler ICP na 8 i potem w kodzie programu jeszcze na dwa, i wtedy masz pięknie podaną szerokość w mikrosekundach. (tylko że u mnie był kwarc 16MHz)<br /><br />To co piszesz o dzieleniu przez 10 jest błędne, wynik w mikrosekundach dzielisz przez 58 i wtedy wychodzi wynik w cm. Nie inaczej. Pozatym tak masz w nocie katalogowej.<br /><br />W kodzie który podał kolega wyżej ma nie być tego odejmowania 7 od zmiennej PulseWidth.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=600">kiclaw</a> — 11 maja 2013, o 21:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sz4t4n]]></name></author>
<updated>2013-05-11T15:57:26+01:00</updated>
<published>2013-05-11T15:57:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36708#p36708</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36708#p36708"/>
<title type="html"><![CDATA[Re: HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36708#p36708"><![CDATA[
Pod tym linkiem masz fajnie działający krótki kod. <a href="http://www.elektroda.pl/rtvforum/topic2443109.html"  class="postlink">http://www.elektroda.pl/rtvforum/topic2443109.html</a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=377">sz4t4n</a> — 11 maja 2013, o 15:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Lukasz89]]></name></author>
<updated>2013-05-11T15:35:52+01:00</updated>
<published>2013-05-11T15:35:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36706#p36706</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36706#p36706"/>
<title type="html"><![CDATA[Re: HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36706#p36706"><![CDATA[
<div class="quotetitle">Janadamis napisał(a):</div><div class="quotecontent"><br />Po drugie po co w przerwaniu wyłączasz timer?<br /></div><br />Dokładnie, nie ma takiej potrzeby, preskaler ustaw raz na początku zaś w przerwaniu rób coś innego:<br />[syntax=c]ISR (INT0_vect)<br /> {<br />         if ( flaga == 0 )<br />         {<br />           //      TCCR0 |= (1&lt;&lt;WGM01); ta cześć kodu do main<br />            //     TCCR0 |=  (1&lt;&lt;CS00); // Start TIMER0 bez prelaskera<br /> TCNT0=0; //zeruj stan timera0<br />                 MCUCR &amp;=  ~(1&lt;&lt;ISC00); // opadajace zbocze wywoluje przerwanie INT0<br />                 flaga = 1;<br />         }<br />         else<br />         {<br />                 //TCCR0 &amp;= ~( (1&lt;&lt;CS02) | (1&lt;&lt;CS01) | (1&lt;&lt;CS00) ); // Stop TIMER0<br />                 //GICR &amp;= ~(1&lt;&lt;INT0); // Zablokowanie przerwania od INT0<br />                 MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00); // Narastajace zbocze wywoluje przerwanie<br />                 odleglosc = licznik;<br />                 licznik = 0;<br />                 flaga = 0;<br />         }<br /> }[/syntax]<br />Poza tym możesz ustawić kombinacje bitów ISC01:0 na 10 i wtedy przerwanie będzie występowało przy zmianie stanu - nie będzie potrzeby ciągłych zmian sposobu wyzwolenia przerwania w samym przerwaniu. Bo jeśli się nie mylę, to przy takim sposobie zmian w trakcie działania programu - przed każdą zmiana należy wyłączać przerwanie z tego źródła, następnie zmienić sposób wyzwalanie, skasować flagę przerwanie - która może się ustawić przy takiej zmianie, i na końcu aktywować przerwanie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=590">Lukasz89</a> — 11 maja 2013, o 15:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SunRiver]]></name></author>
<updated>2013-05-11T15:25:59+01:00</updated>
<published>2013-05-11T15:25:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36705#p36705</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36705#p36705"/>
<title type="html"><![CDATA[Re: HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36705#p36705"><![CDATA[
gdzieś już pisałem o tym na forum poszukajcie , całkiem fajnie chodzą i tańsze od pololu<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/58/6142e2bc30a6b202c17f361d9d88b16b.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/58/6142e2bc30a6b202c17f361d9d88b16b.jpg" alt="Obrazek" /></a><br /><br />brak dokładności na małych odległościach wynika z nakładania się echa na nowy pomiar<br /><br /><!-- l --><a class="postlink-local" href="http://forum.atnel.pl/topic2655.html" >topic2655.html</a><!-- l --><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=58">SunRiver</a> — 11 maja 2013, o 15:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Janadamis]]></name></author>
<updated>2013-05-11T15:16:31+01:00</updated>
<published>2013-05-11T15:16:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36704#p36704</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36704#p36704"/>
<title type="html"><![CDATA[Re: HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36704#p36704"><![CDATA[
Ja też w zeszłym tygodniu kupiłem ten czujnik. <br />Jeszcze nie zacząłem pisać programu ale wydaje mi się że lepiej jakby wykorzystać przerwanie od ICP. Tak jak są odbierane kody z pilota RC5<br />Po drugie po co w przerwaniu wyłączasz timer?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 5 minutach ]</span></strong><br /><br />I może przez ten   _delay_ms(350); z pętli głównej program źle chodzi<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=288">Janadamis</a> — 11 maja 2013, o 15:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Badman]]></name></author>
<updated>2013-05-11T14:05:02+01:00</updated>
<published>2013-05-11T14:05:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36702#p36702</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36702#p36702"/>
<title type="html"><![CDATA[HC-SR04 i Atmega 32]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3090&amp;p=36702#p36702"><![CDATA[
Witam<br /><br />Zakupiłem ultradźwiękowy miernik odległości HC-SR04, napisałem program lecz niezbyt dokładny jest pomiar odległości.<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 /><br />#include &quot;LCD/lcd44780.h&quot;<br /><br />uint8_t flaga;<br />uint16_t licznik, odleglosc;<br /><br /><br />int main(void)<br />{<br />uint16_t l;<br /><br />DDRB |= (1&lt;&lt;PB0); // PB0 wyjsciowy<br />PORTB |= ~(1&lt;&lt;PB0); // PB0 stan niski<br /><br />DDRD |= ~(1&lt;&lt;PD2); // PD2 wejsciowy<br />PORTD |= (1&lt;&lt;PD2); // PD2 podciagniete do VCC<br /><br />_delay_ms(60);<br /><br />// Przerwanie INT0 - konfiguracja<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00); // Narastajace zbocze wywoluje przerwanie<br />GICR |= (1&lt;&lt;INT0); // Odblokowanie przerwania od INT0<br /><br />TIMSK |=  (1&lt;&lt;OCIE0); // Odblokowanie przerwania od przepełnienie TIMER0<br />OCR0 = 8; <br /><br />lcd_init();<br />lcd_str_P( PSTR(&quot;Test HC-SR04&quot;) );<br /><br />sei ();<br /><br />while (1)<br />{<br />// wyzwolenie pomiaru<br />PORTB |= (1&lt;&lt;PB0); // PB0 stan wysoki<br />_delay_us (10);<br />PORTB &amp;= ~(1&lt;&lt;PB0); // PB0 stan niski<br /><br />lcd_locate (1,0);<br />lcd_str_P ( PSTR(&quot;     &quot;) );<br />lcd_locate (1,0);<br />lcd_int( odleglosc / 10 );  // odleglosc powinna byc dzielona na 58<br /><br />_delay_ms(350);<br /><br />}<br /><br />}<br /><br /><br />// Obsluga przerwania INT0<br /> ISR (INT0_vect)<br /> {<br /> if ( flaga == 0 )<br /> {<br /> TCCR0 |= (1&lt;&lt;WGM01);<br /> TCCR0 |=  (1&lt;&lt;CS00); // Start TIMER0 bez prelaskera<br /> MCUCR &amp;=  ~(1&lt;&lt;ISC00); // opadajace zbocze wywoluje przerwanie INT0<br /> flaga = 1;<br /> }<br /> else<br /> {<br /> TCCR0 &amp;= ~( (1&lt;&lt;CS02) | (1&lt;&lt;CS01) | (1&lt;&lt;CS00) ); // Stop TIMER0<br /> //GICR &amp;= ~(1&lt;&lt;INT0); // Zablokowanie przerwania od INT0<br /> MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00); // Narastajace zbocze wywoluje przerwanie<br /> odleglosc = licznik;<br /> licznik = 0;<br /> flaga = 0;<br /> }<br /> }<br /><br /><br />ISR (TIMER0_COMP_vect)<br />{<br />licznik++;<br />}[/syntax] <br /><br />Według dokumentacji zmierzony czas trwania stanu wysokiego powinien być podzielony przez 58, żeby otrzymać wynik w cm. Metodą prób i błędów doszedłem, że zmierzony czas muszę podzielić przez 10, aby wynik w cm był w miarę wiarygodny. Różnica w odległości sięga nieraz 10 cm dla odległości 186 cm. Czyli na wyświetlaczu mam 196 cm.<br />Co jest przyczyną:<br />1. mój program,<br />2. wewnętrzny oscytalor atmegi ustwiony na 8 MHz ma znaczny rozrzut,<br />3. kiepsko skalibrowany uklad HC-SR04<br />?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=916">Badman</a> — 11 maja 2013, o 14:05</p><hr />
]]></content>
</entry>
</feed>