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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-06-25T09:28:32+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12117&amp;mode</id>
<entry>
<author><name><![CDATA[Mario17]]></name></author>
<updated>2015-06-25T09:28:32+01:00</updated>
<published>2015-06-25T09:28:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12117&amp;p=132788#p132788</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12117&amp;p=132788#p132788"/>
<title type="html"><![CDATA[Re: Sterowanie manipulatorem - prośba o sprawdzenie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12117&amp;p=132788#p132788"><![CDATA[
Dwie klamry za dużo. Linia 131 i 152.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3695">Mario17</a> — 25 cze 2015, o 09:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Panicz74]]></name></author>
<updated>2015-06-25T01:37:19+01:00</updated>
<published>2015-06-25T01:37:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12117&amp;p=132784#p132784</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12117&amp;p=132784#p132784"/>
<title type="html"><![CDATA[Sterowanie manipulatorem - prośba o sprawdzenie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12117&amp;p=132784#p132784"><![CDATA[
Witam,<br /><br />Już prawie ukończyłem pisać program do sterowania manipulatorem. Robot składa się z:<br />- Atmega644 16MHz,<br />- 4x serwo,<br />- 11 przycisków, 8 sterowanie ręczne, 9-idź podnieś, 10-przenieś, 11-upuść.<br /><br />Wszystko ładnie, pięknie ale mam problem z ostatnim przyciskiem nr. 11. Oprócz tego wszystkie działają. Program się kompiluje bez problemu. Oto cały kod:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br /><br />#define KEY1    (1&lt;&lt;PA0)<br />#define KEY2    (1&lt;&lt;PA1)<br />#define KEY3    (1&lt;&lt;PA2)<br />#define KEY4    (1&lt;&lt;PA3)<br />#define KEY5    (1&lt;&lt;PA4)<br />#define KEY6    (1&lt;&lt;PA5)<br />#define KEY7    (1&lt;&lt;PA6)<br />#define KEY8    (1&lt;&lt;PA7)<br />#define KEY9(1&lt;&lt;PB0)<br />#define KEY10(1&lt;&lt;PB1)<br />#define KEY11(1&lt;&lt;PB2)<br /><br />#define KEY1_DOWN ( !(PINA &amp; KEY1) )<br />#define KEY2_DOWN ( !(PINA &amp; KEY2) )<br />#define KEY3_DOWN ( !(PINA &amp; KEY3) )<br />#define KEY4_DOWN ( !(PINA &amp; KEY4) )<br />#define KEY5_DOWN ( !(PINA &amp; KEY5) )<br />#define KEY6_DOWN ( !(PINA &amp; KEY6) )<br />#define KEY7_DOWN ( !(PINA &amp; KEY7) )<br />#define KEY8_DOWN ( !(PINA &amp; KEY8) )<br />#define KEY9_DOWN ( !(PINB &amp; KEY9) )<br />#define KEY10_DOWN ( !(PINB &amp; KEY10) )<br />#define KEY11_DOWN ( !(PINB &amp; KEY11) )<br /><br />#define SERVO1 (1&lt;&lt;PD2)<br />#define SERVO2 (1&lt;&lt;PD4)<br />#define SERVO3 (1&lt;&lt;PD6)<br />#define SERVO4 (1&lt;&lt;PD7)<br /><br />#define SERVO_RIGHT13170//22,5 w prawo<br />#define SERVO_RIGHT23650//45 w prawo<br />#define SERVO_RIGHT34120//67,5 w prawo<br />#define SERVO_LEFT31270//67,5 w lewo<br />#define SERVO_LEFT21750//45 w lewo<br />#define SERVO_LEFT12220//22,5 w lewo<br />#define SERVO_MID       2700<br />#define SERVO_MIN       1000<br />#define SERVO_MAX       4400<br />#define HAND_CLOSE      2400<br />#define HAND_OPEN       3500<br /><br /><br />uint16_t servo1, servo2, servo3, servo4;<br />volatile uint8_t key_flag;<br /><br />int main(void)<br />{<br />        servo1 = servo2 = servo3 = servo4 = SERVO_MID;<br />        servo4 = HAND_OPEN;<br />        PORTA |= KEY1 | KEY2 | KEY3 | KEY4 | KEY5 | KEY6 | KEY7 | KEY8; //podciagnięcie wejsc<br />        PORTB |= KEY9 | KEY10 | KEY11;<br />    DDRD |= SERVO1 | SERVO2 | SERVO3 | SERVO4;// wyjscia silnikow<br />    DDRD &amp;= ~(1&lt;&lt;PD0 | 1&lt;&lt;PD1 | 1&lt;&lt;PD3 | 1&lt;&lt;PD5);<br />    PORTD |= (1&lt;&lt;PD0 | 1&lt;&lt;PD1 | 1&lt;&lt;PD3 | 1&lt;&lt;PD5);<br />    DDRC &amp;= ~(1&lt;&lt;PC0 | 1&lt;&lt; PC1 | 1&lt;&lt;PC2 | 1&lt;&lt;PC3 | 1&lt;&lt;PC4 | 1&lt;&lt;PC5 | 1&lt;&lt;PC6 | 1&lt;&lt;PC7);<br />    PORTC |= (1&lt;&lt;PC0 | 1&lt;&lt;PC1 | 1&lt;&lt;PC2 | 1&lt;&lt;PC3 | 1&lt;&lt;PC4 | 1&lt;&lt;PC5 | 1&lt;&lt;PC6 | 1&lt;&lt;PC7);<br />    DDRB &amp;= ~(1&lt;&lt;PB3 | 1&lt;&lt;PB4);<br />    //PORTB |= (1&lt;&lt;PB3 | 1&lt;&lt;PB4);// blokowanie niezaprogramowanych pinów<br />        TCCR1A |= 1&lt;&lt;WGM11;<br />        TCCR1B |= 1&lt;&lt;WGM12 | 1&lt;&lt;WGM13 | 1&lt;&lt;CS11;<br />        TIMSK1 |= 1&lt;&lt;TOIE1;<br /><br />        ICR1 = 39999;//rozciagnij, zawez okres<br /><br />        sei();//uruchomienie przerwań<br /><br />        while(1)<br />        {<br />                if(key_flag)<br />                {<br />                        key_flag = 0;<br />                        if (KEY1_DOWN &amp;&amp; servo1&lt;SERVO_MAX) //klawisz 1 wcisniety<br />                        {<br />                                servo1+=15;<br />                        }<br />                        if (KEY2_DOWN &amp;&amp; servo1!=SERVO_MIN) //klawisz 2 wcisniety<br />                        {<br />                                servo1-=15;<br />                        }<br /><br />                        if (KEY3_DOWN &amp;&amp; servo2&gt;=SERVO_MID-40) //klawisz 3 wcisniety<br />                        {<br />                                servo2+=10;<br />                        }<br />                        if (KEY4_DOWN &amp;&amp; servo2&gt;=SERVO_MID) //klawisz 4 wcisniety<br />                        {<br />                                 servo2-=10;<br />                        }<br /><br />                        if (KEY5_DOWN &amp;&amp; servo3&lt;=SERVO_MID-40 &amp;&amp; servo3!=SERVO_MAX) //klawisz 5 wcisniety<br />                        {<br />                                servo3+=20;<br />                        }<br />                        if (KEY6_DOWN &amp;&amp; servo3&lt;=SERVO_MID &amp;&amp; servo3!=SERVO_MIN) //klawisz 6 wcisniety<br />                        {<br />                                servo3-=20;<br />                        }<br />                        if (KEY7_DOWN) //klawisz 7 wcisniety<br />                        {<br />                                servo4 = HAND_OPEN ;<br />                        }<br />                        if (KEY8_DOWN) //klawisz 8 wcisniety<br />                        {<br />                                servo4 = HAND_CLOSE;<br />                        }<br />                        if (KEY9_DOWN)<br />                        {<br />                        if (servo1&lt;SERVO_MAX)<br />                        {<br />                        servo1 += 10;<br />                        }<br />                        if (servo1==SERVO_MAX &amp;&amp; servo2&lt;SERVO_RIGHT3)<br />                        {<br />                        servo2 += 10;<br />                        }<br />                        if (servo1==SERVO_MAX &amp;&amp; servo2==SERVO_RIGHT3 &amp;&amp; servo3&gt;SERVO_LEFT3)<br />                        {<br />                        servo3 -= 10;<br />                        }<br />                        if (servo1==SERVO_MAX &amp;&amp; servo2==SERVO_RIGHT3 &amp;&amp; servo3==SERVO_LEFT3 &amp;&amp;  servo4!=HAND_OPEN)<br />                        {<br />                        servo4 = HAND_OPEN;<br />                        }<br />                        }<br />                        if (KEY10_DOWN)<br />                        {<br />                        {<br />                        if (servo3&lt;SERVO_MID)<br />                        {<br />                        servo3 += 10;<br />                        }<br />                        if (servo3==SERVO_MID &amp;&amp; servo2!=SERVO_MID)<br />                        {<br />                        servo2 -= 10;<br />                        }<br />                        if (servo3==SERVO_MID &amp;&amp; servo2==SERVO_MID &amp;&amp; servo1&gt;SERVO_MIN)<br />                        {<br />                        servo1 -= 10;<br />                        }<br />                        }<br />                        if (KEY11_DOWN)<br />                        {<br />                        if (servo1==SERVO_MIN &amp;&amp; servo2&lt;SERVO_RIGHT3)<br />                        {<br />                        servo2 += 10;<br />                        }<br />                        }<br />                        }<br />                }<br />                cli();<br />                if(TCNT1 &gt; servo1) PORTD &amp;= ~SERVO1; //nakierowanie mechanizmu przerwania<br />                if(TCNT1 &gt; servo2) PORTD &amp;= ~SERVO2;<br />                if(TCNT1 &gt; servo3) PORTD &amp;= ~SERVO3;<br />                if(TCNT1 &gt; servo4) PORTD &amp;= ~SERVO4;<br />                sei();<br />        }<br />}<br />ISR (TIMER1_OVF_vect)<br />{<br />        PORTD |= SERVO1 | SERVO2 | SERVO3 | SERVO4;<br />        key_flag = 1;<br />}[/syntax]<br /><br />Szukając przyczyny sprawdziłem klamry i wydaje mi się, że jest o jedną kończącą za dużo. Usuwając jedną klamrę Eclipse piszczy:<br /><a href="http://forum.atnel.pl/_obrazki/o/9088/e37a6623212f9c227a97b7cc1e0d41da.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/9088/e37a6623212f9c227a97b7cc1e0d41da.jpg" alt="Obrazek" /></a><br /><br />W innym programie klawisz ten działa bez problemu więc hard jest ok. Może ktoś ze sprawnym okiem by nim rzucił na sprawę? Inaczej manipulator będzie kaleka a nie manipulator <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9088">Panicz74</a> — 25 cze 2015, o 01:37</p><hr />
]]></content>
</entry>
</feed>