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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2019-01-21T21:17:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=21272&amp;mode</id>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2019-01-21T21:17:37+01:00</updated>
<published>2019-01-21T21:17:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=216004#p216004</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=216004#p216004"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=216004#p216004"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Najważniejsze żeby wszystko już na stole działało w 100% zgodnie z założeniami wtedy po zainstalowaniu na bramie będzie łatwiej uruchamiać <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /></div><br />Sam ATtiny działa w 100%, ale sterownik będzie zawierał jeszcze dwa komparatory na LM393 - jeden do czujnika zmierzchowego, drugi do zabezp. przeciążeniowego, współpracujący z modułem pomiaru prądu na ukłdzie ACS712. I tu mogą zdarzyć się niespodzianki, a niespodzianki mnie lubią, bez wzajemności <img src="https://forum.atnel.pl/images/smilies/icon_twisted.gif" alt=":twisted:" title="Szalony" /> <br />Może też się okazać konieczne zamienić miejscami jakieś piny, żeby uprościć ścieżki na płytce. <br />Na razie dopracowuję schemat na papierze. Muszę to przespać, kilka razy przemyśleć, może nasunie się jakiś nowy pomysł. Został mi jeden wolny pin w mikrokontrolerze, więc kto wie?  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br />Gdy to dopracuję, na pewno umieszczę całą konstrukcję w dziale DIY.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 21 sty 2019, o 21:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2019-01-21T16:09:32+01:00</updated>
<published>2019-01-21T16:09:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215999#p215999</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215999#p215999"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215999#p215999"><![CDATA[
Najważniejsze żeby wszystko już na stole działało w 100% zgodnie z założeniami wtedy po zainstalowaniu na bramie będzie łatwiej uruchamiać <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=1922">SylwekK</a> — 21 sty 2019, o 16:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2019-01-21T14:19:05+01:00</updated>
<published>2019-01-21T14:19:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215996#p215996</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215996#p215996"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215996#p215996"><![CDATA[
Praktycznie ukończyłem program. Jest wszystko co chciałem osiągnąć. Pewnie potrzebne będą jakieś korekty przy uruchamianiu sterownika - z tym poczekam do wiosny, nie chcę marznąć teraz w garażu  <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" /> <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;pwm.h&quot;                // dołączenie pliku nagłówkowego z obsługą PWM<br />#include &quot;timer.h&quot;              // dołączenie pliku nagłówkowego z obsługą timera tykającego co 1ms<br /><br />#define PWM_WY  (1&lt;&lt;PD5)        // wyjście PWM sterujące tranzystorem MOSFET<br />#define PKO_WY (1&lt;&lt;PD0)         // wyjście na przekaźnik OTWARCIA<br />#define PKZ_WY (1&lt;&lt;PD1)         // wyjście na przekaźnik ZAMKNIĘCIA<br />#define PK_LAMP (1&lt;&lt;PD2)// wyjście na przekaźnik LAMPA<br />#define LED_WY (1&lt;&lt;PD3)         // wyjście na LED<br /><br />#define KEY_STOP (1&lt;&lt;PB7)       // wejście przycisku STOP<br />#define KEY_PINZ (1&lt;&lt;PB6)       // wejście przycisku ZAMKNIJ<br />#define KEY_PINO (1&lt;&lt;PB5)       // wejście przycisku OTWÓRZ<br />#define KEY_KASUJ  (1&lt;&lt;PB4)//wejście przycisku KASUJ<br />#define KEY_LAMP (1&lt;&lt;PB3)       // wejście przycisku LAMPA<br />#define KEY_INDO (1&lt;&lt;PB2)       // wejście czujnika indukcyjnego otwarcia<br />#define KEY_KRZ  (1&lt;&lt;PB1)       // wejście krańcówki zamknięcia<br />#define KEY_KRO  (1&lt;&lt;PB0)       // wejście krańcówki otwarcia<br />//wejścia na porcie A<br />#define ZMIERZCH  (1&lt;&lt;PA1)//wejście komparatora zmierzchowego 0-ciemno, 1-jasno<br />#define IN_AMPER (1&lt;&lt;PA0)//wejście komparatora przeciążenia silnika 0-przeciążenie, 1-OK<br />//wejścia na porcie D<br />#define FOTO     (1&lt;&lt;PD6)       // wejście fotokomórki<br /><br />#define PKO_OFF PORTD &amp;= ~PKO_WY        // makrodefinicja - załączenie przekaźnika OTWARCIA<br />#define PKO_ON PORTD |= PKO_WY          // makrodefinicja - wyłączenie przekaźnika OTWARCIA<br />#define PKZ_OFF PORTD &amp;= ~PKZ_WY        // makrodefinicja - załączenie przekaźnika ZAMKNIĘCIA<br />#define PKZ_ON PORTD |= PKZ_WY          // makrodefinicja - wyłączenie przekaźnika ZAMKNIĘCIA<br />#define LAMP_ON PORTD |= PK_LAMP    // makrodefinicja - załączenie przekaźnika LAMPA<br />#define LAMP_OFF PORTD &amp;= ~PK_LAMP// makrodefinicja - wyłączenie przekaźnika LAMPA<br />#define LED_MIG PORTD ^= LED_WY         // miganie LED - kontrolka<br />#define LED_ON PORTD |= LED_WY          // załącz LED - kontrolka<br />#define LED_OFF PORTD &amp;= ~LED_WY        // wyłącz LED - kontrolka<br />#define NO_SENS_TIME 120//czas nieczułości czujnika zmierzchowego - podany w sekundach<br />#define SHORT_TIME 120//krótki czas świecenia lampy - czas podany w sekundach<br />#define LONG_TIME 900//długi czas świecenia lampy - czas podany w sekundach<br />#define TEST_TIME 2//testowy czas świecenia lampy, po zadziałaniu czujnika zmierzchowego<br />// (gdy jest jasno)<br /><br />//określenia &quot;maszyny stanów&quot;<br />enum maszyna_st {<br />stop, otwieranie, zamykanie, przeciazenie<br />};<br /><br />enum maszyna_st stan;<br /><br />uint8_t predkosc_rampy = 6; //prędkość rampy PWM do przyspieszania/zwolniania silnika<br />uint8_t predkosc_silnika;       //deklaracja zmiennej licznika dla PWM<br />uint8_t key_lock;//zmienna pomocnicza przy obsłudze włączania LAMPY (inkrementacja do 255)<br />volatile uint8_t mig; //zmienna dla migania LED<br /><br />//Pole bitowe<br />struct {<br />uint8_t zmierzch:1; //flaga wył. zmierzchowego 0=ciemno, 1=jasno<br />uint8_t pauza:1; //flaga 0=wyłączony timer nieczułości, 1=włączony timer nieczułości<br />uint8_t rampa_kierunek:1;     //flaga 0=postój, 1=praca silnika<br />uint8_t krancowka_O:1;//flaga krańcówki całkowitego otwarcia<br />uint8_t krancowka_Z:1;//flaga krańcówki całkowitego zamknięcia<br />uint8_t wolniej:1;//flaga czujnika zwolnienia silnika<br />uint8_t x;//flaga w funkcji pressKR<br />uint8_t lampa;//flaga 0=lampa &quot;na czuwaniu&quot;, 1=lampa włączona ręcznie przyciskiem<br />} flaga;<br /><br />//deklaracja funkcji obsługi przycisków z filtracją zakłóceń<br />void press(uint8_t KEY_x, uint8_t stan_x, uint8_t timer_key_x);<br />uint8_t pressKR(uint8_t KEY_x, uint8_t timer_key_x);<br /><br /><br />int main(void) {<br /><br />timer_init();           // inicjalizacja timera tykającego co 1ms<br />pwm_init();             // inicjalizacja PWM<br /><br />sei();// włączenie globalnego zezwolenia na przerwania<br /><br />DDRD |= PKO_WY | PKZ_WY | PK_LAMP;             //ustawienie pinów portu D jako wyjścia<br />DDRD |= PWM_WY | LED_WY;<br />PORTB |= KEY_PINO | KEY_PINZ | KEY_KRO | KEY_STOP;      //podciągnięcie wejść do Vcc<br />PORTB |= KEY_INDO | KEY_LAMP | KEY_KRZ | KEY_KASUJ;//tylko jeśli nie ma wlutowanych<br />PORTA |= ZMIERZCH | IN_AMPER;//rezystorów podciągających<br />PORTD |= FOTO;<br /><br />_delay_ms(10);  // oczekiwanie na ustalenie się stanu wysokiego na wejściach<br /><br />while (1) {<br /><br />if(stan == zamykanie) {//zadziałanie fotokomórki tylko podczas zamykania<br />press(FOTO, stop, timer_FOTO);<br />}<br /><br />if(stan) {//zadziałanie zabezp. przeciążeniowego silnika<br />if (!(PINA &amp; IN_AMPER)) stan = przeciazenie;<br />}<br /><br />if(stan!=przeciazenie){//Po zadziałąniu zabezp. przeciciążenia blokowane są<br />//przyciski STOP, OTWÓRZ, ZAMKNIJ aż do skasowania przyciskiem KASUJ<br />press(KEY_STOP, stop, timer_keySTOP);//wejście przycisku STOP<br /><br />if(stan != zamykanie) {//Blokowanie przycisku OTWÓRZ podczas zamykania<br />press(KEY_PINO, otwieranie, timer_keyO);//wywołanie funkcji / wejście przycisku OTWÓRZ<br />}<br /><br />if(stan != otwieranie) {//Blokowanie przycisku ZAMKNIJ podczas otwierania<br />press(KEY_PINZ, zamykanie, timer_keyZ);//wejście przycisku ZAMKNIJ<br />}<br />}<br /><br /><br />flaga.krancowka_O = pressKR(KEY_KRO, timer_keyKRO);//wejście krańcówki otwarcia<br /><br />flaga.krancowka_Z = pressKR(KEY_KRZ, timer_keyKRZ);//wejście krańcówki zamknięcia<br /><br />flaga.wolniej = pressKR(KEY_INDO, timer_keyIND);//wejście czujnika indukcyjnrgo, zwalniającego<br /><br />flaga.lampa = pressKR(KEY_LAMP, timer_keyLAMP);//wejście przycisku wł-wył LAMPY<br /><br /><br />switch (stan) {<br />case stop: //stan = 0<br />predkosc_silnika = 0;<br />OCR0B = 0;<br />flaga.rampa_kierunek = 0;<br />flaga.pauza = 0;<br />PKO_OFF;<br />PKZ_OFF;<br />break;<br /><br />case otwieranie: //stan = 1<br />PKO_ON;//kierunek silnika otwieranie<br />if(!flaga.zmierzch) {//jeśli jest jasno, to timer_lampy NIE zostanie ustawiony<br />if(timer_lampy &lt; SHORT_TIME) timer_lampy = SHORT_TIME;//jeśli czas świecenia lampy jest krótszy od SHORT_TIME<br />}//lub jeśli lampa jest wyłączona (timer_lampy=0),<br />//to timer_lampy zostanie ustawiony na czas SHORT_TIME<br /><br />if (!timer_ind &amp;&amp; !flaga.pauza) {<br />timer_ind = 2;//timer czasu nieczułości czujnika zwalniania w sekundach<br />flaga.pauza = 1;<br />}<br />if (flaga.krancowka_O) {<br />stan = stop;//wyłącz po osiągnięciu krańcówki otwarcia<br />//LED_ON;<br />}<br />break;<br /><br />case zamykanie: //stan = 2<br />PKZ_ON;//kierunek silnika zamykanie<br />if(!flaga.zmierzch) {//jeśli jest jasno, to timer_lampy NIE zostanie ustawiony<br />if(timer_lampy &lt; SHORT_TIME) timer_lampy = SHORT_TIME;//jeśli czas świecenia lampy jest krótszy od SHORT_TIME<br />}//lub jeśli lampa jest wyłączona (timer_lampy=0),<br />//to timer_lampy zostanie ustawiony na czas SHORT_TIME<br /><br />if (!timer_ind &amp;&amp; !flaga.pauza) {<br />timer_ind = 2;//timer czasu nieczułości czujnika zwalniania w sekundach<br />flaga.pauza = 1;<br />}<br />if (flaga.krancowka_Z) {<br />stan = stop; //wyłącz po osiągnięciu krańcówki zamknięcia<br />//LED_OFF;<br />}<br />break;<br /><br />case przeciazenie: //stan = 3Po zadziałaniu zabezp. przeciążeniowego silnika<br />predkosc_silnika = 0;//trzeba skasować stan PRZECIĄŻENIE, aby wejść w stan STOP<br />OCR0B = 0;<br />flaga.rampa_kierunek = 0;<br />flaga.pauza = 0;<br />PKO_OFF;<br />PKZ_OFF;<br />if (!(PIND &amp; KEY_KASUJ)) stan = stop;<br /><br />}<br /><br />if (!timer &amp;&amp; stan) //połączony warunek - wykonuj tylko jeśli jakiś ruch ma być<br />{<br />timer = predkosc_rampy;<br />OCR0B = predkosc_silnika;<br /><br />if (flaga.wolniej &amp;&amp; !timer_ind) //zmienna timer_ind blokuje czujnik zwalniania prędkości<br />flaga.rampa_kierunek = 1; //po tym czasie czeka na dojechanie do drugiego czujnika zwalniania prędkości<br /><br />if (!flaga.rampa_kierunek) {<br />if (predkosc_silnika &lt; 255)<br />predkosc_silnika++;  //przyspieszanie<br />} else {<br />if (predkosc_silnika &gt; 10)<br />predkosc_silnika--; //zwalnianie - 50 to minimalna prędkość dojazdowa przy jakiej silnik jeszcze kręci<br />}<br />}<br /><br />// Warunek zezwalający na miganie diody<br />if(flaga.krancowka_Z || flaga.krancowka_Z)  mig = 0; //jeżeli jedna z krańcówek jest wciśnięta - miganie wyłączone<br />  else mig = 1;//jeżeli obie krańcówki są zwolnione - miganie włączone<br />if(stan == przeciazenie) mig = 2;<br />  if(flaga.krancowka_O) LED_ON;<br />  if(flaga.krancowka_Z) LED_OFF;<br /><br /><br />//Procedura czasu nieczułości czujnika zmierzchowego<br />  if (PINA &amp; ZMIERZCH)<br />   {<br />     if(!timer_zmierzch) flaga.zmierzch = 1;// flaga.zmierzch = 1-jasno<br />   }<br />  else {<br />  timer_zmierzch=NO_SENS_TIME;<br />  flaga.zmierzch = 0;// flaga.zmierzch = 0-ciemno<br />  }<br /><br />//Procedura skracania czasu świecenia lampy po rozjaśnieniu<br />  if((timer_lampy&gt;TEST_TIME) &amp;&amp; flaga.zmierzch) timer_lampy=TEST_TIME;// Jeżeli timer_lampy był ustawiony i lampa świeciła,<br />                       // to po rozwidnieniu czas świecenia zostanie skrócony do 3 sekund.<br />                      // Wciśnięcie przycisku LAMPA, włączy lampę na 2 sek.<br /><br />//Obsługa przycisku wł-wył LAMPY<br />if (!key_lock &amp;&amp; flaga.lampa) {//flaga.lampa=0 przycisk puszczony,<br />key_lock = 1;//flaga.lampa=1 przycisk wciśnięty<br />if(!timer_lampy) {<br />if(!flaga.zmierzch) timer_lampy = LONG_TIME;//Gdy jest ciemno, lampa świeci przez czas LONG_TIME<br />else timer_lampy=TEST_TIME;// po rozwidnieniu lampa włącza się na czas TEST_TIME (3 sek.)<br />}<br />else timer_lampy = 0;<br /><br />} else if(key_lock &amp;&amp; !flaga.lampa) key_lock++;<br /><br /><br />//Warunek zezwalający na włączenie lampy<br />if (timer_lampy) LAMP_ON;<br />else LAMP_OFF;<br /><br /><br />}<br />}<br /><br /><br /><br />//FUNKCJA OBSŁUGI PRZYCISKU Z FILTRACJĄ ZAKŁÓCEŃ<br />void press(uint8_t KEY_x, uint8_t stan_x, uint8_t timer_key_x){<br />if (!(PINB &amp; KEY_x)){//nasiśnięcie przycisku, jeśli będzie to szpilka zakłócająca, to po jej<br />//zaniku warunek nie będzie spełniony i przejdzie do else<br />if(!timer_key_x) stan = stan_x;//gdy timer_key odliczy w przerwaniu do zera, to silnik się włączy<br />}<br />else timer_key_x = 10;//licznik będzie permanentnie ustawiany na 10 - opóźnienie 10ms<br />}<br /><br /><br />//FUNKCJA OBSŁUGI KRAŃCÓWKI Z FILTRACJĄ ZAKŁÓCEŃ<br />uint8_t pressKR(uint8_t KEY_x, uint8_t timer_key_x){<br />if (!(PINB &amp; KEY_x)){<br />if(!timer_key_x) flaga.x = 1;<br />}<br />else {<br />flaga.x = 0;<br />timer_key_x = 10;<br />}<br />return flaga.x;<br />}<br /><br /><br /><br />// PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH - timer0A - timer programowy<br />ISR(TIMER0_COMPA_vect) {<br />if (timer) timer--; // zmienna timera do określenia predkosc_rampy dla PWM ok.1,5sek.<br />if (timer_keyO) timer_keyO--;//odliczanie 10ms na pominięcie ewentualnych zakłóceń<br />if (timer_keyZ) timer_keyZ--;<br />if (timer_keyKRO) timer_keyKRO--;<br />if (timer_keyKRZ) timer_keyKRZ--;<br />if (timer_keyIND) timer_keyIND--;<br />if (timer_keySTOP) timer_keySTOP--;<br />if (timer_FOTO) timer_FOTO--;<br />if (timer_keyLAMP) timer_keyLAMP--;<br />}<br /><br />// PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH timer1A<br />ISR(TIMER1_COMPA_vect) {<br />static uint8_t cnt; // statyczna zmienna cnt<br /><br />if (++cnt &gt; 9) { // zmienna cnt jest zwiększana od 0 - 8<br /><br />if (timer_ind) timer_ind--;//timer czasu nieczułości czujnika zwalniania prędkości<br />//zmniejsza się co sekundę<br />if(timer_lampy) timer_lampy--;//timer_lampy odlicza czas włączenia lampy<br />if(timer_zmierzch) timer_zmierzch--; //timer czasu nieczułości czujnika zmierzchowego<br />cnt = 0;<br />}<br /><br />if(mig == 2) LED_MIG;//po wykryciu przeciążenia LED miga co 100ms<br />else if (!(cnt % 5) &amp;&amp; mig == 1) LED_MIG;      // przełącz diodę co 500ms<br />}[/syntax]<br />Wielkie dzięki za pomoc  <img src="https://forum.atnel.pl/images/smilies/icon_exclaim.gif" alt=":!:" title="Wykrzyknik" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 21 sty 2019, o 14:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2019-01-12T12:12:57+01:00</updated>
<published>2019-01-12T12:12:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215725#p215725</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215725#p215725"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215725#p215725"><![CDATA[
Można i tak, ale wystarczy dodatkowy timer programowy z dzielnikiem przez, np. 100 dodać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 12 sty 2019, o 12:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2019-01-12T08:10:46+01:00</updated>
<published>2019-01-12T08:10:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215721#p215721</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215721#p215721"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215721#p215721"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Jeśli w pętli głównej używasz do timera 16-bitowej zmiennej, która jest odliczania w przerwaniach to ZAWSZE będzie problem z regularnym odliczaniem chyba, że... podczas tego odświeżania zostaną wyłączone przerwania (poczytaj atomic blok).<br /></div> Poszedłem w innym kierunku - uruchomiłem drugi timer sprzętowy na 10Hz, do obsługi migania i odmierzania czasu świecenia lampy. To chyba prostsze rowiązanie? Chyba, że do odmierzania minut dla lampy dam osobny timer, 16-bitowy  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> Jakby nie było, tiny2313 ma dwa dwukanałowe timery  <img src="https://forum.atnel.pl/images/smilies/icon_mrgreen.gif" alt=":mrgreen:" title="Pan Zielony" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 12 sty 2019, o 08:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-12-28T20:55:57+01:00</updated>
<published>2018-12-28T20:55:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215159#p215159</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215159#p215159"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215159#p215159"><![CDATA[
Jeśli w pętli głównej używasz do timera 16-bitowej zmiennej, która jest odliczania w przerwaniach to ZAWSZE będzie problem z regularnym odliczaniem chyba, że... podczas tego odświeżania zostaną wyłączone przerwania (poczytaj atomic blok).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 28 gru 2018, o 20:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-28T20:37:43+01:00</updated>
<published>2018-12-28T20:37:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215156#p215156</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215156#p215156"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215156#p215156"><![CDATA[
<div class="quotetitle">oowan napisał(a):</div><div class="quotecontent"><br />jeżeli przedstawisz ciało funkcji 'timer_init();', to może coś da się wywnioskować/wyliczyć.<br /></div><br />[syntax=c]void timer_init(void){<br />//***** Sprzętowy timer0A w ATTiny2313 dla F_CPU=8,0MHz *******<br />TCCR0A |= (1&lt;&lt;WGM01);/* tryb CTC */<br />TCCR0B |= (1&lt;&lt;CS01)|(1&lt;&lt;CS00);/* preskaler = 64 */<br />OCR0A = 124;/* dodatkowy podział przez 125 (rejestr przepełnienia) */<br />TIMSK |= (1&lt;&lt;OCIE0A);/* zezwolenie na przerwanie CompareMatch */<br />/* przerwanie wykonywane co 1ms (1000 razy na sek.) */<br />}[/syntax]<br />Spróbowałem ten fragment<br />[syntax=c]if (!(cnt % 250) &amp;&amp; flaga.mig) LED_MIG;      // przełącz diodę co 250ms[/syntax] przenieść z obsługi przerwania do pętli głównej. Oczywiście zmienną <strong>cnt</strong> zmieniłem z lokalnej na globalną <strong>volatile</strong>.<br />Dioda migała, ale bardzo nieregularnie. Czasem kilka krótkich błysków, czasem dłuższe przerwy lub dłoższe świecenie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 28 gru 2018, o 20:37</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Daro69]]></name></author>
<updated>2018-12-28T17:35:02+01:00</updated>
<published>2018-12-28T17:35:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215138#p215138</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215138#p215138"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215138#p215138"><![CDATA[
witam,<br /><div class="quotetitle">oowan napisał(a):</div><div class="quotecontent"><br />, tylko że odliczana sekunda ma tak na oko 1,6s. Co może być przyczyną?<br /></div><br />jeżeli przedstawisz ciało funkcji 'timer_init();', to może coś da się wywnioskować/wyliczyć.<br />Przejrzałem wątek i nie zauważyłem jak jest ustawiony timer.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=11549">Daro69</a> — 28 gru 2018, o 17:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-28T13:34:33+01:00</updated>
<published>2018-12-28T13:34:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215136#p215136</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215136#p215136"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215136#p215136"><![CDATA[
Program powoli się rozrasta - dołożyłem wyłącznik czasowy do sterowania lampą przed garażem.<br />Jest to kolejny timer programowy (tym razem uint16_t) odliczany co sekundę w przerwaniu.<br />[syntax=c]// PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH - timer programowy<br />ISR(TIMER0_COMPA_vect) {<br />static uint16_t cnt; // statyczna zmienna cnt do odliczania milisekund<br />if (++cnt &gt; 999) { // zmienna cnt jest zwiększana od 0 - 999<br /><br />if (timer_ind) timer_ind--;//timer czasu nieczułości czujnika zwalniania prędkości<br />//zmniejsza się co sekundę<br />if(timer_lampy) timer_lampy--;//timer_lampy odlicza czas włączenia lampy<br />cnt = 0;<br />}<br /><br />if (timer) timer--; // zmienna timera do określenia predkosc_rampy dla PWM ok.1,5sek.<br /><br />if (timer_keyO) timer_keyO--;//odliczanie 10ms na pominięcie ewentualnych zakłóceń<br />if (timer_keyZ) timer_keyZ--;<br />if (timer_keyKRO) timer_keyKRO--;<br />if (timer_keyKRZ) timer_keyKRZ--;<br />if (timer_keyIND) timer_keyIND--;<br />if (timer_keySTOP) timer_keySTOP--;<br />if (timer_keyLAMP) timer_keyLAMP--;<br /><br />if (!(cnt % 250) &amp;&amp; flaga.mig) LED_MIG;      // przełącz diodę co 250ms<br /><br />}[/syntax]<br />Wszystko działa prawidłowo, tylko że odliczana sekunda ma tak na oko 1,6s. Co może być przyczyną?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 28 gru 2018, o 13:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-24T13:43:47+01:00</updated>
<published>2018-12-24T13:43:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215009#p215009</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215009#p215009"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=215009#p215009"><![CDATA[
W efekcie wyszły dwie funkcje:<br />[syntax=c]//deklaracja funkcji obsługi przycisków z filtracją zakłóceń<br />void press(uint8_t KEY_x, uint8_t stan_x, uint8_t timer_key_x);<br />uint8_t pressKR(uint8_t KEY_x, uint8_t timer_key_x);<br />.<br />.<br />int main(void) {<br />.<br />.<br />while (1) {<br /><br />press(KEY_STOP, stop, timer_keySTOP);//wejście przycisku STOP<br /><br />if(stan == zamykanie) { //zadziałanie fotokomórki tylko podczas zamykania<br />press(KEY_STOP, stop, timer_keySTOP);<br />}<br /><br />press(KEY_PINO, otwieranie, timer_keyO);  //wywołanie funkcji / wejście przycisku OTWÓRZ<br /><br />press(KEY_PINZ, zamykanie, timer_keyZ);//wejście przycisku ZAMKNIJ<br /><br />flaga.krancowka_O = pressKR(KEY_KRO, timer_keyKRO);//wejście krańcówki otwarcia<br /><br />flaga.krancowka_Z = pressKR(KEY_KRZ, timer_keyKRZ);//wejście krańcówki zamknięcia<br /><br />flaga.wolniej = pressKR(KEY_INDO, timer_keyIND);//wejście czujnika indukcyjnrgo, zwalniającego<br /><br /><br />switch (stan) {<br />.<br />.<br />  }<br /> }<br />}<br /><br />//FUNKCJA OBSŁUGI PRZYCISKU Z FILTRACJĄ ZAKŁÓCEŃ<br />void press(uint8_t KEY_x, uint8_t stan_x, uint8_t timer_key_x){<br />if (!(PINB &amp; KEY_x)){//nasiśnięcie przycisku, jeśli będzie to szpilka zakłócająca, to po jej<br />//zaniku warunek nie będzie spełniony i przejdzie do else<br />if(!timer_key_x) stan = stan_x;//gdy timer_key odliczy w przerwaniu do zera, to silnik się włączy<br />}<br />else timer_key_x = 10;//licznik będzie permanentnie ustawiany na 10 - opóźnienie 10ms<br />}<br /><br /><br />//FUNKCJA OBSŁUGI KRAŃCÓWKI Z FILTRACJĄ ZAKŁÓCEŃ<br />uint8_t pressKR(uint8_t KEY_x, uint8_t timer_key_x){<br />if (!(PINB &amp; KEY_x)){<br />if(!timer_key_x) flaga.x = 1;<br />}<br />else {<br />flaga.x = 0;<br />timer_key_x = 10;<br />}<br />return flaga.x;<br />}<br /><br />// PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH - timer programowy<br />.<br />.[/syntax]<br />Nie wiem, czy znowu nie przekombinowałem, ale działa, przynajmniej to, co mam fizycznie podłączone do testów.<br /><br /><strong>Życzę wszystkim <span style="color: #00BF00">WESOŁYCH ŚWIĄT!!!</span></strong><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 24 gru 2018, o 13:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-12-21T23:33:37+01:00</updated>
<published>2018-12-21T23:33:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214907#p214907</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214907#p214907"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214907#p214907"><![CDATA[
<div class="quotetitle">oowan napisał(a):</div><div class="quotecontent"><br />Wynika mi z tego, że każdy przycisk musi mieć osobny timer programowy dekrementowany w przerwaniu, bo chyba nie da się tego obsłużyć jednym timerem?<br /></div><br />Jeśli będzie to robione sposobem, który podałem to TAK, ale zawsze można inaczej to zrobić i o ile przyciski nie są wciskane równocześnie to można by z jednego timera korzystać.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 21 gru 2018, o 23:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-20T13:49:04+01:00</updated>
<published>2018-12-20T13:49:04+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214826#p214826</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214826#p214826"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214826#p214826"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Może najpierw trochę porządków, bo są pewne nieścisłości.<br /></div>Taaak, nie wiem jak ten <strong>PIND</strong> się tam znalazł? Po zmianie na <strong>PINB</strong> jest OK!  <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />  Dzięki!<br />Teraz należy taką sekwencję wstawić w badanie kolejnych wejść. Myślę, że byłoby bardziej przejrzyście i elegancko, gdyby to ująć w funkcję. Muszę zajrzeć do BB, bo funkcja będzie mieć kilka argumentów  <img src="https://forum.atnel.pl/images/smilies/icon_e_surprised.gif" alt=":o" title="Zdziwiony" /><br /><br /><div class="quotetitle">dziobak7 napisał(a):</div><div class="quotecontent"><br />Cztery poziomy zagnieżdżenia.<br /></div>Ja naprawdę jestem początkujący, zasugeruj coś może w celu uproszczenia kodu, tworzonego w pocie czoła - tworzę jak potrafię. Jak widać nie ma się czym chwalić  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />Po przemyśleniach, wykrystalizowała się <img src="https://forum.atnel.pl/images/smilies/icon_cool.gif" alt="8-)" title="Cool" />  taka funkcja<br />[syntax=c]void push(uint8_t KEY_x, uint8_t stan_x, uint8_t timer_key_x); //deklaracja funkcji obsługi przycisku z filtracją zakłóceń<br />.<br />.<br />push(KEY_PINO, otwieranie, timer_keyO);  //wywołanie funkcji w pętli głównej<br />.<br />.<br />//FUNKCJA OBSŁUGI PRZYCISKU Z FILTRACJĄ ZAKŁÓCEŃ<br />void push(uint8_t KEY_x, uint8_t stan_x, uint8_t timer_key_x){<br />if (!(PINB &amp; KEY_x)){//nasiśnięcie przycisku, jeśli będzie to szpilka zakłócająca, to po jej<br />//zaniku warunek nie będzie spełniony i przejdzie do else<br />if(!timer_key_x) stan = stan_x;//gdy timer_key odliczy w przerwaniu do zera, to silnik się włączy<br />}<br />else timer_key_x = 10;//licznik będzie permanentnie ustawiany na 10<br />}[/syntax]<br />Wynika mi z tego, że każdy przycisk musi mieć osobny timer programowy dekrementowany w przerwaniu, bo chyba nie da się tego obsłużyć jednym timerem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 20 gru 2018, o 13:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-12-20T11:51:26+01:00</updated>
<published>2018-12-20T11:51:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214820#p214820</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214820#p214820"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214820#p214820"><![CDATA[
Taaaak... <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Może najpierw trochę porządków, bo są pewne nieścisłości. Proszę wyjaśnij to i wskaż jakiś wspólny mianownik:<br /><br />[syntax=c]#define KEY_PINO (1&lt;&lt;PB7)       // wejście przycisku OTWÓRZ<br />.<br />.<br />PORTB |= KEY_PINO | KEY_PINZ | KEY_KRO;      //podciągnięcie wejść do Vcc<br />.<br />.<br />if (!(PIND &amp; KEY_PINO)){        //nasiśnięcie przycisku, jeśli będzie to szpilka zakłócająca, to po jej[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 20 gru 2018, o 11:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-20T10:09:23+01:00</updated>
<published>2018-12-20T10:09:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214810#p214810</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214810#p214810"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214810#p214810"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Wrzuć całość, bo takie sprawdzanie programu w kawałkach do niczego dobrego nie doprowadzi<br /></div><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;pwm.h&quot;                // dołączenie pliku nagłówkowego z obsługą PWM<br />#include &quot;timer.h&quot;              // dołączenie pliku nagłówkowego z obsługą timera tykającego co 1ms<br /><br />#define PWM_WY  (1&lt;&lt;PD5)        // wyjście PWM sterujące tranzystorem MOSFET<br />#define PKO_WY (1&lt;&lt;PD0)         // wyjście na przekaźnik OTWARCIA<br />#define PKZ_WY (1&lt;&lt;PD1)         // wyjście na przekaźnik ZAMKNIĘCIA<br />#define LED_WY (1&lt;&lt;PD2)         // wyjście na LED<br /><br />#define KEY_PINO (1&lt;&lt;PB7)       // wejście przycisku OTWÓRZ<br />#define KEY_PINZ (1&lt;&lt;PB6)       // wejście przycisku ZAMKNIJ<br />#define KEY_KRO  (1&lt;&lt;PB5)       // wejście krańcówki otwarcia<br />#define KEY_KRZ  (1&lt;&lt;PB4)       // wejście krańcówki zamknięcia<br />#define KEY_INDO (1&lt;&lt;PB3)       // wejście czujnika indukcyjnego otwarcia<br />#define KEY_INDZ (1&lt;&lt;PB2)       // wejście czujnika indukcyjnego zamknięcia<br />#define FOTO     (1&lt;&lt;PD6)       // wejście fotokomórki<br />#define KEY_STOP (1&lt;&lt;PD4)       // wejście przycisku STOP<br /><br />#define PKO_OFF PORTD &amp;= ~PKO_WY        // makrodefinicja - załączenie przekaźnika OTWARCIA<br />#define PKO_ON PORTD |= PKO_WY          // makrodefinicja - wyłączenie przekaźnika OTWARCIA<br />#define PKZ_OFF PORTD &amp;= ~PKZ_WY        // makrodefinicja - załączenie przekaźnika ZAMKNIĘCIA<br />#define PKZ_ON PORTD |= PKZ_WY          // makrodefinicja - wyłączenie przekaźnika ZAMKNIĘCIA<br />#define LED_MIG PORTD ^= LED_WY         // miganie LED - kontrolka<br />#define LED_ON PORTD |= LED_WY          // załącz LED - kontrolka<br />#define LED_OFF PORTD &amp;= ~LED_WY        // wyłącz LED - kontrolka<br /><br />//określenia &quot;maszyny stanów&quot;<br />enum maszyna_st {<br />stop, otwieranie, zamykanie,<br />};<br /><br />enum maszyna_st stan;<br /><br />volatile uint8_t timer_key;//timer programowy do opóźniania reakcji klawiszy/przycisków<br /><br />uint8_t predkosc_rampy = 6; //prędkość rampy PWM do przyspieszania/zwolniania silnika<br />uint8_t predkosc_silnika;       //deklaracja zmiennej licznika dla PWM<br /><br />struct {<br />volatile uint8_t mig:1; //flaga dla migania LED<br />uint8_t pauza:1; //flaga 0=wyłączony timer nieczułości, 1=włączony timer nieczułości<br />uint8_t rampa_kierunek:1;     //flaga 0=postój, 1=praca silnika<br />uint8_t krancowka_O:1;//flaga krańcówki całkowitego otwarcia<br />uint8_t krancowka_Z:1;//flaga krańcówki całkowitego zamknięcia<br />uint8_t wolniej:1;//flaga czujnika zwolnienia silnika<br />} flaga;<br /><br />int main(void) {<br /><br />timer_init();           // inicjalizacja timera tykającego co 1ms<br />pwm_init();             // inicjalizacja PWM<br /><br />sei();// włączenie globalnego zezwolenia na przerwania<br /><br />DDRD |= PKO_WY | PKZ_WY;             //ustawienie pinów portu D jako wyjścia<br />DDRD |= PWM_WY | LED_WY;<br />PORTB |= KEY_PINO | KEY_PINZ | KEY_KRO;      //podciągnięcie wejść do Vcc<br />PORTB |= KEY_INDO | KEY_INDZ | KEY_KRZ;<br />PORTD |= FOTO | KEY_STOP;<br /><br />_delay_ms(10);  // oczekiwanie na ustalenie się stanu wysokiego na wejściach<br /><br />while (1) {<br /><br />if (!(PIND &amp; KEY_STOP))<br />stan = stop;<br />/*if (!(PINB &amp; KEY_PINO))<br />stan = otwieranie;*/<br /><br />//PROCEDURA FILTRACJI ZAKŁÓCEŃ<br />if (!(PIND &amp; KEY_PINO)){//nasiśnięcie przycisku, jeśli będzie to szpilka zakłócająca, to po jej<br />//zaniku warunek nie będzie spełniony i przejdzie do else<br />if(!timer_key) stan = otwieranie;//gdy timer_key odliczy w przerwaniu do zera, to silnik się włączy<br />}<br />else timer_key = 10;//licznik będzie permanentnie ustawiany na 10<br /><br /><br />if (!(PINB &amp; KEY_PINZ))<br />stan = zamykanie;<br />if (!(PIND &amp; FOTO) &amp;&amp; (stan == zamykanie)) //zadziałanie fotokomórki tylko podczas zamykania<br />stan = stop;  //wejście na porcie D<br />if (!(PINB &amp; KEY_KRO))<br />flaga.krancowka_O = 1;<br />else<br />flaga.krancowka_O = 0;<br />if (!(PINB &amp; KEY_KRZ))<br />flaga.krancowka_Z = 1;<br />else<br />flaga.krancowka_Z = 0;<br />if (!(PINB &amp; KEY_INDO))<br />flaga.wolniej = 1;<br />else<br />flaga.wolniej = 0;<br /><br />switch (stan) {<br />case stop: //stan = 0<br />predkosc_silnika = 0;<br />OCR0B = 0;<br />flaga.rampa_kierunek = 0;<br />flaga.pauza = 0;<br />PKO_OFF;<br />PKZ_OFF;<br />break;<br /><br />case otwieranie: //stan = 1<br />PKO_ON;//kierunek silnika otwieranie<br />if (!timer_ind &amp;&amp; !flaga.pauza) {<br />timer_ind = 3;//timer czasu nieczułości czujnika zwalniania w sekundach<br />flaga.pauza = 1;<br />}<br />if (flaga.krancowka_O) {<br />stan = stop;//wyłącz po osiągnięciu krańcówki otwarcia<br />LED_ON;<br />}<br />break;<br /><br />case zamykanie: //stan = 2<br />PKZ_ON;//kierunek silnika zamykanie<br />if (!timer_ind &amp;&amp; !flaga.pauza) {<br />timer_ind = 3;//timer czasu nieczułości czujnika zwalniania w sekundach<br />flaga.pauza = 1;<br />}<br />if (flaga.krancowka_Z) {<br />stan = stop; //wyłącz po osiągnięciu krańcówki zamknięcia<br />LED_OFF;<br />}<br />break;<br />}<br /><br />if (!timer &amp;&amp; stan) //połączony warunek - wykonuj tylko jeśli jakiś ruch ma być<br />{<br />timer = predkosc_rampy;<br />OCR0B = predkosc_silnika;<br /><br />if (flaga.wolniej &amp;&amp; !timer_ind) //zmienna timer_ind blokuje czujnik zwalniania prędkości<br />flaga.rampa_kierunek = 1; //po tym czasie czeka na dojechanie do drugiego czujnika zwalniania prędkości<br /><br />if (!flaga.rampa_kierunek) {<br />if (predkosc_silnika &lt; 255)<br />predkosc_silnika++;  //przyspieszanie<br />} else {<br />if (predkosc_silnika &gt; 10)<br />predkosc_silnika--; //zwalnianie - 50 to minimalna prędkość dojazdowa przy jakiej silnik jeszcze kręci<br />}<br />}<br /><br />// Warunek zezwalający na miganie diody podczas pracy silnika<br />if (stan) {<br />flaga.mig = 1;<br />} else<br />flaga.mig = 0;<br /><br />}<br />}<br /><br />// PROCEDURA OBSŁUGI PRZERWANIA COMPARE MATCH - timer programowy<br />ISR(TIMER0_COMPA_vect) {<br /><br />if (++cnt &gt; 999) { // zmienna cnt jest zwiększana od 0 - 999<br />sekundy++;<br />if(sekundy&gt;59) sekundy=0;<br />if (timer_ind) timer_ind--; //timer czasu nieczułości czujnika zwalniania prędkości<br />//zmniejsza się co sekundę<br />cnt = 0;<br />}<br /><br />if (timer) timer--; // zmienna timera do określenia predkosc_rampy dla PWM ok.1,5sek.<br /><br />if (timer_key) timer_key--;//odliczanie 10ms na pominięcie ewentualnych zakłóceń<br /><br />if (!(cnt % 250) &amp;&amp; flaga.mig) LED_MIG;      // przełącz diodę co 250ms<br /><br />}[/syntax]<br />Spróbowałem przy inicjalizacji ustawić <strong>timer_key</strong> na wartość 10, ale nic to nie dało.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 20 gru 2018, o 10:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-12-19T18:38:16+01:00</updated>
<published>2018-12-19T18:38:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214772#p214772</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214772#p214772"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214772#p214772"><![CDATA[
Wrzuć całość, bo takie sprawdzanie programu w kawałkach do niczego dobrego nie doprowadzi<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 19 gru 2018, o 18:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-19T11:29:46+01:00</updated>
<published>2018-12-19T11:29:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214754#p214754</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214754#p214754"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214754#p214754"><![CDATA[
No, dobra <strong>SylwkK</strong>. W teorii jest ok, ale w praktyce niepowodzenie. Program po włączeniu zasilania ustawia zmienną <strong>stan = otwieranie</strong> z pominięciem softstartu (PWM = 255). Po czasie nieczułości działa spowolnienie, jednak krańcówką KEY_KRO nie można wyłączyć silnika. Kontrolka ciągle miga, czyli zmienna <strong>stan</strong> ciągle jest różna od zera.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 19 gru 2018, o 11:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-19T11:29:46+01:00</updated>
<published>2018-12-19T11:29:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214753#p214753</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214753#p214753"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214753#p214753"><![CDATA[
No, dobra <strong>SylwkK</strong>. W teorii jest ok, ale w praktyce niepowodzenie. Program po włączeniu zasilania ustawia zmienną <strong>stan = otwieranie</strong> z pominięciem softstartu (PWM = 255). Po czasie nieczułości działa spowolnienie, jednak krańcówką KEY_KRO nie można wyłączyć silnika. Kontrolka ciągle miga, czyli zmienna <strong>stan</strong> ciągle jest różna od zera.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 19 gru 2018, o 11:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-12-17T11:30:51+01:00</updated>
<published>2018-12-17T11:30:51+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214720#p214720</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214720#p214720"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214720#p214720"><![CDATA[
Można to oczywiście zrobić na kilka innych sposobów, ale ten jest o tyle fajny, że ZAWSZE musi się sygnał utrzymać przez zadany czas zanim zostanie zatwierdzony. Jakakolwiek przerwa czy zakłócenie powoduje, że licznik od nowa mierzy ten czas.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 17 gru 2018, o 11:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-17T10:08:09+01:00</updated>
<published>2018-12-17T10:08:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214718#p214718</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214718#p214718"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214718#p214718"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />A co jest po &quot;else&quot; ?  Permanentnie ustawienie licznika jeśli klawisz nie jest wyciśnięty, a po jego wciśnięciu jest normalnie w przerwaniach odliczany aż dojdzie do zera<br /></div>Aaa...  <img src="https://forum.atnel.pl/images/smilies/icon_idea.gif" alt=":idea:" title="Pomysł" /> no jakie to proste <img src="https://forum.atnel.pl/images/smilies/icon_e_surprised.gif" alt=":o" title="Zdziwiony" /> <br /><span style="color: #FF4000">Pomroczność jasna</span> mnie ostatnio nachodzi <img src="https://forum.atnel.pl/images/smilies/icon_eek.gif" alt=":shock:" title="Zaszokowany" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 17 gru 2018, o 10:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-12-16T12:32:25+01:00</updated>
<published>2018-12-16T12:32:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214696#p214696</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214696#p214696"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214696#p214696"><![CDATA[
A co jest po &quot;else&quot; ? <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";-)" title="Puszcza oko" /> Permanentnie ustawienie licznika jeśli klawisz nie jest wyciśnięty, a po jego wciśnięciu jest normalnie w przerwaniach odliczany aż dojdzie do zera <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=1922">SylwekK</a> — 16 gru 2018, o 12:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-16T12:24:56+01:00</updated>
<published>2018-12-16T12:24:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214695#p214695</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214695#p214695"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214695#p214695"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Zamiast tego co tak rozbudowałeś po prostu tak:<br /> [syntax=c]//DEKLARACJE<br />    volatile uint8_t timer_key;             //timer programowy do opóźniania reakcji klawiszy/przycisków<br />     <br />    //PROCEDURA FILTRACJI ZAKŁÓCEŃ<br />    if (!(PIND &amp; KEY_PINO))<br />     {<br />       if(!timer_key) stan = otwieranie;<br />     }<br />    else timer_key=10;[/syntax]<br /></div>Znowu musisz mnie chyba oświecić, bo wg mnie po naciśnięciu przycisku lub  przy impulsie zakłócającym, zmienna <strong>stan</strong> od razu przyjmie wartość <span style="color: #4000FF"><em>otwieranie</em></span> gdyż warunek jest spełniony (<strong>timer_key == 0</strong>). Dopiero po puszczeniu przycisku, ewentualnie zaniku impulsu, <strong>timer_key</strong> zacznie odliczanie, króre nie ma już praktycznie znaczenia. Tak to widzę.<br />Ja chcę pojenczy, przypadkowy impuls przeczekać i wywołać reakcję  po ponownym sprawdzeniu stanu wejścia <strong>KEY_PINO</strong>. Taki przykład był w BB, ale z użyciem delayów.<br />Ogólnie sposoby na drgające styki bez delayów, jakie znalazłem, reagują na pierwszy impuls i ignorują następne i to jest skuteczne, ale wg mnie nie nadaje się do programowego filtrowania zakłóceń.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 16 gru 2018, o 12:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-13T14:25:41+01:00</updated>
<published>2018-12-13T14:25:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214622#p214622</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214622#p214622"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214622#p214622"><![CDATA[
<div class="quotetitle">SylwekK napisał(a):</div><div class="quotecontent"><br />Z analizą nie powinieneś mieć problemu.<br /></div>No, to mam nad czym myśleć w weekend <img src="https://forum.atnel.pl/images/smilies/icon_cry.gif" alt=":cry:" title="Płacze" /> <br />Dzięki za sugestie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 13 gru 2018, o 14:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-12-13T13:49:03+01:00</updated>
<published>2018-12-13T13:49:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214619#p214619</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214619#p214619"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214619#p214619"><![CDATA[
Znowu zupełnie inne spojrzenie na program kiedy przechodzę ze smartfona na kompa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Zamiast tego co tak rozbudowałeś po prostu tak:<br /><br />[syntax=c]//DEKLARACJE<br />volatile uint8_t timer_key;             //timer programowy do opóźniania reakcji klawiszy/przycisków<br /> <br />//PROCEDURA FILTRACJI ZAKŁÓCEŃ<br />if (!(PIND &amp; KEY_PINO))<br /> {<br />   if(!timer_key) stan = otwieranie; <br /> }<br />else timer_key=10;[/syntax]<br /><br />Nawet flaga nie potrzebna <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Z analizą nie powinieneś mieć problemu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 13 gru 2018, o 13:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[SylwekK]]></name></author>
<updated>2018-12-13T12:01:58+01:00</updated>
<published>2018-12-13T12:01:58+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214614#p214614</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214614#p214614"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214614#p214614"><![CDATA[
Dużo prościej i efektywniej będzie jak zamiast flagi zrobisz licznik jaki stosuje w swojej obsłudze klawisza krótki/długi. Na forum o tym pisałem w moim temacie. I tak bajt jest zużyty więc nie ma problemu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /> Zapewniam, że sposób niezawodny.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br />To twoje rozwiązanie też by dało radę, ale potrzeba przeróbki i &quot;else&quot; przy głównym badaniu klawisza<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1922">SylwekK</a> — 13 gru 2018, o 12:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[oowan]]></name></author>
<updated>2018-12-13T11:38:22+01:00</updated>
<published>2018-12-13T11:38:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214612#p214612</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214612#p214612"/>
<title type="html"><![CDATA[Re: Problem z wymuszonym opuszczeniem pętli for]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=21272&amp;p=214612#p214612"><![CDATA[
<div class="quotetitle">oowan napisał(a):</div><div class="quotecontent"><br />Kolejny mój . Generalnie układ ma taki charakter, że nie potrzeba gasić drgań styków, ale niestety wejścia łapią zakłócenia, bo przewody do krańcówek mają po kilka metrów.<br /></div>Przeanalizowałem problem zakłóceń na wejściach i doszedłem do wniosku, że szpilki zakłócające są raczej pojedyncze i trzeba je przeczekać. 10ms chyba wystarczy, może mniej. Wszyscy wiedzą, che, che, najprościej dać delaya  <img src="https://forum.atnel.pl/images/smilies/icon_twisted.gif" alt=":twisted:" title="Szalony" /><br />Ale na poważnie, zrobiłem kolejny timer programowy, tylko nie wychodzi mi teraz procedura obsługi przycisku. coś jest ewidentnie źle, nie ma reakcji na przycisk.<br />Było tak:<br />[syntax=c]if (!(PINB &amp; KEY_PINO))<br />stan = otwieranie;[/syntax]<br />Teraz jest tak:<br />[syntax=c]//DEKLARACJE<br />volatile uint8_t timer_key;//timer programowy do opóźniania reakcji klawiszy/przycisków<br />uint8_t y;//flaga pomocnicza do obsługi klawiszy/przycisków<br /><br />//PROCEDURA FILTRACJI ZAKŁÓCEŃ<br />if (!(PIND &amp; KEY_PINO)){//nasiśnięcie przycisku, jeśli będzie to szpilka zakłócająca, to po jej<br />//zaniku warunek nie będzie spełniony<br />if(!timer_key &amp;&amp; !y) {<br />y = 1;//ustawienie flagi pomocniczej<br />timer_key=10;//uruchomienie timera, żeby odczekać 10ms<br />}<br />if(!timer_key &amp;&amp; y) {//jeżeli przycisk będzie dalej nasiśnięty, a timer_key doliczy do zera,<br />stan = otwieranie;//to silnik się włączy<br />y = 0;             //zerowanie flagi pomocniczej<br />}<br />}[/syntax]<br />i w przerwaniu:<br />[syntax=c]if (timer_key) timer_key--;//odliczanie 10ms na pominięcie ewentualnych zakłóceń[/syntax]<br />I tak sobie myślę, że ze względu na te zakłócenia, w finalnym układzie lepiej będzie podciągać wejścia rezystorami 5k do 10k. Powinno być bardziej stabilnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9741">oowan</a> — 13 gru 2018, o 11:38</p><hr />
]]></content>
</entry>
</feed>