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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-06-09T13:40:37+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=7340&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-09T13:40:37+01:00</updated>
<published>2014-06-09T13:40:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83826#p83826</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83826#p83826"/>
<title type="html"><![CDATA[Re: ATmega16A - Zastąpienie delay'ów timer'ami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83826#p83826"><![CDATA[
<div class="quotetitle">eMCe2 napisał(a):</div><div class="quotecontent"><br />Mozna sie do jakiejs przedsprzedazy na YellowBooka zapisac? Bo chetnie bym juz cos przygarnal  Jakas data wydania juz znana? Ten rok? Nie ten?<br /></div><br /><br />Nie nie, proszę - jeszcze dużo za wcześnie aby cokolwiek o tym mówić <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /> przykro mi .... ale za to obiecuję, że dla forumowicza będzie tłusty, wręcz ociekający tłuszczem rabat <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=54">mirekk36</a> — 9 cze 2014, o 13:40</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[eMCe2]]></name></author>
<updated>2014-06-09T13:27:01+01:00</updated>
<published>2014-06-09T13:27:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83823#p83823</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83823#p83823"/>
<title type="html"><![CDATA[Re: ATmega16A - Zastąpienie delay'ów timer'ami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83823#p83823"><![CDATA[
Fakt wiedza o której mówicie by się przydała... ja też bawiąc się potrafię wykorzystać to co w BB ale takiego podejścia praktycznego brak... wiem że to sie własnie nabywa w miare pisania kodów ale jakieś podstawy i standardy dobrze jak ktoś pokaże... pozniej praktyka i swoj styl programowania kazdy sobie pewnie wypracuje... Łatwiej jak ktoś w tym pracuje, natomiast jak ktoś to traktuje jako hobby to tej praktyki ma sie znacznie mniej niestety...<br /><br />Mozna sie do jakiejs przedsprzedazy na YellowBooka zapisac? Bo chetnie bym juz cos przygarnal <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Jakas data wydania juz znana? Ten rok? Nie ten?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1363">eMCe2</a> — 9 cze 2014, o 13:27</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-08T22:24:13+01:00</updated>
<published>2014-06-08T22:24:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83773#p83773</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83773#p83773"/>
<title type="html"><![CDATA[Re: ATmega16A - Zastąpienie delay'ów timer'ami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83773#p83773"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Wiesz Mirku, taka mnie ,,myśl puknęła w głowę&quot;.<br /></div><br /><br />Tak tak - mam to od dawna na myśli ... i powoli mam nadzieję, że i mi uda się to jakoś dobrze przedstawić - a będę to poruszał i w poradnikach wideo ... ale też (jeśli uda mi się napisać) kolejne książki to już od YellowBooka - zacznie się czas - korzystania teraz z tego co dowiedzieliśmy się w dwóch pierwszych książkach ... i jak tworzyć projekty od początku do końca - dobierając odpowiednio poznane wcześniej narzędzia z obydwu książek i jak stosować je w praktyce - bo zdaję sobie sprawę, że z tym jest duży problem... Tyle tylko że w poradnikach nie uda mi się wszystkiego przedstawić tak jak bym chciał - dlatego sporą część widzę w książkach i już dawno mam to jakby zaplanowane .... a poradniki będą nadal mam nadzieję uzupełnieniem ...<br /><br />wbrew pozorom to nie jest (przynajmniej dla mnie łatwe zadanie) ... skutecznie przekazać taką wiedzę ... bo wielu czytelników z jednej strony jej oczekuje ale z drugiej strony jak tylko zobaczy coś ciut bardziej skomplikowanego to zaraz się boi w ogóle albo tego oglądać albo czytać .... obawiając się, że i tak niby nie da sobie rady ... albo że nagle czasu nie ma itp ...<br /><br />dlatego mam tu pewne pomysły na przekaz książkowy - ale zobaczymy czy się sprawdzi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />kolega rezasurmar miał też rację że po części w tych poradnikach o callbackach ale i w wielu innych również o tym eepromie, że z nich jak ktoś chce - ale jak chce ... to również zobaczy jaką drogą iść w sensie dzielenia programu na funkcje bo robię tam to na żywo że tak powiem, pomimo że główny cel poradnika jest niby inny .... No ale .... znowu - wielu początkujących boi się nawet tego obejrzeć .... podpatrzeć, chociaż się oswoić ... a przecież w międzyczasie cały czas nawijam w poradniku teksty typu <br /><br />&quot;no to teraz powołamy sobie do życia funkcję x&quot; ... itd itp itd<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 cze 2014, o 22:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2014-06-08T12:34:10+01:00</updated>
<published>2014-06-08T12:34:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83706#p83706</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83706#p83706"/>
<title type="html"><![CDATA[Re: ATmega16A - Zastąpienie delay'ów timer'ami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83706#p83706"><![CDATA[
Zajawki były w pierwszych poradnikach, snake, calblacki, eprom itd. oraz w książce wyjaśniając sens pliku common.h<br /><br />Dlatego zawsze warto opisać co ma robić program na kartce i podzielić go na poszczególne sekcje, algorytmy.<p>Statystyki: Napisane przez Gość — 8 cze 2014, o 12:34</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[piotreks-89]]></name></author>
<updated>2014-06-08T10:49:14+01:00</updated>
<published>2014-06-08T10:49:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83696#p83696</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83696#p83696"/>
<title type="html"><![CDATA[Re: ATmega16A - Zastąpienie delay'ów timer'ami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83696#p83696"><![CDATA[
Dzięki a porady! Obejrzę film w wolnym czasie i będę kombinował <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Program byłoby pewnie znacznie łatwiej zrobić, gdyby nie to, że sobie utrudniłem życie tymi czujnikami. <br /><br />Ten &quot;tworek&quot; miał być poprawiony, ale spełniał swoją funkcję, więc pozostał na miejscu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=491">piotreks-89</a> — 8 cze 2014, o 10:49</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-06-08T09:41:17+01:00</updated>
<published>2014-06-08T09:41:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83693#p83693</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83693#p83693"/>
<title type="html"><![CDATA[Re: ATmega16A - Zastąpienie delay'ów timer'ami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83693#p83693"><![CDATA[
Pierwszy i PODSTAWOWY twój problem to to, że praktycznie W OGÓLE nie korzystasz z funkcji. Twoja pętla główna jest napuchnięta do granic możliwości i robi się z tego taki jakby program liniowy w Bascomie w jednym pliku ....<br /><br />Pomyśl - zasada jest jedna - PĘTLA GŁÓWNA programu powinna być jak najkrótsza a z niej powinny być wywoływane funkcje ... głównie .. bo wiadomo że czasem parę IF'ów się trafi<br /><br />to właśnie przez to - przestajesz sam panować nad kodem ... analiza takiego kodu jest mega ciężka ... <br /><br /><br />poza tym tworzenie TAKICH - (nie obraź się za określenie) POTWORKÓW:<br /><br />[syntax=c]led_on(1);<br />        led_on(2);<br />        led_on(3);<br />        led_on(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_off(1);<br />        led_off(2);<br />        led_off(3);<br />        led_off(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_on(1);<br />        led_on(2);<br />        led_on(3);<br />        led_on(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_off(1);<br />        led_off(2);<br />        led_off(3);<br />        led_off(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_on(1);<br />        led_on(2);<br />        led_on(3);<br />        led_on(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_off(1);<br />        led_off(2);<br />        led_off(3);<br />        led_off(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_on(1);<br />        led_on(2);<br />        led_on(3);<br />        led_on(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_off(1);<br />        led_off(2);<br />        led_off(3);<br />        led_off(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_on(1);<br />        led_on(2);<br />        led_on(3);<br />        led_on(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_off(1);<br />        led_off(2);<br />        led_off(3);<br />        led_off(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_on(1);<br />        led_on(2);<br />        led_on(3);<br />        led_on(4);<br />        _delay_ms(250);<br />        _delay_ms(250);<br />        led_off(1);<br />        led_off(2);<br />        led_off(3);<br />        led_off(4);[/syntax]<br /><br />to już gwóźdź do przysłowiowej trumny .... odnośnie tego &quot;potworka&quot; obejrzyj sobie to:<br /><br /><!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2014/05/mikrokontrolery-avr-jak-zaczac-wprawki.html" >http://mirekk36.blogspot.com/2014/05/mi ... rawki.html</a><!-- m --><br /><br />ok ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 8 cze 2014, o 09:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[piotreks-89]]></name></author>
<updated>2014-06-08T09:17:33+01:00</updated>
<published>2014-06-08T09:17:33+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83691#p83691</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83691#p83691"/>
<title type="html"><![CDATA[ATmega16A - Zastąpienie delay'ów timer'ami.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=7340&amp;p=83691#p83691"><![CDATA[
Witajcie!<br /><br />Wielu konstruktorów robotów w ogóle nie pokazuje swojego kodu. Po wielu nieudanych godzinach zastępowania delay'ów timer'ami odpadam. Sam nie dam rady <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />Aktualnie mam taki program:<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 />// ***** preprocesor<br />#define S1 (1&lt;&lt;PA0)<br />#define S2 (1&lt;&lt;PC1)<br /><br />#define KTIR1 (1&lt;&lt;PA6)<br />#define KTIR2 (1&lt;&lt;PA5)<br /><br />#define AKU (1&lt;&lt;PA7)<br /><br />#define RXD (1&lt;&lt;PD0)<br />#define TXD (1&lt;&lt;PD1)<br /><br />#define KS_KEY (1&lt;&lt;PD3)<br />#define START_KEY (1&lt;&lt;PD2)<br /><br />#define TSOP1 (1&lt;&lt;PA1)<br />#define TSOP2 (1&lt;&lt;PA4)<br />#define TSOP3 (1&lt;&lt;PA3)<br />#define TSOP4 (1&lt;&lt;PA2)<br /><br />#define LED1 (1&lt;&lt;PC7)<br />#define LED2 (1&lt;&lt;PC6)<br />#define LED3 (1&lt;&lt;PC0)<br />#define LED4 (1&lt;&lt;PD6)<br /><br />#define IR1 (1&lt;&lt;PB4)<br />#define IR2 (1&lt;&lt;PB3)<br />#define IR3 (1&lt;&lt;PB2)<br />#define IR4 (1&lt;&lt;PB1)<br />#define IR5 (1&lt;&lt;PB0)<br /><br />#define IR_KEY (1&lt;&lt;PD7)<br /><br />#define L1 (1&lt;&lt;PC5)<br />#define L2 (1&lt;&lt;PC4)<br />#define PWM_L (1&lt;&lt;PD5)<br /><br />#define P1 (1&lt;&lt;PC3)<br />#define P2 (1&lt;&lt;PC2)<br />#define PWM_P (1&lt;&lt;PD4)<br /><br />// *** mekrodefinicje<br />#define LEWA_PRZOD ( PORTC |= L1, PORTC &amp;= ~L2 )<br />#define LEWA_TYL ( PORTC &amp;= ~L1, PORTC |= L2 )<br />#define LEWA_HAM ( PORTC &amp;= ~( L1 | L2 ) )<br /><br />#define PRAWA_PRZOD ( PORTC |= P1, PORTC &amp;= ~P2 )<br />#define PRAWA_TYL ( PORTC &amp;= ~P1, PORTC |= P2 )<br />#define PRAWA_HAM ( PORTC &amp;= ~( P1 | P2 ) )<br /><br />//OCR1A - lewa strona<br />//OCR1B - prawa strona<br />#define HAM ( LEWA_HAM, PRAWA_HAM )<br /><br />#define OBROT_PRAWO ( odwrot(odwrot_pwm), _delay_ms(250), skr_p(mid_pwm), _delay_ms(200), _delay_ms(100) )<br />#define OBROT_LEWO ( odwrot(odwrot_pwm), _delay_ms(250), skr_l(mid_pwm), _delay_ms(200), _delay_ms(100) )<br /><br />// *** deklaracje funkcji<br />uint16_t pomiar(uint8_t kanal);<br />void prog_stop(void);<br />void odlicz_5s(void);<br />void led_on(uint8_t numer_on);<br />void led_off(uint8_t numer_off);<br />void led_xor(uint8_t numer_xor);<br />void program(uint8_t prog);<br /><br />//*** definicje najważniejszych funkcji<br />void przod(uint16_t pwm)<br />{<br />OCR1A=(pwm);<br />OCR1B=(pwm);<br />LEWA_PRZOD;<br />PRAWA_PRZOD;<br />}<br /><br />void odwrot(uint16_t pwm)<br />{<br />OCR1A=(pwm);<br />OCR1B=(pwm);<br />LEWA_TYL; <br />PRAWA_TYL;<br />}<br /><br />void skr_l(uint16_t pwm)<br />{<br />OCR1A=(pwm);<br />OCR1B=(pwm);<br />PRAWA_HAM;<br />LEWA_PRZOD; <br />}<br /><br />void skr_p(uint16_t pwm)<br />{<br />OCR1A=(pwm);<br />OCR1B=(pwm);<br />LEWA_HAM; <br />PRAWA_PRZOD;<br />}<br /><br />// *** definicje stałych<br />const uint16_t a=700;//zmienna, do której porównywane są wartości czujników<br />const uint16_t aku_adc=525;//ADC=(Vin*1024)/Vref | ADC=(3,25*1024)/4,94<br />/*<br />Wartości aku_adc:<br />1) 600 - 7,8V<br />2) 550 - 7,73V<br />3) 525 - ?<br />4) 500 - ?<br />*/<br />const uint16_t max_pwm=1000;<br />const uint16_t mid_pwm=500;<br />const uint16_t min_pwm=200;<br />const uint16_t odwrot_pwm=700;<br /><br />// *** definicje zmiennych<br />uint8_t b=19;//zmienna przechowująca ilość zliczeń 250ms<br />uint8_t ss1=0;//zmienna pomocnicza stanu S1<br />uint8_t ss2=1;//zmienna pomocnicza stanu S2<br />volatile uint8_t start=0;//zmienna pomocnicza - startowanie robota (z możliwością edycji w przerwaniach)<br />uint8_t PROGRAM=1;//zmienna przechowująca wartość programu startowego<br />volatile uint8_t wykonaj=1;//zmienna pomocnicza pozwalająca na jednokrotne wykonanie programu startowego (z możliwością edycji w przerwaniach)<br /><br />// *** obsługa modułu startowego - przerwanie od INT0<br />ISR( INT0_vect )<br />{<br />//blok warunkowy - odczyt, jaka zmiana nastąpiła<br />if( ( PIND &amp; START_KEY ) )<br />{<br />start=1;<br />wykonaj=1;<br />}<br />else<br />{<br />start=0;<br />wykonaj=0;<br />}<br />}<br /><br />// ********** funkcja główna programu<br />int main(void)<br />{<br />// ***** inicjalizacja <br />// *** ADC<br />    ADMUX |= (1&lt;&lt;REFS0);<br />    ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADPS0) | (1&lt;&lt;ADPS1);<br /><br />// *** Timer/Counter1<br />TCCR1A |= (1&lt;&lt;COM1A1) | (1&lt;&lt;COM1B1) | (1&lt;&lt;WGM11);//Timer1 tryb Fast-PWM (WGM11 + WGM12 + WGM13), tryb nieodwrócony<br />TCCR1B |= (1&lt;&lt;CS11) | (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13); //Prescaler: 8 (CS11) <br />ICR1=500;//Częstotliwość 4kHz - F=Fq/p/ICR1<br />OCR1A=0;//PWM - wypełnienie 0<br />OCR1B=0;//PWM - wypełnienie 0<br /><br />// *** Timer/Counter2 <br />TCCR2 |= (1&lt;&lt;WGM21) | (1&lt;&lt;COM20) | (1&lt;&lt;CS20); //Timer2 tryb CTC (WGM21), przełącza OC2 przy zrównaniu(COM20), prescaler=1 (CS20)<br />OCR2=222; //OCR2 = Fq/2F | 36kHz<br /><br />// *** Przerwania zewnętrzne<br />MCUCR |= (1&lt;&lt;ISC00);//Dowolna zmiana stanu logicznego na INT0 wywoła żądanie przerwania (ISC00=1)<br />GICR |= (1&lt;&lt;INT0);//Włączenie przerwań od pinu INT0<br />sei(); //Globalne włączenie przerwań<br /><br />// *** wejścia<br />DDRA &amp;= ~( S1 | KTIR1 | KTIR2 | AKU | TSOP1| TSOP2 | TSOP3 | TSOP4 );//S1, KTIR1, KTIR2 - wejście<br />PORTA |= S1;//S1 - podciągnięty do Vcc<br /><br />DDRC &amp;= ~S2;//S2 - wejście<br />PORTC |= S2;//S2 - podciągnięty do Vcc<br /><br />DDRD &amp;= ~( START_KEY | KS_KEY );//START_KEY i KS_KEY - wejścia<br /><br />// *** wyjścia<br />DDRC |= LED1 | LED2 | LED3;//LED1, LED2, LED3 - wyjścia<br />PORTC |= LED1 | LED2 | LED3;//LED1, LED2, LED3 - wyłączone (podciągnięte do Vcc)<br /><br />DDRD |= LED4 | IR_KEY;//LED4, IR_KEY - wyjście<br />PORTD |= LED4;//LED4 - wyłączone (podciągnięte do Vcc)<br /><br />DDRB |= IR1 | IR2 | IR3 | IR4 | IR5;//IR1, IR2, IR3, IR4, IR5 - wyjścia<br />PORTB |= IR1 | IR2 | IR3 | IR4 | IR5;//IR1, IR2, IR3, IR4, IR5 - włączone (1 - ON, 0 - OFF)<br /><br />DDRC |= L1 | L2 | P1 | P2;//L1, L2, P1, P2 - wyjścia<br />HAM;<br /><br />DDRD |= PWM_L | PWM_P;//PWM_L, PWM_P - wyjścia<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br /><br />// *** pętla nieskończona<br />while(1)<br />{<br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br /><br />//zerowanie LED'ów<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br /><br />HAM;<br /><br />//blok warunkowy - sprawdzanie stanu S2<br />if( !( PINC &amp; S2 ) )<br />{<br />_delay_ms(100);<br />if( !( PINC &amp; S2 ) )<br />{<br />ss2=0;<br />}<br />else<br />{<br />ss2=1;<br />}<br />}<br /><br />//blok warunkowy - sprawdzanie stanu S2<br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) ) ss1=1;<br />else ss1=0;<br />}<br /><br />// ***** PROGRAM TESTOWY ROBOTA *****<br />while( ss1&gt;0 )<br />{<br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br /><br />// *** TEST CZUJNIKÓW PRZECIWNIKA ***<br />while( ss1==1 )<br />{<br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) ) <br />{<br />ss1=2;<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />}<br />else ss1=1;<br />}<br /><br />if( !( PINA &amp; TSOP1 ) ) led_on(1);<br />else led_off(1);<br /><br />if( !( PINA &amp; TSOP2 ) ) led_on(2);<br />else led_off(2);<br /><br />if( !( PINA &amp; TSOP3 ) ) led_on(3);<br />else led_off(3);<br /><br />if( !( PINA &amp; TSOP4 ) ) led_on(4);<br />else led_off(4);<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br />}<br /><br />// *** TEST CZUJNIKÓW LINII ***<br />while( ss1==2 )<br />{<br /><br />led_off(3);<br />led_off(4);<br /><br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) ) <br />{<br />ss1=3;<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />}<br />else ss1=2;<br />}<br /><br />if( pomiar(5)&lt;=a ) led_on(1);<br />else led_off(1);<br /><br />if( pomiar(6)&lt;=a ) led_on(2);<br />else led_off(2);<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br />}<br /><br />// *** TEST SILNIKÓW ***<br />while( ss1==3 )<br />{<br /><br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br /><br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) ) <br />{ <br />ss1=0;<br />HAM;<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />}<br />else ss1=3;<br />}<br /><br />przod(max_pwm);<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br />}<br />}<br /><br />// ***** PROGRAM GŁÓWNY ROBOTA *****<br />// *** MENU WYBORU PROGRAMU STARTOWEGO ***<br />while( ss2==0 )<br />{<br /><br />HAM;<br /><br />//blok warunkowy - sprawdzanie stanu S1 (jeśli wciśnięty PROGRAM++)<br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) )<br />{<br />PROGRAM++;<br />}<br />}<br /><br />if( PROGRAM==1 ) led_on(1);<br />else led_off(1);<br /><br />if( PROGRAM==2 ) led_on(2);<br />else led_off(2);<br /><br />if( PROGRAM==3 ) led_on(3);<br />else led_off(3);<br /><br />if( PROGRAM==4 ) led_on(4);<br />else led_off(4);<br /><br />if( PROGRAM==5 ) <br />{<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />}<br />else <br />{<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />}<br /><br />if( PROGRAM==6 ) <br />{<br />led_on(1);<br />led_on(3);<br />led_on(4);<br />}<br />else <br />{<br />led_off(1);<br />led_off(3);<br />led_off(4);<br />}<br /><br />if( PROGRAM==7 ) <br />{<br />led_on(1);<br />led_on(2);<br />led_on(4);<br />}<br />else <br />{<br />led_off(1);<br />led_off(2);<br />led_off(4);<br />}<br /><br />if( PROGRAM==8 ) <br />{<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />}<br />else <br />{<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />}<br /><br />if( PROGRAM==9 ) PROGRAM=0;<br /><br />//blok warunkowy - sprawdzanie stanu S2 (jeśli wciśnięty uruchom robota)<br />if( !( PINC &amp; S2 ) )<br />{<br />_delay_ms(100);<br />if( !( PINC &amp; S2 ) )<br />{<br />// ZGAŚ DIODY LED<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br /><br />//WYSTARTUJ ROBOTA<br />start=1;<br />wykonaj=1;<br /><br />//ODCZEKAJ 5s<br />odlicz_5s();<br />}<br />}<br /><br />// *** ALGORYTM WALKI ***<br />while( start==1 )<br />{<br />// *** jednokrotne wykonanie programu startowego<br />if( wykonaj==1 )<br />{<br />program( PROGRAM );//uruchom program startowy uprzednio wybrany w menu<br />wykonaj=0;//i wykonaj go wyłącznie raz!<br />}<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br /><br />//blok warunkowy - odczyt stanu KTIR1<br />if( pomiar(5)&lt;=a )<br />{<br />OBROT_PRAWO;<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR2<br />if( pomiar(6)&lt;=a )<br />{<br />OBROT_PRAWO;<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR1 &amp;&amp; KRIR2<br />if( pomiar(5)&lt;=a &amp;&amp; pomiar(6)&lt;=a )<br />{<br />OBROT_PRAWO;<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR1 &amp;&amp; TSOP3<br />if( pomiar(5)&lt;=a &amp;&amp; !( PINA &amp; TSOP3 ) )<br />{<br />OBROT_PRAWO;<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR2 &amp;&amp; TSOP3<br />if( pomiar(6)&lt;=a &amp;&amp; !( PINA &amp; TSOP3 ) )<br />{<br />OBROT_LEWO;<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR1 &amp;&amp; TSOP4<br />if( pomiar(5)&lt;=a &amp;&amp; !( PINA &amp; TSOP4 ) )<br />{<br />OBROT_PRAWO;<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR2 &amp;&amp; TSOP4<br />if( pomiar(6)&lt;=a &amp;&amp; !( PINA &amp; TSOP3 ) )<br />{<br />OBROT_PRAWO;<br />}<br /><br />// blok warunkowy - odczyt stanu TSOP1<br />if( !( PINA &amp; TSOP1 ) )<br />{<br />led_on(1); <br />skr_l(max_pwm);<br />}<br />else <br />{<br />led_off(1);<br />przod(min_pwm);<br />}<br /><br />// blok warunkowy - odczyt stanu TSOP2<br />if( !( PINA &amp; TSOP2 ) )<br />{<br />led_on(2);<br />skr_p(max_pwm); <br />}<br />else <br />{<br />led_off(2);<br />}<br /><br />// blok warunkowy - odczyt stanu TSOP3<br />if( !( PINA &amp; TSOP3 ) )<br />{<br />if( !( PINA &amp; TSOP4 ) &amp;&amp; pomiar(5)&gt;a &amp;&amp; pomiar(6)&gt;a ) <br />{<br />led_on(3);<br />led_on(4);<br />przod(max_pwm);<br />}<br />else <br />{<br />led_on(3);<br />skr_p(mid_pwm);<br />}<br />}<br />else <br />{<br />led_off(3);<br />}<br /><br />// blok warunkowy - odczyt stanu TSOP4<br />if( !( PINA &amp; TSOP4 ) )<br />{<br />if( !( PINA &amp; TSOP3 ) &amp;&amp; pomiar(5)&gt;a &amp;&amp; pomiar(6)&gt;a ) <br />{<br />led_on(3);<br />led_on(4);<br />przod(max_pwm);<br />}<br />else <br />{<br />led_on(4);<br />skr_l(mid_pwm);<br />}<br />}<br />else <br />{<br />led_off(4);<br />}<br /><br />//blok warunkowy - odczyt stanu S2<br />if( !( PINC &amp; S2 ) )<br />{<br />_delay_ms(100);<br />if( !( PINC &amp; S2 ) ) <br />{<br />start=0;//jeśli wciśnięty - zatrzymaj robota<br />ss2=1;//i wyjdź do menu wyboru PROGRAM TESTOWY/PROGRAM GŁÓWNY<br />}<br />else <br />{<br />start=1;//jeśli nie - walcz dalej<br />ss2=0;//i nie wychodź do menu wyboru PROGRAM TESTOWY/PROGRAM GŁÓWNY<br />}<br />}<br />}<br />}<br />}<br />}<br />// ********** koniec funkcji głównej programu<br /><br />// *** definicje funkcji<br />uint16_t 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 prog_stop(void)<br />{<br />//zahamuj wszystkie silniki, wyłącz wszystkie diody IR, wyświetl sekwencję zapalania/gaszenia wszystkoch diod<br />HAM;<br />PORTB &amp;= ~( IR1 | IR2 | IR3 | IR4 | IR5 );<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />//wykonaj pętlę zabierającą 100% czasu procesora<br />while(1);<br />}<br /><br />void odlicz_5s(void)<br />{<br />b=0;<br />while( b&lt;19 )<br />{<br />_delay_ms(250);<br />led_xor(1);<br />led_xor(2);<br />led_xor(3);<br />led_xor(4);<br />b++;<br />}<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(100);<br />}<br /><br />void led_on(uint8_t numer_on)<br />{<br />switch ( numer_on )<br />{<br />case 1:      ( PORTC &amp;= ~LED1 );   break;<br />case 2:      ( PORTC &amp;= ~LED2 );   break;<br />case 3:      ( PORTC &amp;= ~LED3 );   break;<br />case 4:      ( PORTD &amp;= ~LED4 );   break;<br />default:     {};            break;<br />}<br />}<br /><br />void led_off(uint8_t numer_off)<br />{<br />switch ( numer_off )<br />{<br />case 1:      ( PORTC |= LED1 );   break;<br />case 2:      ( PORTC |= LED2 );   break;<br />case 3:      ( PORTC |= LED3 );   break;<br />case 4:      ( PORTD |= LED4 );   break;<br />default:     {};            break;<br />}<br />}<br /><br />void led_xor(uint8_t numer_xor)<br />{<br />switch ( numer_xor )<br />{<br />case 1:      ( PORTC ^= LED1 );   break;<br />case 2:      ( PORTC ^= LED2 );   break;<br />case 3:      ( PORTC ^= LED3 );   break;<br />case 4:      ( PORTD ^= LED4 );   break;<br />default:     {};            break;<br />}<br />}<br /><br />void program(uint8_t prog)<br />{<br />switch ( prog )<br />{<br />//*** PROGRAM STARTOWY 0<br />case 0:<br />{<br />PROGRAM=0;<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 1<br />   case 1:<br />{<br />skr_p(max_pwm);<br />_delay_ms(250);<br />_delay_ms(100);<br />};   <br />break;<br /><br />//*** PROGRAM STARTOWY 2<br />case 2:<br />{<br />skr_l(max_pwm);<br />_delay_ms(250);<br />_delay_ms(100);<br />};   <br />break;<br /><br />//*** PROGRAM STARTOWY 3<br />case 3:<br />{<br />skr_p(max_pwm);<br />_delay_ms(250);<br />_delay_ms(50);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 4<br />case 4:<br />{<br />skr_l(max_pwm);<br />_delay_ms(250);<br />_delay_ms(50);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 5<br />case 5:<br />{<br />skr_p(max_pwm);<br />_delay_ms(250);<br />_delay_ms(150);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 6<br />case 6:<br />{<br />skr_l(max_pwm);<br />_delay_ms(250);<br />_delay_ms(150);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 7<br />case 7:<br />{<br />skr_p(350);<br />_delay_ms(250);<br />_delay_ms(250);<br />_delay_ms(250);<br />_delay_ms(150);<br />skr_p(max_pwm);<br />_delay_ms(250);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 8<br />case 8:<br />{<br />skr_l(350);<br />_delay_ms(250);<br />_delay_ms(250);<br />_delay_ms(250);<br />_delay_ms(150);<br />skr_l(max_pwm);<br />_delay_ms(250);<br />};<br />break;<br /><br />default:     {};            break;<br />}<br />}[/syntax]<br />Wszystko działa, ale... Te delay'e... Gdy robot wykonuje któryś z manewrów - OBROT_PRAWA, OBROT_LEWA lub któryś z programów startowych (które są zapisane w instrukcji switch) nie znajdzie przeciwnika. Jest po prostu ślepy przez te delay'e i wiadomo, jak to się kończy... Przeciwnik podjeżdża i bez problemu może zepchnąć mojego robota, bo ten nie ma się jak bronić.<br /><br /><strong>Pierwsza zmiana - delay'e na timer:</strong><br />No to pomyślałem, że można by zamienić delay'e na odliczanie czasu timer'ami i w trakcie wykonywania funkcji obrot_p, obrot_l, program_lewa, program_prawa sprawdzać czujniki. Z racji tego, że został mi ostatni wolny timer - timer0, to on zajmuje się odliczaniem czasu. Jest ustawiony w tryb CTC i daje przerwanie, co 1ms (bez przełączania wyjścia). Uznałem, że dla mnie dobrą podstawą czasu będzie 20ms (czas, w którym nie zapcham buforów TSOP'ów). Dlatego po zliczeniu zmiennej ilosc_1ms=20, inkrementuję zmienną ilosc_20ms, daję sygnał o wykonaniu pomiaru i zeruję ilosc_1ms. Wszystkie funkcje są oparte o właśnie podstawę czasu 20ms. Gdy któryś z czujników zauważy przeciwnika, to ilosc_20ms jest zwiększana do do takiej ilości, aby wyjść z wszystkich pętli. Oczywiście to nie działa i nie mam pojęcia czemu...<br /><br /><strong>Druga zmiana - &quot;paczkowanie&quot; impulsów dla większego zasięgu czujników:</strong><br />Dotychczas włączałem wszystkie diody IR i modulowałem sygnał na 36kHz. To działa, ale zapycha bufory odbiorników TSOP i zmniejsza się zasięg. Postanowiłem to zmienić i dodałem tzw. &quot;paczkowanie&quot;. Teraz wysyłam sygnał testowy (według DS), czyli 30 impulsów (bo tyle wykona się w ciągu 85us). Problem w tym, że tutaj też mam delay'e. Drugi problem, że funkcja czujnik() nie działa jeśli jest ta zmienna stan. Bez zmiennej, czyli z return'em już po samym odczycie stanu pinu działa, ale nie mam pewności czy funkcja wykonuje się do końca - czy dioda zostanie zgaszona. <br /><br /><strong>Powstało coś takiego:</strong><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 />// ***** preprocesor<br />#define S1 (1&lt;&lt;PA0)<br />#define S2 (1&lt;&lt;PC1)<br /><br />#define KTIR1 (1&lt;&lt;PA6)<br />#define KTIR2 (1&lt;&lt;PA5)<br /><br />#define AKU (1&lt;&lt;PA7)<br /><br />#define RXD (1&lt;&lt;PD0)<br />#define TXD (1&lt;&lt;PD1)<br /><br />#define KS_KEY (1&lt;&lt;PD3)<br />#define START_KEY (1&lt;&lt;PD2)<br /><br />#define TSOP1 (1&lt;&lt;PA1)<br />#define TSOP2 (1&lt;&lt;PA4)<br />#define TSOP3 (1&lt;&lt;PA3)<br />#define TSOP4 (1&lt;&lt;PA2)<br /><br />#define LED1 (1&lt;&lt;PC7)<br />#define LED2 (1&lt;&lt;PC6)<br />#define LED3 (1&lt;&lt;PC0)<br />#define LED4 (1&lt;&lt;PD6)<br /><br />#define IR1 (1&lt;&lt;PB4)<br />#define IR2 (1&lt;&lt;PB3)<br />#define IR3 (1&lt;&lt;PB2)<br />#define IR4 (1&lt;&lt;PB1)<br />#define IR5 (1&lt;&lt;PB0)<br /><br />#define IR_KEY (1&lt;&lt;PD7)<br /><br />#define L1 (1&lt;&lt;PC5)<br />#define L2 (1&lt;&lt;PC4)<br />#define PWM_L (1&lt;&lt;PD5)<br /><br />#define P1 (1&lt;&lt;PC3)<br />#define P2 (1&lt;&lt;PC2)<br />#define PWM_P (1&lt;&lt;PD4)<br /><br />// *** mekrodefinicje<br />#define LEWA_PRZOD ( PORTC |= L1, PORTC &amp;= ~L2 )<br />#define LEWA_TYL ( PORTC &amp;= ~L1, PORTC |= L2 )<br />#define LEWA_HAM ( PORTC &amp;= ~( L1 | L2 ) )<br /><br />#define PRAWA_PRZOD ( PORTC |= P1, PORTC &amp;= ~P2 )<br />#define PRAWA_TYL ( PORTC &amp;= ~P1, PORTC |= P2 )<br />#define PRAWA_HAM ( PORTC &amp;= ~( P1 | P2 ) )<br /><br />//OCR1A - lewa strona<br />//OCR1B - prawa strona<br />#define HAM ( LEWA_HAM, PRAWA_HAM )<br /><br />#define OBROT_PRAWO ( odwrot(odwrot_pwm), _delay_ms(250), skr_p(mid_pwm), _delay_ms(200), _delay_ms(100) )<br />#define OBROT_LEWO ( odwrot(odwrot_pwm), _delay_ms(250), skr_l(mid_pwm), _delay_ms(200), _delay_ms(100) )<br /><br />// *** deklaracje funkcji<br />uint16_t pomiar(uint8_t kanal);<br />void prog_stop(void);<br />void odlicz_5s(void);<br />void led_on(uint8_t numer_on);<br />void led_off(uint8_t numer_off);<br />void led_xor(uint8_t numer_xor);<br />void program(uint8_t prog);<br /><br />// *** definicje stałych<br />const uint16_t a=650;//zmienna, do której porównywane są wartości czujników<br />const uint16_t aku_adc=525;//ADC=(Vin*1024)/Vref | ADC=(3,25*1024)/4,94<br />/*<br />Wartości aku_adc:<br />1) 600 - 7,8V<br />2) 550 - 7,73V<br />3) 525 - ?<br />4) 500 - ?<br />*/<br />const uint16_t max_pwm=1000;<br />const uint16_t mid_pwm=500;<br />const uint16_t min_pwm=200;<br />const uint16_t odwrot_pwm=700;<br /><br />// *** definicje zmiennych<br />uint8_t b=19;//zmienna przechowująca ilość zliczeń 250ms<br />uint8_t ss1=0;//zmienna pomocnicza stanu S1<br />uint8_t ss2=1;//zmienna pomocnicza stanu S2<br />volatile uint8_t start=0;//zmienna pomocnicza - startowanie robota (z możliwością edycji w przerwaniach)<br />uint8_t PROGRAM=1;//zmienna przechowująca wartość programu startowego<br />volatile uint8_t wykonaj=1;//zmienna pomocnicza pozwalająca na jednokrotne wykonanie programu startowego (z możliwością edycji w przerwaniach)<br />volatile uint16_t ilosc_1ms=0;//zmienna pomocnicza przechowująca ilość zliczeń 1ms<br />volatile uint16_t ilosc_20ms=0;//zmienna pomocnciza przechowująca ilość zliczeń 20ms<br />volatile uint8_t wykonaj_pomiar=0;//zmienna decydująca o wykonaniu pomiarów z czujników<br /><br />//*** definicje najważniejszych funkcji<br />uint8_t czujnik(uint8_t tsop, uint8_t ir)<br />{<br />uint8_t stan=0;//zmienna lokalna przechowująca wartość zwracaną na końcu funkcji<br />PORTB |= (ir);//włączenie diody IRx<br />_delay_us(85);//30 impulsów 36kHz<br />if( !(PINA &amp; tsop) ) stan=1;//jeśli TSOPx coś wykrył wpisz 1 do zmiennej<br />else stan=0;//jeśli nie, to wpisz 0<br />PORTB &amp;= ~(ir);//wyłącz diodę IRx<br />_delay_ms(1);//odczekaj 1ms w celu zlikwidowania błędów<br />if(stan==1) return 1;//jeśli coś wykryto to zwróć 1<br />else return 0;//jeśli nie, to zwróć 0<br />}<br /><br />uint8_t czujnik_przod(void)<br />{<br />uint8_t stan=0;//zmienna lokalna przechowująca wartość zwracaną na końcu funkcji<br />PORTB |= IR4;//włączenie diody IR4<br />_delay_us(85);//30 impulsów 36kHz<br />if( !(PINA &amp; TSOP3) &amp;&amp; !(PINA &amp; TSOP4) ) stan=1;//jeśli TSOP3 i TSOP4 coś wykrył wpisz 1 do zmiennej<br />else stan=0;//jeśli nie, to wpisz 0<br />PORTB &amp;= ~IR4;//wyłącz diodę IR4<br />_delay_ms(1);//odczekaj 1ms w celu zlikwidowania błędów<br />if(stan==1) return 1;//jeśli coś wykryto to zwróć 1<br />else return 0;//jeśli nie, to zwróć 0<br />}<br /><br />void przod(uint16_t pwm)<br />{<br />OCR1A=(pwm);<br />OCR1B=(pwm);<br />LEWA_PRZOD;<br />PRAWA_PRZOD;<br />}<br /><br />void odwrot(uint16_t pwm)<br />{<br />OCR1A=(pwm);<br />OCR1B=(pwm);<br />LEWA_TYL; <br />PRAWA_TYL;<br />}<br /><br />void skr_l(uint16_t pwm)<br />{<br />OCR1A=(pwm);<br />OCR1B=(pwm);<br />PRAWA_HAM;<br />LEWA_PRZOD; <br />}<br /><br />void skr_p(uint16_t pwm)<br />{<br />OCR1A=(pwm);<br />OCR1B=(pwm);<br />LEWA_HAM; <br />PRAWA_PRZOD;<br />}<br /><br />void obrot_p(void)<br />{<br />ilosc_20ms=0;<br /><br />while(ilosc_20ms&lt;11)<br />{<br />odwrot(odwrot_pwm);<br />if(wykonaj_pomiar==1)<br />{<br />//Blok odczytu czujnika z przodu<br />if( czujnik_przod() ) <br />{<br />led_on(3);<br />led_on(4);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(3);<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy-przod<br />if( czujnik(TSOP3,IR3) )<br />{<br />led_on(3);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(3);<br />}<br /><br />//Blok odczytu czujnika prawy-przod<br />if( czujnik(TSOP4,IR5) )<br />{<br />led_on(4);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy<br />if( czujnik(TSOP2,IR1) )<br />{<br />led_on(1);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(1);<br />}<br /><br />//Blok odczytu czujnika prawy<br />if( czujnik(TSOP1,IR2) )<br />{<br />led_on(2);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(2);<br />}<br /><br />wykonaj_pomiar=0;<br /><br />}<br />}<br /><br />while(ilosc_20ms&gt;10 &amp;&amp; ilosc_20ms&lt;23)<br />{<br />skr_p(mid_pwm);<br />if(wykonaj_pomiar==1)<br />{<br />//Blok odczytu czujnika z przodu<br />if( czujnik_przod() ) <br />{<br />led_on(3);<br />led_on(4);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(3);<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy-przod<br />if( czujnik(TSOP3,IR3) )<br />{<br />led_on(3);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(3);<br />}<br /><br />//Blok odczytu czujnika prawy-przod<br />if( czujnik(TSOP4,IR5) )<br />{<br />led_on(4);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy<br />if( czujnik(TSOP2,IR1) )<br />{<br />led_on(1);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(1);<br />}<br /><br />//Blok odczytu czujnika prawy<br />if( czujnik(TSOP1,IR2) )<br />{<br />led_on(2);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(2);<br />}<br /><br />wykonaj_pomiar=0;<br /><br />}<br />}<br />}<br /><br />void obrot_l(void)<br />{<br /><br />ilosc_20ms=0;<br /><br />while(ilosc_20ms&lt;11)<br />{<br />odwrot(odwrot_pwm);<br />if(wykonaj_pomiar==1)<br />{<br />//Blok odczytu czujnika z przodu<br />if( czujnik_przod() ) <br />{<br />led_on(3);<br />led_on(4);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(3);<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy-przod<br />if( czujnik(TSOP3,IR3) )<br />{<br />led_on(3);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(3);<br />}<br /><br />//Blok odczytu czujnika prawy-przod<br />if( czujnik(TSOP4,IR5) )<br />{<br />led_on(4);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy<br />if( czujnik(TSOP2,IR1) )<br />{<br />led_on(1);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(1);<br />}<br /><br />//Blok odczytu czujnika prawy<br />if( czujnik(TSOP1,IR2) )<br />{<br />led_on(2);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(2);<br />}<br /><br />wykonaj_pomiar=0;<br /><br />}<br />}<br /><br />while(ilosc_20ms&gt;10 &amp;&amp; ilosc_20ms&lt;23)<br />{<br />skr_l(mid_pwm);<br />if(wykonaj_pomiar==1)<br />{<br />//Blok odczytu czujnika z przodu<br />if( czujnik_przod() ) <br />{<br />led_on(3);<br />led_on(4);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(3);<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy-przod<br />if( czujnik(TSOP3,IR3) )<br />{<br />led_on(3);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(3);<br />}<br /><br />//Blok odczytu czujnika prawy-przod<br />if( czujnik(TSOP4,IR5) )<br />{<br />led_on(4);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy<br />if( czujnik(TSOP2,IR1) )<br />{<br />led_on(1);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(1);<br />}<br /><br />//Blok odczytu czujnika prawy<br />if( czujnik(TSOP1,IR2) )<br />{<br />led_on(2);<br />ilosc_20ms=23;<br />}<br />else<br />{<br />led_off(2);<br />}<br /><br />wykonaj_pomiar=0;<br /><br />}<br />}<br />}<br /><br />void program_lewa(uint8_t czas1, uint8_t czas2, uint16_t pwm_czas1, uint16_t pwm_czas2)<br />{<br />ilosc_20ms=0;<br /><br />while(ilosc_20ms&lt;czas1)<br />{<br />skr_l(pwm_czas1);<br />if(wykonaj_pomiar==1)<br />{<br />//Blok odczytu czujnika z przodu<br />if( czujnik_przod() ) <br />{<br />led_on(3);<br />led_on(4);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(3);<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy-przod<br />if( czujnik(TSOP3,IR3) )<br />{<br />led_on(3);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(3);<br />}<br /><br />//Blok odczytu czujnika prawy-przod<br />if( czujnik(TSOP4,IR5) )<br />{<br />led_on(4);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy<br />if( czujnik(TSOP2,IR1) )<br />{<br />led_on(1);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(1);<br />}<br /><br />//Blok odczytu czujnika prawy<br />if( czujnik(TSOP1,IR2) )<br />{<br />led_on(2);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(2);<br />}<br /><br />wykonaj_pomiar=0;<br /><br />}<br />}<br /><br />while(ilosc_20ms&gt;czas1 &amp;&amp; ilosc_20ms&lt;czas2)<br />{<br />skr_l(pwm_czas2);<br />if(wykonaj_pomiar==1)<br />{<br />//Blok odczytu czujnika z przodu<br />if( czujnik_przod() ) <br />{<br />led_on(3);<br />led_on(4);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(3);<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy-przod<br />if( czujnik(TSOP3,IR3) )<br />{<br />led_on(3);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(3);<br />}<br /><br />//Blok odczytu czujnika prawy-przod<br />if( czujnik(TSOP4,IR5) )<br />{<br />led_on(4);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy<br />if( czujnik(TSOP2,IR1) )<br />{<br />led_on(1);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(1);<br />}<br /><br />//Blok odczytu czujnika prawy<br />if( czujnik(TSOP1,IR2) )<br />{<br />led_on(2);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(2);<br />}<br /><br />wykonaj_pomiar=0;<br /><br />}<br />}<br />}<br /><br />void program_prawa(uint8_t czas1, uint8_t czas2, uint16_t pwm_czas1, uint16_t pwm_czas2)<br />{<br />ilosc_20ms=0;<br /><br />while(ilosc_20ms&lt;czas1)<br />{<br />skr_p(pwm_czas1);<br />if(wykonaj_pomiar==1)<br />{<br />//Blok odczytu czujnika z przodu<br />if( czujnik_przod() ) <br />{<br />led_on(3);<br />led_on(4);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(3);<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy-przod<br />if( czujnik(TSOP3,IR3) )<br />{<br />led_on(3);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(3);<br />}<br /><br />//Blok odczytu czujnika prawy-przod<br />if( czujnik(TSOP4,IR5) )<br />{<br />led_on(4);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy<br />if( czujnik(TSOP2,IR1) )<br />{<br />led_on(1);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(1);<br />}<br /><br />//Blok odczytu czujnika prawy<br />if( czujnik(TSOP1,IR2) )<br />{<br />led_on(2);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(2);<br />}<br /><br />wykonaj_pomiar=0;<br /><br />}<br />}<br /><br />while(ilosc_20ms&gt;czas1 &amp;&amp; ilosc_20ms&lt;czas2)<br />{<br />skr_p(pwm_czas2);<br />if(wykonaj_pomiar==1)<br />{<br />//Blok odczytu czujnika z przodu<br />if( czujnik_przod() ) <br />{<br />led_on(3);<br />led_on(4);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(3);<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy-przod<br />if( czujnik(TSOP3,IR3) )<br />{<br />led_on(3);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(3);<br />}<br /><br />//Blok odczytu czujnika prawy-przod<br />if( czujnik(TSOP4,IR5) )<br />{<br />led_on(4);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(4);<br />}<br /><br />//Blok odczytu czujnika lewy<br />if( czujnik(TSOP2,IR1) )<br />{<br />led_on(1);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(1);<br />}<br /><br />//Blok odczytu czujnika prawy<br />if( czujnik(TSOP1,IR2) )<br />{<br />led_on(2);<br />ilosc_20ms=czas2;<br />}<br />else<br />{<br />led_off(2);<br />}<br /><br />wykonaj_pomiar=0;<br /><br />}<br />}<br />}<br /><br />// *** obsługa modułu startowego - przerwanie od INT0<br />ISR( INT0_vect )<br />{<br />//blok warunkowy - odczyt, jaka zmiana nastąpiła<br />if( ( PIND &amp; START_KEY ) )<br />{<br />start=1;<br />wykonaj=1;<br />}<br />else<br />{<br />start=0;<br />wykonaj=0;<br />}<br />}<br /><br />// *** timer odliczający dokładnie 1ms<br />ISR( TIMER0_COMP_vect ) <br />{<br />ilosc_1ms++;<br />if(ilosc_1ms&gt;=20) <br />{<br />ilosc_1ms=0;<br />ilosc_20ms++;<br />wykonaj_pomiar=1;<br />}<br />}<br /><br />// ********** funkcja główna programu<br />int main(void)<br />{<br />// ***** inicjalizacja <br />// *** ADC<br />    ADMUX |= (1&lt;&lt;REFS0);<br />    ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADPS0) | (1&lt;&lt;ADPS1);<br /><br />// *** Timer/Counter0<br />TCCR0 |= (1&lt;&lt;WGM01) | (1&lt;&lt;CS00) | (1&lt;&lt;CS01);//Timer0 tryb CTC; Prescaler: 64<br />OCR0 = 249;//OCR=(16000000/(64*1000))-1 - 1ms<br />TIMSK  |= (1&lt;&lt;OCIE0);//Włącznie przerwań od Timer0<br /><br />// *** Timer/Counter1<br />TCCR1A |= (1&lt;&lt;COM1A1) | (1&lt;&lt;COM1B1) | (1&lt;&lt;WGM11);//Timer1 tryb Fast-PWM (WGM11 + WGM12 + WGM13), tryb nieodwrócony<br />TCCR1B |= (1&lt;&lt;CS11) | (1&lt;&lt;WGM12) | (1&lt;&lt;WGM13); //Prescaler: 8 (CS11) <br />ICR1=500;//Częstotliwość 4kHz - F=Fq/p/ICR1<br />OCR1A=0;//PWM - wypełnienie 0<br />OCR1B=0;//PWM - wypełnienie 0<br /><br />// *** Timer/Counter2 <br />TCCR2 |= (1&lt;&lt;WGM21) | (1&lt;&lt;COM20) | (1&lt;&lt;CS20); //Timer2 tryb CTC (WGM21), przełącza OC2 przy zrównaniu(COM20), prescaler=1 (CS20)<br />OCR2=222; //OCR2 = Fq/2F | 36kHz<br /><br />// *** Przerwania zewnętrzne<br />MCUCR |= (1&lt;&lt;ISC00);//Dowolna zmiana stanu logicznego na INT0 wywoła żądanie przerwania (ISC00=1)<br />GICR |= (1&lt;&lt;INT0);//Włączenie przerwań od pinu INT0<br />sei(); //Globalne włączenie przerwań<br /><br />// *** wejścia<br />DDRA &amp;= ~( S1 | KTIR1 | KTIR2 | AKU | TSOP1| TSOP2 | TSOP3 | TSOP4 );//S1, KTIR1, KTIR2 - wejście<br />PORTA |= S1;//S1 - podciągnięty do Vcc<br /><br />DDRC &amp;= ~S2;//S2 - wejście<br />PORTC |= S2;//S2 - podciągnięty do Vcc<br /><br />DDRD &amp;= ~( START_KEY | KS_KEY );//START_KEY i KS_KEY - wejścia<br /><br />// *** wyjścia<br />DDRC |= LED1 | LED2 | LED3;//LED1, LED2, LED3 - wyjścia<br />PORTC |= LED1 | LED2 | LED3;//LED1, LED2, LED3 - wyłączone (podciągnięte do Vcc)<br /><br />DDRD |= LED4 | IR_KEY;//LED4, IR_KEY - wyjście<br />PORTD |= LED4;//LED4 - wyłączone (podciągnięte do Vcc)<br /><br />DDRB |= IR1 | IR2 | IR3 | IR4 | IR5;//IR1, IR2, IR3, IR4, IR5 - wyjścia<br />PORTB &amp;= ~(IR1 | IR2 | IR3 | IR4 | IR5);//IR1, IR2, IR3, IR4, IR5 - wyłączone (1 - ON, 0 - OFF)<br /><br />DDRC |= L1 | L2 | P1 | P2;//L1, L2, P1, P2 - wyjścia<br />HAM;<br /><br />DDRD |= PWM_L | PWM_P;//PWM_L, PWM_P - wyjścia<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br /><br />// *** pętla nieskończona<br />while(1)<br />{<br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br /><br />//zerowanie LED'ów<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br /><br />HAM;<br /><br />//blok warunkowy - sprawdzanie stanu S2<br />if( !( PINC &amp; S2 ) )<br />{<br />_delay_ms(100);<br />if( !( PINC &amp; S2 ) )<br />{<br />ss2=0;<br />}<br />else<br />{<br />ss2=1;<br />}<br />}<br /><br />//blok warunkowy - sprawdzanie stanu S2<br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) ) ss1=1;<br />else ss1=0;<br />}<br /><br />// ***** PROGRAM TESTOWY ROBOTA *****<br />while( ss1&gt;0 )<br />{<br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br /><br />// *** TEST CZUJNIKÓW PRZECIWNIKA ***<br />while( ss1==1 )<br />{<br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) ) <br />{<br />ss1=2;<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />}<br />else ss1=1;<br />}<br /><br />if( czujnik(TSOP3,IR3) ) led_on(1);<br />else led_off(1);<br /><br />if( czujnik_przod() ) led_on(2);<br />else led_off(2);<br /><br />if( czujnik(TSOP4,IR5) ) led_on(3);<br />else led_off(3);<br /><br />led_off(4);<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br />}<br /><br />// *** TEST CZUJNIKÓW LINII ***<br />while( ss1==2 )<br />{<br /><br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) ) <br />{<br />ss1=3;<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />}<br />else ss1=2;<br />}<br /><br />if( pomiar(5)&lt;=a ) led_on(1);<br />else led_off(1);<br /><br />if( pomiar(6)&lt;=a ) led_on(2);<br />else led_off(2);<br /><br />if( czujnik(TSOP2,IR1) ) led_on(3);<br />else led_off(3);<br /><br />if( czujnik(TSOP1,IR2) ) led_on(4);<br />else led_off(4);<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br />}<br /><br />// *** TEST SILNIKÓW ***<br />while( ss1==3 )<br />{<br /><br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br /><br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) ) <br />{ <br />ss1=0;<br />HAM;<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />}<br />else ss1=3;<br />}<br /><br />przod(max_pwm);<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br />}<br />}<br /><br />// ***** PROGRAM GŁÓWNY ROBOTA *****<br />// *** MENU WYBORU PROGRAMU STARTOWEGO ***<br />while( ss2==0 )<br />{<br /><br />HAM;<br /><br />//blok warunkowy - sprawdzanie stanu S1 (jeśli wciśnięty PROGRAM++)<br />if( !( PINA &amp; S1 ) )<br />{<br />_delay_ms(100);<br />if( !( PINA &amp; S1 ) )<br />{<br />PROGRAM++;<br />}<br />}<br /><br />if( PROGRAM==1 ) led_on(1);<br />else led_off(1);<br /><br />if( PROGRAM==2 ) led_on(2);<br />else led_off(2);<br /><br />if( PROGRAM==3 ) led_on(3);<br />else led_off(3);<br /><br />if( PROGRAM==4 ) led_on(4);<br />else led_off(4);<br /><br />if( PROGRAM==5 ) <br />{<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />}<br />else <br />{<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />}<br /><br />if( PROGRAM==6 ) <br />{<br />led_on(1);<br />led_on(3);<br />led_on(4);<br />}<br />else <br />{<br />led_off(1);<br />led_off(3);<br />led_off(4);<br />}<br /><br />if( PROGRAM==7 ) <br />{<br />led_on(1);<br />led_on(2);<br />led_on(4);<br />}<br />else <br />{<br />led_off(1);<br />led_off(2);<br />led_off(4);<br />}<br /><br />if( PROGRAM==8 ) <br />{<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />}<br />else <br />{<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />}<br /><br />if( PROGRAM==9 ) PROGRAM=0;<br /><br />//blok warunkowy - sprawdzanie stanu S2 (jeśli wciśnięty uruchom robota)<br />if( !( PINC &amp; S2 ) )<br />{<br />_delay_ms(100);<br />if( !( PINC &amp; S2 ) )<br />{<br />// ZGAŚ DIODY LED<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br /><br />//WYSTARTUJ ROBOTA<br />start=1;<br />wykonaj=1;<br /><br />//ODCZEKAJ 5s<br />odlicz_5s();<br />}<br />}<br /><br />// *** ALGORYTM WALKI ***<br />while( start==1 )<br />{<br />// *** jednokrotne wykonanie programu startowego<br />if( wykonaj==1 )<br />{<br />program( PROGRAM );//uruchom program startowy uprzednio wybrany w menu<br />wykonaj=0;//i wykonaj go wyłącznie raz!<br />}<br /><br />// *** sprawdzanie napięcia akumulatora<br />if( pomiar(7)&lt;=aku_adc ) prog_stop();<br /><br />//blok warunkowy - odczyt stanu KTIR1<br />if( pomiar(5)&lt;=a )<br />{<br />obrot_p();<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR2<br />if( pomiar(6)&lt;=a )<br />{<br />obrot_l();<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR1 &amp;&amp; KRIR2<br />if( pomiar(5)&lt;=a &amp;&amp; pomiar(6)&lt;=a )<br />{<br />obrot_p();<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR1 &amp;&amp; czujnika przedniego-lewego<br />if( pomiar(5)&lt;=a &amp;&amp; czujnik(TSOP3,IR3) )<br />{<br />obrot_p();<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR2 &amp;&amp; czujnika przedniego-lewego<br />if( pomiar(6)&lt;=a &amp;&amp; czujnik(TSOP3,IR3) )<br />{<br />obrot_l();<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR1 &amp;&amp; czujnika przedniego-prawego<br />if( pomiar(5)&lt;=a &amp;&amp; czujnik(TSOP4,IR5) )<br />{<br />obrot_p();<br />}<br /><br />//blok warunkowy - odczyt stanu KTIR2 &amp;&amp; czujnika przedniego-prawego<br />if( pomiar(6)&lt;=a &amp;&amp; czujnik(TSOP4,IR5) )<br />{<br />obrot_l();<br />}<br /><br />// blok warunkowy - odczyt czujnika prawego<br />if( czujnik(TSOP1,IR2) )<br />{<br />led_on(1); <br />skr_l(max_pwm);<br />}<br />else <br />{<br />led_off(1);<br />przod(min_pwm);<br />}<br /><br />// blok warunkowy - odczyt czujnika lewego<br />if( czujnik(TSOP2,IR1) )<br />{<br />led_on(2);<br />skr_p(max_pwm); <br />}<br />else <br />{<br />led_off(2);<br />}<br /><br />// blok warunkowy - odczyt czujnika przedniego-lewego<br />if( czujnik(TSOP3,IR3) )<br />{<br />led_on(3);<br />skr_p(mid_pwm);<br />}<br />else <br />{<br />led_off(3);<br />}<br /><br />// blok warunkowy - odczyt czujnika przedniego-prawego<br />if( czujnik(TSOP4,IR5) )<br />{<br />led_on(4);<br />skr_l(mid_pwm);<br />}<br />else <br />{<br />led_off(4);<br />}<br /><br />// blok warunkowy - odczyt czujnika przedniego<br />if( czujnik_przod() )<br />{<br />if( pomiar(5)&lt;=a || pomiar(6)&lt;=a )<br />{<br />obrot_p();<br />}<br />else<br />{<br />led_on(3);<br />led_on(4);<br />przod(max_pwm);<br />}<br />}<br />else<br />{<br />led_off(3);<br />led_off(4);<br />}<br /><br />//blok warunkowy - odczyt stanu S2<br />if( !( PINC &amp; S2 ) )<br />{<br />_delay_ms(100);<br />if( !( PINC &amp; S2 ) ) <br />{<br />start=0;//jeśli wciśnięty - zatrzymaj robota<br />ss2=1;//i wyjdź do menu wyboru PROGRAM TESTOWY/PROGRAM GŁÓWNY<br />}<br />else <br />{<br />start=1;//jeśli nie - walcz dalej<br />ss2=0;//i nie wychodź do menu wyboru PROGRAM TESTOWY/PROGRAM GŁÓWNY<br />}<br />}<br />}<br />}<br />}<br />}<br />// ********** koniec funkcji głównej programu<br /><br />// *** definicje funkcji<br />uint16_t 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 prog_stop(void)<br />{<br />//zahamuj wszystkie silniki, wyłącz wszystkie diody IR, wyświetl sekwencję zapalania/gaszenia wszystkoch diod<br />HAM;<br />PORTB &amp;= ~( IR1 | IR2 | IR3 | IR4 | IR5 );<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_on(1);<br />led_on(2);<br />led_on(3);<br />led_on(4);<br />_delay_ms(250);<br />_delay_ms(250);<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />//wykonaj pętlę zabierającą 100% czasu procesora<br />while(1);<br />}<br /><br />void odlicz_5s(void)<br />{<br />b=0;<br />while( b&lt;19 )<br />{<br />_delay_ms(250);<br />led_xor(1);<br />led_xor(2);<br />led_xor(3);<br />led_xor(4);<br />b++;<br />}<br />led_off(1);<br />led_off(2);<br />led_off(3);<br />led_off(4);<br />_delay_ms(100);<br />}<br /><br />void led_on(uint8_t numer_on)<br />{<br />switch ( numer_on )<br />{<br />case 1:      ( PORTC &amp;= ~LED1 );   break;<br />case 2:      ( PORTC &amp;= ~LED2 );   break;<br />case 3:      ( PORTC &amp;= ~LED3 );   break;<br />case 4:      ( PORTD &amp;= ~LED4 );   break;<br />default:     {};            break;<br />}<br />}<br /><br />void led_off(uint8_t numer_off)<br />{<br />switch ( numer_off )<br />{<br />case 1:      ( PORTC |= LED1 );   break;<br />case 2:      ( PORTC |= LED2 );   break;<br />case 3:      ( PORTC |= LED3 );   break;<br />case 4:      ( PORTD |= LED4 );   break;<br />default:     {};            break;<br />}<br />}<br /><br />void led_xor(uint8_t numer_xor)<br />{<br />switch ( numer_xor )<br />{<br />case 1:      ( PORTC ^= LED1 );   break;<br />case 2:      ( PORTC ^= LED2 );   break;<br />case 3:      ( PORTC ^= LED3 );   break;<br />case 4:      ( PORTD ^= LED4 );   break;<br />default:     {};            break;<br />}<br />}<br /><br />void program(uint8_t prog)<br />{<br />switch ( prog )<br />{<br />//*** PROGRAM STARTOWY 0<br />case 0:<br />{<br />PROGRAM=0;<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 1<br />   case 1:<br />{<br />//skr_p(max_pwm);<br />//_delay_ms(250);<br />//_delay_ms(100);<br /><br />program_prawa(0,14,0,max_pwm);<br />};   <br />break;<br /><br />//*** PROGRAM STARTOWY 2<br />case 2:<br />{<br />//skr_l(max_pwm);<br />//_delay_ms(250);<br />//_delay_ms(100);<br /><br />program_lewa(0,14,0,max_pwm);<br />};   <br />break;<br /><br />//*** PROGRAM STARTOWY 3<br />case 3:<br />{<br />//skr_p(max_pwm);<br />//_delay_ms(250);<br />//_delay_ms(50);<br /><br />program_prawa(0,12,0,max_pwm);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 4<br />case 4:<br />{<br />//skr_l(max_pwm);<br />//_delay_ms(250);<br />//_delay_ms(50);<br /><br />program_lewa(0,12,0,max_pwm);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 5<br />case 5:<br />{<br />//skr_p(max_pwm);<br />//_delay_ms(250);<br />//_delay_ms(150);<br /><br />program_prawa(0,16,0,max_pwm);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 6<br />case 6:<br />{<br />//skr_l(max_pwm);<br />//_delay_ms(250);<br />//_delay_ms(150);<br /><br />program_lewa(0,16,0,max_pwm);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 7<br />case 7:<br />{<br />//skr_p(350);<br />//_delay_ms(250);<br />//_delay_ms(250);<br />//_delay_ms(250);<br />//_delay_ms(150);<br />//skr_p(max_pwm);<br />//_delay_ms(250);<br /><br />program_prawa(36,10,350,max_pwm);<br />};<br />break;<br /><br />//*** PROGRAM STARTOWY 8<br />case 8:<br />{<br />//skr_l(350);<br />//_delay_ms(250);<br />//_delay_ms(250);<br />//_delay_ms(250);<br />//_delay_ms(150);<br />//skr_l(max_pwm);<br />//_delay_ms(250);<br /><br />program_lewa(36,10,350,max_pwm);<br />};<br />break;<br /><br />default:     {};            break;<br />}<br />}[/syntax]<br /><br />Będę ogromnie wdzięczny za każdą pomoc <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />  Robot wprawdzie przechodzi na emeryturę, ale chciałbym go odstawić na półkę, jako w pełni ukończonego <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=491">piotreks-89</a> — 8 cze 2014, o 09:17</p><hr />
]]></content>
</entry>
</feed>