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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-01-16T21:53:42+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=5460&amp;mode</id>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2014-01-16T21:53:42+01:00</updated>
<published>2014-01-16T21:53:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=65291#p65291</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=65291#p65291"/>
<title type="html"><![CDATA[Re: Sterownik skręcarki Atmega 8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=65291#p65291"><![CDATA[
Witam ponownie. Poradziłem sobie już z funkcją automatycznego cofania o zaprogramowana liczbę impulsów, ale dalej nie wiem jak mam zrobić zapamiętanie wartości licznika np. po wciśnięciu klawisza wyboru kierunku (klawisz 6 i 7) a po zakończeniu pracy (zadeklarowane zmienne) wypisać tą zapamiętaną wartość do n. Chyba, że czegoś nie kumam. Prosiłbym żeby ktoś pokazał na przykładnie jak to można rozwiązać.<br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2014-01-01<br /> *      Author: hopek<br /> *      wersja 1.4<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br /><br />//definicja pinu dla diody LED<br />#define LED_PIN (1&lt;&lt;PC0)<br />#define LED_OFF PORTC &amp;= ~(1&lt;&lt;PC0)<br />#define LED_ON PORTC |= (1&lt;&lt;PC0)<br /><br />//piny dla styczników<br />#define LEWO (1&lt;&lt;PB2)<br />#define PRAWO (1&lt;&lt;PB1)<br /><br />#define LEWO_ON PORTB &amp;= ~LEWO<br />#define PRAWO_ONPORTB &amp;= ~PRAWO<br />#define LEWO_OFF PORTB |= LEWO<br />#define PRAWO_OFF PORTB |= PRAWO<br /><br /><br />//definicje klawiszy<br />#define KEY1 (1&lt;&lt;PD0)//zmniejsza licznik o 1<br />#define KEY4 (1&lt;&lt;PD1)//zwiększa licznik o 1<br />#define KEY3 (1&lt;&lt;PD2)//zwiększa licznik o 10<br />#define KEY2 (1&lt;&lt;PD3)//zwiększa licznik o 100<br />#define KEY5 (1&lt;&lt;PD4)//zeruje licznik<br />#define KEY6 (1&lt;&lt;PB6)//załącza stycznik 1 na OUT 1<br />#define KEY7 (1&lt;&lt;PB7)//załącza stycznik 2 na OUT 2<br /><br />#define BUZ (1&lt;&lt;PC1)//brzęczyk<br />#define BUZ_OFF PORTC &amp;= ~BUZ<br />#define BUZ_ON PORTC |= BUZ<br />#define BUZ_TOG PORTC ^= BUZ<br /><br /><br /><br /><br /><br />//pin czujnika<br />#define IMP (1&lt;&lt;PD5)<br /><br /><br />//definicje własnych znaków LCD<br />uint8_t tab1 &#91;&#93; = {16,24,28,30,28,24,16,32}; //strzałka prawo<br />uint8_t tab2 &#91;&#93; = {1,3,7,15,7,3,1,32};//strzałak lewo<br />uint8_t tab3 &#91;&#93; = {2,4,14,16,14,1,30,32};//litera s<br />uint8_t tab4 &#91;&#93; = {2,4,14,16,16,17,14,32};//litera ć<br />uint8_t tab5 &#91;&#93; = {2,4,14,17,17,17,14,32};//litera ó<br />uint8_t tab6 &#91;&#93; = {32,32,14,17,31,16,14,2}; //litera ę<br /><br />uint8_t imp_lock, key1_lock, key2_lock, key3_lock, key4_lock, key5_lock, key6_lock, key7_lock;<br />uint8_t czujnik1(void);<br />uint16_t licznik(void);<br />uint8_t praca_lewo; //zmienna pomocnicza<br />uint8_t praca_prawo;//zmienna pomocnicza<br />uint16_t n;//zmienna pomocnicza<br /><br /><br /><br />void beep_on (void);<br />void beep_ready (void);<br />void beep_klik (void);<br />void beep_wrong (void);<br /><br /><br /><br />int main(void)<br />{<br />        DDRC |= LED_PIN;  //kierunek pinu PC7 wyjściowy<br />        PORTC &amp;= ~LED_PIN; //wyłączenie diody<br />        DDRD &amp;= ~ (IMP | KEY1 | KEY2 | KEY3 | KEY4 | KEY5);    //kierunki portów jako wejściowe<br />        PORTD  |= IMP | KEY1 | KEY2| KEY3 | KEY4 | KEY5;//klawisze do VCC<br />        DDRB &amp;= ~(KEY6 | KEY7);<br />        PORTB |= KEY6 | KEY7;<br />        DDRB |= LEWO | PRAWO;<br />        PORTB |= LEWO | PRAWO;<br />        DDRC |= BUZ;<br />        PORTC |= BUZ;<br /><br />        BUZ_OFF;<br /><br />        LEWO_OFF;<br />        PRAWO_OFF;<br /><br />        lcd_init();     //inicjalizacja LCD<br /><br />        lcd_defchar ( 0x80, tab1);<br />        lcd_defchar( 0x81, tab3);<br />        lcd_defchar( 0x82, tab4);<br />        lcd_defchar ( 0x83, tab5);<br />        lcd_defchar ( 0x84, tab6);<br />        lcd_defchar ( 0x85, tab2);<br /><br />        lcd_locate(0,0);<br /><br /><br /><br /><br /><br /><br />//efekty specjalne<br /><br />/*        lcd_str(&quot;S&quot;);<br />         _delay_ms(100);<br /><br />         lcd_locate(0,1);<br />        lcd_str(&quot;t&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,2);<br />        lcd_str(&quot;e&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,3);<br />        lcd_str(&quot;r&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,4);<br />        lcd_str(&quot;o&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,5);<br />        lcd_str(&quot;w&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,6);<br />        lcd_str(&quot;n&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,7);<br />        lcd_str(&quot;i&quot;);<br />        _delay_ms(100);<br />        lcd_locate(0,8);<br /><br />        lcd_str(&quot;k&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(1,0);<br />        lcd_str(&quot;S&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(1,1);<br />        lcd_str(&quot;k&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(1,2);<br />        lcd_str(&quot;r&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(1,3);<br />        lcd_str(&quot;\x84&quot;);<br />        _delay_ms(100);<br />        lcd_locate(1,4);<br />        lcd_str(&quot;c&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(1,5);<br />        lcd_str(&quot;a&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(1,6);<br />        lcd_str(&quot;r&quot;);<br />        _delay_ms(100);<br />        lcd_locate(1,7);<br />        lcd_str(&quot;k&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(1,8);<br />        lcd_str(&quot;i&quot;);<br />        _delay_ms(500);<br /><br />        lcd_locate(1,10);<br />        lcd_str(&quot;  v1.4&quot;);<br /><br /><br />       _delay_ms(500);<br /><br />       beep_on();<br />       */<br /><br />//<br />        while(1)<br />        {<br />                if(czujnik1())<br />                {<br />                        licznik();<br />                }<br /><br />                lcd_locate(0,0);<br />                lcd_str(&quot;Ilo\x81\x82 impuls\x83w:&quot;);<br />                lcd_locate (1,0);<br />                lcd_int(n);<br />                lcd_str(&quot;                &quot;);<br /><br /><br /><br /><br /><br /><br /><br />//OBSŁUGA DRGAŃ STYKÓW I KLAWISZY<br /><br />//klawisz 1 (zmniejszanie o 1)<br />if( !key1_lock &amp;&amp; !(PIND &amp; KEY1 ) )<br />{<br />key1_lock=1;<br />n--;<br />//beep_klik();<br /><br />}<br />else if( key1_lock &amp;&amp; (PIND &amp; KEY1 ) )<br />key1_lock=0;<br /><br />//klawisz 2 (zwiększanie o 1)<br />if( !key2_lock &amp;&amp; !(PIND &amp; KEY2 ) )<br />{<br />key2_lock=1;<br />n ++;<br />//beep_klik();<br /><br />}<br />else if( key2_lock &amp;&amp; (PIND &amp; KEY2 ) )<br />key2_lock=0;<br /><br />//klawisz 3 (zwiększanie o 10)<br />if( !key3_lock &amp;&amp; !(PIND &amp; KEY3 ) )<br />{<br />key3_lock=1;<br />n +=10;<br />//beep_klik();<br />}<br />else if( key3_lock &amp;&amp; (PIND &amp; KEY3 ) )<br />key3_lock=0;<br /><br />//klawisz 4 (zwiększanie o 100)<br />if( !key4_lock &amp;&amp; !(PIND &amp; KEY4 ) )<br />{<br />key4_lock=1;<br />n +=100;<br />//beep_klik();<br />}<br />else if( key4_lock &amp;&amp; (PIND &amp; KEY4 ) )<br />key4_lock=0;<br /><br />//klawisz 5 (kasowanie licznika)<br />if( !key5_lock &amp;&amp; !(PIND &amp; KEY5 ) )<br />{<br />key5_lock=1;<br />n =0;<br />//beep_wrong();<br />praca_lewo=0;<br />praca_prawo=0;<br />LEWO_OFF;<br />PRAWO_OFF;<br />}<br />else if( key5_lock &amp;&amp; (PIND &amp; KEY5 ) )<br />key5_lock=0;<br /><br />//--------------------------------KLAWISZE WYBORU KIERUNKU PRACY------------------------------<br /><br />//klawisz 6 (obroty lewo)<br />if( !key6_lock &amp;&amp; !(PINB &amp; KEY6 ) )<br />{<br /><br />key6_lock=1;<br />praca_lewo=1;<br />LEWO_ON;<br />//beep_klik();<br /><br /><br /><br />}<br />else if( key6_lock &amp;&amp; (PINB &amp; KEY6 ) )<br />key6_lock=0;<br /><br /><br /><br />//klawisz 7 (obroty prawo)<br />if( !key7_lock &amp;&amp; !(PINB &amp; KEY7 ) )<br />{<br />key7_lock=1;<br /><br />PRAWO_ON;<br />praca_prawo=1;<br />//beep_klik();<br /><br />}<br />else if( key7_lock &amp;&amp; (PINB &amp; KEY7 ) )<br />key7_lock=0;<br />//--------------------------------KLAWISZE WYBORU KIERUNKU PRACY------------------------------<br /><br />//funkcja która zatrzymuje i cofa maszyne o 5 impulsów wstecz żeby odprężyć materiał<br />if (praca_lewo)<br /><br />{<br /><br />if (!(PINB &amp; LEWO) &amp; (n==0))<br />{<br />LEWO_OFF;<br />_delay_ms(1500);<br />n=5;<br />_delay_ms(500);<br />PRAWO_ON;<br />}<br /><br />if (!(PINB &amp; PRAWO) &amp; (n==0))<br />       {<br />            PRAWO_OFF;<br />            praca_lewo=0;<br />            //beep_ready();<br /><br /><br />       }<br /><br /><br />}<br /><br /><br />if (praca_prawo)<br /><br />{<br /><br />if (!(PINB &amp; PRAWO) &amp; (n==0))<br />{<br />PRAWO_OFF;<br />_delay_ms(1500);<br />n=5;<br />_delay_ms(500);<br />LEWO_ON;<br />}<br /><br />if (!(PINB &amp; LEWO) &amp; (n==0))<br />{<br />LEWO_OFF;<br />praca_prawo=0;<br />//beep_ready();<br /><br /><br /><br />}<br /><br /><br />}<br /><br /><br /><br />//warunek nie pozwalający na ujemne stany licznika<br />if (n &gt;= -1)<br />{<br />n=0;<br /><br />}<br />//blokowanie klawiszy wyboru kierunku skręcania podczas gdy urzadzenie nie pracuje<br />if ((n==0) || (praca_lewo || praca_prawo))<br />{<br />key6_lock=1;//wybór kierunku LEWO<br />key7_lock=1;//wybór kierunku PRAWO<br />}<br /><br /><br /><br />//warunek blokujący klawisze podczas pracy, żeby nie było bum. Klawisz reset aktywny.<br />if ((!(PINB &amp; LEWO)) || (!(PINB &amp; PRAWO)))<br />{<br />key1_lock=1;//zmniejszanie o 1<br />key2_lock=1;//zwiększanie o 1<br />key3_lock=1;//zwiększanie o 10<br />key4_lock=1;//zwiększanie o 100<br />}<br />        }<br />}<br /><br /><br /><br />uint8_t czujnik1(void)<br />        {<br />        if( !imp_lock &amp;&amp; !(PIND &amp; IMP ) )<br />              {<br />                  imp_lock=1;<br />                  n--;<br /><br />                  // mignij diodą z każdym impulsem<br />                  LED_ON;<br />                  _delay_ms(2);<br />                  LED_OFF;<br />              }<br />        else if( imp_lock &amp;&amp; (PIND &amp; IMP ) ) imp_lock=0;<br />                return 0;<br />        }<br /><br /><br />uint16_t licznik(void)<br />        {<br />                static uint16_t licznik;  //definicja zmiennej statycznej<br />                n = licznik++;<br />                return n;<br />        }<br /><br /><br /><br />void beep_klik(void)<br />{<br />    uint8_t i;<br />    for(i=0; i&lt;70; i++)<br />        {<br />            _delay_us(250);<br />            BUZ_TOG;<br /><br />        }<br />        BUZ_OFF;<br />}<br /><br />void beep_on (void)<br />{<br />uint8_t i;<br />for(i=0; i&lt;100; i++)<br />    {<br />        _delay_us(250);<br />        BUZ_TOG;<br />    }<br />_delay_ms(80);<br /><br />for(i=0; i&lt;150; i++)<br />    {<br />       _delay_us(200);<br />        BUZ_TOG;<br />    }<br />BUZ_OFF;<br />}<br /><br />void beep_ready (void)<br />{<br />uint16_t i;<br />for(i=0; i&lt;350; i++)<br />    {<br />        _delay_us(200);<br />        BUZ_TOG;<br />    }<br />_delay_ms(80);<br /><br />for(i=0; i&lt;350; i++)<br />    {<br />       _delay_us(250);<br />       BUZ_TOG;<br />    }<br /><br />BUZ_OFF;<br />}<br /><br /><br />void beep_wrong (void) {<br />uint8_t i;<br />for(i=0; i&lt;70; i++)<br />    {<br />        _delay_us(400);<br />        BUZ_TOG;<br /><br />    }<br />_delay_ms(100);<br />for(i=0; i&lt;70; i++)<br />    {<br />        _delay_us(400);<br />        BUZ_TOG;<br /><br />    }<br />_delay_ms(100);<br />for(i=0; i&lt;70; i++)<br />    {<br />        _delay_us(400);<br />        BUZ_TOG;<br /><br />    }<br />_delay_ms(100);<br />BUZ_OFF;<br />}[/syntax]<br /><br />Problem rozwiązany.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 16 sty 2014, o 21:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[niemy]]></name></author>
<updated>2014-01-07T23:48:12+01:00</updated>
<published>2014-01-07T23:48:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64254#p64254</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64254#p64254"/>
<title type="html"><![CDATA[Re: Sterownik skręcarki Atmega 8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64254#p64254"><![CDATA[
To musisz stworzyć kolejną zmienną w której będziesz pamiętał ten twój pierwotny niejako stan impulsów i po skończonym cyklu PRACA program zatrzyma się na pytaniu &quot;co dalej?&quot; Powtórka cyklu czy nowy cykl.<br />Jak powtórka to przepiszesz tą zapamiętaną wartość znowu do &quot;n&quot; a jak nowy cykl to przechodzisz to ustawiania liczby impulsów i po zatwierdzeniu znowu zapisujesz już nowo wpisaną liczbę impulsów do &quot;n&quot; i do zmiennej do pamiętania.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=675">niemy</a> — 7 sty 2014, o 23:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2014-01-07T23:05:03+01:00</updated>
<published>2014-01-07T23:05:03+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64241#p64241</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64241#p64241"/>
<title type="html"><![CDATA[Re: Sterownik skręcarki Atmega 8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64241#p64241"><![CDATA[
Nie, nie żadnych gotowców, od tego jest forum żeby się czegoś nauczyć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Ale z podpowiedzi jak zrobić te 2 rzezy chętnie skorzystam. Program pisałem sam, a ze jestem jeszcze początkujący w prockach to pytam. Wartość licznika ma powracać do tej ustawionej na początku ustawień czyli nabijam 300 impulsów klawiszami, wrzucam do pamięci ram, klikam kierunek, licznik dobija zera, cofa w kierunku przeciwnym ileś tam i po opóźnieniu z pamięci ram nabija znowu 300.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 7 sty 2014, o 23:05</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[niemy]]></name></author>
<updated>2014-01-07T22:43:45+01:00</updated>
<published>2014-01-07T22:43:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64232#p64232</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64232#p64232"/>
<title type="html"><![CDATA[Re: Sterownik skręcarki Atmega 8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64232#p64232"><![CDATA[
Chcesz gotowy program, czy podpowiedź do algorytmu działania.<br />Tak jak zawsze mówi Pan Mirek - kartka długopis i wyrysować sobie.<br /><br />Ja bym zrobił to w ten sposób, że wprowadziłbym kolejną zmienną np. PRACA aby określić czy już skręcasz drut czy jesteś jeszcze w ustawieniach. I potem prosto jeżeli n=0 (bo to chyba ilość impulsów) a PRACA ciągle trwa to poczekaj sekundkę i obróć kierunek i pięć impulsików w górę i wtedy koniec PRACY.<br /><br />A z zapamiętaniem wartości to chcesz ją zapamiętać powiedzmy na zawsze czy chcesz tylko zapamiętać na następny cykl pracy czyli jakby aktualna ilość skrętów na dzisiaj?<br /><br />OK moje rozważania ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=675">niemy</a> — 7 sty 2014, o 22:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[hopek]]></name></author>
<updated>2014-01-07T00:47:18+01:00</updated>
<published>2014-01-07T00:47:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64136#p64136</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64136#p64136"/>
<title type="html"><![CDATA[Sterownik skręcarki Atmega 8]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=5460&amp;p=64136#p64136"><![CDATA[
Witam. Panie i Panowie, przyszło mi napisać sterownik do skręcarki prętów metalowych. Udało mi się to zrobić i na stoliku układ działa poprawnie. <br />Zasada działania:<br />Silnik 3 fazowy sterowany lewo, prawo przez styczniki 24v. Na wałku silnika znajduje się przekładnia z 1400 obr/min. na 30 obr/min. Dalej na wałku zdawczym z przekładni mam założone koło zębate z ABS i czujnik indukcyjny 24V ze stykami NO i NC zwieranymi do masy. Program działa tak:<br />1. Zrobiony jest licznik do którego klawiszami nabijam żądaną wartość impulsów (klawisze do wyboru: -1, +100, +10, +1).<br />2. Jednym z 2 klawiszy wybieram kierunek skręcania (lewo, prawo).<br />3. Po kliknięciu klawiszem wyboru kierunku załączam stycznik i impulsy z czujnika odejmują po jednym z wartości początkowej licznika aż do wartości 0 gdzie w tym momencie wyłączam stycznik i silnik się zatrzymuje. Podczas pracy silnika (odejmowania impulsów) klawisze wyboru kierunku, dodawania i odejmowania wartości są zblokowane. Aktywny jest tylko przycisk RESET/STOP, który podczas pracy zatrzymuje silnik i zeruje wartość licznika a podczas stanu oczekiwania tylko zeruje licznik. Oczywiście wszystko wyświetlam na LCD <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Chciałbym jeszcze dorobić 2 rzeczy czyli automatyczne cofanie (odprężanie materiału) o np. 5 impulsów z opóźnieniem 1 sekundy od zatrzymania, oraz zapamiętywanie wartości początkowej licznika, żeby nie nabijać tego od nowa klawiszami.<br />I tu zwracam się z prośbą do Was o poradę jak...<br /><br />Wiem że może dla większości wygląda to śmiesznie, ale no cóż działa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Niżej podaję kod programu:<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2014-01-01<br /> *      Author: hopek<br /> *      wersja 1.1<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &quot;LCD/lcd44780.h&quot;<br /><br /><br /><br /><br /><br />//definicja pinu dla diody LED<br />#define LED_PIN (1&lt;&lt;PC0)<br />#define LED_ON PORTC &amp;= ~(1&lt;&lt;PC0)<br />#define LED_OFF PORTC |= (1&lt;&lt;PC0)<br /><br />//piny dla styczników<br />#define OUT1 (1&lt;&lt;PB2)<br />#define OUT2 (1&lt;&lt;PB1)<br /><br />#define OUT1_ON PORTB &amp;= ~OUT1;<br />#define OUT2_ONPORTB &amp;= ~OUT2;<br />#define OUT1_OFF PORTB |= OUT1;<br />#define OUT2_OFF PORTB |= OUT2;<br /><br /><br /><br />//definicje klawiszy<br />#define KEY1 (1&lt;&lt;PD0)//zmniejsza licznik o 1<br />#define KEY2 (1&lt;&lt;PD1)//zwiększa licznik o 1<br />#define KEY3 (1&lt;&lt;PD2)//zwiększa licznik o 10<br />#define KEY4 (1&lt;&lt;PD3)//zwiększa licznik o 100<br />#define KEY5 (1&lt;&lt;PD4)//zeruje licznik<br />#define KEY6 (1&lt;&lt;PB6)//załącza stycznik 1 na OUT 1<br />#define KEY7 (1&lt;&lt;PB7)//załącza stycznik 2 na OUT 2<br /><br />//sprawdzanie stanów klawiszy (czy wcisnięte)<br />#define KEY1_DOWN !(PIND &amp; KEY1)<br />#define KEY2_DOWN !(PIND &amp; KEY2)<br />#define KEY3_DOWN !(PIND &amp; KEY3)<br />#define KEY4_DOWN !(PIND &amp; KEY4)<br />#define KEY5_DOWN !(PIND &amp; KEY5)<br />#define KEY6_DOWN !(PINB &amp; KEY6)<br />#define KEY7_DOWN !(PINB &amp; KEY7)<br /><br /><br /><br />//pin czujnika<br />#define IMP (1&lt;&lt;PD5)<br /><br /><br />//definicje własnych znaków LCD<br />uint8_t tab1 &#91;&#93; = {16,24,28,30,28,24,16,32}; //strzałka prawo<br />uint8_t tab2 &#91;&#93; = {1,3,7,15,7,3,1,32};//strzałak lewo<br />uint8_t tab3 &#91;&#93; = {2,4,14,16,14,1,30,32};//litera s<br />uint8_t tab4 &#91;&#93; = {2,4,14,16,16,17,14,32};//litera ć<br />uint8_t tab5 &#91;&#93; = {2,4,14,17,17,17,14,32};//litera ó<br />uint8_t tab6 &#91;&#93; = {32,32,14,17,31,16,14,2}; //litera ę<br /><br />uint8_t imp_lock, key1_lock, key2_lock, key3_lock, key4_lock, key5_lock, key6_lock, key7_lock;<br />uint8_t czujnik1(void);<br />uint16_t licznik(void);<br />uint16_t n=0;<br /><br />int main(void)<br />{<br />        DDRC |= LED_PIN;  //kierunek pinu PC7 wyjściowy<br />        PORTC |= LED_PIN; //wyłączenie diody<br />        DDRD &amp;= ~ (IMP | KEY1 | KEY2 | KEY3 | KEY4 | KEY5);    //kierunki portów jako wejściowe<br />        PORTD  |= IMP | KEY1 | KEY2| KEY3 | KEY4 | KEY5;//klawisze do VCC<br />        DDRB &amp;= ~(KEY6 | KEY7);<br />        PORTB |= KEY6 | KEY7;<br />        DDRB |= OUT1 | OUT2;<br />        PORTB |= OUT1 | OUT2;<br />        OUT1_OFF;<br />        OUT2_OFF;<br /><br /><br /><br /><br />        lcd_init();     //inicjalizacja LCD<br /><br />        lcd_defchar ( 0x80, tab1);<br />        lcd_defchar( 0x81, tab3);<br />        lcd_defchar( 0x82, tab4);<br />        lcd_defchar ( 0x83, tab5);<br />        lcd_defchar ( 0x84, tab6);<br /><br />        lcd_locate(0,0);<br /><br />        //efekty specjalne<br />        lcd_str(&quot;S&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,1);<br />        lcd_str(&quot;t&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,2);<br />        lcd_str(&quot;e&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,3);<br />        lcd_str(&quot;r&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,4);<br />        lcd_str(&quot;o&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,5);<br />        lcd_str(&quot;w&quot;);<br />        _delay_ms(100);<br /><br />        lcd_locate(0,6);<br />        lcd_str(&quot;n&quot;);<br />        _delay_ms(100);<br /><br />                                        lcd_locate(0,7);<br />                                        lcd_str(&quot;i&quot;);<br />                                        _delay_ms(100);<br />                                        lcd_locate(0,8);<br /><br />                                        lcd_str(&quot;k&quot;);<br />                                        _delay_ms(100);<br /><br />                                        lcd_locate(1,0);<br />                                        lcd_str(&quot;S&quot;);<br />                                        _delay_ms(100);<br /><br />                                        lcd_locate(1,1);<br />                                        lcd_str(&quot;k&quot;);<br />                                        _delay_ms(100);<br /><br />                                        lcd_locate(1,2);<br />                                        lcd_str(&quot;r&quot;);<br />                                        _delay_ms(100);<br /><br />                                        lcd_locate(1,3);<br />                                        lcd_str(&quot;\x84&quot;);<br />                                        _delay_ms(100);<br /><br />                                        lcd_locate(1,4);<br />                                        lcd_str(&quot;c&quot;);<br />                                        _delay_ms(100);<br /><br />                                        lcd_locate(1,5);<br />                                        lcd_str(&quot;a&quot;);<br />                                        _delay_ms(100);<br /><br />                                        lcd_locate(1,6);<br />                                        lcd_str(&quot;r&quot;);<br />                                        _delay_ms(100);<br /><br />                                        lcd_locate(1,7);<br />                                        lcd_str(&quot;k&quot;);<br />                                        _delay_ms(100);<br /><br />                                        lcd_locate(1,8);<br />                                        lcd_str(&quot;i&quot;);<br />                                        _delay_ms(500);<br /><br />                                        lcd_locate(1,10);<br />                                        lcd_str(&quot;  v1.1&quot;);<br /><br />                                        _delay_ms(1000);<br /><br />        while(1)<br />        {<br />                if(czujnik1())<br />                {<br />                        licznik();<br />                }<br /><br /><br />                lcd_locate(0,0);<br />                lcd_str(&quot;Ilo\x81\x82 impuls\x83w:&quot;);<br />                lcd_locate (1,0);<br />                lcd_int(n);<br />                lcd_str(&quot;                &quot;);<br /><br />                //OBSŁUGA DRGAŃ STYKÓW I KLAWISZY<br /><br />                //klawisz 1 (zmniejszanie o 1)<br />                if( !key1_lock &amp;&amp; !(PIND &amp; KEY1 ) )<br />                {<br />                key1_lock=1;<br />                n--;<br />                }<br />                else if( key1_lock &amp;&amp; (PIND &amp; KEY1 ) ) key1_lock=0;<br /><br />                //klawisz 2 (zwiększanie o 1)<br />                if( !key2_lock &amp;&amp; !(PIND &amp; KEY2 ) )<br />                {<br />                key2_lock=1;<br />                n ++;<br />                }<br />                else if( key2_lock &amp;&amp; (PIND &amp; KEY2 ) ) key2_lock=0;<br /><br />                //klawisz 3 (zwiększanie o 10)<br />                if( !key3_lock &amp;&amp; !(PIND &amp; KEY3 ) )<br />                {<br />                         key3_lock=1;<br />                         n +=10;<br />                }<br />                else if( key3_lock &amp;&amp; (PIND &amp; KEY3 ) ) key3_lock=0;<br /><br />                //klawisz 4 (zwiększanie o 100)<br />                if( !key4_lock &amp;&amp; !(PIND &amp; KEY4 ) )<br />                    {<br />                         key4_lock=1;<br />                         n +=100;<br />                    }<br />                else if( key4_lock &amp;&amp; (PIND &amp; KEY4 ) ) key4_lock=0;<br /><br />                //klawisz 5 (kasowanie licznika)<br />                if( !key5_lock &amp;&amp; !(PIND &amp; KEY5 ) )<br />                    {<br />                         key5_lock=1;<br />                         n =0;<br />                    }<br />                else if( key5_lock &amp;&amp; (PIND &amp; KEY5 ) ) key5_lock=0;<br /><br /><br /><br />                //klawisz 6 (stycznik 1)<br />                if( !key6_lock &amp;&amp; !(PINB &amp; KEY6 ) )<br />                    {<br />                         key6_lock=1;<br />                         OUT1_ON;<br />                     }<br /><br />                else if( key6_lock &amp;&amp; (PINB &amp; KEY6 ) )<br />                key6_lock=0;<br /><br /><br />                //klawisz 7 (stycznik 2)<br />                if( !key7_lock &amp;&amp; !(PINB &amp; KEY7 ) )<br />                     {<br />                         key7_lock=1;<br />                         OUT2_ON;<br />                     }<br />                else if( key7_lock &amp;&amp; (PINB &amp; KEY7 ) ) key7_lock=0;<br /><br /><br />                //warunek wyłączający oba wyjscia styczników gdy licznik osiągnie wartosć 0<br />                if(n==0)<br />                {<br />                OUT1_OFF;<br />                OUT2_OFF;<br />                }<br /><br />                //warunek nie pozwalający na ujemne stany licznika<br />                if (n==-1)<br />                {<br />                n=0;<br />                }<br /><br /><br />                //warunek blokujący klawisze podczas pracy, żeby nie było bum. Klawisz reset aktywny.<br />                if ((!(PORTB &amp; OUT1)) || (!(PINB &amp; OUT2)))<br />                {<br />                key1_lock=1;<br />                key2_lock=1;<br />                key3_lock=1;<br />                key4_lock=1;<br />                key6_lock=1;<br />                key7_lock=1;<br />                }<br />        }<br />}<br /><br /><br />uint8_t czujnik1(void)<br />        {<br />        if( !imp_lock &amp;&amp; !(PIND &amp; IMP ) )<br />              {<br />                  imp_lock=1;<br />                  n--;<br /><br />                  // mignij diodą z każdym impulsem<br />                  LED_ON;<br />                  _delay_ms(10);<br />                  LED_OFF;<br />              }<br />        else if( imp_lock &amp;&amp; (PIND &amp; IMP ) ) imp_lock=0;<br />                return 0;<br /><br />        }<br />uint16_t licznik(void)<br />        {<br />                static uint16_t licznik;  //definicja zmiennej statycznej<br />                n = licznik++;<br />                return n;<br />        }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1692">hopek</a> — 7 sty 2014, o 00:47</p><hr />
]]></content>
</entry>
</feed>