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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2020-09-20T13:56:22+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=23342&amp;mode</id>
<entry>
<author><name><![CDATA[Piotrek_P]]></name></author>
<updated>2020-09-20T13:56:22+01:00</updated>
<published>2020-09-20T13:56:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229050#p229050</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229050#p229050"/>
<title type="html"><![CDATA[Re: Generowanie impulsu, synchronizacja z przerwaniem zewnęt]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229050#p229050"><![CDATA[
Teraz wszystko jasne. Jeszcze raz dziękuję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=290">Piotrek_P</a> — 20 wrz 2020, o 13:56</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2020-09-20T08:42:10+01:00</updated>
<published>2020-09-20T08:42:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229047#p229047</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229047#p229047"/>
<title type="html"><![CDATA[Re: Generowanie impulsu, synchronizacja z przerwaniem zewnęt]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229047#p229047"><![CDATA[
Flaga jest automatycznie kasowana po wejściu w procedurę obsługi przerwania. Kiedy przerwanie INT jest wyłączone procedura nie jest wołana, a więc i nie ma kasowania. A, jak widać, flaga jest ustawiana niezależnie od tego czy przerwanie jest włączone czy nie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 20 wrz 2020, o 08:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Piotrek_P]]></name></author>
<updated>2020-09-19T20:46:05+01:00</updated>
<published>2020-09-19T20:46:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229042#p229042</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229042#p229042"/>
<title type="html"><![CDATA[Re: Generowanie impulsu, synchronizacja z przerwaniem zewnęt]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229042#p229042"><![CDATA[
<div class="quotetitle">fofex napisał(a):</div><div class="quotecontent"><br /><div class="quotetitle">Piotrek_P napisał(a):</div><div class="quotecontent"> po kolejnych naciśnięciach switcha zmiana stanu na pinie PC7 nie następuje zaraz po wystąpieniu przerwania tylko w różnych momentach<br /></div><br />Występuje zaraz po naciśnięciu buttona. Jeśli chcesz żeby przerwanie INT0 wykonało się przy następnym najbliższym zboczu po wciśnieciu buttona, przed aktywacją przerwania INT0 wyzeruj flagę INTF0.<div class="quotetitle">Piotrek_P napisał(a):</div><div class="quotecontent"><br />ustawiam flagę kontrolną. Następnie w pętli głównej sprawdzam czy flaga jest ustawiona. Jeżeli tak to odmierzam 10ms,<br /></div><br /><br />W ten sposób nie otrzymasz stabilnego i pewnego impulsu. W przerwaniu INT startuj timer, a w jego przerwaniu compare lub overflow, w zależności od konfiguracji, go zatrzymuj.</div><br /><br />Dodałem kasowanie flagi INTF0 i teraz zmiana stanu działa perfekcyjnie, choć nadal nie rozumiem dlaczego trzeba tą flagę kasować bo już kiedyś kombinowałem ze sprawdzaniem tej  flagi w pętli i ją kasowałem ale nie było żadnego efektu, a do tego w datasheet znalazłem informację że flagi INTFx są kasowane automatycznie.<br />Docelowo wygenerowanie impulsu ma być przesunięte w czasie od wystąpienia najbliższego zbocza, tak aby włączać odbiornik w szczycie sinusa 230V. Funkcja do omierzania czasu działa precyzyjnie bo jest w oparciu o sprzętowy timer1.<br />@fofex Bardzo mi pomogłeś, bardzo dziękuję, ale jak byś mógł mi jeszcze wytłumaczyć dlaczego trzeba kasować tą flagę skoro w DS piszą że się sama kasuje, tylko nie wiadomo kiedy <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=290">Piotrek_P</a> — 19 wrz 2020, o 20:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fofex]]></name></author>
<updated>2020-09-19T19:57:38+01:00</updated>
<published>2020-09-19T19:57:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229041#p229041</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229041#p229041"/>
<title type="html"><![CDATA[Re: Generowanie impulsu, synchronizacja z przerwaniem zewnęt]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229041#p229041"><![CDATA[
<div class="quotetitle">Piotrek_P napisał(a):</div><div class="quotecontent"><br />po kolejnych naciśnięciach switcha zmiana stanu na pinie PC7 nie następuje zaraz po wystąpieniu przerwania tylko w różnych momentach<br /></div><br />Występuje zaraz po naciśnięciu buttona. Jeśli chcesz żeby przerwanie INT0 wykonało się przy następnym najbliższym zboczu po wciśnieciu buttona, przed aktywacją przerwania INT0 wyzeruj flagę INTF0.<div class="quotetitle">Piotrek_P napisał(a):</div><div class="quotecontent"><br />ustawiam flagę kontrolną. Następnie w pętli głównej sprawdzam czy flaga jest ustawiona. Jeżeli tak to odmierzam 10ms,<br /></div><br />W ten sposób nie otrzymasz stabilnego i pewnego impulsu. W przerwaniu INT startuj timer, a w jego przerwaniu compare lub overflow, w zależności od konfiguracji, go zatrzymuj.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21072">fofex</a> — 19 wrz 2020, o 19:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Piotrek_P]]></name></author>
<updated>2020-09-19T17:58:02+01:00</updated>
<published>2020-09-19T17:58:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229039#p229039</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229039#p229039"/>
<title type="html"><![CDATA[Generowanie impulsu, synchronizacja z przerwaniem zewnętrzny]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23342&amp;p=229039#p229039"><![CDATA[
Witam,<br /><br />Mam następujący problem z programem. Już wyjaśniam o co chodzi. Procek ATMega32 na zestawie ATB 1.05a  taktowany kwarcem 16Mhz ma wygenerować impuls o określonej długości np. 10ms gdy na INT0 pojawi się zbocze narastające. Do INT0 doprowadzam sygnał 50Hz(z Timera2), docelowo z detektora zera sieci 230V. Przerwanie od INT0 normalnie jest zablokowane. Naciskając przycisk(switch) wywołuję funkcję której zadaniem jest tylko odblokować przerwanie INT0, a w funkcji obsługi przerwania blokuję obsługę tego przerwania, zmieniam stan na pinie PC7 na niski i ustawiam flagę kontrolną. Następnie w pętli głównej sprawdzam czy flaga jest ustawiona. Jeżeli tak to odmierzam 10ms, zmieniam stan na wyjściu PC7 na wysoki i zeruję flagę a procek czeka na kolejne wciśnięcie switcha. Niby prosta sprawa, ale po podłączeniu analizatora jednym kanałem do generatora(pin PD7) oraz drugim kanałem do wyjścia PC7 obserwuję że po kolejnych naciśnięciach switcha zmiana stanu na pinie PC7 nie następuje zaraz po wystąpieniu przerwania tylko w różnych momentach. Już myślałem że się walnąłem przy konfiguracji przerwania, ale według datasheeta jest ok. Poniżej kilka screenów i kod źródłowy.<br /><a href="https://obrazkiforum.atnel.pl/290/6d11c78f934b8681a529ef95db2f538d.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/290/6d11c78f934b8681a529ef95db2f538d.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/290/c15955cf1dfb7aecc9fd76388a39c08f.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/290/c15955cf1dfb7aecc9fd76388a39c08f.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/290/44d080067fcf4ae6b9fc7368fc3d886e.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/290/44d080067fcf4ae6b9fc7368fc3d886e.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/290/dd680ddc622e8d169d651001b589d542.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/290/dd680ddc622e8d169d651001b589d542.jpg" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/290/de579024876b8eff183633db80153bde.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/290/de579024876b8eff183633db80153bde.jpg" alt="Obrazek" /></a><br /><br />[syntax=c]/*<br /> * mainc.c<br /> *<br /> *  Created on: 11 sie 2020<br /> *      Author: Piotr<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />//#include &lt;util/delay.h&gt;<br />//#include &lt;avr/pgmspace.h&gt;<br />//#include &lt;string.h&gt;<br />//#include &lt;inttypes.h&gt;<br />//#include &lt;math.h&gt;<br /><br />#include &quot;pp_timers.h&quot;<br /><br /><br />#define SW_START(1 &lt;&lt; PC0)<br /><br />#define SIG_OUT(1 &lt;&lt; PC6)<br />#define SIG_OUT_ON  PORTC |= SIG_OUT<br />#define SIG_OUT_OFF PORTC &amp;=~SIG_OUT<br />#define SIG_OUT_TOG PORTC ^= SIG_OUT<br /><br />#define LED_1(1 &lt;&lt; PC7)<br />#define LED_1_ONPORTC &amp;=~LED_1<br />#define LED_1_OFFPORTC |= LED_1<br /><br />uint8_t key_lock;<br />volatile uint8_t f_int0;<br /><br />void wait_ms( uint16_t ms );<br />void start( void );<br /><br /><br /><br />int main( void ){<br /><br />PORTC |= SW_START;// podciągnięcie klawisza do VCC<br />DDRC  |= SIG_OUT | LED_1;<br />//DDRD  &amp;= ~(1&lt;&lt;PD2);     //INT0 jako wejście<br />DDRD  |=  (1&lt;&lt;PD7);// wyjście generatora<br />PORTD |=  (1&lt;&lt;PD2);// podciągnięcie pinu INT0 do VCC<br /><br />LED_1_OFF;<br /><br />MCUCR  |= (1 &lt;&lt; ISC01) | (1 &lt;&lt; ISC00); //INT0 - reakcja na zbocze narastające<br />TCCR1B |= (1 &lt;&lt; WGM12); //Timer1 - CTC na potrzeby funkcji wait_ms<br />TCCR2  |= (1 &lt;&lt; WGM21); //Timer2 - CTC - generator 50Hz<br /><br />timer2_start(); // włączenie generatora 50Hz z timera 2<br /><br />f_int0 = 0;<br /><br />sei();<br />while( 1 ){<br /><br />key_press( &amp;key_lock, &amp;PINC, SW_START, start); // funkcja obsługi klawiszy z bloga mirekk36<br />if(f_int0){<br /><br />wait_ms(10);<br />LED_1_OFF;<br />f_int0 = 0;<br />}<br />}<br />}<br /><br />void start( void ){<br /><br />GICR |= (1 &lt;&lt; INT0); //odblokowanie obsługi przerwania INT0<br />}<br /><br />ISR(INT0_vect){<br />GICR &amp;= ~(1 &lt;&lt; INT0); //zablokowanie obsługi przerwania INT0<br />f_int0 = 1;<br />LED_1_ON;<br />//SIG_OUT_ON;<br /><br />}<br />void wait_ms( uint16_t ms){<br /><br />for( uint16_t cnt= ms;cnt&gt;0;cnt--){<br />wait_us(1000); // jedna milisekunda<br />}<br /><br />}[/syntax]<br /><br />Walczę z tematem już dość długo, dlatego proszę o jakieś sugestie jeżeli ma ktoś ochotę pomóc.<br />Z góry dziękuję <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=290">Piotrek_P</a> — 19 wrz 2020, o 17:58</p><hr />
]]></content>
</entry>
</feed>