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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7103&amp;mode</id>
<entry>
<author><name><![CDATA[komandos332]]></name></author>
<updated>2014-05-20T21:43:12+01:00</updated>
<published>2014-05-20T21:43:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7103&amp;p=81890#p81890</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7103&amp;p=81890#p81890"/>
<title type="html"><![CDATA[Re: Frezarka CNC, Mach3, Silniki Krokowe, Język C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7103&amp;p=81890#p81890"><![CDATA[
Kilka poprawek i wszystko działa. Dla ciekawych udostępniam kod oraz projekt w eagle.<br /><br />Program ATmega16/32:<br /><a href="http://www45.zippyshare.com/v/8839933/file.html"  class="postlink">http://www45.zippyshare.com/v/8839933/file.html</a><br /><br />Projekt eagle:<br /><!-- m --><a class="postlink" href="http://www45.zippyshare.com/v/15208169/file.html" >http://www45.zippyshare.com/v/15208169/file.html</a><!-- m --><br /><br /><br />Niema to jak samemu rozwiązać problem ^^<br />Dziękuję i pozdrawiam, Maciek <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Aaaa zapomniałem, radzę dodać jeszcze po oporniczku na wejścia 10k Ohm.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4299">komandos332</a> — 20 maja 2014, o 21:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[komandos332]]></name></author>
<updated>2014-05-19T23:24:10+01:00</updated>
<published>2014-05-19T23:24:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7103&amp;p=81778#p81778</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7103&amp;p=81778#p81778"/>
<title type="html"><![CDATA[Re: Frezarka CNC, Mach3, Silniki Krokowe, Język C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7103&amp;p=81778#p81778"><![CDATA[
Wydaje mi się, że udało mi się rozwiązać ten problem, bez użycia zatrzymujących program pętli while oraz bez pomocy przerwań.<br />Udostępniam kod, jeżeli wam się chce to był bym wdzięczny za analizę tego kodu, w najbliższym czasie przetestuję ten sterowniczek.<br />Okazało się że Mach3 podaje tylko 2 sygnały, DIR i STEP, gdzie jeśli DIR nie jest zapalony, obraca silnikiem w jedną stronę, a kiedy się włączy to w drugą. W najbliższym czasie przetestuję i dam znać czy działa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Zrobię potem projekt płytki PCB i również udostępnię.<br /><br />[syntax=C]#include &lt;avr/io.h&gt;<br /><br />//Wejścia sygnałowe z LPT<br />#define DX    (1&lt;&lt;PB0)     //KIERUNEK OSI X<br />#define DIRX  (PINB &amp; DX)<br />#define SX    (1&lt;&lt;PB1)     //KROKI OSI X<br />#define STEPX (PINB &amp; SX)<br />#define DY    (1&lt;&lt;PB2)     //KIERUNEK OSI Y<br />#define DIRY  (PINB &amp; DY)<br />#define SY    (1&lt;&lt;PB3)     //KROKI OSI Y<br />#define STEPY (PINB &amp; SY)<br />#define DZ    (1&lt;&lt;PB4)     //KIERUNEK OSI Z<br />#define DIRZ  (PINB &amp; DZ)<br />#define SZ    (1&lt;&lt;PB5)     //KROKI OSI Z<br />#define STEPZ (PINB &amp; SZ)<br /><br />//Wyjścia osi X<br />#define X1     (1&lt;&lt;PA0)<br />#define X1ON   PORTA |= X1<br />#define X1OFF  PORTA &amp;=~ X1<br />#define X2     (1&lt;&lt;PA1) <br />#define X2ON   PORTA |= X2<br />#define X2OFF  PORTA &amp;=~ X2<br />#define X3     (1&lt;&lt;PA2)<br />#define X3ON   PORTA |= X3<br />#define X3OFF  PORTA &amp;=~ X3<br />#define X4     (1&lt;&lt;PA3)<br />#define X4ON   PORTA |= X4<br />#define X4OFF  PORTA &amp;=~ X4<br /><br />//Wyjścia osi Y<br />#define Y1     (1&lt;&lt;PA4)<br />#define Y1ON   PORTA |= Y1<br />#define Y1OFF  PORTA &amp;=~ Y1<br />#define Y2     (1&lt;&lt;PA5) <br />#define Y2ON   PORTA |= Y2<br />#define Y2OFF  PORTA &amp;=~ Y2<br />#define Y3     (1&lt;&lt;PA6)<br />#define Y3ON   PORTA |= Y3<br />#define Y3OFF  PORTA &amp;=~ Y3<br />#define Y4     (1&lt;&lt;PA7)<br />#define Y4ON   PORTA |= Y4<br />#define Y4OFF  PORTA &amp;=~ Y4<br /><br />//Wyjścia osi Z<br />#define Z1     (1&lt;&lt;PC7)<br />#define Z1ON   PORTC |= Z1<br />#define Z1OFF  PORTC &amp;=~ Z1<br />#define Z2     (1&lt;&lt;PC6) <br />#define Z2ON   PORTC |= Z2<br />#define Z2OFF  PORTC &amp;=~ Z2<br />#define Z3     (1&lt;&lt;PC5)<br />#define Z3ON   PORTC |= Z3<br />#define Z3OFF  PORTC &amp;=~ Z3<br />#define Z4     (1&lt;&lt;PC6)<br />#define Z4ON   PORTC |= Z4<br />#define Z4OFF  PORTC &amp;=~ Z4<br /><br />uint8_t stepx, stepy, stepz, xcontrol, ycontrol, zcontrol;<br /><br />int main(void)<br />{<br />//Zmienne wpis<br />stepx = 0;<br />stepy = 0;<br />stepz = 0;<br />xcontrol = 0;<br />ycontrol = 0;<br />zcontrol = 0;<br /><br />//Wejścia<br />DDRB &amp;=~ DX;<br />PINB &amp;=~ DX;<br />DDRB &amp;=~ SX;<br />PINB &amp;=~ SX;<br />DDRB &amp;=~ DY;<br />PINB &amp;=~ DY;<br />DDRB &amp;=~ SY;<br />PINB &amp;=~ SY;<br />DDRB &amp;=~ DZ;<br />PINB &amp;=~ DZ;<br />DDRB &amp;=~ SZ;<br />PINB &amp;=~ SZ;<br /><br />//Wyjścia<br />DDRA |= X1;<br />DDRA |= X2;<br />DDRA |= X3;<br />DDRA |= X4;<br />DDRA |= Y1;<br />DDRA |= Y2;<br />DDRA |= Y3;<br />DDRA |= Y4;<br />DDRC |= Z1;<br />DDRC |= Z2;<br />DDRC |= Z3;<br />DDRC |= Z4;<br /><br />while(1)<br />{<br />if(stepx &lt; 1)<br />{<br />stepx = 8;<br />}<br />if(stepx &gt; 8)<br />{<br />stepx = 1;<br />}<br />if(stepy &lt; 1)<br />{<br />stepy = 8;<br />}<br />if(stepy &gt; 8)<br />{<br />stepy = 1;<br />}<br />if(stepz &lt; 1)<br />{<br />stepz = 8;<br />}<br />if(stepz &gt; 8)<br />{<br />stepz = 1;<br />}<br />if(STEPX &amp;&amp; xcontrol == 0) //wykonuje krok jeśli zmienna xcontrol = 0 oraz wysoki stan pinu STEPX<br />{<br />stepx++;<br />xcontrol = 1; //Po wykonaniu kroku wpisuje do xcontrol 1 i nie pozwala na zrobienie kroku z tego samego sygnalu.<br />}<br />if(!(STEPX))<br />{<br />xcontrol = 0; //resetuje zmienną xcontrol jeśli będzie niski stan pinu STEPX i pozwoli wykonać następny krok.<br />}<br />if(DIRX &amp;&amp; STEPX &amp;&amp; xcontrol == 0)<br />{<br />stepx--;<br />xcontrol = 1;<br />}<br />if(STEPY &amp;&amp; ycontrol == 0)<br />{<br />stepy++;<br />ycontrol = 1;<br />}<br />if(!(STEPY))<br />{<br />ycontrol = 0;<br />}<br />if(DIRY &amp;&amp; STEPY &amp;&amp; ycontrol == 0)<br />{<br />stepy--;<br />ycontrol = 1;<br />}<br />if(STEPZ &amp;&amp; zcontrol == 0)<br />{<br />stepz++;<br />zcontrol = 1;<br />}<br />if(!(STEPZ))<br />{<br />zcontrol = 0;<br />}<br />if(DIRZ &amp;&amp; STEPZ &amp;&amp; zcontrol == 0)<br />{<br />stepz--;<br />zcontrol = 1;<br />}<br />switch(stepx)<br />{<br />case 1:<br />X1ON;<br />X2OFF;<br />X3OFF;<br />X4OFF;<br />case 2:<br />X1ON;<br />X2ON;<br />X3OFF;<br />X4OFF;<br />case 3:<br />X1OFF;<br />X2ON;<br />X3OFF;<br />X4OFF;<br />case 4:<br />X1OFF;<br />X2ON;<br />X3ON;<br />X4OFF;<br />case 5:<br />X1OFF;<br />X2OFF;<br />X3ON;<br />X4OFF;<br />case 6:<br />X1OFF;<br />X2OFF;<br />X3ON;<br />X4ON;<br />case 7:<br />X1OFF;<br />X2OFF;<br />X3OFF;<br />X4ON;<br />case 8:<br />X1ON;<br />X2OFF;<br />X3OFF;<br />X4ON;<br />}<br />switch(stepy)<br />{<br />case 1:<br />Y1ON;<br />Y2OFF;<br />Y3OFF;<br />Y4OFF;<br />case 2:<br />Y1ON;<br />Y2ON;<br />Y3OFF;<br />Y4OFF;<br />case 3:<br />Y1OFF;<br />Y2ON;<br />Y3OFF;<br />Y4OFF;<br />case 4:<br />Y1OFF;<br />Y2ON;<br />Y3ON;<br />Y4OFF;<br />case 5:<br />Y1OFF;<br />Y2OFF;<br />Y3ON;<br />Y4OFF;<br />case 6:<br />Y1OFF;<br />Y2OFF;<br />Y3ON;<br />Y4ON;<br />case 7:<br />Y1OFF;<br />Y2OFF;<br />Y3OFF;<br />Y4ON;<br />case 8:<br />Y1ON;<br />Y2OFF;<br />Y3OFF;<br />Y4ON;<br />}<br />switch(stepz)<br />{<br />case 1:<br />Z1ON;<br />Z2OFF;<br />Z3OFF;<br />Z4OFF;<br />case 2:<br />Z1ON;<br />Z2ON;<br />Z3OFF;<br />Z4OFF;<br />case 3:<br />Z1OFF;<br />Z2ON;<br />Z3OFF;<br />Z4OFF;<br />case 4:<br />Z1OFF;<br />Z2ON;<br />Z3ON;<br />Z4OFF;<br />case 5:<br />Z1OFF;<br />Z2OFF;<br />Z3ON;<br />Z4OFF;<br />case 6:<br />Z1OFF;<br />Z2OFF;<br />Z3ON;<br />Z4ON;<br />case 7:<br />Z1OFF;<br />Z2OFF;<br />Z3OFF;<br />Z4ON;<br />case 8:<br />Z1ON;<br />Z2OFF;<br />Z3OFF;<br />Z4ON;<br />}<br />}<br />}[/syntax]<br />Pozdrawiam, Maciek<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4299">komandos332</a> — 19 maja 2014, o 23:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[komandos332]]></name></author>
<updated>2014-05-17T16:36:09+01:00</updated>
<published>2014-05-17T16:36:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7103&amp;p=81424#p81424</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7103&amp;p=81424#p81424"/>
<title type="html"><![CDATA[Frezarka CNC, Mach3, Silniki Krokowe, Język C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7103&amp;p=81424#p81424"><![CDATA[
Witam serdecznie.<br /><br />Niektórzy być może czytali temat założony przez użytkownika Samuel <a href="http://forum.atnel.pl/topic6534.html"  class="postlink">http://forum.atnel.pl/topic6534.html</a><br />Udało nam się stworzyć tę frezarkę CNC, działa całkowicie sprawnie. Jednak niestety nie powiodło się tak jak w temacie Samuela<br />użyć do tego programu Mach3, ponieważ on na porcie LPT wystawia sygnały kierunku lewo/prawo oraz takt: 1 impuls - 1 krok.<br />Wtedy okazało się że trzeba by było zakupić sterowniki do silników krokowych które przetwarzają te właśnie sygnały już bezpośrednio na zasilanie silnika krokowego. Mnie jednak jak zawsze poniosła ambicja i postanowiłem napisać taki sterownik samodzielnie.<br />Nie jest to bardzo skomplikowane, mam jednak parę pytań w których mam nadzieję ktoś mi doradzi.<br /><br />Konkretny problem przedstawia się następująco. Nie wiem jaką długość ma sygnał kroku z potu LPT więc muszę w jakiś sposób<br />uzyskać taki efekt, że po każdym zapaleniu się tego wyjścia, do jakiejś zmiennej doda się lub odejmie w zależności od kierunku<br />jedynka, a z tej zmiennej przy użyciu switch(zmienna) będę sterował silnikiem.<br /><br />Gdybym chciał zrobić to bez zastosowania przerwań, zrobił bym to mniej więcej tak:<br /><br />[syntax]if(sygnal_lewox)<br />{<br />     if(sygnal_krokx) //sygnal_krokx to sygnał z portu LPT.<br />     {<br />          krokx++;<br />          while(sygnal_krokx); //pusta pętla która zatrzyma pętle programu aż sygnał zniknie.<br />     }<br />}[/syntax]<br /><br />Obawiam się jednak, że tę opcję można od razu wyrzucić do kosza, ponieważ efekt jak podejrzewam byłby taki, że sygnały z portu<br />LPT dal silników osi Y oraz Z będą się gubić. <br />Kiedy obejrzałem tutorial pana Mirka o przerwaniach, dowiedziałem się, że nawet podczas wykonywania się jednego z przerwań,<br />reszta przerwań zostaje zapisana do wykonania zaraz po poprzednim, w tym wypadku myślę, że całkowicie rozwiązywało by mi to<br />sprawę, bo w tym wypadku chodzi tutaj tylko o dopisanie lub odjęcie jedynki od zmiennej.<br />Co o tym sądzicie? Macie dla mnie jakieś rady? Dodam też że boję się jeszcze trochę przerwań, są dla mnie &quot;obce&quot;.<br />Powiedziałem też na początku, że frezarka działa, jest tak ponieważ znaleźliśmy program o nazwie TurboCNC który podaje<br />na wyjście LPT już gotowy sygnał na silniki krokowe, jest on jednak uruchamiany w DOS'ie, nie jest zbyt komfortowy<br />do obsługi, za każdym razem trzeba na nowo konfigurować osie, kroki silnika, kąt obrotu silnika, ogólnie rzecz biorąc jest<br />odrzucający.<br /><br />Dziękuję i pozdrawiam, Maciek <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=4299">komandos332</a> — 17 maja 2014, o 16:36</p><hr />
]]></content>
</entry>
</feed>