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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-01-25T10:16:59+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=22&amp;t=7301&amp;mode</id>
<entry>
<author><name><![CDATA[filipq21]]></name></author>
<updated>2016-01-25T10:16:59+01:00</updated>
<published>2016-01-25T10:16:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=151645#p151645</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=151645#p151645"/>
<title type="html"><![CDATA[Re: Sterowanie silnikiem krokowym, Atmega8 + L298N]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=151645#p151645"><![CDATA[
ZAJEBISTE !  POMOGŁEŚ MI ZDAĆ TECHNIKĘ MIKROPROCESOROWĄ . DZIEKUJĘ <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=12741">filipq21</a> — 25 sty 2016, o 10:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2015-05-07T18:29:39+01:00</updated>
<published>2015-05-07T18:29:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=128516#p128516</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=128516#p128516"/>
<title type="html"><![CDATA[Re: Sterowanie silnikiem krokowym, Atmega8 + L298N]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=128516#p128516"><![CDATA[
mam pewne zastrzeżenia wobec tego projektu .<br />Oco chodzi? <br />Chodzi o to że nie problem pokręcić silnikiem w lewo i prawo jak na filmach tu pokazanych , silniki krokowe mogą służyć jako pomoc dydaktyczną OK ale przedewszystkim mają wykonać jakąś prace z obciążeniem w jakim rygorze czasowym .<br />////<br />i tu zachodzi pytanie . Czy autor tematu sprawdzał układ podczas pracy z realnymi obciążeniami przewidzianymi dla tych silników ? ? Bo ja tak sobie myśle że nie sprawdzał . Więc niech sprawdzi bowiem nie problem jest w ty ze silnik pokreci sie w lewo a potem w prawo . Cały problem z silnikami krokowymi jest taki że mają pokręcić sie w prawo z odpowiednim przyrostem prędkości oraz całkiem konkretnym obciążeniem mechanicznym ....i właśnie w tym momecie pojawiaja sie schody do nieba .<br />////<br />Natomiast bardzo fajny przykład ,test na działanie samego oprogramowania no i napewno niezła frajda i od tej strony ten Projekt bardzo mi sie podoba .Gdyby jeszcze robił coś 'konkretnego&quot; byłoby super.<p>Statystyki: Napisane przez Gość — 7 maja 2015, o 18:29</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[arczi90]]></name></author>
<updated>2015-05-06T09:41:20+01:00</updated>
<published>2015-05-06T09:41:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=128382#p128382</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=128382#p128382"/>
<title type="html"><![CDATA[Re: Sterowanie silnikiem krokowym, Atmega8 + L298N]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=128382#p128382"><![CDATA[
Jakiego programu i środowiska użyłeś do zaprogramowania atmegi?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=9541">arczi90</a> — 6 maja 2015, o 09:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mknight9090]]></name></author>
<updated>2015-04-18T19:24:27+01:00</updated>
<published>2015-04-18T19:24:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=126857#p126857</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=126857#p126857"/>
<title type="html"><![CDATA[Re: Sterowanie silnikiem krokowym, Atmega8 + L298N]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=126857#p126857"><![CDATA[
Cały program jest przecież w poście, pod filmikami. Chyba, że chodzi Ci o aplikację na Androida, to nie wiem czy ją jeszcze gdzieś mam, ale tam to nie było nic po za wysyłaniem odpowiednich stringów po kliknięciu w przycisk.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1566">mknight9090</a> — 18 kwi 2015, o 19:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[arczi90]]></name></author>
<updated>2015-04-17T07:55:09+01:00</updated>
<published>2015-04-17T07:55:09+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=126742#p126742</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=126742#p126742"/>
<title type="html"><![CDATA[Re: Sterowanie silnikiem krokowym, Atmega8 + L298N]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=126742#p126742"><![CDATA[
Czy masz może program do tego sterownika? <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=9541">arczi90</a> — 17 kwi 2015, o 07:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Nefarious19]]></name></author>
<updated>2014-06-04T11:55:36+01:00</updated>
<published>2014-06-04T11:55:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=83342#p83342</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=83342#p83342"/>
<title type="html"><![CDATA[Re: Sterowanie silnikiem krokowym, Atmega8 + L298N]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=83342#p83342"><![CDATA[
hahah;p świetny projekcik:) szczególnie ten grający silnik:)<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2500">Nefarious19</a> — 4 cze 2014, o 11:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mknight9090]]></name></author>
<updated>2014-06-04T00:04:37+01:00</updated>
<published>2014-06-04T00:04:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=83305#p83305</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=83305#p83305"/>
<title type="html"><![CDATA[Sterowanie silnikiem krokowym, Atmega8 + L298N]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7301&amp;p=83305#p83305"><![CDATA[
Witam wszystkich. <br />Ostatnio zrobiłem mały, prosty projekcik i zanim rozmontuję układ chciałem go Wam przedstawić.<br /><br />Ponieważ dostałem kiedyś tablet, którego do niczego nie używam, postanowiłem jakoś go wykorzystać w połączeniu z AVR. <br />Był pewien problem, bo jest to jeden z najtańszych tabletów i nie posiada bluetootha. Po wielu kombinacjach udało mi się połączyć go z modułem radiowym na USB. <br />Początkowo chciałem zbudować prosty sterownik silnika krokowego - sterujący kierunkiem obrotów i ilością obrotów, a jako interfejs użytkownika miała służyć aplikacja napisana na Androida.<br />Później doszło jeszcze kilka rzeczy i skończyło się na tym co prezentuję poniżej.<br /><br />Do sterowania silnikiem wykorzystałem układ L298N oraz procesor ATmega8A. Silnik, którego użyłem jest unipolarny i posiada 6 wyprowadzeń, ale bez probemu pracuje przy sterowaniu bipolarnym,<br />gdzie wyprowadzenia COM zostają niepodłączone. <br /><br />Układ posiada 4 przyciski microswitch, działające jako klawiatura analogowa, ponieważ zaczynało mi już brakować wolnych portów, a obejrzałem ostatnio gdzieś w Internecie bardzo fajny poradnik <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />  <br /><br />Funkcje to po kolei, od przycisku po prawej: (dłuższe przytrzymanie)<br />Start/Stop (zwiększenie prędkości)<br />Kierunek obrotu (funkcja specjalna)<br />Zwiększanie zadanego kąta o 45 stopni (zwiększenie kąta o 360 stopni)<br />Zmniejszanie kąta o 45 stopni (zmniejszenie kąta o 360 stopni)<br /><br />W zasadzie nie ma tu za wiele do opisywania, bo wszystko jest na schemacie i w kodzie. Schemat nie jest w 100% zgodny z układem na płytce (troszkę inaczej podłączone są klawisze i nie ma dławika przy zasilaniu AVCC). <br />Z góry przepraszam za wszystkie rażące błędy, jeśli takie są, ale to w zasadzie mój pierwszy tego typu projekt. <br />To co chciałem, żeby działało, działa tak jak chciałem, więc ja jestem z niego zadowolony, no ale wiadomo, że dużo rzeczy mogło być zrobione lepiej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Filmiki są bardzo słabej jakości, ale mam nadzieję, że będzie cokolwiek widać i słychać. Pierwszy nagrywany telefonem dałem dlatego, że na reszcie nie widać nic na wyświetlaczu LCD.<br />Program do sterowania z tabletu to moja pierwsza aplikacja pisana na Androida i w ogóle w Javie, może nie wygląda pięknie, ale miała głównie na celu przetestowanie komunikacji.<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/1566/e6fb7b017091234d316399d6d9532ffb.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1566/e6fb7b017091234d316399d6d9532ffb.JPG" alt="Obrazek" /></a> <a href="http://forum.atnel.pl/_obrazki/o/1566/c4ebcce6101b4e614542dca14be13af6.jpg"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1566/c4ebcce6101b4e614542dca14be13af6.jpg" alt="Obrazek" /></a> <a href="http://forum.atnel.pl/_obrazki/o/1566/e74c16e9b8bbbd9044e82a71ef2954a6.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/1566/e74c16e9b8bbbd9044e82a71ef2954a6.png" alt="Obrazek" /></a><br /><br /><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><div style="width: 583px; height: 471px; margin: 0 auto; padding-left: 26px; padding-top: 48px; background: url('https://www.atnel.pl/download/atnel_tv.png') no-repeat;"> <strong>iframe</strong> </div><br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;stdlib.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br /><br />#include &quot;UART/uart.h&quot;<br />#include &quot;LCD/lcd.h&quot;<br /><br /><br />#define LED_PIN (1&lt;&lt;PD3)<br />#define LED_ON PORTD |= LED_PIN<br />#define LED_OFF PORTD &amp;= ~LED_PIN<br />#define LED_TOG PORTD ^= LED_PIN<br /><br />#define EN_A (1&lt;&lt;PD6)<br />#define EN_B (1&lt;&lt;PB0)<br /><br />#define L1 (1&lt;&lt;PD7)<br />#define L2 (1&lt;&lt;PD5)<br />#define L3 (1&lt;&lt;PB1)<br />#define L4 (1&lt;&lt;PB2)<br /><br />#define EN_A_ON PORTD |= EN_A<br />#define EN_B_ON PORTB |= EN_B<br />#define L1_ON PORTD |= L1<br />#define L2_ON PORTD |= L2<br />#define L3_ON PORTB |= L3<br />#define L4_ON PORTB |= L4<br /><br />#define EN_A_OFF PORTD &amp;= ~ EN_A<br />#define EN_B_OFF PORTB &amp;= ~ EN_B<br />#define L1_OFF PORTD &amp;= ~L1<br />#define L2_OFF PORTD &amp;= ~L2<br />#define L3_OFF PORTB &amp;= ~L3<br />#define L4_OFF PORTB &amp;= ~L4<br /><br />#define okres 0.05 //okres timera sprzętowego powiązanego ze sterowaniem silnikiem (w ms)<br /><br />//częstotliwości poszczególnych dźwięków przeliczone na wartości do bezpośredniego użycia w programie<br />#defineG4(1/392.00)*1000/okres<br />#defineAb4(1/415.30)*1000/okres<br />#defineLA4(1/440.00)*1000/okres<br />#defineAb3(1/207.65)*1000/okres<br />#defineE4(1/329.63)*1000/okres<br />#defineF4(1/349.23)*1000/okres<br />#defineF3(1/174.61)*1000/okres<br />#defineLA3(1/220.00)*1000/okres<br />#defineC4(1/261.63)*1000/okres<br />#defineEb3(1/155.56)*1000/okres<br />#defineBb3(1/233.08)*1000/okres<br />#defineD4(1/293.66)*1000/okres<br />#defineDb4(1/277.18)*1000/okres<br />#defineB3(1/246.94)*1000/okres<br />#defineEb4(1/311.13)*1000/okres<br />#defineGb4 (1/369.99)*1000/okres<br /><br />//Czas trwania nut (ms)<br />#define BPM 170<br />#define Q (60000/BPM)*20 //1/4<br />#define H 2*Q //2/4<br />#define E Q/2   //1/8<br />#define S Q/4 //1/16<br />#define W 4*Q //4/4<br /><br />#define ADC_RANGE 50<br /><br />//Funkcje sterujące silnikiem<br />void reset();<br />void ustaw(uint8_t x);<br />void krok();<br /><br />//Funkcje wyświetlania na LCD<br />void wyswietl_kat();<br />void wyswietl_stan();<br />void wyswietl_kierunek();<br /><br />uint16_t adc_pomiar (uint8_t kanal);<br />const uint16_t adc_progi&#91;4&#93; PROGMEM = {192, 348, 480, 595 }; //wartości pomiaru ADC dla poszczególnych przycisków<br />uint8_t keys&#91;5&#93;;<br /><br />uint8_t x=1;//numer kroku (1-8)<br />uint8_t kierunek;//obroty kierunek = 0 -&gt; lewe<br />uint8_t start;//start = 0 -&gt; stop<br />char special='n';// 'n' - tryb normal, sterowanie przyciskami; 'x' - granie; 'u' - sterowanie przez UART<br />uint16_t licznik_krok;//liczy ile kroków zrobił silnik, przy 45 stopniach zerowanie<br />uint16_t zadany_kat=10; //kąt obrotu, wielokrotnosc kąta 45 st (10 -&gt; 450st -&gt; 1obr 90st)<br /><br />//nutki z: http://www.instructables.com/id/How-to-easily-play-music-with-buzzer-on-arduino-Th/<br />const uint16_t nuty&#91;&#93; PROGMEM= {LA3,LA3,LA3,F3, C4,LA3,F3, C4,LA3,E4,E4,E4,F4, C4,Ab3,F3,C4,LA3,LA4,LA3,LA3,LA4,Ab4,G4,Gb4,E4,F4,Bb3,Eb4,D4,Db4,C4,B3,C4,F3,Ab3,F3,LA3,C4,LA3,C4,E4,LA4,LA3,LA3,LA4,Ab4,G4,Gb4,E4,F4,Bb3,Eb4,D4,Db4,C4,B3,C4,F3,Ab3,F3,C4,LA3,F3,C4,LA3,20};<br />const int16_t czastrwania&#91;&#93; PROGMEM= {Q,Q,Q,E+S, S,Q,E+S, S,H,Q,Q,Q,E+S, S,Q,E+S,S,H,Q,E+S,S,Q,E+S,S,S,S,E,E,Q,E+S,S,S,S,E,E,Q,E+S,S,Q,E+S,S,H,Q,E+S,S,Q,E+S,S,S,S,E,E,Q,E+S,S,S,S,E,E,Q,E+S,S,Q,E+S,S,H,500};<br />const uint16_t pauza&#91;&#93; PROGMEM= {Q,Q,Q,E+S, S,Q,E+S, S,H,Q,Q,Q,E+S, S,Q,E+S,S,H,Q,E+S,S,Q,E+S,S,S,S,2*E,E,Q,E+S,S,S,S,2*E,E,Q,E+S,S,Q,E+S,S,H,Q,E+S,S,Q,E+S,S,S,S,2*E,E,Q,E+S,S,S,S,2*E,E,Q,E+S,S,Q,E+S,S,3*H,500};<br /><br />char  input_s&#91;11&#93;=&quot;&quot;;//string odebrany z UARTa<br />uint16_t predkosc=110;//prędkość obrotowa jako okres programowego Timera1, im większa tym silnik wolniej się obraca<br />uint8_t licznik; //licznik iteracji przy odbieraniu danych przez UART<br />uint8_t licznik1;//licznik iteracji dźwięków przy odtwarzaniu<br /><br />int kv, wzr; //zmienne pomocnicze do adc<br /><br />//Timery programowe oparte na sprzętowym Timerze 0<br />//Timer1 - sterowanie silnikiem<br />//Timer2 - czas trwania dźwięku<br />//Timer3 - czas trwania pauzy pomiędzy kolejnymi dźwiękami<br />volatile uint16_t Timer1,Timer2,Timer3;<br />volatile uint8_t timer1_start=1, timer2_start, timer3_start;<br /><br />int main(void)<br />{<br /><br />DDRD |= LED_PIN;<br />DDRD |= EN_A ;<br />DDRB |= EN_B ;<br />DDRB |= L1 ;<br />DDRB |= L2;<br />DDRD |= L3 ;<br />DDRD |= L4 ;<br /><br />//Timer0 - sterowanie silnikiem i granie<br />//Przerwanie sprzętowe co 0.05ms / 20kHz<br />TCCR0 |= (1&lt;&lt;CS01);   //Preskaler 8<br />TIMSK |= (1&lt;&lt;TOIE0);  //Zezwolenie na przerwanie<br />TCNT0=156;<br /><br />//Timer1 - przytrzymanie klawiszy<br />//Przerwanie sprzętowe co 480ms / 2,08Hz<br />TCCR1B |=(1&lt;&lt;WGM12); //Tryb CTC<br />TCCR1B |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10); // Preskaler 256<br />TIMSK |= (1&lt;&lt;OCIE1A); //Zezwolenie na przerwanie<br />OCR1A = 7500; //Co ok  pół sek<br /><br />//ADC_INIT<br />ADMUX |= (1&lt;&lt;REFS0)|(1&lt;&lt;REFS1); //Internal 2.56V Voltage Reference<br />ADCSRA |= (1&lt;&lt;ADEN)| (1&lt;&lt;ADPS2) | (1&lt;ADPS1); //ON , Preskaler 64<br /><br />USART_Init(16);<br />init_lcd();<br /><br />uart_puts(&quot;*---start---*&quot;);<br /><br /><br />wyswietl_stan();<br />wyswietl_kierunek();<br />wyswietl_kat();<br /><br />LED_ON;<br />_delay_ms(1000);<br />LED_OFF;<br /><br />sei();<br /><br />while(1)<br />{<br />// Pomiar ADC i określenie który przycisk jest wciśnięty<br />// zmienna tablicowa wcośniętego klawisza zwiększana w każdym obiegu pętli głównej<br />// do 40 (wartość dobrana doświadczalnie w celu eliminacji drgań styków)<br />// zmienne klawiszy niewciśnietych zerowane<br /><br />kv=adc_pomiar(0);<br />uint8_t i;<br />for(i=0; i&lt;4; i++)<br />{<br />wzr = pgm_read_word(&amp;adc_progi&#91;i&#93;); //odczytanie progu zapisanego w pamięci FLASH<br />if( kv &gt; wzr-ADC_RANGE &amp;&amp; kv &lt; wzr+ADC_RANGE  )<br />{<br />if( keys&#91;i&#93;&lt;40 ) keys&#91;i&#93;++;<br />}<br />else keys&#91;i&#93;=0;<br />}<br /><br /><br /><br />//obługa wciśnięcia przycisków (wartość zmiennej 39 - wykona się tylko raz)<br />if( keys&#91;0&#93;==39 )//przycisk START/STOP<br />{<br />if(!start)<br />{<br />predkosc = 110;<br />Timer1=predkosc;<br />licznik_krok=0;<br />special='n';<br />}<br />start^=1;<br />wyswietl_stan();<br />}<br />else if( keys&#91;1&#93;==39 )//przycisk KIERUNEK<br />{<br />if(!start)<br />kierunek^=1;<br />wyswietl_kierunek();<br />}<br />else if( keys&#91;2&#93;==39 ) // przycisk '+'<br />{<br />LED_TOG;<br />if(!start)<br />{<br />if(zadany_kat&lt;=1440)zadany_kat++; //1440*45 = 64800stopni- 180 obrotów - MAX (16bitowa zmienna)<br />wyswietl_kat();<br />}<br />}<br />else if( keys&#91;3&#93;==39 )//przycisk '-'<br />{<br />LED_TOG;<br />if(!start)<br />{<br />if(zadany_kat)zadany_kat--;<br />wyswietl_kat();<br />}<br />}<br /><br /><br />// odczytywanie instrukcji z UART<br />// przykład instrukcji: &quot;10123444ne&quot;<br />// start=1; kierunek=0; predkosc=123; zadany_kat=444; special='n'<br /><br />char c;<br />c=uart_getc();<br />if(c)<br />{<br />input_s&#91;licznik&#93;=c;<br />licznik++;<br />}<br /><br />if(licznik==10  )<br />{<br /><br />if(input_s&#91;9&#93;=='e') //sprawdzenie czy &quot;e&quot;- znak końca komendy jest na swoim miejscu<br />{<br />start = input_s&#91;0&#93;-'0';<br />kierunek = input_s&#91;1&#93;-'0';<br />predkosc = (input_s&#91;2&#93;-'0')*100 + (input_s&#91;3&#93;-'0')*10 +(input_s&#91;4&#93;-'0');<br /><br />if(!zadany_kat)<br />zadany_kat = (input_s&#91;5&#93;-'0')*100 + (input_s&#91;6&#93;-'0')*10 +(input_s&#91;7&#93;-'0');<br />special=input_s&#91;8&#93;;<br /><br />Timer1=predkosc;<br />timer1_start=1;<br />licznik=0;<br /><br />if(special=='x')<br />{<br />Timer2=pgm_read_word(&amp;czastrwania&#91;0&#93;);<br />Timer1=pgm_read_word(&amp;nuty&#91;0&#93;);<br />timer2_start=1;<br />licznik1=0;<br />}<br /><br />}<br />else //Jeżeli wystąpił błąd w komunikacji wyzeruj licznik i wyczyść bufor odbiorczy<br />{<br />licznik=0;<br />clear_buff();<br />}<br />}<br /><br /><br />//sterowanie silnikiem<br />if(start)<br />{<br />//granie<br />if(special=='x')<br />{<br />if(licznik1&lt;66)<br />{<br />predkosc = pgm_read_word(&amp;nuty&#91;licznik1&#93;);<br /><br />if(!Timer1 &amp;&amp; timer1_start)<br />{<br />krok();<br />Timer1=predkosc;<br />}<br />if(!Timer2 &amp;&amp; timer2_start)<br />{<br />timer1_start=0;<br />timer2_start=0;<br />reset();<br /><br />Timer3 = pgm_read_word(&amp;pauza&#91;licznik1&#93;)/2;<br />timer3_start=1;<br />}<br />if(!Timer3 &amp;&amp; timer3_start)<br />{<br />licznik1++;<br />Timer2 = pgm_read_word(&amp;czastrwania&#91;licznik1&#93;);<br />predkosc = pgm_read_word(&amp;nuty&#91;licznik1&#93;);<br />timer3_start=0;<br />timer1_start=1;<br />timer2_start=1;<br />}<br />}<br />else<br />{<br />timer3_start=0;<br />timer2_start=0;<br />start=0;<br />licznik1=0;<br />reset();<br />wyswietl_stan();<br />}<br />}<br /><br />//sterowanie kątem obrotu<br />else<br />{<br />if(!Timer1 &amp;&amp; timer1_start)<br />{<br />krok();<br />Timer1=predkosc;<br />}<br /><br />if(licznik_krok&gt;=50)<br />{<br />licznik_krok=0;<br />zadany_kat--;<br />if(special=='n') wyswietl_kat(); //aktualizowanie kąta na wyświetlaczu tylko przy sterowaniu przyciskami<br />}<br /><br />if(!zadany_kat)<br />{<br />start=0;<br />reset();<br />wyswietl_stan();<br />}<br />}<br />}<br />else<br />reset();<br />}<br /><br />}<br /><br /><br /><br />void krok()<br />{<br />if (kierunek == 1)<br />{<br />x++;<br />if (x == 9)<br />x = 1;<br />if (x == 0)<br />x = 8;<br />ustaw(x);<br />}<br />else if (kierunek == 0)<br />{<br />x--;<br />if (x == 9)<br />x = 1;<br />if (x == 0)<br />x = 8;<br />ustaw(x);<br />}<br /><br />else<br />reset();<br />}<br /><br /><br /><br /><br />void ustaw(uint8_t x)<br />{<br />licznik_krok++;<br /><br />EN_A_ON;<br />EN_B_ON;<br /><br />switch(x)<br />{<br />case 1:<br />L1_ON;<br />L2_OFF;<br />L3_OFF;<br />L4_OFF;<br />break;<br /><br />case 2:<br />L1_ON;<br />L2_OFF;<br />L3_ON;<br />L4_OFF;<br />break;<br /><br />case 3:<br />L1_OFF;<br />L2_OFF;<br />L3_ON;<br />L4_OFF;<br />break;<br /><br />case 4:<br />L1_OFF;<br />L2_ON;<br />L3_ON;<br />L4_OFF;<br />break;<br /><br />case 5:<br />L1_OFF;<br />L2_ON;<br />L3_OFF;<br />L4_OFF;<br /><br />break;<br /><br />case 6:<br />L1_OFF;<br />L2_ON;<br />L3_OFF;<br />L4_ON;<br />break;<br /><br />case 7:<br />L1_OFF;<br />L2_OFF;<br />L3_OFF;<br />L4_ON;<br />break;<br /><br />case 8:<br />L1_ON;<br />L2_OFF;<br />L3_OFF;<br />L4_ON;<br /><br />break;<br /><br />default:<br />reset();<br />break;<br />}<br />}<br /><br />void reset()<br />{<br />EN_A_OFF;<br />EN_B_OFF;<br />L1_OFF;<br />L2_OFF;<br />L3_OFF;<br />L4_OFF;<br />}<br />uint16_t adc_pomiar (uint8_t kanal)<br />{<br />ADMUX = (ADMUX &amp; 0xF8) | kanal;<br />ADCSRA |= (1&lt;&lt; ADSC);<br />while (ADCSRA &amp; (1&lt;&lt;ADSC));<br />return ADCW;<br />}<br /><br />void wyswietl_kat()<br />{<br />uint16_t kat = zadany_kat*45;<br />uint8_t obr = kat/360; //ilosc pełnych obrotów<br />kat=kat%360; //reszta<br /><br />lcd_locate(1,0);<br />if (obr&lt;10) lcd_str(&quot;00&quot;);<br />else if(obr&lt;100) lcd_str(&quot;0&quot;);<br />lcd_int(obr);<br />lcd_str(&quot;obr.&quot;);<br /><br />lcd_locate(1,9);<br />if(kat&lt;10) lcd_str(&quot;00&quot;);<br />else if(kat&lt;100) lcd_str(&quot;0&quot;);<br />lcd_int(kat);<br />lcd_str(&quot;st&quot;);<br />}<br />void wyswietl_stan()<br />{<br />lcd_locate(0,0);<br />lcd_str(&quot;S:&quot;);<br />if(start)<br />lcd_str(&quot;start&quot;);<br />else<br />lcd_str(&quot;stop &quot;);<br />}<br />void wyswietl_kierunek()<br />{<br />lcd_locate(9,0);<br />lcd_str(&quot;kier:&quot;);<br />if(kierunek)<br />lcd_str(&quot;P&quot;);<br />else<br />lcd_str(&quot;L&quot;);<br />}<br /><br />//przerwanie co 0,05ms<br />ISR(TIMER0_OVF_vect)<br />{<br />TCNT0=156;<br />if(timer1_start &amp;&amp; Timer1) Timer1--;<br />if(timer2_start &amp;&amp; Timer2) Timer2--;<br />if(timer3_start &amp;&amp; Timer3) Timer3--;<br /><br />}<br /><br />//przerwanie co 480ms<br />ISR(TIMER1_COMPA_vect)<br />{<br />// Jeżeli przycisk wciśnięty (zmienna tablicowa = 40) zmienna zwiększana o 1 co 480ms, do wartości 45<br />// zmienne niewciśnietych przycisków są zerowane w każdym obiegu pętli głównej<br /><br />//Przyciski '+' i '-' : po dłuższym przytrzymaniu zadany kąt zwiększany/zmniejszany o 360 stopni<br />if( keys&#91;2&#93;&lt;45 )keys&#91;2&#93;++;<br />if( keys&#91;2&#93;==45 )<br />{<br />LED_TOG;<br />if(!start)<br />{<br />if(zadany_kat&lt;=1432) //1440 - MAX<br />{<br />zadany_kat+=8;<br />wyswietl_kat();<br />}<br />}<br />}<br /><br />if( keys&#91;3&#93;&lt;45 )keys&#91;3&#93;++;<br />if( keys&#91;3&#93;==45 )<br />{<br /><br />LED_TOG;<br />if(!start)<br />{<br />if(zadany_kat&gt;=8)<br />{<br />zadany_kat-=8;<br />wyswietl_kat();<br />}<br />}<br />}<br /><br />//Przycisk zmiany kierunku po przytrzymaniu uruchamia granie<br />if( keys&#91;1&#93;&lt;46 )keys&#91;1&#93;++; //46 - bo wtedy intrukcja wykona się tylko raz<br />if( keys&#91;1&#93;==45 )<br />{<br />start=1;<br />special='x';<br />Timer2=pgm_read_word(&amp;czastrwania&#91;0&#93;);<br />Timer1=pgm_read_word(&amp;nuty&#91;0&#93;);<br />timer2_start=1;<br />licznik1=0;<br />kierunek=1;<br />wyswietl_stan();<br />wyswietl_kierunek();<br />}<br /><br />//Przycisk START/STOP po przytrzymaniu zmienia prędkość obrotową silnika<br />if( keys&#91;0&#93;&lt;46 )keys&#91;0&#93;++;<br />if( keys&#91;0&#93;==45 )<br />{<br />if(predkosc==110)<br />predkosc=40;<br />else<br />predkosc=110;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1566">mknight9090</a> — 4 cze 2014, o 00:04</p><hr />
]]></content>
</entry>
</feed>