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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-06-10T11:07:49+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=11968&amp;mode</id>
<entry>
<author><name><![CDATA[kanciaqel]]></name></author>
<updated>2015-06-10T11:07:49+01:00</updated>
<published>2015-06-10T11:07:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131395#p131395</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131395#p131395"/>
<title type="html"><![CDATA[Re: Sprawdzanie stanu flagi w przerwaniu, flaga ustawiana w]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131395#p131395"><![CDATA[
<div class="quotetitle">Antystatyczny napisał(a):</div><div class="quotecontent"><br />Hmm, ciekawy warunek... Przyznaję, że zaglądałem w ten kod, ale to mi umknęło. Myślę, że chodziło mniej więcej o to:  Jeżeli licznik sekund jest różny od zero oraz naliczył taką ilosć, że operacja modulo 3 zwraca zero, to zresetuj bluetooth. Hmm, wydaje mi sie, że to moze działać, ale ja bym onawiasował obie części warunku, czyli:<br />[syntax=c]if( (sekundy%3 == 0) &amp;&amp; (sekundy !=0) ) reset_BT();[/syntax]<br /></div><br /><br />Ten warunek z sekundami działa, tylko chodzi mi o tą flagę i warunek flagi, który w przerwaniu powinien być (w tym przypadku) zawsze spełniony i wykonany. W moim szerszym projekcie urządzenie bt łączy się w trybie master automatycznie z różnymi urządzeniami BT. Chodzi o to, że w przypadku nawiązania połączenia z nieodpowiednim urządzeniem, takim jak jakiś telefon komórkowy przechodnia i w przypadku nieodebrania danych (ponieważ urządzenie takie nie należy do systemu) po 3 sek musi nastąpić automatyczne zerwanie połączenia bluetooth. W przypadku nawiązania połączenia z urządzeniem bt należącym systemu następuje wymiana danych i rozłączenie się. W funkcji odbiorczej używam standardowej funkcji odbioru danych zawartej w katalogu atmega32, która będzie czekała w tym miejscu kodu na odebranie danych. <br />[syntax=c]unsigned char ReceiveUSART( void )  // funkcja odbioru bajtu z RS232<br />{//dopoki bufor nie będzie pusty zwraca wartosc funkcji<br />   while ( !(UCSRA &amp; (1&lt;&lt;RXC)) );<br />   return UDR;<br />}[/syntax]<br />Nie mogę także na sztywno sparować moich obu układów z modułami BTM222, ponieważ do systemu należało będzie wiele układów z modułem BTM222 i zapisanie ich wszystkich w pamięci mikrokontrolera jest niemożliwe.<br /><br />Niestety mogę załączyć tylko drobną część mojego kodu dotyczącą mojego problemu, jak ta wspomniana wcześniej w &quot;Sposób 1&quot;, ponieważ jest to kawałek mojej pracy dyplomowej i nie mogę na obecną chwilę udostępnić pełnej jej zawartości.<br /><br />Reasumując zastanawia mnie tylko dlaczego warunek if (flaga==1) sprawdzany co 1sek nie uruchamia się, mimo że cały czas w main w pętli while flaga=1. Trochę dziwna sytuacja, bo powinno to działać. Mogę prosić o pomoc? (tak na wszelki wypadek sprawdziłem czy ten warunek, o którym Pan wspomniał naprawi problem, ale nie niestety pomogło)<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 46 minutach ]</span></strong><br /><br /><div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />1. a po co kolega inicjalizuje zerami zmienne na początku kodu ? to kompletnie niepotrzebne - robi to kompilator<br />2. z tą flagą ustawianą w pętli głównej programu i próbą obsługi tego w przerwaniu to kolega przesadził o tyle - że widać, że nie rozumiesz na razie kompletnie idei działania tego typu programowych flag. Toż w pętli głównej wciąż milion razy na sekundę ją ustawiasz więc czego innego się spodziewasz w przerwaniu niż 1 ?<br /><br />Na prawdę proponuję zacząć naukę C od książki:<br /><!-- m --><a class="postlink" href="http://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >http://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><br /><br />gwarantuję, że nie tylko kwestia flag się wyjaśni ale jeszcze mnóstwo innych rzeczy<br /><br />PS jeśli zmienna licznik jest wykorzystywana TYLKO w przerwaniu to niepotrzebny jest specyfikator volatile, ba! nie ma sensu jej robić jako zmienną globalną - a dać jako statyczną właśnie w przerwaniu .... I o tym też jest w Bluebooku dlatego go polecam bo widzę, że sporo jeszcze przed kolegą<br /></div><br /><br /><br />Ad.2) Spodziewam się tylko wartości flaga=1 i wykonania warunku w przerwaniu ISR if (flaga==1). Jest to miniprogram i chciałem tylko, aby w przerwaniu następowała reakcja na ustawioną flagę, jednak wtedy program nie reaguje i zastanawia mnie to dlaczego tak się dzieje. Z mojego punktu widzenia wynik działania programu przedstawionego w &quot;sposób 1&quot; powinien być taki sam jak wynik programu opisanego w &quot;sposób 2&quot;, lecz zasada działania nieco inna.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5134">kanciaqel</a> — 10 cze 2015, o 11:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-06-10T09:59:37+01:00</updated>
<published>2015-06-10T09:59:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131385#p131385</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131385#p131385"/>
<title type="html"><![CDATA[Re: Sprawdzanie stanu flagi w przerwaniu, flaga ustawiana w ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131385#p131385"><![CDATA[
1. a po co kolega inicjalizuje zerami zmienne na początku kodu ? to kompletnie niepotrzebne - robi to kompilator<br />2. z tą flagą ustawianą w pętli głównej programu i próbą obsługi tego w przerwaniu to kolega przesadził o tyle - że widać, że nie rozumiesz na razie kompletnie idei działania tego typu programowych flag. Toż w pętli głównej wciąż milion razy na sekundę ją ustawiasz więc czego innego się spodziewasz w przerwaniu niż 1 ?<br /><br />Na prawdę proponuję zacząć naukę C od książki:<br /><!-- m --><a class="postlink" href="http://atnel.pl/mikrokontrolery-avr-jezyk-c.html" >http://atnel.pl/mikrokontrolery-avr-jezyk-c.html</a><!-- m --><br /><br />gwarantuję, że nie tylko kwestia flag się wyjaśni ale jeszcze mnóstwo innych rzeczy<br /><br />PS jeśli zmienna licznik jest wykorzystywana TYLKO w przerwaniu to niepotrzebny jest specyfikator volatile, ba! nie ma sensu jej robić jako zmienną globalną - a dać jako statyczną właśnie w przerwaniu .... I o tym też jest w Bluebooku dlatego go polecam bo widzę, że sporo jeszcze przed kolegą<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 10 cze 2015, o 09:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2015-06-10T09:54:00+01:00</updated>
<published>2015-06-10T09:54:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131384#p131384</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131384#p131384"/>
<title type="html"><![CDATA[Re: Sprawdzanie stanu flagi w przerwaniu, flaga ustawiana w ]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131384#p131384"><![CDATA[
Witam<br />Tylko się nie śmiej: co to za warunek?<br />[syntax=c]if(  ...&amp;&amp; sekundy!= 0)[/syntax]<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 10 cze 2015, o 09:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kanciaqel]]></name></author>
<updated>2015-06-10T08:57:09+01:00</updated>
<published>2015-06-10T08:57:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131381#p131381</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131381#p131381"/>
<title type="html"><![CDATA[Sprawdzanie stanu flagi w przerwaniu, flaga ustawiana w main]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=11968&amp;p=131381#p131381"><![CDATA[
Witam forumowicze <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Chciałbym Was zapytać czy wiecie może jak usunąć błąd? W funkcji main ustawiam flagę zadeklarowaną jako zmienną globalną, natomiast w przerwaniu następuje sprawdzanie jej stanu co 1sek. Warunek sprawdzający czy flaga==1 nie działa poprawnie, mimo że warunek ten jest zawsze spełniony (flaga=1 w pętli nieskończonej while).<br /><br />Sposób 1(działający, ale bez sprawdzania flagi, której potrzebuję):<br /><br /><span style="color: #FF0000">Źle wstawiony kod - Różowo-zielony J.</span><br /><br />Sposób 2(niedziałający nie działa if(flaga==1) w funkcji przerwania ISR):<br /><br /><span style="color: #FF0000">Źle wstawiony kod - Różowo-zielony J.</span><br /><br />W podglądzie mojego postu niepoprawnie wypisało define (bez PA7), dlatego tu zamieszczam jeszcze raz definicje:<br />#define reset_ONPORTA &amp;=~(1&lt;&lt;PA7)<br />#define reset_OFFPORTA |= (1&lt;&lt;PA7)<br />Na pewno błędu nie powoduje _delay_ms(100) umieszczony w funkcji reset_BT (w przerwaniu), ponieważ w Sposobie nr1 nie powodował problemów. Macie może jakieś fajne pomysły? Wydaje mi się, że popełniam jakiś elementarny błąd. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />P.S.<br />Za mądre odpowiedzi daję + <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 14 minutach ]</span></strong><br /><br />Ponownie wstawiam kod programu:<br /><br />Sposób 1(działający, ale bez funkcji sprawdzania flagi w przerwaniu)<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;inttypes.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define reset_ONPORTA &amp;=~(1&lt;&lt;PA7)<br />#define reset_OFFPORTA |= (1&lt;&lt;PA7)<br /><br />volatile uint8_t licznik=0; //licznik występujący w przerwaniu<br />volatile uint8_t sekundy=0;//zlicza sekundy<br />volatile uint8_t flaga=0;   //stan połączenia<br /><br />void reset_BT(void);<br /><br />int main(void){<br />DDRA|=(1&lt;&lt;PA7);<br />PORTA|=(1&lt;&lt;PA7);<br /><br />//timer2<br />TCCR2 |=(1&lt;&lt;CS20)|(1&lt;&lt;CS21)|(1&lt;&lt;CS22)|(1&lt;&lt;WGM21);//preskaler=1024, tryb ctc<br />TIMSK |= (1&lt;&lt;TOIE2);<br />TCNT2 =131;<br /><br />sei();<br /><br />while(1){//jakas pętla nieskonczona, podczas której występuje przerwanie ISR<br />flaga=1;<br /><br />//*-------------FLAGA-------------------------*<br />//|0 - brak połączenia bluetooth|<br />//|1 - nawiązano połączenie bluetooth (BT)|<br />//*-------------------------------------------*<br />_delay_ms(10000);<br />}<br />}<br /><br /><br /><br />ISR(TIMER2_OVF_vect){//przerwanie co 1sek<br />licznik++;<br />if (licznik&gt;125){ //minęła 1sek<br />licznik=0;//wyzerowanie licznika<br />sekundy++;//zwiększenie licznika sekund<br />if (sekundy&gt;59){ //reset licznika sekund co 1min (aby się nie przepełnił po 255sek)<br />sekundy=0;<br />}<br />//START_WARUNEK_FLAGI<br />//if (flaga==1){ //jeżeli połączono to resetuj licznik sekund (WARUNEK Z FLAGĄ NIE DZIAŁA, BEZ TEGO WARUNKU RESETUJE CO 3SEK, ALE MI JEST POTRZEBNY TEN WARUNEK FLAGI)<br />//sekundy=0;<br />if (sekundy%3==0 &amp;&amp; sekundy!= 0){<br />reset_BT(); // automatyczne zerwanie połączenia BT po 3sek od chwili nawiązania połączenia BT<br />}<br />//}//END_WARUNEK_FLAGI<br />}<br />TCNT2=131;<br />}<br /><br />//funkcja zrywająca połączenie bluetooth poprzez podanie na pin RESET zera logicznego, a następnie jedynki<br />void reset_BT(void) {<br />reset_ON; //wyłączenie zasilania<br />_delay_ms(100);<br />reset_OFF; //włączenie zasilania<br /><br />}[/syntax]<br /><br />Sposób 2 (niedziałający - nie działa funkcja sprawdzania flagi w przerwaniu):<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;inttypes.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define reset_ONPORTA &amp;=~(1&lt;&lt;PA7)<br />#define reset_OFFPORTA |= (1&lt;&lt;PA7)<br /><br />volatile uint8_t licznik=0; //licznik występujący w przerwaniu<br />volatile uint8_t sekundy=0;//zlicza sekundy<br />volatile uint8_t flaga=0;   //stan połączenia<br /><br />void reset_BT(void);<br /><br />int main(void){<br />DDRA|=(1&lt;&lt;PA7);<br />PORTA|=(1&lt;&lt;PA7);<br /><br />//timer2<br />TCCR2 |=(1&lt;&lt;CS20)|(1&lt;&lt;CS21)|(1&lt;&lt;CS22)|(1&lt;&lt;WGM21);//preskaler=1024, tryb ctc<br />TIMSK |= (1&lt;&lt;TOIE2);<br />TCNT2 =131;<br /><br />sei();<br /><br />while(1){//jakas pętla nieskonczona, podczas której występuje przerwanie ISR<br />flaga=1;<br /><br />//*-------------FLAGA-------------------------*<br />//|0 - brak połączenia bluetooth|<br />//|1 - nawiązano połączenie bluetooth (BT)|<br />//*-------------------------------------------*<br />_delay_ms(10000);<br />}<br />}<br /><br /><br /><br />ISR(TIMER2_OVF_vect){//przerwanie co 1sek<br />licznik++;<br />if (licznik&gt;125){ //minęła 1sek<br />licznik=0;//wyzerowanie licznika<br />sekundy++;//zwiększenie licznika sekund<br />if (sekundy&gt;59){ //reset licznika sekund co 1min (aby się nie przepełnił po 255sek)<br />sekundy=0;<br />}<br />//START_WARUNEK_FLAGI<br />if (flaga==1){ //jeżeli połączono to resetuj licznik sekund (WARUNEK Z FLAGĄ NIE DZIAŁA, BEZ TEGO WARUNKU RESETUJE CO 3SEK, ALE MI JEST POTRZEBNY TEN WARUNEK FLAGI)<br />sekundy=0;<br />if (sekundy%3==0 &amp;&amp; sekundy!= 0){<br />reset_BT(); // automatyczne zerwanie połączenia BT po 3sek od chwili nawiązania połączenia BT<br />}<br />}//END_WARUNEK_FLAGI<br />}<br />TCNT2=131;<br />}<br /><br />//funkcja zrywająca połączenie bluetooth poprzez podanie na pin RESET zera logicznego, a następnie jedynki<br />void reset_BT(void) {<br />reset_ON; //wyłączenie zasilania<br />_delay_ms(100);<br />reset_OFF; //włączenie zasilania<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=5134">kanciaqel</a> — 10 cze 2015, o 08:57</p><hr />
]]></content>
</entry>
</feed>