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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2021-09-17T22:45:31+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=23894&amp;mode</id>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-17T22:45:31+01:00</updated>
<published>2021-09-17T22:45:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233583#p233583</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233583#p233583"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233583#p233583"><![CDATA[
No więc posłuchałem i trochę się douczyłem, postanowiłem na nowo napisać &quot;sterownik&quot; do wiatraka. Założenia jak poprzednio, sterowanie silnikiem DC(3 tryby szybkosci) sterowanie servem, obsluga 3 przycisków wlaczajaca silnik,servo, i wylaczajaca wszystko. Teraz użyłem już tylko 3 przycisków wykorzystując zwaną dumnie szumnie maszynę stanów. Rozbiłem projekt na 3 pliki, wykorzystałem strukturę i pola bitowe w ramach testu, jak to działa. Teraz wszystko działa tak jak chciałem. Wrzucam kod, żeby ktoś ocenił, lub nawet dla porównania z poprzednim. Chętnie wysłucham uwag co tu mogłem zrobić lepiej, co spaproszyłem itp. Będę miał jeszcze kilka pytań ogólnych ale to potem. Gdyby coś w kodzie było niejasne to napisze, czemu cos tak rozwiązałem.<br /><br />Main.c<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;pwm.h&quot;<br /><br />uint8_t stan,stan1; // zmienna pomocnicza do petli switch<br /><br />int main () {<br />// inicjalizacja pwm i timerow //<br />pwmInit();<br />timerInit();<br />wiatrak.pwm1 = 51; // pozycja srodkowa serva<br /><br />_delay_ms(1); // Opoznienie,by ustabilizowac stan wysoki na pinie wejsciowym<br /><br />sei(); // zezwolenie na globalne przerwania<br />while(1) {<br /><br />if (!wiatrak.keylock1 &amp;&amp; !(PINB &amp; (1&lt;&lt;MOTOR_ON))){ // obsluga przyciski motor_on<br />    wiatrak.keylock1=1;<br />    stan1++;<br />    if (stan1&gt;3)stan1=1;<br />    }else if (wiatrak.keylock1 &amp;&amp; (PINB &amp; (1&lt;&lt;MOTOR_ON)))wiatrak.keylock1++;<br /><br />if (stan1 &amp;&amp; !wiatrak.keylock &amp;&amp; !(PINB &amp; (1&lt;&lt;SERVO_ONOFF))){ // obsluga przycisku servo_onoff<br />wiatrak.keylock=1;<br />stan++;<br />if(stan&gt;2)stan=1;<br />}else if (wiatrak.keylock &amp;&amp; (PINB &amp; (1&lt;&lt;SERVO_ONOFF)))wiatrak.keylock++;<br /><br />if (!wiatrak.keylock2 &amp;&amp; !(PINB &amp; (1&lt;&lt;MOTOR_OFF))){  // obsluga przycisku motor_off<br />wiatrak.keylock2=1;<br />stan1=0;<br />stan=2;<br />}else if (wiatrak.keylock2 &amp;&amp; (PINB &amp; (1&lt;&lt;MOTOR_OFF)))wiatrak.keylock2++;<br /><br />switch (stan){ // Stany serva<br />case 1:<br /> servo_on();<br /> break;<br />case 2:<br /> <br /> break;<br />}<br />switch (stan1){ // stany motoru<br />case 1:<br />     wiatrak.pwm2=85;<br /> DC_START;<br />     break;<br />case 2:<br /> wiatrak.pwm2=170;<br /> break;<br />case 3:<br /> wiatrak.pwm2=255;<br />     break;<br />default:<br /> DC_STOP;<br />   }<br /> }<br />}[/syntax]<br /><br />pwm.c<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &quot;pwm.h&quot;<br /><br />volatile uint8_t timer1,timer2; // timery programowe<br /><br />void pwmInit(){<br />PORTB |= (1&lt;&lt;SERVO_ONOFF)|(1&lt;&lt;MOTOR_ON)|(1&lt;&lt;MOTOR_OFF); // pullup start/stop servo<br />DDRD |= (1&lt;&lt;PD6)|(1&lt;&lt;PD7)|(1&lt;&lt;WE_A)|(1&lt;&lt;WE_B); // wyjscia pwm i sterowanie silnika<br />TCCR0A |= (1&lt;&lt;WGM01); // tryb ctc timer0<br />TCCR0B |= (1&lt;&lt;CS00); // prescaler 1<br />TIMSK0 |= (1&lt;&lt;OCIE0A); // zezwlenie na przerwanie<br />OCR0A = 200;<br />}<br />void timerInit(){<br />TCCR1A |= (1&lt;&lt;WGM12); // ctc timer1<br />TCCR1B |= (1&lt;&lt;CS10);// prescaler 1<br />TIMSK1 |= (1&lt;&lt;OCIE1A); //zezwolenie na przerwanie<br />OCR1A = 100;<br />}<br /><br />void servo_on(){<br />if(!timer1){<br />if(!wiatrak.kierunek){ // jesli kierunek 0<br />wiatrak.pwm1++; // obracaj<br />if(wiatrak.pwm1 == 99)wiatrak.kierunek = 1; // jesli pwm99 zmien kierunek<br />}else{<br />if(wiatrak.kierunek){ // jesli kierunek wiekszy od 0<br />wiatrak.pwm1--; // obracaj<br />if(wiatrak.pwm1 == 18)wiatrak.kierunek = 0; // jesli pwm18 zmien kierunek<br />}<br />}<br />timer1 = 10; // predkosc obracania<br />}<br />}<br /><br />ISR(TIMER0_COMPA_vect){ // Programowe PWMy<br />static uint8_t cnt;<br /><br />if (cnt&gt;=wiatrak.pwm1) channel1_off else channel1_on<br />if (cnt&gt;=wiatrak.pwm2) channel2_off else channel2_on<br /><br />cnt++;<br />}<br /><br />ISR(TIMER1_COMPA_vect){ // Timery programowe<br />if(timer1)timer1--;<br />if(timer2)timer2--;<br />}[/syntax]<br /><br />pwm.h<br /><br />[syntax=c]#ifndef PWM_H_<br />#define PWM_H_<br /><br />#define channel1_on PORTD |= (1&lt;&lt;PD6);   // kanaly pwm<br />#define channel1_off PORTD &amp;=~(1&lt;&lt;PD6);<br />#define channel2_on PORTD |= (1&lt;&lt;PD7);<br />#define channel2_off PORTD &amp;=~(1&lt;&lt;PD7);<br /><br />#define SERVO_ONOFF PB0 // klawisz wlacz/wylacz servo<br />#define MOTOR_ON PB1 // klawisz wlacz motor<br />#define MOTOR_OFF PB2 // klawisz wylacz motor<br />#define WE_A PD3 // pin sterujace motorem<br />#define WE_B PD4 // pin sterujacy motorem<br /><br />#define DC_START PORTD |= (1&lt;&lt;WE_A); PORTD &amp;=~(1&lt;&lt;WE_B) // wlacz silnik<br />#define DC_STOP PORTD &amp;=~(1&lt;&lt;WE_A); PORTD &amp;=~(1&lt;&lt;WE_B) // wylacz silnik<br /><br /><br />// deklaracje funkcji<br /><br />void servo_on();<br />void pwmInit();<br />void timerInit();<br /><br />struct { // Testowa struktura<br />volatile uint8_t pwm1; // kanaly pwm<br />volatile uint8_t pwm2;<br />uint8_t kierunek:1; // kierunek obrotu serva<br />uint8_t keylock; // zmienne do obslugi klawiszy<br />uint8_t keylock1;<br />uint8_t keylock2;<br />}wiatrak;<br /><br /><br />#endif /* PWM_H_ */[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 17 wrz 2021, o 22:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-09-04T22:54:50+01:00</updated>
<published>2021-09-04T22:54:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233519#p233519</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233519#p233519"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233519#p233519"><![CDATA[
No to teraz zamiast tych swoich pętli <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> zastosuj właśnie timer programowy<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 wrz 2021, o 22:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-04T21:33:15+01:00</updated>
<published>2021-09-04T21:33:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233518#p233518</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233518#p233518"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233518#p233518"><![CDATA[
W sumie jeśli chodzi o te timery programowe to nie myślałem o nich jako zamiennik delayow, bardziej to rozumiem jak takie np 2-3 niezależne procesy które wykonują się z określoną częstotliwością jaką ustalę. Ale postaram się przećwiczyć je dobrze. W BB jestem na etapie gruntownego czytania teorii bo od rozdziału funkcji no pewne rzeczy jeszcze sprawiają problem ze zrozumieniem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> a to w sumie podstawy podstaw<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 4 wrz 2021, o 21:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-09-04T21:04:19+01:00</updated>
<published>2021-09-04T21:04:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233516#p233516</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233516#p233516"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233516#p233516"><![CDATA[
No właśnie to, żeby nie traktować np timerów programowych jako delay. Przejrzyj parę przykładów z książki gdzie są one używane, a jak coś nawet nie będziesz wiedział to dopytaj tutaj.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 wrz 2021, o 21:04</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-04T18:18:50+01:00</updated>
<published>2021-09-04T18:18:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233515#p233515</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233515#p233515"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233515#p233515"><![CDATA[
Co mam rozumieć przez zmianę podejścia do programowania? Chciałbym sobie zaczac to powoli jakoś układać w głowie <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=21771">krawi92</a> — 4 wrz 2021, o 18:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-09-04T16:55:18+01:00</updated>
<published>2021-09-04T16:55:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233514#p233514</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233514#p233514"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233514#p233514"><![CDATA[
<div class="quotetitle">krawi92 napisał(a):</div><div class="quotecontent"><br />Tylko wciąż mnie zastanawia jak zrobić jakby pauzę w programie.<br /></div><br />To jest bodajże NAJGORSZY moment do przejścia dla początkujących - bo sobie wyobrażają, że timer programowy ma zastąpić DELAYA - a to w 100% nieprawda i ZŁA droga. Trzeba ABSOLUTNIE inaczej podejść do programowania - pisania kodu<br /><br /><div class="quotetitle">krawi92 napisał(a):</div><div class="quotecontent"><br />Tzn tak, zrobienie timerow programowych w oparciu o sprzętowy timer ogarniam.<br /></div><br />Dlatego muszę powiedzieć, że jednak nie ogarniasz - i broń Boże nie ma to być przytyk! tylko zachęcenie do ćwiczenia z tymi timerami programowymi - bo czuję, że tak troszkę po łepkach nad tym tematem przeszedłeś - no i to pokutuje.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 2 minutach ]</span></strong><br /><br /><div class="quotetitle">Marhef napisał(a):</div><div class="quotecontent"><br />trochę zgubiłem się w Twoim programie<br /></div><br />Przecież tu kolega autor leci na MAXA delajami okrutnymi w pętlach - dlatego ciężko to ogarnąć a autor niestety ugrzęźnie w tym na amen, chyba że zacznie jednak ostrzej ćwiczyć programowanie z użyciem timerów programowych<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 wrz 2021, o 16:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-04T16:21:11+01:00</updated>
<published>2021-09-04T16:21:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233513#p233513</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233513#p233513"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233513#p233513"><![CDATA[
No domyślam się. Sprawdzam tam dużo warunków bo dużo switchy jest heh. Ale faktycznie ogarnąłem, dodam zmienna do kierunku obrotu, z resztą sobie powinienem poradzić<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 4 wrz 2021, o 16:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Marhef]]></name></author>
<updated>2021-09-04T12:06:25+01:00</updated>
<published>2021-09-04T12:06:25+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233511#p233511</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233511#p233511"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233511#p233511"><![CDATA[
Zapisuj wartość i kierunek. Tylko musisz trochę zmienić funkcję do serwa. Dodać warunek, który sprawdzi, czy ma się kręcić w prawo czy w lewo.<br />Jak konkretnie, nie podpowiem, trochę zgubiłem się w Twoim programie<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12752">Marhef</a> — 4 wrz 2021, o 12:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-04T11:50:07+01:00</updated>
<published>2021-09-04T11:50:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233510#p233510</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233510#p233510"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233510#p233510"><![CDATA[
Tzn tak, zrobienie timerow programowych w oparciu o sprzętowy timer ogarniam. Tylko wciąż mnie zastanawia jak zrobić jakby pauzę w programie. Myślałem o wykorzystaniu trybu pharse correct, który zlicza od 0 w górę i potem z góry na dół (przebieg trójkątny) nie musiałbym się bawić w jakieś pętle czy inkrementacje i dekrementacje wypełnienia. Jedyne co mi przychodzi do głowy co na chwilę wstrzymuje pracę to przerwanie.. Przerywa program, odkłada adres, wykonuje procedurę i wraca tam gdzie przerwał. Tu bym chciał zrobić podobnie. Z tym że przerwanie zwykle trwa bardzo krótko, a moje wstrzymanie pracy serva jest na nieokreślony czas.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 4 wrz 2021, o 11:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-09-04T07:18:31+01:00</updated>
<published>2021-09-04T07:18:31+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233507#p233507</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233507#p233507"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233507#p233507"><![CDATA[
<div class="quotetitle">krawi92 napisał(a):</div><div class="quotecontent"><br />czy w tak napisanym programie, w takiej formie jestem w stanie to zrobić.<br /></div><br />Nie, bo to praktycznie wciąż programowanie liniowe ... <br /><br />poczytaj sobie o timerach programowych w Bluebooku<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 4 wrz 2021, o 07:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-04T02:46:23+01:00</updated>
<published>2021-09-04T02:46:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233505#p233505</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233505#p233505"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233505#p233505"><![CDATA[
Podpowie coś ktoś? <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=21771">krawi92</a> — 4 wrz 2021, o 02:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-09-01T19:00:22+01:00</updated>
<published>2021-09-01T19:00:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233477#p233477</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233477#p233477"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233477#p233477"><![CDATA[
Pokombinowałem trochę ze zmiennymi, żeby zapamiętać po wyjściu stan OCR1A, servo po zatrzymaniu i ponownym uruchomieniu wznawia ruch od miejsca zatrzymania, jednak działa to tylko w jedną stronę. Wszystko jest dla mnie zrozumiałe dlaczego, ponieważ funkcja rozpoczyna się od zwiększania wartości, dlatego obojętnie w którym miejscu wyjdę z funkcji, jej ponownie wywołanie spowoduje zwiększanie się wypełnienia. Ja główkowałem jak to zrobić, aby po wyjściu z funkcji w momencie zmniejszania się wypełnienia, gdy servo obraca sie w lewo, po ponownym jej wywołaniu kontynuować ten ruch w lewo, czyli jakby funkcja musiała się zacząć od środka(Wiem, namieszałem i sam widzę że to głupio brzmi) Dlatego zastanawiam się, czy w tak napisanym programie, w takiej formie jestem w stanie to zrobić.<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define SERVO_OFF (1&lt;&lt;PD7) // klawisz stop servo<br />#define SERVO_ON (1&lt;&lt;PB0) // klawisz start servo<br />#define PWM_SERVO (1&lt;&lt;PB1) // kanal pwm serva<br />#define PWM_MOTOR (1&lt;&lt;PB2) // kanal pwm do mostka H<br />#define WE_A (1&lt;&lt;PD5) // wejscie sterujace<br />#define WE_B (1&lt;&lt;PD6) // wejscie sterujace<br />#define DC_START PORTD |= WE_A; PORTD &amp;=~WE_B // start silika<br />#define DC_STOP PORTD &amp;=~WE_A; PORTD &amp;=~WE_B // stop silnika<br />#define MOTOR_SLOW (1&lt;&lt;PB3) // niskie obroty<br />#define MOTOR_MEDIUM (1&lt;&lt;PB4) // srednie obroty<br />#define MOTOR_HIGH (1&lt;&lt;PB5) // maksymalne obroty<br />#define STOP (1&lt;&lt;PB7) // zatrzymanie pracy<br /><br />void servo (); // deklaracja funkcji<br /><br />uint8_t licznik; // zmienna pomocnicza do petli while<br />uint8_t zmienna1; // zmienna pomocnicza do petli for<br />uint8_t motor_on; // potwierdzenie wlaczenia silnika<br /><br />int main() {<br /><br /><br />DDRD |= WE_A|WE_B; // wyjscie wyjsc sterujacych<br />DDRB |= PWM_SERVO|PWM_MOTOR; // wyjscie kanalow pwm<br /><br />PORTD |= SERVO_OFF; // podciagniecie klawisza do vcc<br />PORTB |= SERVO_ON|MOTOR_SLOW|MOTOR_MEDIUM|MOTOR_HIGH|STOP; // podciagniecie klawiszy do vcc<br /><br />/*       INICJALIZACJA PWM */<br />TCCR1A |= (1&lt;&lt;WGM10)|(1&lt;&lt;COM1B1)|(1&lt;&lt;COM1A1); // tryb 8 bit i kanaly<br />TCCR1B |= (1&lt;&lt;WGM12)|(1&lt;&lt;CS12); // prescaler 256<br /><br />    while (1){<br /> motor_on=OCR1B; // przypisanie do zmiennej wartosci OCR1B<br /><br />  if (!(PINB &amp; MOTOR_SLOW)){          // wolne obroty<br />  OCR1B = 85;<br />  DC_START;<br />  }else if(!(PINB &amp; MOTOR_MEDIUM)){  // srednie obroty<br />  OCR1B = 180;<br />  }else if(!(PINB &amp; MOTOR_HIGH)){  // szybkie obroty<br />  OCR1B = 255;<br />  }else if(!(PINB &amp; STOP)) {  // zatrzymanie silnika<br />  DC_STOP;<br /><br />  }<br /><br /><br />  if (!(PINB &amp; SERVO_ON) &amp;&amp; motor_on){ // jesli wcisniety klawisz i silnik wlaczony wlacz servo<br />   licznik=1;<br />   while(licznik)servo();<br />  }<br /><br /><br />}<br />}<br />void servo () { // definicja funkcji serva<br /><br />for (uint8_t i=zmienna1;i&lt;90;i++){<br /><br />if (!(PIND &amp; SERVO_OFF)){  // jesli wcisniety klawisz zakoncz dzialanie funkcji<br />zmienna1=OCR1A;<br />licznik=0;<br />motor_on=0;<br />break;<br />}<br />if (!(PINB &amp; MOTOR_SLOW)){       // Zmiana prędkości motoru w trakcie obrotu serva<br />  OCR1B = 85;<br />  DC_START;<br />}else if(!(PINB &amp; MOTOR_MEDIUM)){<br />  OCR1B = 180;<br />}else if(!(PINB &amp; MOTOR_HIGH)){<br />  OCR1B = 255;<br />}else if (!(PINB &amp; STOP)){<br />  licznik=0;<br />  zmienna1=OCR1A;<br />  OCR1B=0;<br />  DC_STOP;<br />  break;<br />}<br />  OCR1A = i;<br />  if (OCR1A &lt; 90) zmienna1=0;<br />  _delay_ms(120);<br /> }<br /><br />for (uint8_t i=90;i&gt;0;i--){<br />if (!(PIND &amp; SERVO_OFF)){<br />zmienna1=OCR1A;<br />licznik=0;<br />motor_on=0;<br />break;<br />}<br />if (!(PINB &amp; MOTOR_SLOW)){<br />  OCR1B = 85;<br />  DC_START;<br />    }else if(!(PINB &amp; MOTOR_MEDIUM)){<br />  OCR1B = 180;<br />    }else if(!(PINB &amp; MOTOR_HIGH)){<br />  OCR1B = 255;<br />    }else if (!(PINB &amp; STOP)){<br />    licznik=0;<br />    zmienna1=OCR1A;<br />    OCR1B=0;<br />    DC_STOP;<br />    break;<br />    }<br />OCR1A = i;<br /><br />_delay_ms(120);<br />   }<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 1 wrz 2021, o 19:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-08-31T18:47:11+01:00</updated>
<published>2021-08-31T18:47:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233461#p233461</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233461#p233461"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233461#p233461"><![CDATA[
Ok, dziś na spokojnie usiadłem i skleiłem coś, co działa prawie tak jakbym chciał. Nie ma tu programowo wielozadaniowości, ale fizycznie mogę zmieniać prędkość silnika w trakcie obrotu servem itp. Wkleję kod, jak ja to sobie wymyśliłem.<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br /><br />#define SERVO_OFF (1&lt;&lt;PD7) // klawisz stop servo<br />#define SERVO_ON (1&lt;&lt;PB0) // klawisz start servo<br />#define PWM_SERVO (1&lt;&lt;PB1) // kanal pwm serva<br />#define PWM_MOTOR (1&lt;&lt;PB2) // kanal pwm do mostka H<br />#define WE_A (1&lt;&lt;PD5) // wejscie sterujace<br />#define WE_B (1&lt;&lt;PD6) // wejscie sterujace<br />#define DC_START PORTD |= WE_A; PORTD &amp;=~WE_B // start silika<br />#define DC_STOP PORTD &amp;=~WE_A; PORTD &amp;=~WE_B // stop silnika<br />#define MOTOR_SLOW (1&lt;&lt;PB3) // niskie obroty<br />#define MOTOR_MEDIUM (1&lt;&lt;PB4) // srednie obroty<br />#define MOTOR_HIGH (1&lt;&lt;PB5) // maksymalne obroty<br />#define STOP (1&lt;&lt;PB7) // zatrzymanie pracy<br />void servo (); // deklaracja funkcji<br /><br />uint8_t licznik; // zmienna pomocnicza do petli<br /><br />int main() {<br /><br />DDRD |= WE_A|WE_B; // wyjscie wyjsc sterujacych<br />DDRB |= PWM_SERVO|PWM_MOTOR; // wyjscie kanalow pwm<br /><br />PORTD |= SERVO_OFF; // podciagniecie klawisza do vcc<br />PORTB |= SERVO_ON|MOTOR_SLOW|MOTOR_MEDIUM|MOTOR_HIGH|STOP; // podciagniecie klawiszy do vcc<br /><br />/*       INICJALIZACJA PWM */<br />TCCR1A |= (1&lt;&lt;WGM10)|(1&lt;&lt;COM1B1)|(1&lt;&lt;COM1A1); // tryb 8 bit i kanaly<br />TCCR1B |= (1&lt;&lt;WGM12)|(1&lt;&lt;CS12); // prescaler 256<br /><br />    while (1){<br /><br />  if (!(PINB &amp; MOTOR_SLOW)){<br />  OCR1B = 85;<br />  DC_START;<br />  }else if(!(PINB &amp; MOTOR_MEDIUM)){<br />  OCR1B = 180;<br />  }else if(!(PINB &amp; MOTOR_HIGH)){<br />  OCR1B = 255;<br />  }else if(!(PINB &amp; STOP)) {<br />  DC_STOP;<br /><br />  }<br /><br /><br />  if (!(PINB &amp; SERVO_ON)){ // jesli wcisniety klawisz wlacz servo<br />   licznik=1;<br />   while(licznik)servo();<br />  }<br /><br /><br />}<br />}<br />void servo () { // definicja funkcji serva<br /><br />for (uint8_t i=0;i&lt;90;i++){<br />if (!(PIND &amp; SERVO_OFF)){  // jesli wcisniety klawisz zakoncz dzialanie funkcji<br />licznik=0;<br />return;<br />}<br />if (!(PINB &amp; MOTOR_SLOW)){       // Zmiana prędkości motoru w trakcie obrotu serva<br />  OCR1B = 85;<br />  DC_START;<br />}else if(!(PINB &amp; MOTOR_MEDIUM)){<br />  OCR1B = 180;<br />}else if(!(PINB &amp; MOTOR_HIGH)){<br />  OCR1B = 255;<br />}else if (!(PINB &amp; STOP)){<br />  licznik=0;<br />  DC_STOP;<br />  return;<br />}<br />  OCR1A = i;<br />  _delay_ms(120);<br /> }<br /><br />for (uint8_t i=90;i&gt;0;i--){<br />if (!(PIND &amp; SERVO_OFF)){<br />licznik=0;<br />return;<br />}<br />if (!(PINB &amp; MOTOR_SLOW)){<br />  OCR1B = 85;<br />  DC_START;<br />    }else if(!(PINB &amp; MOTOR_MEDIUM)){<br />  OCR1B = 180;<br />    }else if(!(PINB &amp; MOTOR_HIGH)){<br />  OCR1B = 255;<br />    }else if (!(PINB &amp; STOP)){<br />    licznik=0;<br />    DC_STOP;<br />    return;<br />    }<br />OCR1A = i;<br />_delay_ms(120);<br />   }<br />}[/syntax]<br />Jest tu dużo microswitchy, ale na razie nie chciałem się bawić w obsługę kilku instrukcji za pomocą jednego klawisza, ale będę starał się to poprawić. Jednak jest problem, za który nie bardzo wiem, jak się zabrać. Po wcisnieciu klawisza servo_on następuje obrót,raz w jedną raz w drugą. Gdy wciskamy servo_off to servo zatrzymuje się w danej pozycji i to jest OK, tak to ma wyglądać. Jednak gdy znowu wcisnę servo_on servo szybko się skręca do pozycji 0 i zaczyna się pętla od nowa. Nie jest to pożądany dla mnie efekt, ale rozumiem czemu tak się dzieje, bo pętla w funkcji liczy od 0 więc nic dziwnego, że się tak dzieje. Tylko teraz pytanie jak to zrobić, żeby po zatrzymaniu serva, pętla zaczeła liczyć od momentu zatrzymania? Tą wartość trzeba by zapamiętać i podstawić do pętli for. Nie bardzo wiem jak tu zakombinować.<br />Ps. wiem, że pewnie forma tak napisanego programu jest tragiczna pewnie, ale nie mialem pomyslu jak pewne rzeczy rozwiązać. Jeśli chodzi o zmianę prędkości silnika w trakcie pracy serva pomyslalem o przerwaniach zewnętrznych, ale jak sobie pomyslalem, że jeden klawisz pod INT0,drugi pod INT1 a trzeci co, pod PCINT któryś ? Stwierdziłem, że chyba jednak nie tędy droga.  <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=21771">krawi92</a> — 31 sie 2021, o 18:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[wlodex]]></name></author>
<updated>2021-08-29T10:27:32+01:00</updated>
<published>2021-08-29T10:27:32+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233418#p233418</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233418#p233418"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233418#p233418"><![CDATA[
W przeglądarce Mozilla Firefox też wyświetla się poprawnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=18571">wlodex</a> — 29 sie 2021, o 10:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-08-29T10:11:10+01:00</updated>
<published>2021-08-29T10:11:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233416#p233416</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233416#p233416"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233416#p233416"><![CDATA[
być może korzystasz z jakiejś kociej przeglądarki niestety - bo normalnie wszystko widać, właśnie sprawdziłem - ja zawsze działam na google chrome<br /><br /><a href="https://obrazkiforum.atnel.pl/54/9e4c96825217ad7fb7d8523198b92853.jpg"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/54/9e4c96825217ad7fb7d8523198b92853.jpg" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 29 sie 2021, o 10:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-08-29T06:46:10+01:00</updated>
<published>2021-08-29T06:46:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233411#p233411</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233411#p233411"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233411#p233411"><![CDATA[
Troche odejdę od tematu, czytałem 2 cz art i drganiu styków i obsludze klawisza, w pewnym momencie powinien pojawić się kod, do którego potem odnosi się artykuł a żadnego kodu tam nie ma tylko dwie kreski.. Można wiedzieć czemu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 29 sie 2021, o 06:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2021-08-28T14:31:44+01:00</updated>
<published>2021-08-28T14:31:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233387#p233387</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233387#p233387"/>
<title type="html"><![CDATA[Re: Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233387#p233387"><![CDATA[
<div class="quotetitle">krawi92 napisał(a):</div><div class="quotecontent"><br />Wielozadaniowość jest poruszana w bluebooku ale pod koniec<br /></div><br /><br />Dokładnie i to w najprostszy możliwy i wiele mówiący sposób - łącznie z przykładowym kodem do tego<br /><br /><div class="quotetitle">krawi92 napisał(a):</div><div class="quotecontent"><br />jeszcze nie dotarłem tam, tzn czytałem trochę, ale jeszcze średnio to rozumiem<br /></div><br />No niestety bez podstaw C ciężko - ale ... zacznij czytać ten rozdział na spokojnie i zacznij notować po KOLEI tego czego nie rozumiesz i takie gotowe pytania po kolei publikuj na forum - ale nie że w jednym wątku milion pytań - tylko jeden wątek - krótko jedno, dwa, max 3 pytanka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 28 sie 2021, o 14:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[krawi92]]></name></author>
<updated>2021-08-28T14:28:35+01:00</updated>
<published>2021-08-28T14:28:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233386#p233386</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233386#p233386"/>
<title type="html"><![CDATA[Wielozadaniowosc w C]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=23894&amp;p=233386#p233386"><![CDATA[
Witam, chciałbym aby ktoś podpowiedział, jak jako początkujący podejść do tego tematu, wykonywania kilku procesów w tle. Np: robię sobie prosty wiatrak,sterowany PWM, może kręcić się wolno,srednio,maksymalnie,wlaczyc,wylaczyc. Zrobiłem to na klawiszach i zwykłej instrukcji IF. Chciałem, żeby servo mi też go obracało. No i tu się zaczyna właśnie problem  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Wiem, że temat bardzo często wałkowany, czytam że takie rzeczy robi się w przerwaniach itp. Piszą też o maszynach stanu ale trochę ciężko mi przejść przez ten gąszcz informacji. Wielozadaniowość jest poruszana w bluebooku ale pod koniec, jeszcze nie dotarłem tam, tzn czytałem trochę, ale jeszcze średnio to rozumiem. Pytanie, czy na tak poczatkowym etapie jestem w stanie to wg zrobić.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=21771">krawi92</a> — 28 sie 2021, o 14:28</p><hr />
]]></content>
</entry>
</feed>