<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="pl-pl">
<link rel="self" type="application/atom+xml" href="https://forum.atnel.pl/feed.php?f=30&amp;t=12411&amp;mode" />

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-07-25T20:55:08+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=12411&amp;mode</id>
<entry>
<author><name><![CDATA[elsat1]]></name></author>
<updated>2015-07-25T20:55:08+01:00</updated>
<published>2015-07-25T20:55:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135496#p135496</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135496#p135496"/>
<title type="html"><![CDATA[Re: Jeden klawisz, dwa tryby pracy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135496#p135496"><![CDATA[
Teraz po waszych podpowiedziach przerobiłem przykład pana Mirka i dopasowałem program, że działa b. dobrze  na testach na stykówce.<br />Pojawił się problem, gdy zamiast zwykłego przycisku, podłączyłem sygnał z sensora pojemnościowego.<br />Tu jest aktywne &quot;1&quot; przy dotyku przycisku sensora, czyli odwrotnie! <br />Proszę o podpowiedź, jak zanegować to programowo, bo sprzętowo PCB jest zrobiona dla aktywne &quot;0&quot;.<br />W tym programie zastosowałem KEY2 i LED2, nie tak jak zadeklarowałem w opisie. Przepraszam że nie zmieniłem, przeszkadzają burze !<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 22 lip 2015<br /> *      Author: Jan<br /> */<br /><br />//procesor ATtiny13A, taktowanie 9600000<br />//wejście: KEY1 - przycisk - port PB0<br />//wejście: PIN_SW -przełącznik trybu pracy (tryb_1 / tryb_2) -port PB3<br />//wyjście: LED1 - (sterowanie przekaźnikiem) -port PB1<br />//PROGRAM<br />//tryb_1: PIN_SW=1 (klik KEY1-załącz, klik KEY1-wyłącz)<br />//tryb_2: PIN_SW=0 (wciśnięty KEY1-załącz, puszczony KEY1-wyłącz)<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define LED1 (1&lt;&lt;PB1)<br />#define LED2 (1&lt;&lt;PB4)<br />#define KEY1 (1&lt;&lt;PB0)<br />#define KEY2 (1&lt;&lt;PB2)<br /><br />#define PIN_SW (PINB &amp;(1&lt;&lt;PB3)) //przełącznik trybu pracy<br /><br />uint8_t key1_lock, key2_lock;<br /><br />void change_led1(void) {<br /> PORTB ^= LED1;<br />}<br /><br />void change_led2(void) {<br /> PORTB ^= LED2;<br />}<br /><br />void key_press( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br />void key_przycisk( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br /><br />//**************** OBSŁUGA JEDNEGO KLAWISZA za pomocą dwuch funkcji (key_press i key_przycisk}<br /><br />int main(void) {<br /><br /> PORTB |= KEY1|KEY2;  // podciągam linie klawiszy do VCC<br /> DDRB |= LED1|LED2;   // piny LED jako WYjścia<br /><br /> _delay_ms(10);<br /><br /> PORTB |= LED1 |LED2;  //wylanczam wyjścia<br /><br /><br /> while(1) {<br /><br />  if (!PIN_SW)<br />    {<br />  key_press( &amp;key2_lock, &amp;PINB, KEY2, change_led2 );<br />  }<br />  else<br />  {<br />  key_przycisk( &amp;key2_lock, &amp;PINB, KEY2, change_led2 );<br /><br />  }<br /><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-tryb I)<br />  if(kfun) kfun();<br /><br /> } else if( *klock &amp;&amp; key_press ) (*klock)++;<br />}<br /><br /><br />//---------------------------------------------------------------------<br />void key_przycisk(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-tryb II)<br />    if(kfun) kfun();<br />      }<br />      else<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-tryb II)<br />   if(kfun) kfun();<br />   }<br />   }<br />   }<br />}[/syntax]<br /><br />Ten program pięknie działa, uwzględnia drgania styków klawisza. Tu dziękuję za poradniki pana Mirka na których bazuję. Polecam wszystkim.<br />Wam dziękuję za podpowiedzi i synchronizację dla moich zastosowań.<br />Proszę o podpowiedź, jak zanegować sygnał przycisku (sensora), żeby uzyskać ten sam efekt dla aktywnego &quot;1&quot;.<br />Czy da się tak zrobić bez zmian sprzętowych na PCB ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=151">elsat1</a> — 25 lip 2015, o 20:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kaka0204]]></name></author>
<updated>2015-07-24T19:28:28+01:00</updated>
<published>2015-07-24T19:28:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135438#p135438</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135438#p135438"/>
<title type="html"><![CDATA[Re: Jeden klawisz, dwa tryby pracy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135438#p135438"><![CDATA[
Witam<br /><br />[syntax=c]#define SW (1&lt;&lt;PB3)<br />#define KEY1 (1&lt;&lt;PB0)<br />#define KEY2 (1&lt;&lt;PB2)<br /><br />#define LED1 (1&lt;&lt;PB1)<br />#define LED2 (1&lt;&lt;PB4)<br /><br /><br /><br />int main(void)<br />{<br />     //podciagasz klawisze do plusa, wlaczasz pull-up<br /><br />     while(1)<br />     {<br />          if(PINB &amp; SW) //jesli przelacznik podlaczony do plusa<br />          {<br />                if(!(PINB &amp; KEY1)) LED1_TOG;<br />          }<br /><br />          if(!(PINB &amp; SW) // jesli przelacznik podlaczony do GND<br />          {<br />                if(!(PINB &amp; KEY2) LED2_ON;<br />                else if(PINB &amp; KEY2) LED2_OFF;<br />          }<br /><br /><br />     }<br />}[/syntax]<br /><br />Programu nie sprawdzałem, wiec może zawierać male błędy <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Musisz jeszcze dodać opóźnienia, ale z tym pewnie sobie poradzisz <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=889">kaka0204</a> — 24 lip 2015, o 19:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elsat1]]></name></author>
<updated>2015-07-25T16:47:56+01:00</updated>
<published>2015-07-23T01:15:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135258#p135258</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135258#p135258"/>
<title type="html"><![CDATA[Re: Jeden klawisz, dwa tryby pracy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135258#p135258"><![CDATA[
Według poradnika-kodu pana Mirka tj. (2 przyciski i 2 LED-y), wszystko działa poprawnie. Mnie chodzi o to , żeby jeden przycisk (KEY1) działał na jedno wyjście (LED1) w dwóch trybach po ustawieniu SW (na 1, lub 0).<br />Tu się poprawiam, nie chcę upomnienia, przepraszam. Dołączony kod jest zmieniony i prawie dobry. Szczegóły niżej.<br /><br />[syntax=actionscript]/*<br /> * main.c<br /> *<br /> *  Created on: 22 lip 2015<br /> *      Author: Jan<br /> */<br /><br />//procesor ATtiny13A, taktowanie 9600000<br />//wejście: KEY1 - przycisk - port PB0<br />//wejście: PIN_SW -przełącznik trybu pracy (tryb_1 / tryb_2) -port PB3<br />//wyjście: LED1 - (sterowanie przekaźnikiem) -port PB1<br />//PROGRAM<br />//tryb_1: PIN_SW=1 (klik KEY1-załącz, klik KEY1-wyłącz)<br />//tryb_2: PIN_SW=0 (wciśnięty KEY1-załącz, puszczony KEY1-wyłącz)<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#define LED1 (1&lt;&lt;PB1)<br />#define LED2 (1&lt;&lt;PB4)<br />#define KEY1 (1&lt;&lt;PB0)<br />#define KEY2 (1&lt;&lt;PB2)<br /><br />#define PIN_SW (PINB &amp;(1&lt;&lt;PB3)) //przełącznik trybu pracy<br /><br />uint8_t key1_lock, key2_lock;<br /><br />void change_led1(void) {<br /> PORTB ^= LED1;<br />}<br /><br />void change_led2(void) {<br /> PORTB ^= LED2;<br />}<br /><br />void key_press( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br />void key_przycisk( uint8_t * klock, volatile uint8_t * KPIN, uint8_t key_mask, void (*kfun)(void) ) ;<br /><br />//**************** OBSŁUGA JEDNEGO KLAWISZA za pomocą dwuch funkcji (key_press i key_przycisk}<br /><br />int main(void) {<br /><br /> PORTB |= KEY1|KEY2;  // podciągam linie klawiszy do VCC<br /> DDRB |= LED1|LED2;   // piny LED jako WYjścia<br /><br /> _delay_ms(10);<br /><br /> PORTB |= LED1 |LED2;  //wylanczam wyjścia<br /><br /><br /> while(1) {<br /><br />  if (!PIN_SW)<br />    {<br />  key_press( &amp;key2_lock, &amp;PINB, KEY2, change_led2 );<br />  }<br />  else<br />  {<br />  key_przycisk( &amp;key2_lock, &amp;PINB, KEY2, change_led2 );<br /><br />  }<br /><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-tryb I)<br />  if(kfun) kfun();<br /><br /> } else if( *klock &amp;&amp; key_press ) (*klock)++;<br />}<br /><br /><br />//---------------------------------------------------------------------<br />void key_przycisk(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-tryb II)<br />    if(kfun) kfun();<br />      }<br />      else<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-tryb II)<br />   if(kfun) kfun();<br />   }<br />   }<br />   }<br />}[/syntax]<br />Nie wiem jak to zrobić, proszę o pomoc.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=151">elsat1</a> — 23 lip 2015, o 01:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[bloniak91]]></name></author>
<updated>2015-07-22T14:04:41+01:00</updated>
<published>2015-07-22T14:04:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135206#p135206</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135206#p135206"/>
<title type="html"><![CDATA[Re: Jeden klawisz, dwa tryby pracy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135206#p135206"><![CDATA[
spróbuj:<br />[syntax=c]#define PIN_SW (PINA &amp;(1&lt;&lt;PA0) <br /><br />if(!PIN_SW )<br />{<br />//obsługa klawisza na stan niski na pinie <br />}<br />else<br />{<br />//obsługa klawisza na stan wysoki na pinie <br />}[/syntax]<br />Oczywiście numer i port pinu tam sobie dobierz. Do niego ma być podłączony przełącznik, który w jednej pozycji łączy do GND, a w drugiej do VCC.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3841">bloniak91</a> — 22 lip 2015, o 14:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[elsat1]]></name></author>
<updated>2015-07-22T12:39:28+01:00</updated>
<published>2015-07-22T12:39:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135194#p135194</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135194#p135194"/>
<title type="html"><![CDATA[Jeden klawisz, dwa tryby pracy]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12411&amp;p=135194#p135194"><![CDATA[
Chcę jednym przyciskiem (KEY1) zapalać i gasić LED - I tryb pracy.<br />Po zmianie stanu przełącznikiem (SW1) na porcie ATtiny13 - II tryb pracy, trzymam przycisk LED = świeci, puszczam przycisk LED = gaśnie.<br />Korzystam z poradnika pana Mirka  <!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2012/10/obsuga-klawiszy-drgania-stykow-cd2.html" >http://mirekk36.blogspot.com/2012/10/ob ... w-cd2.html</a><!-- m --><br />Jestem początkujący w programowaniu C , trudno się przestawić z Asemblera.<br />Proszę o podpowiedź , przykład rozwiązania tak prostego programu dla ATtiny13A.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=151">elsat1</a> — 22 lip 2015, o 12:39</p><hr />
]]></content>
</entry>
</feed>