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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-05-09T15:10:43+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7000&amp;mode</id>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-05-09T15:10:43+01:00</updated>
<published>2014-05-09T15:10:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7000&amp;p=80641#p80641</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7000&amp;p=80641#p80641"/>
<title type="html"><![CDATA[Re: Problem ze obsługą swtcha - porażka]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7000&amp;p=80641#p80641"><![CDATA[
Przejrzałem pobieżnie kod i wydaje mi się, że problem masz w tej funkcji<br />[syntax=c]void func_a(void)<br />{<br />if (status_s1 == s1_on)<br />{<br />s1_stop();<br />}<br /><br />if (status_s1 == s1_off)<br />{<br />s1_start();<br />}<br />}[/syntax]<br />Błędnie założyłeś, że po wciśnięciu KEY2 wykona się pierwszy warunek a po drugim wciśnięciu wykona się drugi warunek. Jeśli zmienna <strong>status_s1 == s1_on</strong> to spełniony będzie pierwszy warunek. Wykona się funkcja <strong>s1_stop()</strong> w której zmienna <strong>status_s1</strong> przyjmie wartość <strong>s1_off</strong>. Tym samym, za chwile będzie spełniony drugi warunek bo zmienna <strong>status == s1_off</strong>. I wykona się funkcja <strong>s1_start</strong> w której zmienna znów przyjmie wartość <strong>s1_on</strong>. A to wszystko po jednorazowym wciśnięciu KEY2. Po następnym wciśnięciu sytuacja się powtórzy.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 9 maja 2014, o 15:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zaba]]></name></author>
<updated>2014-05-06T22:13:28+01:00</updated>
<published>2014-05-06T22:13:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7000&amp;p=80360#p80360</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7000&amp;p=80360#p80360"/>
<title type="html"><![CDATA[Re: Problem ze obsługą swtcha - porażka]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7000&amp;p=80360#p80360"><![CDATA[
Kody programu wstaw w znacznikach &quot;syntax=c&quot;<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1044">Zaba</a> — 6 maja 2014, o 22:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Adhewelt]]></name></author>
<updated>2014-05-07T09:02:24+01:00</updated>
<published>2014-05-06T22:06:47+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7000&amp;p=80359#p80359</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7000&amp;p=80359#p80359"/>
<title type="html"><![CDATA[Problem ze obsługą swtcha - porażka]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7000&amp;p=80359#p80359"><![CDATA[
Witam,<br /><br />Piszę ten post ponieważ nie mam już pomysłów na obejście problemu. Problem prawdopodobnie jest prosty do rozwiązania ale, że jestem początkującym w temacie nie widzę tego rozwiązania...;/ Mianowicie chodzi o program do okapu (padł silnik w okapie i musiałem zdecydować się na zamiennik ponieważ oryginału nie dostałem i tutaj byłem zmuszony zmienić również elektronikę nim sterującą).<br /><br />Założenia programu:<br /><br />- Sterowanie silnikiem 3 przyciskami KEY2 - pierwszy bieg, KEY3 - drugi bieg, KEY4 - trzeci bieg<br />- Sterowanie 3 światłami LED'owymi jednym przyciskiem KEY1<br />- Po wyłączeniu silnika, zewnętrzny wentylator(wyciągowy) chodzi przez określony czas<br />- Po przytrzymaniu przez 2 sekundy przycisku KEY2 - samodzielna praca wentylatora przez określony czas dłuższy niż ten w poprzednim punkcie<br /><br />- dodatkowe 2 diody jako sygnalizacja (osobny temat którym się teraz nie przejmuje - myślę, że nie będzie ciężko)<br /><br /> Ważną rzeczą jest to, że silnik może pracować tylko na jednym biegu (uzwojenie z odczepami - a żeby było śmieszniej silnik sterowany jest N'ka (przewodem neutralnym)<br /><br />Rozwiązałem powyższe zadania w ten sposób że KEY1 po pierwszym wciśnięciu włącza nam 1 przekaźnik do którego podłączona jest 1 żarówka LED,<br />po drugim wciśnięciu wyłącza nam 1 przekaźnik i włącza drugi gdzie podłączone 2 żarówki LED, po trzecim wciśnięciu włączają się obydwa przekaźniki, w efekcie święcą 3 żarówki LED - To założenie udało się zrealizować.<br /><br />Sterowanie silnikiem rozwiązałem w ten sposób, że jeśli naciśniemy któryś z KEY2, KEY3, KEY4 to włączy się odpowiedni przekaźnik, po ponownym jego wciśnięciu się wyłączy ale jeżeli naciśniemy jeden przycisk sterowania po czym wciśniemy inny to w efekcie poprzedni bieg musi się wyłączyć i włączyć ten odpowiadający przyciskowi który nacisnęliśmy. Tutaj udało mi się to osiągnąć ale tylko na KEY3 i KEY4.<br /><br />Mój problem polega na tym, że przy użyciu funkcji superdebounce kolegi ANTYSTATYCZNEGO, nie chce mi działać wyłączenie biegu po ponownym naciśnięciu KEY2 (ponieważ na KEY2 jest tylko użyty Superdebounce) - tak jakby funkcja w programie s1_stop() działała.<br /><br />Wyłączanie wentylatora zewnętrznego po czasie jeszcze nie do końca opracowałem. Jest w programie delikatny zarys funkcji do której przekazuje czas po którym powinno nastąpić wyłączenie - sprawdziłem to tylko czy działa.<br /><br />Od razu mówię, że kody wykorzystane w programie są zaczerpnięte w dużej mierze z książki bluebook oraz z forum od kolegi ANTYSTATYCZNEGO - przepraszam ale sam jeszcze nie opracowałem swoich bibliotek.<br /><br />Jakby ktoś mógł spojrzeć i doradzić jak się za to zabrać byłoby fajnie.<br /><br />Zaznaczam, że dopiero się uczę i tak na prawdę jest to mój pierwszy poważny program.<br /><br />Program pisany w oparciu o zestaw ATB 1.04 na układzie ATMEGA16 taktowanym kwarcem 11059200.<br /><br />main.c :<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 30-03-2014<br /> *      Author: Adrian Hewelt<br /> *<br /> *<br /> *      PROJEKT OKAPU - ATMEGA 8 w obudowie DIP<br /> *<br /> *sprbowac na zasadzie ilosci wcisniec !!! tak jak z key1   -- pamietac<br /> *<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;common.h&quot;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br />#define DEB_TIME 4                      //40ms<br />#define REP_TIME 5                      //50ms<br />#define REP_DELAY_TIME 50<br /><br />//zmienne do konfiguracji dzialania<br /><br />volatile uint8_t tim_deb,tim_rep_delay, tim_rep, lamp_status;<br /><br />enum {released, debounce, pressed, to_release, to_repeat, repeat};<br />enum {s1_sta, s1_sto, s2_sta, s2_sto, s3_sta, s3_sto, went_sta, went_sto, s1_on=33, s1_off=66, s2_on, s2_off, s3_on, s3_off, went_on, went_off};<br /><br />uint8_t ile,flag_w,<br />status_s1, status_s2, status_s3, status_went;<br /><br />volatile uint16_t Timer1, Timer2, Timer3;<br /><br />uint8_t czas_went_m=100;// czas pracy wentylatora po przytrzymaniu przycisku --&gt; w minutach<br />// czas przytrzymania przycisku po którym nastepuje druga czynnosc --&gt; w sekundach<br />uint8_t czas_went2_m = 50;// czas wyłączenia wentylatora po wyłączeniu wszystkich silników --&gt; w minutach<br /><br />uint8_t key1, key2, key3, key4;<br /><br /><br />void superdebounce(uint8_t * key_state,uint8_t key,void(*push_proc)(void),void(*rep_proc)(void));<br /><br />void s1_start (void);<br /><br />void s1_stop (void);<br /><br />void s2_start (void);<br /><br />void s2_stop (void);<br /><br />void s3_start (void);<br /><br />void s3_stop (void);<br /><br />void wents_on (void);<br /><br />void went_s (uint8_t *czas);<br /><br />void func_a(void)<br />{<br />if (status_s1 == s1_on)<br />{<br /><br />s1_stop();<br />}<br /><br />if (status_s1 == s1_off)<br />{<br />s1_start();<br />}<br /><br />}<br /><br />void func_b(void)<br />{<br />SYGN1_TOG;<br />}<br /><br />int main (void)<br />{<br /><br />init_timer2();<br /><br />status_s1 = s1_off;<br />status_s2 = s2_off;<br />status_s3 = s3_off;<br /><br />init_key();<br /><br />init_ster();<br /><br />lcd_init();<br />lcd_locate(0,0);<br />lcd_str(&quot;start()...&quot;);<br /><br /><br /><br />_delay_ms(1000);<br /><br />lcd_cls();<br /><br />sei();<br /><br /><br />while(1)<br />{<br /><br />superdebounce(&amp;key2, KEY2, func_a, func_b );<br /><br />lcd_locate(0,0);<br />lcd_int(status_s1);<br /><br />if (!key1 &amp;&amp; !(PINB &amp; KEY1))<br />{<br />key1=1;<br />ile ++;<br />if(ile == 1){LED1_ON; LED2_OFF;}<br />if(ile == 2){LED1_OFF; LED2_ON;}<br />if(ile == 3){LED1_ON; LED2_ON;}<br />if(ile &gt;3){LED1_OFF; LED2_OFF; ile=0;}<br /><br />} else if (key1 &amp;&amp; (PINB &amp; KEY1)) key1++;<br /><br /><br /><br />if (status_s2 == s2_on)<br />{<br />if(!key3 &amp;&amp; !(PINB &amp; KEY3))///---------------------------------------------------<br />{<br />key3=1;<br />s2_stop();<br /><br /><br />}else if (key3 &amp;&amp; (PINB &amp; KEY3)) key3++;<br />}<br /><br />if (status_s2 == s2_off)<br />{<br />if(!key3 &amp;&amp; !(PINB &amp; KEY3))///---------------------------------------------------<br />{<br />key3=1;<br /><br />s2_start();<br /><br /><br />}else if (key3 &amp;&amp; (PINB &amp; KEY3)) key3++;<br />}<br /><br />if (status_s3 == s3_on)<br />{<br />if(!key4 &amp;&amp; !(PINB &amp; KEY4))///---------------------------------------------------<br />{<br />key4=1;<br />s3_stop();<br /><br /><br />}else if (key4 &amp;&amp; (PINB &amp; KEY4)) key4++;<br />}<br /><br />if (status_s3 == s3_off)<br />{<br />if(!key4 &amp;&amp; !(PINB &amp; KEY4))///---------------------------------------------------<br />{<br />key4=1;<br />s3_start();<br /><br /><br />}else if (key4 &amp;&amp; (PINB &amp; KEY4)) key4++;<br />}<br /><br /><br /><br />if (!Timer2 &amp; flag_w)<br />{<br />flag_w = 0;<br />WENT_OFF;<br />}<br /><br />if (status_s1 == s1_off &amp;&amp; status_s2 == s2_off &amp;&amp; status_s3 == s3_off &amp;&amp; status_went == went_on)<br />{<br />status_went = went_off;<br /><br />}<br /><br /><br /><br />}<br /><br />}<br /><br /><br /><br /><br />void superdebounce(uint8_t *key_state, uint8_t key,void(*push_proc)(void),void(*rep_proc)(void))<br />{<br />        if((!(PINB &amp; key))&amp;&amp; (*key_state == released))<br />        {<br />                *key_state = debounce;<br />                tim_deb=DEB_TIME;<br />        }<br />        if((*key_state == debounce) &amp;&amp; !tim_deb)<br />        {<br />                if(!(PINB &amp; key))    *key_state = pressed;<br />                else<br />                {<br />                        *key_state = to_release;<br />                        tim_deb = DEB_TIME;<br />                }<br />        }<br />        if(!(PINB &amp; key) &amp;&amp; *key_state == pressed)<br />        {<br />                /*-----------------JEDNORAZOWE WYWOLANIE FUNKCJI---------------------*/<br />                if(push_proc) push_proc();<br />                *key_state = to_repeat;<br />                tim_rep_delay = REP_DELAY_TIME;<br />        }<br />        if((*key_state == to_repeat) &amp;&amp; !tim_rep_delay) *key_state = repeat;<br />        if(!(PINB &amp; key) &amp;&amp; *key_state == repeat &amp;&amp; !tim_rep)<br />        {<br />                /*----------------CYKLICZNE WYWOLYWANIE FUNKCJI----------------------*/<br />                if(rep_proc) rep_proc();<br />                tim_rep = REP_TIME;<br />        }<br />        if((PINB &amp; key) &amp;&amp; (*key_state == repeat||*key_state == to_repeat||*key_state == pressed))<br />        {<br />                *key_state = to_release;<br />                tim_deb = DEB_TIME;<br />        }<br />        if((*key_state == to_release) &amp;&amp; !tim_deb) *key_state = released;<br />}<br /><br />void s1_start (void)<br />{<br />status_s1 = s1_on;<br />S1_ON;<br />S2_OFF;<br />S3_OFF;<br />wents_on();<br />status_s3 = s3_off;<br />status_s2 = s2_off;<br /><br /><br />}<br /><br />void s1_stop (void)<br />{<br />status_s1 = s1_off;<br />SYGN2_TOG;<br />S1_OFF;<br /><br />}<br /><br />void s2_start (void)<br />{<br />S1_OFF;<br />S2_ON;<br />S3_OFF;<br />wents_on();<br />status_s3 = s3_off;<br />status_s2 = s2_on;<br />status_s1 = s1_off;<br /><br />}<br />void s2_stop (void)<br />{<br /><br />S2_OFF;<br /><br />status_s2 = s2_off;<br />}<br />void s3_start (void)<br />{<br />S1_OFF;<br />S2_OFF;<br />S3_ON;<br />wents_on();<br />status_s3 = s3_on;<br />status_s2 = s2_off;<br />status_s1 = s1_off;<br />}<br />void s3_stop (void)<br />{<br />S3_OFF;<br />status_s3 = s3_off;<br />}<br /><br />void wents_on (void)<br />{<br />status_went = went_on;<br />WENT_ON;<br />}<br /><br /><br /><br /><br /><br /><br />void went_s (uint8_t *czas)<br />{<br />wents_on();<br />flag_w = 1;<br />Timer2 = *czas * 600;<br />}<br /><br /><br />ISR(TIMER2_COMP_vect)<br />{<br />        //obsluga timerow programowych superdebounce<br />        uint8_t temp = tim_deb;<br />        if(temp) tim_deb--;<br /><br />        temp = tim_rep;<br />        if(temp) tim_rep--;<br /><br />        temp = tim_rep_delay;<br />        if(temp) tim_rep_delay--;<br /><br /><br />}[/syntax]<br /><br />common.h:<br /><br />[syntax=c]/*<br /> * common.h<br /> *<br /> *  Created on: 04-05-2014<br /> *      Author: Adrian<br /> *<br /> *<br /> *      Timer1 - zarezerwowany dla debounce<br /> *<br /> *<br /> */<br /><br />#ifndef COMMON_H_<br />#define COMMON_H_<br /><br />#define LED1(1&lt;&lt;PD0)<br />#define LED2(1&lt;&lt;PD1)<br />#define S1(1&lt;&lt;PD2)<br />#define S2(1&lt;&lt;PD3)<br />#define S3(1&lt;&lt;PD4)<br />#define WENT(1&lt;&lt;PD5)<br />#define SYGN1(1&lt;&lt;PD6)<br />#define SYGN2(1&lt;&lt;PD7)<br /><br />#define KEY1(1&lt;&lt;PB0)<br />#define KEY2(1&lt;&lt;PB1)<br />#define KEY3(1&lt;&lt;PB2)<br />#define KEY4(1&lt;&lt;PB3)<br /><br />#define LED1_ONPORTD &amp;= ~LED1<br />#define LED2_ONPORTD &amp;= ~LED2<br />#define S1_ONPORTD &amp;= ~S1<br />#define S2_ONPORTD &amp;= ~S2<br />#define S3_ONPORTD &amp;= ~S3<br />#define WENT_ONPORTD &amp;= ~WENT<br />#define SYGN1_ONPORTD &amp;= ~SYGN1<br />#define SYGN2_ONPORTD &amp;= ~SYGN2<br /><br />#define LED1_OFFPORTD |= LED1<br />#define LED2_OFFPORTD |= LED2<br />#define S1_OFFPORTD |= S1<br />#define S2_OFFPORTD |= S2<br />#define S3_OFFPORTD |= S3<br />#define WENT_OFFPORTD |= WENT<br />#define SYGN1_OFFPORTD |= SYGN1<br />#define SYGN2_OFFPORTD |= SYGN2<br /><br />#define LED1_TOGPORTD ^= LED1<br />#define LED2_TOGPORTD ^= LED2<br />#define S1_TOGPORTD ^= S1<br />#define S2_TOGPORTD ^= S2<br />#define S3_TOGPORTD ^= S3<br />#define WENT_TOGPORTD ^= WENT<br />#define SYGN1_TOGPORTD ^= SYGN1<br />#define SYGN2_TOGPORTD ^= SYGN2<br /><br /><br /><br />//------------------------------------------------------DEFINICJE<br /><br />void init_timer2 (void)<br />{<br />//inicjalizacja timera 2<br />TCCR2 |= (1&lt;&lt;WGM21);// tryb ctc<br />TCCR2 |= (1&lt;&lt;CS20) | (1&lt;&lt;CS21) | (1&lt;&lt;CS22);//preskaler 1024<br />OCR2 |= 107;//przerwanie co 10ms<br />TIMSK |= (1&lt;&lt;OCIE2);<br />}<br /><br />void init_key (void)<br />{<br />DDRB &amp;= ~ (KEY1 | KEY2 | KEY3 | KEY4);<br />PORTB |= KEY1 | KEY2 | KEY3 | KEY4;<br />}<br /><br />void init_ster (void)<br />{<br />DDRD |= LED1 | LED2 | S1 | S2 | S3 | WENT | SYGN1 | SYGN2;<br />LED1_OFF; LED2_OFF; S1_OFF; S2_OFF; S3_OFF; WENT_OFF; SYGN1_OFF; SYGN2_OFF;<br />}<br /><br /><br /><br /><br /><br /><br />#endif /* COMMON_H_ */[/syntax]<br /><br />Niektóre zmienne w programie są kompletnie niepotrzebne ale nie robiłem porządku z nimi bo przydają mi się one do &quot;kombinowania&quot; no i sprawdzam po kolei jak to działa, jak to się je, po prostu testuje.<br /><br />Również biblioteka do obsługi wyświetlacza jest Pana Mirka dlatego jej nie wrzucam.<br /><br />Mogłem coś chaotycznie wytłumaczyć, w razie co mogę to dokładniej opisać albo najlepiej rozrysować.<br />Z góry dziękuję za pomoc.<br /><br />Nie wiem dlaczego zjadło mi przypisanie pinów  w common.h podczas pisania normalnie je widać ;/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3179">Adhewelt</a> — 6 maja 2014, o 22:06</p><hr />
]]></content>
</entry>
</feed>