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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-05-12T00:05:06+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6099&amp;mode</id>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2016-05-12T00:05:06+01:00</updated>
<published>2016-05-12T00:05:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160482#p160482</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160482#p160482"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160482#p160482"><![CDATA[
Witam<br />W.g mnie jeśli kol.<strong>TomekTomek55</strong> operuje gotowymi bibliotekami to posiada wszystkie projekty z BB. Co stoi na przeszkodzie wziąć &quot;Projekt wielozadaniowy&quot;, wyrżnąć to co niepotrzebne i ma działać ( wyrżnąć a nie zarżnąć - to muszą być precyzyjne cięcia ). A jeśli nie, to przynajmniej popatrzeć jak bez  _delay:  ds, 7_LED, LCD i pozostałe bajery są zaprzęgnięte do pracy. To &quot;śpiewa, tańczy i gotuje&quot; i jeszcze mruga  <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> <br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 12 maja 2016, o 00:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamBo]]></name></author>
<updated>2016-05-11T21:55:53+01:00</updated>
<published>2016-05-11T21:55:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160477#p160477</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160477#p160477"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160477#p160477"><![CDATA[
I znowu po 1 kolego kod wklejamy syntax c. Po 2 sorry ale rozmawiasz z nami jak byś dzwonił do lekarza i powiedział mu &quot;panie doktorze chory jestem&quot; i oczekiwał, że po takim info doktorek poda ci diagnozę i przepisze leki. Nic z tego kolego wklejaj cały kod OBSŁUGI!! Mirkowych bibliotek wtedy coś poradzimy.<br /><br />Wysłane z mojego HTC One_M8 przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9051">adamBo</a> — 11 maja 2016, o 21:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[TomekTomek55]]></name></author>
<updated>2016-05-11T21:39:13+01:00</updated>
<published>2016-05-11T21:39:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160472#p160472</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160472#p160472"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160472#p160472"><![CDATA[
<div class="codetitle"><b>Code:</b></div><div class="codecontent">void Pomiar_temperatury(uint8_t Sekunda)<br />{////////////////////////DS18B20 /////////////////////////////////////////<br />static uint8_t  StanPoprzedni;<br />  if( Sekunda != StanPoprzedni ) {   /* sprawdzanie flagi tyknięć timera programowego co 1 sekundę */<br />     StanPoprzedni = Sekunda;<br />         /* co trzy sekundy gdy reszta z dzielenia modulo 3 == 0 sprawdzaj ilość dostępnych czujników */<br />         if( 0 == (Sekunda%3) ) {<br />            uint8_t *cl=(uint8_t*)gSensorIDs;   // pobieramy wskaźnik do tablicy adresów czujników<br />            for( uint8_t i=0; i&lt;MAXSENSORS*OW_ROMCODE_SIZE; i++) *cl++ = 0; // kasujemy całą tablicę<br />            czujniki_cnt = search_sensors();   // ponownie wykrywamy ile jest czujników i zapełniamy tablicę<br />         }<br />         /* co trzy sekundy gdy reszta z dzielenia modulo 3 == 1 wysyłaj rozkaz pomiaru do czujników */<br />         if( 1 == (Sekunda%3) )<br />         {<br />         DS18X20_start_meas( DS18X20_POWER_EXTERN, NULL );<br />         }<br />         /* co trzy sekundy gdy reszta z dzielenia modulo 3 == 2 czyli jedną sekundę po rozkazie konwersji<br />          *  dokonuj odczytu i wyświetlania temperatur z 2 czujników jeśli są podłączone, jeśli nie<br />          *  to pokaż komunikat o błędzie<br />          */<br />         if( 2 == (Sekunda%3) ) {<br />            uint8_t a;<br />             for (a = 0; a &lt; 4; ++a) {<br />               if( DS18X20_OK == DS18X20_read_meas(gSensorIDs&#91;a&#93;, &amp;subzero, &amp;cel, &amp;cel_fract_bits) ){<br />                   CzujnikNr&#91;a&#93;.TempLiczba = cel *10 + cel_fract_bits;<br />                   CzujnikNr&#91;a&#93;.Blad = 0;<br />                   if(subzero) { //jesli temp jemna to zruj<br />                      cel = 0;<br />                      cel_fract_bits = 0;<br />                   }<br />               } else {CzujnikNr&#91;a&#93;.Blad = 1;}  //Blad czujnika temp<br />            }<br /><br /><br />         }<br /><br />         /* zerujemy flagę aby tylko jeden raz w ciągu sekundy wykonać operacje */<br />      } /* koniec sprawdzania flagi */<br /><br />}   ////////////////////////DS18B20 ///////////////////////////////////////<br /><br /><br /><br /></div><br /><br /><br /><br />Tak to wygląda w środku a delayus(480) jest juz w funkcji Mirkowej a NIE mojej.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4629">TomekTomek55</a> — 11 maja 2016, o 21:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamBo]]></name></author>
<updated>2016-05-11T21:29:53+01:00</updated>
<published>2016-05-11T21:29:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160467#p160467</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160467#p160467"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160467#p160467"><![CDATA[
Coś kolego ciężko z komunikacją między nami. Jeszcze raz sprubuje. Nikt nie mówi byś publikował &quot;Mirkowe&quot; biblioteki, masz po prostu pokazać nam jak je obsługujesz. Najprawdopodobniej problem jest z delayami. Zmień kod w taki sposób by pomiar temperatury wykonywać poprzez tajmera a nie opóźniać go delayem.<br /><br />Wysłane z mojego HTC One_M8 przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9051">adamBo</a> — 11 maja 2016, o 21:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[TomekTomek55]]></name></author>
<updated>2016-05-11T21:15:38+01:00</updated>
<published>2016-05-11T21:15:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160461#p160461</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160461#p160461"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160461#p160461"><![CDATA[
Wnętrze mojej funkcji &quot;Pomiar_temperatury&quot; to już Mirkowa funkcja pomiarowa korzystająca z jego bibliotek. I tak jak wspomniałem wczesniej to własnie tam jest opoznienie      _delay_us(480);       w funkcji ow_reset(void) i z tym mam problem jak to ominąć.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4629">TomekTomek55</a> — 11 maja 2016, o 21:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matekogon]]></name></author>
<updated>2016-05-11T20:50:05+01:00</updated>
<published>2016-05-11T20:50:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160455#p160455</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160455#p160455"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160455#p160455"><![CDATA[
Kolego to co wkleiłeś to nadal wróżenie z fusów. Jeśli w twojej funkcji pomiar_temperatury jest delay  a pewnie jest bo czujnik DS potrzebuje 750ms do konwersji temperatury  więc dla tego ci się sypie program bo wstrzymujesz pracę AVR <br /><br />Ps kod wklejamy za pomocą syntax  C <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> A kolega mnie uprzedził<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1380">matekogon</a> — 11 maja 2016, o 20:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamBo]]></name></author>
<updated>2016-05-11T20:46:05+01:00</updated>
<published>2016-05-11T20:46:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160454#p160454</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160454#p160454"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160454#p160454"><![CDATA[
A jednak to będą fusy. Po pierwsze naucz się prawidłowo wklejać kod. Po drugie nie chcesz chyba nam powiedzieć, że tak wygląda twój plik min???<br /><br />Wysłane z mojego HTC One_M8 przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9051">adamBo</a> — 11 maja 2016, o 20:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[TomekTomek55]]></name></author>
<updated>2016-05-11T20:24:00+01:00</updated>
<published>2016-05-11T20:24:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160451#p160451</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160451#p160451"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160451#p160451"><![CDATA[
<div class="codetitle"><b>Code:</b></div><div class="codecontent">while(1)<br />{//petla nieskonczona<br /><br />kanal1 = procent(40);   //funkcja regulacji mocy<br /><br />if (FlagaDokonajPomiaru == true ) {  //co 1s ustawiana w przerwaniu<br />   FlagaDokonajPomiaru = false;<br />   Pomiar_temperatury(Sekundy); //     jak to zaremuje t jest ok<br />}<br /><br /><br /><br /><br />}//petla nieskonczona<br /><br /><br /><br /></div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4629">TomekTomek55</a> — 11 maja 2016, o 20:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[adamBo]]></name></author>
<updated>2016-05-11T20:16:55+01:00</updated>
<published>2016-05-11T20:16:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160448#p160448</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160448#p160448"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160448#p160448"><![CDATA[
Kolego nie chodzi byś wstawiał gotowe biblioteki lecz ich obsługę zawarta w pliku main<br /><br />Wysłane z mojego HTC One_M8 przy użyciu Tapatalka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9051">adamBo</a> — 11 maja 2016, o 20:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[TomekTomek55]]></name></author>
<updated>2016-05-11T20:03:14+01:00</updated>
<published>2016-05-11T20:03:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160446#p160446</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160446#p160446"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160446#p160446"><![CDATA[
Nie chodzi o wróżenie z fusów wiadoma sprawa ale nie chciałem wstawiać na forum gotowych kodów Mirka. Mam jego bibliotekę do DS obslugi i do regulacji mocy 230 też. Jak ktoś jest wtajemniczony i ma te bibloteki to ja mam dokładnia tekie same więc wie o co chodzi. Dla testow w petni glownej mam tylko regulacje mocy z lekcji 18 i jak zrobie wywolanie funkcji pomiarowej to sie regulacja sypie. Mogę powiedzieć i potestowałem to ze jak zaremuje omine opóźnienie  //_delay_us(480);    w funkcji  ow_reset(void)  to jest ok.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4629">TomekTomek55</a> — 11 maja 2016, o 20:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matekogon]]></name></author>
<updated>2016-05-11T19:50:28+01:00</updated>
<published>2016-05-11T19:50:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160440#p160440</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160440#p160440"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160440#p160440"><![CDATA[
<div class="quotetitle">llemar napisał(a):</div><div class="quotecontent"><br />Kombinowałem i kombinowałem ...i chyba jednak musi być po mojemu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Mam problem z fragmentem kodu do cyklicznego ściemniania i rozjaśniania (amplituda). Proszę o podpowiedzi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />]<br /></div><br /><br />Kolego zastąp delay flagami wyznaczonymi przez przerwanie. Bo przecież delay wstrzymuje ci cały program na określony czas a  avr może wykonywać inne czynności w tym czasie zamiast odpoczywać <br /><br /><div class="quotetitle">TomekTomek55 napisał(a):</div><div class="quotecontent"><br />Odświerze trochę temat nie będę zakładał nowego.<br />Wykonałem wspomniany w temacie regulator i mam problem tego typu ze mój AVR musi mierzyć jeszcze temperaturę z DS18B20. Jeśli jest wykonywany sam program regulacji mocy to jest wszystko OK. Jeśli jednak dołożę obsługę czujników DS to żarówka w chwili pomiaru czasami przygasa ma to związek z samą istotą działania programu dla obsługi DS. Nie wiem jak to pogodzić bo generalnie nie mogę na czas pomiaru wyłączać sterowania  wyjściem 230V.<br /></div><br /><br />Kolego a może jakiś fragment kodu, gdzie co wstawiłeś ,ciężko wróżyć z fusów <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=1380">matekogon</a> — 11 maja 2016, o 19:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[TomekTomek55]]></name></author>
<updated>2016-05-11T17:19:47+01:00</updated>
<published>2016-05-11T17:19:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160430#p160430</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160430#p160430"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=160430#p160430"><![CDATA[
Odświerze trochę temat nie będę zakładał nowego.<br />Wykonałem wspomniany w temacie regulator i mam problem tego typu ze mój AVR musi mierzyć jeszcze temperaturę z DS18B20. Jeśli jest wykonywany sam program regulacji mocy to jest wszystko OK. Jeśli jednak dołożę obsługę czujników DS to żarówka w chwili pomiaru czasami przygasa ma to związek z samą istotą działania programu dla obsługi DS. Nie wiem jak to pogodzić bo generalnie nie mogę na czas pomiaru wyłączać sterowania  wyjściem 230V.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4629">TomekTomek55</a> — 11 maja 2016, o 17:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-02-26T23:22:14+01:00</updated>
<published>2014-02-26T23:22:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=72221#p72221</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=72221#p72221"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=72221#p72221"><![CDATA[
Kombinowałem i kombinowałem ...i chyba jednak musi być po mojemu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Mam problem z fragmentem kodu do cyklicznego ściemniania i rozjaśniania (amplituda). Proszę o podpowiedzi <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><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 /><br />#define LED1 (1&lt;&lt;PC1)<br />#define LED2 (1&lt;&lt;PC2)<br />#define LED2_TOG PORTC ^= LED2// makrodefinicja – zmiana stanu diody<br />#define KEY1 (1&lt;&lt;PC3)<br />#define KEY2 (1&lt;&lt;PC4)<br /><br />#define KEY_PIN (1&lt;&lt;PC3)<br />#define KEY_DOWN !(PINC &amp; KEY_PIN)<br /><br />uint8_t czujniki_cnt;           /* ilość czujników na magistrali */<br />volatile uint8_t s1_flag;       /* flaga tyknięcia timera co 1 sekundę */<br />volatile uint8_t sekundy;       /* licznik sekund 0-59 */<br />volatile uint8_t timer1=0;<br /><br />/*********************** D I M M E R  -   U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 200<br /><br />// czas trwania szpilki (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 1.7<br />/*********************** D I M M E R  -   U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />//#define procent(x) ((x*(LICZBA_KROKOW-1))/100)<br /><br />static uint8_t procent(uint8_t pr) {<br />return (pr * (LICZBA_KROKOW-1))/100;<br />}<br /><br /><br />#define T_ZAR1_ON PORTC |= (1&lt;&lt;PC0)<br />#define T_ZAR1_OFF PORTC &amp;= ~(1&lt;&lt;PC0)<br /><br />#define T_ZAR2_ON PORTC |= (1&lt;&lt;PC1)<br />#define T_ZAR2_OFF PORTC &amp;= ~(1&lt;&lt;PC1)<br /><br />#define T_ZAR3_ON PORTC |= (1&lt;&lt;PC2)<br />#define T_ZAR3_OFF PORTC &amp;= ~(1&lt;&lt;PC2)<br /><br />uint8_t key1_lock, key2_lock;<br />uint8_t wlacznik = 0;<br />uint8_t zatrzask = 0;<br />uint8_t ampli = 0;<br />volatile uint8_t kroki;<br />volatile uint8_t kanal1;<br />volatile uint8_t ika1;<br /><br /><br /><br /><br />void wlacz(void) {<br />wlacznik=1;<br />}<br /><br />void wylacz(void) {<br /> wlacznik=0;<br />}<br /><br />void amplituda(void) {<br /><br />ampli=1;<br /><br />}<br /><br /><br /><br />void key_press( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br />void key_push_up( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br /><br /><br /><br />int main(void) {<br /><br /><br /> PORTC |= KEY1|KEY2;  // podciągamy linie klawiszy do VCC<br /> DDRC |= LED1|LED2;   // piny LED jako WYjścia<br /><br /><br /><br />DDRC |= (1&lt;&lt;PC0);<br />T_ZAR1_OFF;<br />DDRC |= (1&lt;&lt;PC1);<br />T_ZAR2_OFF;<br /><br />DDRC &amp;= ~KEY_PIN;<br />PORTC |= KEY_PIN;<br /><br />// Przerwanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br /><br /><br />// TIMER2<br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania COMPARE MATCH<br />OCR2 = __OCR_STEP;<br /><br />// TIMER3<br />    TCCR0 |= (1&lt;&lt;CS00)|(1&lt;&lt;CS02);           /* preskaler = 1024 */<br />TIMSK |= (1&lt;&lt;TOIE0);                    /* zezwolenie na przerwanie CompareMatch */<br /><br />sei();<br /><br /><br /><br />#define SZYBKOSC_SCIEMNIACZA 20<br />volatile uint8_t i,k;<br /><br />_delay_ms(10);<br /><br />while(1) {<br /><br /><br /><br /><br />if(KEY_DOWN) {<br />_delay_ms(80);<br />if(KEY_DOWN) {<br />if(ampli==1){<br />                                    //tutaj będzie kod zwiększający i zmniejszający wartoć zmiennej &quot;i&quot;<br />            //w momencie zwolnienia klawisza zmienna powina mieć taką wartoć jak w chwili zwolniena<br />zatrzask=0;<br />}<br />if(s1_flag){<br />LED2_TOG; //lampka kontrolna czy procek działa<br />zatrzask++;<br />s1_flag=0;<br />}<br />}<br />}<br /><br /><br />if(wlacznik==0){<br /><br />key_press( &amp;key1_lock, &amp;PINC, KEY1, wlacz ); //włączenie wiatła<br />}<br /><br />if(wlacznik==1){<br />if(zatrzask&gt;10){<br />key_press( &amp;key1_lock, &amp;PINC, KEY1, amplituda ); //włączenie trybu wyboru natężenia wiatła<br />if(zatrzask&lt;10) ampli=0;<br />}<br /><br />if(zatrzask&gt;1){<br />if(ampli==0){<br />key_push_up( &amp;key1_lock, &amp;PINC, KEY1, wylacz ); //wyłączenie wiatła<br />}<br />}<br />}<br />if(wlacznik==1){            //rozjasnianie<br />PORTC |= (1&lt;&lt;PC1);<br />if(i&lt;100){<br />for( i=0; i&lt;102; i++ ) {<br />kanal1 = procent(i);<br />_delay_ms(SZYBKOSC_SCIEMNIACZA);<br />}<br />  }<br />}<br /><br /><br /><br /><br /><br />if(wlacznik==0){             //sciemnianie<br />PORTC &amp;= ~(1&lt;&lt;PC1);<br />if(i&gt;100){<br />for( k=0, i=101; k&lt;101; k++,i-- ) {<br />kanal1 = procent(i);<br />_delay_ms(SZYBKOSC_SCIEMNIACZA);<br />zatrzask=0;<br />}<br />}<br />}<br /><br /><br /><br /><br />}     //end while(1)<br />}        //end int main(void)<br /><br /><br />ISR(INT0_vect) {<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br /><br /><br />}<br /><br />ISR(TIMER2_COMP_vect) {<br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />kroki--;<br /><br />//    static uint8_t cnt=0;   /* statyczna zmienna cnt do odliczania setnych ms */<br /><br />}<br /><br />ISR(TIMER0_OVF_vect)  //przerwania timer<br />{<br />    static uint8_t cnt=0;   /* statyczna zmienna cnt do odliczania setnych ms */<br /><br />    if(++cnt&gt;2) {  /* gdy licznik ms &gt; 33 (minęła 1 sekunda) */<br />            s1_flag=1;      /* ustaw flagę tyknięcia sekundy */<br />            cnt=0;  /* wyzeru licznik setnych ms */<br />    }<br />}<br /><br />void key_press(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) {<br />  *klock=1;<br /><br />  // reakcja na PRESS (wcinięcie przycisku)<br />  if(kfun) kfun();<br /><br /> } else if( *klock &amp;&amp; key_press ) (*klock)++;<br />}<br /><br /><br /><br />void key_push_up(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) *klock=1;<br /> else if( *klock &amp;&amp; key_press ) {<br />  if( !++*klock ) {<br /><br />   // reakcja na PUSH_UP (zwolnienie przycisku)<br />   if(kfun) kfun();<br />  }<br /> }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 26 lut 2014, o 23:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-02-25T14:12:36+01:00</updated>
<published>2014-02-25T14:12:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71978#p71978</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71978#p71978"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71978#p71978"><![CDATA[
Dziękuję Jecekk232 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> jak będę w domu to się pobawię <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=2090">llemar</a> — 25 lut 2014, o 14:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-02-24T22:29:38+01:00</updated>
<published>2014-02-24T22:29:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71896#p71896</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71896#p71896"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71896#p71896"><![CDATA[
<div class="quotetitle">llemar napisał(a):</div><div class="quotecontent"><br />W języku drabinkowym na PLC nie miałbym z tym problemów, ale w C jestem bardzo początkującym<br /></div> No to zupełnie odwrotnie niż ja <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":-)" title="Szczęśliwy" /><br /><br />Ja myślałem żeby zrobić coś w tym stylu<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 /><br />/*********************** D I M M E R  -   U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 200<br /><br />// czas trwania szpilki (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 1.8<br />/*********************** D I M M E R  -   U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />//#define procent(x) ((x*(LICZBA_KROKOW-1))/100)<br /><br />static uint8_t procent(uint8_t pr) {<br />return (pr * (LICZBA_KROKOW-1))/100;<br />}<br /><br />#define SZYBKOSC_SCIEMNIACZA 5//50ms - 10ms *5<br /><br />#define KEY_PIN (1&lt;&lt;PC3)<br /><br />#define T_ZAR1_ON PORTC |= (1&lt;&lt;PC0)<br />#define T_ZAR1_OFF PORTC &amp;= ~(1&lt;&lt;PC0)<br /><br />//#define T_ZAR2_ON PORTC |= (1&lt;&lt;PC1)<br />//#define T_ZAR2_OFF PORTC &amp;= ~(1&lt;&lt;PC1)<br />//<br />//#define T_ZAR3_ON PORTC |= (1&lt;&lt;PC2)<br />//#define T_ZAR3_OFF PORTC &amp;= ~(1&lt;&lt;PC2)<br /><br />volatile uint8_t kroki;<br />volatile uint8_t kanal1;<br />//volatile uint8_t kanal2;<br />//volatile uint8_t kanal3;<br /><br />volatile uint8_t ika1;<br />//volatile uint8_t ika2;<br />//volatile uint8_t ika3;<br /><br />volatile uint16_t Timer1, Timer2, Timer3;//timery programowe<br />uint8_t k1;//zmienna na potrzeby obsługi klawisza<br />uint8_t dir, on_off_flag;<br />int8_t i;<br /><br />void fun1(void);<br />void fun2(void);<br /><br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) );<br /><br /><br />int main(void) {<br /><br />DDRC &amp;= ~KEY_PIN;<br />PORTC |= KEY_PIN;<br /><br /><br />//dioda LED - Procesor OK<br />DDRC |=(1&lt;&lt;PC5);//wyjście<br />PORTC |= (1&lt;&lt;PC5);//dioda wyłączona<br /><br />DDRC |= (1&lt;&lt;PC0)|(1&lt;&lt;PC1)|(1&lt;&lt;PC2);<br />T_ZAR1_OFF;<br />//T_ZAR2_OFF;<br />//T_ZAR3_OFF;<br /><br />// Przerwanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br /><br /><br />// TIMER2<br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania COMPARE MATCH<br />OCR2 = __OCR_STEP;<br /><br />//konfiguracja Timera0 - Timery programowe<br />//Tryb Normal<br />TCCR0 |= (1&lt;&lt;CS02) | (1&lt;&lt;CS00);//preskaler 1024<br />TCNT0 = 178;//ok. 10ms - 100Hz<br />TIMSK |= (1&lt;&lt;TOIE0);//odblokowanie przerwania Timer0 Overflow<br /><br /><br />sei();<br /><br />kanal1 = procent(0);<br />//kanal2 = procent(60);<br />//kanal3 = procent(90);<br />_delay_ms(1000);<br /><br />while(1)<br />{<br />SuperDebounce(&amp;k1, &amp;PINC, KEY_PIN, 5, 100, fun1, fun2 );<br /><br />if(on_off_flag)//jeśli zmienna ustawiona<br />{<br />if(!Timer2)//jeśli Timer2 doliczył do zera<br />{<br />Timer2 = SZYBKOSC_SCIEMNIACZA;//załaduj Timer2 nową wartością do odliczenia<br />if(dir)//jeśli zmienna dir rózna od zera<br />{<br />i++;//zwiększ wartość zmiennej i<br />if(i &lt; 101) kanal1 = procent(i);<br />if(i &gt;= 100) on_off_flag = 0;//jeśli żarówka się rozjaśniła to wyzeruj flagę<br />}//aby ta część już się nie wykonywała<br />else<br />{<br />i--;//zmiejsz wartość zmiennej i<br />if(i &gt;= 0) kanal1 = procent(i);<br />if(i &lt; 0) on_off_flag = 0;<br />}//jeśli żarówka się ściemniła to wyzeruj flagę<br />}//aby ta część już się nie wykonywała<br />}<br /><br /><br />if(!Timer3)//migająca dioda LED<br />{//widać czy timery programowe działają<br />Timer3 = 50;//i czy pętla główna się wykonuje<br />PORTC ^= (1&lt;&lt;PC5);<br />}<br /><br />}<br />}<br /><br />void fun1(void)<br />{//ustaw flagę aby mógła się wykonywać część programu<br />on_off_flag = 1;//rozjaśniająca i ściemniająca w pętli głównej<br />dir ^= 1;//rozjaśnianie lub ściemnianie<br />}<br /><br />void fun2(void)<br />{<br />if(!dir)<br />{<br />i++;<br />if(i &lt; 101) kanal1 = procent(i);<br />if(i &gt; 100) dir = 1;<br />}<br />else<br />{<br />i--;<br />if(i &gt; 20) kanal1 = procent(i);<br />if(i &lt;= 20) dir = 0;<br />}<br />}<br /><br /><br />ISR(TIMER0_OVF_vect)<br />{<br />TCNT0 = 178;<br /><br />uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */<br />if (n) Timer1 = --n;<br /><br />n = Timer2;/* 100Hz Timer1 */<br />if (n) Timer2 = --n;<br /><br />n = Timer3;/* 100Hz Timer1 */<br />if (n) Timer3 = --n;<br /><br />}<br /><br /><br />ISR(INT0_vect) {<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br />//T_ZAR2_OFF;<br />//T_ZAR3_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br />//ika2=kanal2;<br />//ika3=kanal3;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br />}<br /><br />ISR(TIMER2_COMP_vect) {<br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />//if(ika2 &amp;&amp; kroki == ika2) T_ZAR2_ON;<br />//if(ika3 &amp;&amp; kroki == ika3) T_ZAR3_ON;<br />kroki--;<br />}<br /><br />/************** funkcja SuperDebounce do obsługi pojedynczych klawiszy ***************<br /> * AUTOR: Mirosław Kardaś<br /> * ZALETY:<br /> * - nie wprowadza najmniejszego spowalnienia<br /> * - posiada funkcję REPEAT (powtarzanie akcji dla dłużej wciśniętego przycisku)<br /> * - można przydzielić różne akcje dla trybu REPEAT i pojedynczego kliknięcia<br /> * - można przydzielić tylko jedną akcję wtedy w miejsce drugiej przekazujemy 0 (NULL)<br /> *<br /> * Wymagania:<br /> * Timer programowy utworzony w oparciu o Timer sprzętowy (przerwanie 100Hz)<br /> *<br /> * Parametry wejściowe:<br /> * *key_state - wskaźnik na zmienną w pamięci RAM (1 bajt)<br /> *  *KPIN - nazwa PINx portu na którym umieszczony jest klawisz, np: PINB<br /> *  key_mask - maska klawisza np: (1&lt;&lt;PB3)<br /> *  rep_time - czas powtarzania funkcji rep_proc w trybie REPEAT<br /> *  rep_wait - czas oczekiwania do przejścia do trybu REPEAT<br /> *  push_proc - wskaźnik do własnej funkcji wywoływanej raz po zwolenieniu przycisku<br /> *  rep_proc - wskaźnik do własnej funkcji wykonywanej w trybie REPEAT<br /> **************************************************************************************/<br />void SuperDebounce(uint8_t * key_state, volatile uint8_t *KPIN,<br />uint8_t key_mask, uint16_t rep_time, uint16_t rep_wait,<br />void (*push_proc)(void), void (*rep_proc)(void) ) {<br /><br />/*kod funkcji znajduje się w materiałach dodatkowych do książki<br /> * Mokrokontrolery AVT<br /> *Język C<br /> * Podstawy programowania<br /> */<br /><br />}[/syntax]<br /><br />Kod funkcji SuperDebounce wziąłem z płyty DVD z lekcji 17_SuperDebounce.<br /><br />W kodzie zakomentowałem nie używane fragmenty. Fragment kodu z Timerem3 i diodą LED nie jest potrzebny. Ale często w swoich projektach tak robię. Jeśli dioda miga to wiem że timery programowe działają a pętla główna nie ma zawiechy.<br /><br />Kod pisany na szybko i nie jest zoptymalizowany. Chciałem pokazać ideę jak ja bym to mniej więcej zrobił aby wszystko działało w sposób nieblokujący.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 24 lut 2014, o 22:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-02-24T21:03:30+01:00</updated>
<published>2014-02-24T21:03:30+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71884#p71884</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71884#p71884"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71884#p71884"><![CDATA[
Próbuję coś wykombinować z kodem z bloga Mirka o drganiach styków (reakcja na przyciśnięcie i puszczenie klawisza). Załączenie następowało by po wciśnięciu a wyłączenie po zwolnieniu klawisza. trzeba by było jakoś zabezpieczyć aby wyłączenie nie nastąpiło zaraz po wciśnięciu i zwolnieniu (jako zaświecenie światła - jedna operacja). Kolejne przyciśnięcie i przytrzymanie (jeżeli jest włączone światło - zmienna &quot;wlacznik&quot;) powiedzmy 1s uruchamiałoby funkcję, która zmieniałaby wartość zmiennej &quot;i&quot; (procent(i)) zmniejsza i zwiększa w zakresie 20 - 100. Po tej czynność również nie mogłaby zadziałać reakcja na zwolnienie przycisku. Reakcja na zwolnienie mogłaby zadziałać tylko po krótkim przyciśnięciu i zwolnieniu przycisku jeżeli jest aktualnie włączone światło. Na razie powrzucałem wszystko do jednego &quot;worka&quot; i próbuję to jakoś poukładać. Podpowiedzcie proszę czy w dobrą stronę kombinuję.<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 />#define KEY_PIN (1&lt;&lt;PC3)<br />#define KEY_DOWN !(PINC &amp; KEY_PIN)<br /><br /><br /><br />/*********************** D I M M E R  -   U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 200<br /><br />// czas trwania szpilki (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 1.6<br />/*********************** D I M M E R  -   U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />//#define procent(x) ((x*(LICZBA_KROKOW-1))/100)<br /><br />static uint8_t procent(uint8_t pr) {<br />return (pr * (LICZBA_KROKOW-1))/100;<br />}<br /><br /><br />#define T_ZAR1_ON PORTC |= (1&lt;&lt;PC0)<br />#define T_ZAR1_OFF PORTC &amp;= ~(1&lt;&lt;PC0)<br /><br />#define T_ZAR2_ON PORTC |= (1&lt;&lt;PC1)<br />#define T_ZAR2_OFF PORTC &amp;= ~(1&lt;&lt;PC1)<br /><br />#define T_ZAR3_ON PORTC |= (1&lt;&lt;PC2)<br />#define T_ZAR3_OFF PORTC &amp;= ~(1&lt;&lt;PC2)<br /><br />volatile uint8_t wlacznik = 0;<br />volatile uint8_t kroki;<br />volatile uint8_t kanal1;<br />volatile uint8_t amplituda;<br />volatile uint8_t ika1;<br />uint8_t key1_lock, key2_lock;<br /><br />void wlacz(void) {<br />wlacznik++;<br />_delay_ms(200);<br />if(wlacznik==2) wlacznik=0;<br />}<br /><br /><br />void key_press( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br />void key_push_up( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br /><br /><br />int main(void) {<br /><br /><br />DDRC |= (1&lt;&lt;PC0);<br />T_ZAR1_OFF;<br />DDRC |= (1&lt;&lt;PC1);<br />T_ZAR2_OFF;<br /><br />DDRC &amp;= ~KEY_PIN;<br />PORTC |= KEY_PIN;<br /><br />// Przerwanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br /><br /><br />// TIMER2<br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania COMPARE MATCH<br />OCR2 = __OCR_STEP;<br /><br /><br />sei();<br /><br /><br /><br />#define SZYBKOSC_SCIEMNIACZA 25<br />volatile uint8_t i,k;<br /><br /><br />while(1) {<br /><br />  key_press( &amp;key1_lock, &amp;PINC, KEY1, change_led1 );<br /><br />  key_push_up( &amp;key2_lock, &amp;PINC, KEY2, change_led2 );<br /><br /><br />if(KEY_DOWN){<br />_delay_ms(80);<br />if(KEY_DOWN) {<br />wlacznik++;<br />_delay_ms(200);<br />if(wlacznik==2) wlacznik=0;<br />}<br />}<br /><br /><br />if(wlacznik==1){<br />PORTC |= (1&lt;&lt;PC1);<br />if(i&lt;100){<br />for( i=0; i&lt;102; i++ ) {<br />kanal1 = procent(i);<br />_delay_ms(SZYBKOSC_SCIEMNIACZA);<br />}<br />}<br /><br />}<br /><br /><br />if(wlacznik==0){<br />PORTC &amp;= ~(1&lt;&lt;PC1);<br />if(i&gt;100){<br />for( k=0, i=101; k&lt;101; k++,i-- ) {<br />kanal1 = procent(i);<br />_delay_ms(SZYBKOSC_SCIEMNIACZA);<br />}<br />}<br />}<br /><br /><br /><br /><br /><br />}     //end while(1)<br />}        //end int main(void)<br /><br /><br />ISR(INT0_vect) {<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br />}<br /><br />ISR(TIMER2_COMP_vect) {<br /><br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />kroki--;<br /><br />}<br />//..............................................................................Funkcje<br />void key_press(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) {<br />  *klock=1;<br /><br />  // reakcja na PRESS (wcinięcie przycisku)<br />  if(kfun) kfun();<br /><br /> } else if( *klock &amp;&amp; key_press ) (*klock)++;<br />}<br /><br /><br /><br />void key_push_up(uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) {<br /><br /> register uint8_t key_press = (*KPIN &amp; key_mask);<br /><br /> if( !*klock &amp;&amp; !key_press ) *klock=1;<br /> else if( *klock &amp;&amp; key_press ) {<br />  if( !++*klock ) {<br /><br />   // reakcja na PUSH_UP (zwolnienie przycisku)<br />   if(kfun) kfun();<br />  }<br /> }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 24 lut 2014, o 21:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-02-22T00:27:37+01:00</updated>
<published>2014-02-22T00:27:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71476#p71476</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71476#p71476"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71476#p71476"><![CDATA[
jacekk232 ale mnie zmuszasz do myślenia <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> aż mi się w głowie gotuje... W języku drabinkowym na PLC nie miałbym z tym problemów, ale w C jestem bardzo początkującym <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=2090">llemar</a> — 22 lut 2014, o 00:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-02-22T00:12:52+01:00</updated>
<published>2014-02-22T00:12:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71472#p71472</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71472#p71472"/>
<title type="html"><![CDATA[Re: Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71472#p71472"><![CDATA[
Ja bym wykorzystał do obsługi klawisza funkcję Superdebounce.<br /><br />W funkcji krótkiego wciśnięcia zmieniał bym stan jakiejś flagi a w pętli głównej w zależności od stanu tej flagi rozjaśniał lub ściemniał żarówkę. Rozjaśnianie i ściemnianie zrobiłbym na timerach programowych a nie na pętlach for po to żeby pętla główna wykonywała się z jak największa szybkością.<br /><br />Natomiast naprzemienne rozjaśnianie i ściemnianie zrobiłbym w funkcji Repeat wywoływanej po wciśnięciu i przytrzymaniu przycisku. <br />Trzymając wciśnięty klawisz co określony czas zostaje wywoływana funkcja rep_proc(). W tej funkcji, co każde jej wywołanie, zmieniałbym poziom jasności. Rozjaśnianie i ściemnianie byłoby zależne od stanu zmiennej flagi. Stan flagi zmieniałby się po rozjaśnieniu i po ściemnieniu żarówki. W ten sposób żarówka wciąż by się rozjaśniała i ściemniała.<br />Szybkość zmian byłaby zależna od parametru rep_time, który ustala częstotliwość wywoływania funkcji rep_proc().<br /><br />To tak w skrócie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 22 lut 2014, o 00:12</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[llemar]]></name></author>
<updated>2014-02-21T20:07:12+01:00</updated>
<published>2014-02-21T20:07:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71426#p71426</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71426#p71426"/>
<title type="html"><![CDATA[Regulacja mocy 230V - przykład 18]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6099&amp;p=71426#p71426"><![CDATA[
Witam,<br />    Panowie jak przerobić ten kod aby po przyciśnięciu przycisku światło powoli się zapaliło, a po przyciśnięciu kolejny raz tego samego przycisku powoli zgasło. A gdy podczas gdy jest światło włączone przyciśniemy jeszcze raz przycisk na dłużej niż jedną sekundę, wówczas światło zacznie się ściemniać (sciemnianie do 20% nie mniej) i rozjaśniać na przemian aż nie zwolnimy przycisku tym samym ustalając wartość natężenia światła. Układ na atmega8 8MHz, 8 kanałów, ale na razie kombinuję na jednym <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><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 />#define KEY_PIN (1&lt;&lt;PC3)<br />#define KEY_DOWN !(PINC &amp; KEY_PIN)<br /><br /><br />/*********************** D I M M E R  -   U S T A W I E N I A   ***************************/<br />#define LICZBA_KROKOW 200<br /><br />// czas trwania szpilki (Detekcja ZERA) wyrażony w milisekundach np: 1,2,... albo np: 0.5<br />#define SZPILKA_MS 1.6<br />/*********************** D I M M E R  -   U S T A W I E N I A   ***************************/<br /><br />#define __OCR_STEP ((F_CPU/8)*((1000-((SZPILKA_MS*100)/2))/LICZBA_KROKOW))/100000<br /><br />//#define procent(x) ((x*(LICZBA_KROKOW-1))/100)<br /><br />static uint8_t procent(uint8_t pr) {<br />return (pr * (LICZBA_KROKOW-1))/100;<br />}<br /><br /><br />#define T_ZAR1_ON PORTC |= (1&lt;&lt;PC0)<br />#define T_ZAR1_OFF PORTC &amp;= ~(1&lt;&lt;PC0)<br /><br />#define T_ZAR2_ON PORTC |= (1&lt;&lt;PC1)<br />#define T_ZAR2_OFF PORTC &amp;= ~(1&lt;&lt;PC1)<br /><br />#define T_ZAR3_ON PORTC |= (1&lt;&lt;PC2)<br />#define T_ZAR3_OFF PORTC &amp;= ~(1&lt;&lt;PC2)<br /><br />volatile uint8_t wlacznik = 0;<br /><br />volatile uint8_t kroki;<br />volatile uint8_t kanal1;<br /><br />volatile uint8_t ika1;<br /><br /><br /><br />int main(void) {<br /><br /><br />DDRC |= (1&lt;&lt;PC0);<br />T_ZAR1_OFF;<br />DDRC |= (1&lt;&lt;PC1);<br />T_ZAR2_OFF;<br /><br />DDRC &amp;= ~KEY_PIN;<br />PORTC |= KEY_PIN;<br /><br />// Przerwanie INT0<br />MCUCR |= (1&lt;&lt;ISC01)|(1&lt;&lt;ISC00);// zbocze narastające<br />GICR |= (1&lt;&lt;INT0);// odblokowanie INT0<br /><br /><br />// TIMER2<br />#define TIMER2_START TCCR2 |= (1&lt;&lt;CS21)// prescaler=8<br />#define TIMER2_STOP TCCR2 &amp;= ~(1&lt;&lt;CS21)// prescaler off<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb CTC<br />TIMSK |= (1&lt;&lt;OCIE2);// odblokowanie przerwania COMPARE MATCH<br />OCR2 = __OCR_STEP;<br /><br /><br />sei();<br /><br />//kanal1 = procent(10);<br />//_delay_ms(3000);<br /><br /><br />#define SZYBKOSC_SCIEMNIACZA 25<br />volatile uint8_t i,k;<br /><br /><br />while(1) {<br /><br />if(KEY_DOWN){<br />_delay_ms(80);<br />if(KEY_DOWN) {<br />wlacznik++;<br />_delay_ms(200);<br />if(wlacznik==2) wlacznik=0;<br />}<br />}<br /><br /><br />if(wlacznik==1){<br />PORTC |= (1&lt;&lt;PC1);<br />if(i&lt;100){<br />for( i=0; i&lt;102; i++ ) {<br />kanal1 = procent(i);<br />_delay_ms(SZYBKOSC_SCIEMNIACZA);<br />}<br />}<br /><br />}<br /><br /><br />if(wlacznik==0){<br />PORTC &amp;= ~(1&lt;&lt;PC1);<br />if(i&gt;100){<br />for( k=0, i=101; k&lt;101; k++,i-- ) {<br />kanal1 = procent(i);<br />_delay_ms(SZYBKOSC_SCIEMNIACZA);<br />}<br />}<br />}<br /><br /><br /><br /><br /><br />}     //end while(1)<br />}        //end int main(void)<br /><br /><br />ISR(INT0_vect) {<br />TIMER2_STOP;<br />T_ZAR1_OFF;<br /><br />kroki=LICZBA_KROKOW;<br /><br />/* podwójne buforowanie, synchronizacja do 50Hz */<br />ika1=kanal1;<br /><br />TCNT2 = 0;<br />TIMER2_START;<br />}<br /><br />ISR(TIMER2_COMP_vect) {<br /><br />if(ika1 &amp;&amp; kroki == ika1) T_ZAR1_ON;<br />kroki--;<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2090">llemar</a> — 21 lut 2014, o 20:07</p><hr />
]]></content>
</entry>
</feed>