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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-12-31T09:52:11+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=31&amp;t=2004&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-31T09:52:11+01:00</updated>
<published>2012-12-31T09:52:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22642#p22642</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22642#p22642"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22642#p22642"><![CDATA[
Program wygląda dobrze poza linią:<br />[syntax=c]ADMUX  |= (ADMUX &amp; 0xF8)|channel;[/syntax]<br />bo ma być:<br />[syntax=c]ADMUX  = (ADMUX &amp; 0xF8)|channel;[/syntax]<br />Najlepiej stwórz nowy projekt. Może programujesz starym softem.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 31 gru 2012, o 09:52</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sosnus]]></name></author>
<updated>2012-12-31T02:06:08+01:00</updated>
<published>2012-12-31T02:06:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22632#p22632</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22632#p22632"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22632#p22632"><![CDATA[
Zaprawdę dziwy się dzieją...<br />Oto program powyżej, ze wstawionymi ledami, bym widział co się dzieje...<br />Ewidentnie po kolei zapalam 3 ledy, a następnie je gaszę, lecz...<br />W rzeczywistości ledy nie gasną, po kolei zapalają się, lecz nie gasną...<br />Już sam nie wiem o co chodzi.<br /><br />Oto kod z ledami:<br />[syntax=c]<br />/*<br /> * main.c<br /> *<br /> *  Created on: 30-12-2012<br /> *      Author: Arek<br /> */<br /><br />// eLF2 Line Follower<br />// Atmega8    16MHz<br /><br />#include &lt;util/delay.h&gt;<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include&quot;common.h&quot;<br />#include&quot;superdebounce.h&quot;<br /><br />volatile uint8_t adc0, adc1, adc2, adc3, adc4, adc5, tim_deb, tim_rep, tim_rep_delay;<br />uint8_t pocz_pwm = 200, start_flag = 1;<br />int8_t czll, czl, czs, czp, czpp, delta_czujn, suma_czujn, roznica_pwm = 50 , delta_pwm, czujniki;<br />int granica = 500 ;<br /><br />void begin_drive(void);<br />void follow_the_line(void);<br />void hardware_init(void);<br />void start_Event(void);<br />int main(void)<br />{<br />        hardware_init();<br />        sei();<br />        RRED_ON;<br />        _delay_ms(50);<br />        YELLOW_ON ;<br />        _delay_ms(50) ;<br />        LRED_ON;<br />        //!!!!!!!!!!!!!! wygląda jak by tutaj siadł program<br />//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!<br />        _delay_ms(50);<br />        RRED_OFF;<br />        _delay_ms(50);<br />        YELLOW_OFF ;<br />        _delay_ms(50) ;<br />        LRED_OFF;<br />        _delay_ms(50);<br />        while(1)<br />    {<br />        superdebounce(&amp;key1, KEY1, begin_drive, 0);//start button<br />                start_Event();<br />    }<br />}<br />void hardware_init(void)<br />{<br />        //PWM<br />        PWM_DIR|= (LMOTOR|RMOTOR);<br />        TCCR1A |= (1&lt;&lt;WGM10);<br />        TCCR1B |= (1&lt;&lt;WGM12);<br />        TCCR1A |= (1&lt;&lt;COM1A1)|(1&lt;&lt;COM1B1);//set on compare match, clear at bottom<br />        TCCR1B |= (1&lt;&lt;CS10)|(1&lt;&lt;CS11);<br />        SILNIK_L= 0;<br />        SILNIK_P= 0;<br />        //KEYS<br />        KEY_DIR  &amp;= ~(KEY1|KEY2|KEY3);//in<br />        KEY_PORT |= (KEY1|KEY2|KEY3);//pull up<br />        //ADC<br />        ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADSC)|(1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1);//enabled, start first conv, prescaler 64<br />        ADMUX  |= (1&lt;&lt;ADLAR)|(1&lt;&lt;REFS0);//8bit, internal VCC<br />        ADC_DIR   &amp;= ~(ADC_0|ADC_1|ADC_2|ADC_3|ADC_4|ADC_5);//input, no pull up's<br />        //TIMER<br />        TCCR2  |= (1&lt;&lt;WGM21);//CTC mode<br />        TCCR2 |= (1&lt;&lt;CS22)|(1&lt;&lt;CS21)|(1&lt;&lt;CS20);//F_CPU/1024<br />        OCR2 = 156;//100Hz @ F_CPU 16MHz<br />        TIMSK  |= (1&lt;&lt;OCIE2);<br /><br />}<br />void start_Event(void)<br />{<br />        if(!start_flag)<br />        {<br />        follow_the_line();<br />        BLUE_ON ;<br />        _delay_ms(50) ;<br />        BLUE_OFF ;<br />        _delay_ms(50) ;<br />        }<br />}<br />void begin_drive(void)<br />{<br />        start_flag = 0;<br />}<br />void follow_the_line()<br />{<br />        if(adc1&lt;granica)<br />        {<br />                czll = -2;<br />                czujniki++;<br />        }<br />        if(adc2&lt;granica)<br />        {<br />                czl  = -1;<br />                czujniki++;<br />        }<br />        if(adc3&lt;granica)<br />        {<br />                czs  =  0;<br />                czujniki++;<br />        }<br />        if(adc4&lt;granica)<br />        {<br />                czp  =  1;<br />                czujniki++;<br />        }<br />        if(adc5&lt;granica)<br />        {<br />                czpp =  2;<br />                czujniki++;<br />        }<br />        suma_czujn  = czll + czl + czs + czp + czpp;<br /><br />        // *******<br />        if ( suma_czujn == 0 )<br />        {<br />        YELLOW_ON ;<br />        RRED_OFF ;<br />        LRED_OFF ;<br />        }<br />        else if ( suma_czujn &lt; 0)<br />        {<br />        YELLOW_OFF ;<br />        RRED_ON;<br />        LRED_OFF ;<br />        }<br />        else if ( suma_czujn &gt; 0)<br />        {<br />        YELLOW_OFF ;<br />        RRED_OFF ;<br />        LRED_ON ;<br />        }<br /><br />        delta_czujn = suma_czujn  / czujniki;<br />        delta_pwm   = delta_czujn * roznica_pwm;<br />        SILNIK_L    = pocz_pwm + delta_pwm;<br />        SILNIK_P    = pocz_pwm - delta_pwm;<br />        czujniki    = 0;<br />        czll = 0;<br />        czl  = 0;<br />        czs  = 0;<br />        czp  = 0;<br />        czpp = 0;<br />}<br />ISR(TIMER2_COMP_vect)<br />{<br />        static uint8_t channel = 1;<br />        uint8_t temp;<br />        if((temp = tim_deb)) tim_deb--;<br />        if((temp = tim_rep)) tim_rep--;<br />        if((temp = tim_rep_delay)) tim_rep_delay--;<br />        if(!(ADCSRA&amp;(1&lt;&lt;ADSC)))//if previous conversion complete<br />        {<br />                switch(channel)<br />                {<br />                case 1:<br />                        adc1=ADCH;<br />                        break;<br />                case 2:<br />                        adc2=ADCH;<br />                        break;<br />                case 3:<br />                        adc3=ADCH;<br />                        break;<br />                case 4:<br />                        adc4=ADCH;<br />                        break;<br />                case 5:<br />                        adc5=ADCH;<br />                        break;<br />                }<br />                ADCSRA |= (1&lt;&lt;ADSC);//start next conversion<br />        }<br />        if(++channel&gt;5) channel = 1;<br />        ADMUX  |= (ADMUX &amp; 0xF8)|channel;<br />}<br />[/syntax]<br /><br />PS. Przed chwilą z trudem wymieniłem procesor (z obu stron otoczony jest IDC10) wstawiłem drugą megę8, jest to samo, co napisałem u góry postu<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=364">sosnus</a> — 31 gru 2012, o 02:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[naelektryzowany]]></name></author>
<updated>2012-12-30T20:47:10+01:00</updated>
<published>2012-12-30T20:47:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22597#p22597</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22597#p22597"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22597#p22597"><![CDATA[
Może ja wrzucę swoje trzy grosze <img src="https://forum.atnel.pl/images/smilies/icon_razz.gif" alt=":P" title="Pokazuje język" /><br />Jako, że jestem w temacie lf'ów, o odczycie adc powiem tyle: im szybciej tym lepiej. Różnica jest zauważalna, i te kilkaset Hz nie jest przesadzone, tym bardziej, że algorytm wykonuje się również dość szybko. U mnie adc odczytywane jest ponad 200Khz które jest maksymalne wg atmela. czyli odczyt przy typowej prędkości ok 1,2-1,5m/sek jest dokonywany kilka razy na 1mm ! może różnica między dużo niższym preskalerem częstotliwości odczytu nie jest duża, ale jest. szczególnie przy dodaniu członu różniczkującego, kiedy częste odczyty i częste ich porównywanie jest niezbędne do np. nie wypadnięcia z kąta prostego.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=577">naelektryzowany</a> — 30 gru 2012, o 20:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sosnus]]></name></author>
<updated>2012-12-30T20:36:12+01:00</updated>
<published>2012-12-30T20:36:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22595#p22595</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22595#p22595"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22595#p22595"><![CDATA[
Myślę że tak. Ale chyba tą częstotliwość będzie można łatwo zmienić za pomocą preskalera, tak? <br />Najlepiej by było, aby odczyt ze wszystkich czujników wykonywał się co najmniej z taką prędkością, jak algorytm dalszego przetwarzania tych wyników.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=364">sosnus</a> — 30 gru 2012, o 20:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-30T12:18:42+01:00</updated>
<published>2012-12-30T12:18:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22519#p22519</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22519#p22519"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22519#p22519"><![CDATA[
Tak, ta linijka powoduje twoje problemy:<br />[syntax=c]TIMSK |= (1&lt;&lt;TOIE0) | (1&lt;&lt;TOIE1); //Przerwanie overflow przepełnienie timera[/syntax]<br />Opisz dokładnie co tu robisz. Co to za rejestr co oznaczają bity, które ustawiasz i co to powoduje.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 30 gru 2012, o 12:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sosnus]]></name></author>
<updated>2012-12-30T11:31:11+01:00</updated>
<published>2012-12-30T11:31:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22517#p22517</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22517#p22517"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22517#p22517"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Jak mogło ci działać skoro miałeś odblokowane przerwanie jak pisze Krauser bez jego obsługi ISR() .... To ZAWSZE spowoduje RESET nie ma innej możliwości.<br /></div><br /><br />Coś musiałem wyciąć przez przypadek, ale nie pamiętam co. I zrobiłem błąd, nie zapisałem wtedy jeszcze działającej wersji programu, więc nie widzę co jest nie tak...<br />Linijka numer 334, czy o tą linijkę Wam chodzi? Coś w tym miejscu jest nie tak?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=364">sosnus</a> — 30 gru 2012, o 11:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-12-30T11:01:36+01:00</updated>
<published>2012-12-30T11:01:36+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22515#p22515</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22515#p22515"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22515#p22515"><![CDATA[
<div class="quotetitle">sosnus napisał(a):</div><div class="quotecontent"><br />Krauser, wczoraj nic z timerami nie ruszałem, a wcześniej ten program działał.<br /></div><br /><br />Jak mogło ci działać skoro miałeś odblokowane przerwanie jak pisze Krauser bez jego obsługi ISR() .... To ZAWSZE spowoduje RESET nie ma innej możliwości.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 30 gru 2012, o 11:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-30T10:59:23+01:00</updated>
<published>2012-12-30T10:59:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22514#p22514</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22514#p22514"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22514#p22514"><![CDATA[
Po co odblokowujesz przerwanie <em>(1&lt;&lt;TOIE1)</em> Jak nie masz jego obsługi ISR. To powoduje skok do początku programu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 30 gru 2012, o 10:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sosnus]]></name></author>
<updated>2012-12-30T10:54:44+01:00</updated>
<published>2012-12-30T10:54:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22513#p22513</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22513#p22513"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22513#p22513"><![CDATA[
Krauser, wczoraj nic z timerami nie ruszałem, a wcześniej ten program działał. Wczoraj coś przekombinowałem i nie wiem co jest nie tak.<br /><br />Nixie, tak, teraz to zauważyłem, za takie poprawki mam zamiar się wziąć, jak tylko rozwiążę mój główny problem, bo te przyciski na razie są nieistotne, ale dzięki.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=364">sosnus</a> — 30 gru 2012, o 10:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[nixie]]></name></author>
<updated>2012-12-30T10:14:54+01:00</updated>
<published>2012-12-30T10:14:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22504#p22504</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22504#p22504"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22504#p22504"><![CDATA[
Po drugie <br /><br />[syntax=c]    //badanie przycisków<br />        if ( przycisk (MODE_DOWN_PIN) ) RRED_TOG ;<br />        if ( przycisk (MODE_DOWN_PIN) )[/syntax]<br /><br />Dwa razy sprawdzasz warunek dla tego samego przycisku.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=358">nixie</a> — 30 gru 2012, o 10:14</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2012-12-30T10:07:06+01:00</updated>
<published>2012-12-30T10:07:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22503#p22503</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22503#p22503"/>
<title type="html"><![CDATA[Re: Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22503#p22503"><![CDATA[
Podpowiedź:<br /><div class="quotetitle">sosnus napisał(a):</div><div class="quotecontent"><br />[syntax=c]<br />//...<br />TIMSK |= (1&lt;&lt;TOIE0) | (1&lt;&lt;TOIE1); //Przerwanie overflow przepełnienie timera<br />//...<br />ISR(TIMER0_OVF_vect) <br />//...<br />[/syntax]<br /></div><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 30 gru 2012, o 10:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[sosnus]]></name></author>
<updated>2012-12-29T21:51:23+01:00</updated>
<published>2012-12-29T21:51:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22443#p22443</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22443#p22443"/>
<title type="html"><![CDATA[Niewidzialny błąd w programie]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=2004&amp;p=22443#p22443"><![CDATA[
Witam, zupełnie nie mam pojęcia o co chodzi, poniżej zamieszczam program. Problem w tym, że w miejscu gdzie napisałem wykrzykniki program tak jakby się zawieszał, led świeci ciągle, a powinien zmieniać stany. Zmieniłem pin leda na inny, i to samo...<br />Zupełnie nie mam pomysłu co jest nie tak, dodam jeszcze, że nie kompilator nie pokazuje żadnych errorów ani warningów...<br />To musi być coś głupiego i prostego, ale ja tego nie widzę...  <img src="https://forum.atnel.pl/images/smilies/icon_rolleyes.gif" alt=":roll:" title="Udaje, że to nie on" /> <br /><br /><br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 26-12-2012<br /> *      Author: Administrator<br /> */<br /><br />// eLF2 Line Follower<br />// Atmega8    16MHz<br />// sosnus<br /><br />//********************************************************<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &lt;avr/interrupt.h&gt;<br /><br /><br /><br /><br />//##########   MAKRODEFINICJE LEDÓW   ##########<br /><br />// DIODA NIEBIESKA<br />#define BLUE_PIN (1&lt;&lt;PD7)// definicja pinu do którego podłączona jest dioda<br />#define BLUE_ON PORTD &amp;= ~BLUE_PIN// makrodefinicja – załączenie diody<br />#define BLUE_OFF PORTD |= BLUE_PIN// makrodefinicja – wyłączenie diody<br />#define BLUE_TOG PORTD ^= BLUE_PIN// makrodefinicja – zmiana stanu diody<br /><br />// DIODA CZERWONA LEWA<br />#define LRED_PIN (1&lt;&lt;PD4)// definicja pinu do którego podłączona jest dioda<br />#define LRED_ON PORTD &amp;= ~LRED_PIN// makrodefinicja – załączenie diody<br />#define LRED_OFF PORTD |= LRED_PIN// makrodefinicja – wyłączenie diody<br />#define LRED_TOG PORTD ^= LRED_PIN// makrodefinicja – zmiana stanu diody<br /><br />// DIODA ŻÓŁTA<br />#define YELLOW_PIN (1&lt;&lt;PD3)// definicja pinu do którego podłączona jest dioda<br />#define YELLOW_ON PORTD &amp;= ~YELLOW_PIN// makrodefinicja – załączenie diody<br />#define YELLOW_OFF PORTD |= YELLOW_PIN// makrodefinicja – wyłączenie diody<br />#define YELLOW_TOG PORTD ^= YELLOW_PIN// makrodefinicja – zmiana stanu diody<br /><br />// DIODA CZERWONA PRAWA<br />#define RRED_PIN (1&lt;&lt;PD2)// definicja pinu do którego podłączona jest dioda<br />#define RRED_ON PORTD &amp;= ~RRED_PIN// makrodefinicja – załączenie diody<br />#define RRED_OFF PORTD |= RRED_PIN// makrodefinicja – wyłączenie diody<br />#define RRED_TOG PORTD ^= RRED_PIN// makrodefinicja – zmiana stanu diody<br /><br /><br /><br />//##########   MAKRODEFINICJE PRZYCISKÓW   ##########<br /><br />#define MODE_DOWN_PIN (1&lt;&lt;PB5)//definicja klawisza SCK<br />#define START_PIN (1&lt;&lt;PB4)//definicja klawisza MISO<br />#define MODE_UP_PIN (1&lt;&lt;PB3)//definicja klawisza MOSI<br /><br /><br /><br />//##########   MAKRODEFINICJE SILNIKÓW   ##########<br />#define SILNIK_L OCR1A<br />#define SILNIK_P OCR1B<br /><br /><br />//########################################<br />//definicja napiecia referencyjnego<br />#define VREF 5.0<br /><br />//definicje wejść ADC<br /><br />#define wej_0 PC0<br />#define wej_1 PC1<br />#define wej_2 PC2<br />#define wej_3 PC3<br />#define wej_4 PC4<br />#define wej_5 PC5<br /><br />volatile uint8_t adc0;//zmienna do pomiaru ADC wej_0<br />volatile uint8_t adc1;//zmienna do pomiaru ADC wej_1<br />volatile uint8_t adc2;//zmienna do pomiaru ADC wej_2<br />volatile uint8_t adc3;//zmienna do pomiaru ADC wej_3<br />volatile uint8_t adc4;//zmienna do pomiaru ADC wej_4<br />volatile uint8_t adc5;//zmienna do pomiaru ADC wej_5<br /><br />volatile uint8_t wejscie=1;//zmienna do zmiany wejścia, początkowo pc2<br /><br />//##############################################################################<br /><br />// deklaracje zmiennych<br />uint8_t konfiguracja ;<br />int8_t czll, czl, czs, czp, czpp ;<br />int8_t delta_czujn, suma_czujn, roznica_pwm, delta_pwm, czujniki ;<br />uint8_t pocz_pwm ;<br />int granica ;<br />//##########   DEKLARACJE FUNKCJI   ##########<br /><br />uint8_t przycisk (uint8_t klawisz);// deklaracja funkcji obsługi klawiszy<br />void follow_the_line (void) ; // deklaracja funkcji jazdy<br />void pwm_ini(void);//deklaracja funkcji inicjalizacji pwm<br />void switch_ini(void);//deklaracja funkcji inicjalizacji przycisków<br />void led_ini(void) ; //deklaracja funkcji inicjalizacji ledów<br />void adc_ini(void) ; //deklaracja funkcji inicjalizacji przetwornika ADC<br /><br />int main(void)<br />{<br /><br />//##########   INICJALIZACJE   ##########<br />switch_ini();//inicjalizacja przycisków<br />led_ini();  //inicjalizacja ledów<br /><br />RRED_ON;<br />_delay_ms(50);<br />YELLOW_ON ;<br />_delay_ms(50) ;<br />LRED_ON;<br />_delay_ms(50);<br />RRED_OFF;<br />_delay_ms(50);<br />YELLOW_OFF ;<br />_delay_ms(50) ;<br />LRED_OFF;<br />_delay_ms(50);<br /><br />BLUE_ON ;<br />_delay_ms(200);<br />BLUE_OFF ;<br />_delay_ms(100);<br />BLUE_ON ;<br />_delay_ms(50);<br />BLUE_OFF ;<br />_delay_ms(100);<br />BLUE_ON ;<br />_delay_ms(50);<br />konfiguracja = 0 ;<br /><br /><br />pwm_ini();//inicjalizacja pwm<br />adc_ini();//inicjalizacja adc<br />sei();//Globalne uruchomienie przerwań<br /><br />// koniec inicjalizacji<br /><br />//########################################################<br />//####################                ####################<br />//####################   USTAWIENIA   ####################<br />//####################                ####################<br />//########################################################<br />/*<br />pocz_pwm    = 70 ;<br />granica     = 500 ;<br />roznica_pwm = 100  ;<br />*/<br />//########################################################<br /><br />//pomiar(1); //odczyt napięcia silników<br />/* OBLICZENIA STANU BATERII<br />  255 = 10Vodczyt - X<br />  127 = 5V       X            X=(odczyt*10V)/255<br />  0   = 0V   255 - 10V<br /><br />  7V -         X - napięcie<br />   6,5V -              X            X=(255*napięcie)/10<br />  6V -         255 - 10V<br /><br /><br /><br /> */<br /><br />//SILNIK_L = 0 ;<br />//SILNIK_P = 0 ;<br />konfiguracja = 1 ;<br /><br />while ( konfiguracja == 1 )  //TRYB KONFIGURACYJNY<br />  {<br />//badanie przycisków<br />if ( przycisk (MODE_UP_PIN) ) LRED_TOG ;<br />if ( przycisk (MODE_DOWN_PIN) ) RRED_TOG ;<br />if ( przycisk (MODE_DOWN_PIN) )<br />{<br />LRED_ON ;<br />_delay_ms(200);<br />LRED_OFF ;<br />_delay_ms(100);<br />LRED_ON ;<br />_delay_ms(50);<br />LRED_OFF ;<br />_delay_ms(100);<br />LRED_ON ;<br />_delay_ms(50);<br />konfiguracja = 0 ;<br />}<br />konfiguracja = 0 ;<br />  }  //koniec pętli konfiguracyjnej<br /><br />// jeżeli nacisnito na przycisk start, wchodzimy do pętli głównej<br />RRED_ON;<br />_delay_ms(50);<br />YELLOW_ON ;<br />_delay_ms(50) ;<br />LRED_ON;<br />_delay_ms(50);<br />RRED_OFF;<br />_delay_ms(50);<br />YELLOW_OFF ;<br />_delay_ms(50) ;<br />LRED_OFF;<br />_delay_ms(50);<br /><br /><br />    while ( 1 )// PĘTLA GŁÓWNA NIESKOŃCZONA<br />    {<br />    follow_the_line () ;<br /><br />    }// koniec pętli głównej nieskończonej :p<br /><br />}// koniec pętli main<br /><br /><br />//###DEFINICJE FUNKCJI<br /><br /><br />//###POMIAR ADC<br /><br />//######## definicje funkcji<br />void pwm_ini ()//definicja inicjalizacji PWM<br />{<br />// inicjalizacja PWM<br /> /* USTAWIANIE WYJŚĆ */<br />  DDRB |= (1&lt;&lt;PB1 | 1&lt;&lt;PB2);    //wyjścia pwm<br /><br />    /* INICJALIZACJA PWM - TIMER1 */<br /><br />TCCR1A |= (1&lt;&lt;WGM10);                      // Fast PWM 8bit<br />    TCCR1B |= (1&lt;&lt;WGM12);<br />    TCCR1A |= (1&lt;&lt;COM1A1)|(1&lt;&lt;COM1B1) ;        //Clear OC1A/OC1B on Compare Match, set OC1A/OC1B at BOTTOM<br />    TCCR1B |= (1&lt;&lt;CS10)|(1&lt;&lt;CS11);             // Preksaler = 64  fpwm = 976,5Hz<br /><br />    OCR1A = 0;         //kanał A = 0<br />    OCR1B = 0;         //kanał B = 0<br />}<br /><br />void switch_ini (void)//definicja inicjalizacji PWM<br />{<br />DDRB &amp;= ~(MODE_UP_PIN | MODE_DOWN_PIN | START_PIN );// kierunek pinów MISO, MOSI i SCK - wejściowy<br />PORTB |= (MODE_UP_PIN | MODE_DOWN_PIN | START_PIN );// podciągnięcie pinów do VCC<br />}<br /><br />void led_ini()//definicja inicjalizacji ledów<br />{<br />DDRD|= LRED_PIN;// kierunek pinu PC7 – wyjściowy<br /><br />DDRD|= RRED_PIN;// kierunek pinu PC7 – wyjściowy<br /><br />DDRD|= YELLOW_PIN;// kierunek pinu PC7 – wyjściowy<br /><br />DDRD|= BLUE_PIN;// kierunek pinu PC7 – wyjściowy<br /><br />}<br /><br />uint8_t przycisk(uint8_t klawisz)//definicja obsługi  przycisków<br />{<br />if( ! (PINB &amp; klawisz ) )// klawisz wciśnięty ?<br />{<br />_delay_ms(80);// czas drgań styków<br />if( ! (PINB &amp; klawisz ) )<br />{<br />return 1;   // jeśli wciśnięty?  zakończ funkcję - rezultat = 1<br />}<br />}<br /><br />return 0;// jeśli nie wciśnięty klawisz, zakończ funkcję, rezultat = 0<br />}<br /><br />void adc_ini()<br />{<br />ADCSRA = (1&lt;&lt;ADEN)      // ADC Enable (uruchomienie przetwornika)<br />             |(1&lt;&lt;ADFR)      //tryb Free run<br />             |(1&lt;&lt;ADSC)      //rozpoczęcie konwersji<br />             |(1&lt;&lt;ADPS2);   //ADPS2: (ustawienie preskalera) preskaler= 16<br /><br />   ADMUX  =   (1&lt;&lt;ADLAR)     //Wyrównanie wyniku do lewej<br />             |(1&lt;&lt;REFS0)            //VCC jako napięcie referencyjne<br />             |wejscie;   //Wybór wejścia początkowego czyli PC2<br /><br />   //Inicjalizacja Timera<br />   TIMSK |= (1&lt;&lt;TOIE0) | (1&lt;&lt;TOIE1); //Przerwanie overflow przepełnienie timera<br />   TCCR0 |= (1&lt;&lt;CS01); // źródłem CLK, preskaler 8 (2000000 Hz)<br />   TCNT0 = 155; //Początkowa wartość licznika<br /><br /><br />   DDRC &amp;=~ (1&lt;&lt;wej_0);<br />   DDRC &amp;=~ (1&lt;&lt;wej_1);        //Ustawienie pinów wejściowych ADC<br />   DDRC &amp;=~ (1&lt;&lt;wej_2);        //Ustawienie pinów wejściowych ADC<br />   DDRC &amp;=~ (1&lt;&lt;wej_3);        //Ustawienie pinów wejściowych ADC<br />   DDRC &amp;=~ (1&lt;&lt;wej_4);        //Ustawienie pinów wejściowych ADC<br />   DDRC &amp;=~ (1&lt;&lt;wej_5);<br />}<br /><br />void follow_the_line ()<br />{<br />//adc1 = czll ;adc2 = czl ;adc3 = czs ;adc4 = czp ;adc5 = czpp ; jednak nieprzydatne<br />if ( adc1 &lt; granica)  { czll = -2 ; czujniki++ ; }<br />if ( adc2 &lt; granica)  { czl  = -1 ; czujniki++ ; }<br />if ( adc3 &lt; granica)  { czs  =  0 ; czujniki++ ; }<br />if ( adc4 &lt; granica)  { czp  =  1 ; czujniki++ ; }<br />if ( adc5 &lt; granica)  { czpp =  2 ; czujniki++ ; }<br /><br />suma_czujn  = czll + czl + czs + czp + czpp ;<br />delta_czujn = suma_czujn  / czujniki ;<br />delta_pwm   = delta_czujn * roznica_pwm ;<br /><br />SILNIK_L = pocz_pwm + delta_pwm ;<br />SILNIK_P = pocz_pwm - delta_pwm ;<br /><br />// debugger<br />if ( delta_czujn == 0)<br />{<br />RRED_OFF ;<br />YELLOW_ON ;<br />LRED_OFF ;<br />}<br />else if ( delta_czujn &gt; 0)<br />{<br />RRED_ON ;<br />YELLOW_ON ;<br />LRED_OFF ;<br />}<br />else if ( delta_czujn &lt; 0)<br />{<br />RRED_OFF ;<br />YELLOW_OFF ;<br />LRED_ON ;<br />}<br /><br /><br />//zerowanie<br />czujniki = 0 ;<br />    czll = 0 ;<br />    czl  = 0 ;<br />    czs  = 0 ;<br />    czp  = 0 ;<br />    czpp = 0 ;<br /><br />}<br /><br />ISR(TIMER0_OVF_vect)<br />{<br />   switch(wejscie)<br />   {<br /><br />      case 1://gdy PC1<br />        adc1=ADCH;     //odczytaj tylko starszy bajt pomiaru<br />        break;<br />      case 2://gdy PC2<br />        adc2=ADCH;     //odczytaj tylko starszy bajt pomiaru<br />        break;<br /><br />      case 3://gdy PC3<br />        adc3=ADCH;     //odczytaj tylko starszy bajt pomiaru<br />        break;<br /><br />      case 4://gdy PC4<br />        adc4=ADCH;     //odczytaj tylko starszy bajt pomiaru<br />        break;<br /><br />      case 5://gdy PC5<br />        adc5=ADCH;     //odczytaj tylko starszy bajt pomiaru<br />        break;<br />   }<br /><br />   if(wejscie&lt;5)<br />        wejscie++;<br />   else<br />        wejscie=1;<br /><br />   ADMUX = 0;  //kasowanie rejestru<br /><br />   ADMUX  =   (1&lt;&lt;ADLAR) |(1&lt;&lt;REFS0)| wejscie; //Ustawianie nowych wartości<br /><br />   TCNT0 = 155;  //Początkowa wartość licznika<br />}<br />[/syntax]<br /><br /><br />Z obserwacji ledów mam wrażenie, że w kółko wykonuje się ta część programu:<br />[syntax=c]<br /><br />RRED_ON;<br />_delay_ms(50);<br />YELLOW_ON ;<br />_delay_ms(50) ;<br />LRED_ON;<br />_delay_ms(50);<br />RRED_OFF;<br />_delay_ms(50);<br />YELLOW_OFF ;<br />_delay_ms(50) ;<br />LRED_OFF;<br />_delay_ms(50);<br /><br />BLUE_ON ;<br />_delay_ms(200);<br />BLUE_OFF ;<br />_delay_ms(100);<br />BLUE_ON ;<br />_delay_ms(50);<br />BLUE_OFF ;<br />_delay_ms(100);<br />BLUE_ON ;<br />_delay_ms(50);<br />konfiguracja = 0 ;<br />[/syntax]<br /><br /><br />PS Proszę się nie śmiać z mojego algorytmu jazdy. To jest mój autorski pomysł na wykrywanie linii, jeszcze nie sprawdzony w praktyce, sam jestem ciekaw czy to zadziała.   <img src="https://forum.atnel.pl/images/smilies/icon_lol.gif" alt=":lol:" title="Śmieje się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=364">sosnus</a> — 29 gru 2012, o 21:51</p><hr />
]]></content>
</entry>
</feed>