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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=14100&amp;mode</id>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2016-01-09T13:18:18+01:00</updated>
<published>2016-01-09T13:18:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=150040#p150040</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=150040#p150040"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=150040#p150040"><![CDATA[
<div class="quotetitle">natalia4646 napisał(a):</div><div class="quotecontent"><br />A te diody to nie wiem dlaczego się tak słabo świecą, coś jest źle.. :/<br /></div><br />Jak masz taki problem to tylko dla tej części sprzętu napisz sobie najprostszy program. Pokaż schemat itd. Programowanie to w gruncie rzeczy składanie czegoś większego z klocków. Najprościej na początek sprawdzić sobie coś, a potem lecieć dalej z kolejnym kawałkiem. Na koniec składasz wszystko.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 9 sty 2016, o 13:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[natalia4646]]></name></author>
<updated>2016-01-08T19:57:10+01:00</updated>
<published>2016-01-08T19:57:10+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=150002#p150002</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=150002#p150002"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=150002#p150002"><![CDATA[
aaaaj powinno być ADCSRA |= (1&lt;&lt;ADSC); <br />tak? Teraz dodam do rejestru ADCSRA (i jego wszyskich skonfigurowanych uprzednio bitów) ADSC =1 , i rozpocznie się konwersja. <br />A te diody to nie wiem dlaczego się tak słabo świecą, coś jest źle.. :/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12396">natalia4646</a> — 8 sty 2016, o 19:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2016-01-08T16:00:55+01:00</updated>
<published>2016-01-08T16:00:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149972#p149972</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149972#p149972"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149972#p149972"><![CDATA[
<div class="quotetitle">natalia4646 napisał(a):</div><div class="quotecontent"><br />[syntax=c]ADCSRA &amp;= (1&lt;&lt;ADSC);[/syntax]<br /></div><br />Zakładam, że chcesz uruchomić start konwersji. To oznacza, że należy ustawić bit ADSC, a pozostałe pozostawić bez zmian tymczasem taka konstrukcja zrobi nie to co powinna:<br />[syntax=c]ADCSRA &amp;= (1&lt;&lt;ADSC); <br />ADCSRA = ADCSRA &amp; (1&lt;&lt;ADSC);<br />ADCSRA = ADCSRA &amp; (1&lt;&lt;6); //ADSC to 6<br />ADCSRA = ADCSRA &amp; 0b0100000; //&amp; - bitowy operator iloczynu logicznego. Bit po bicie wykonuje się iloczyn i tworzy końcowy wynik<br />//czyli gdy ADCSRA jest równe 0bx1xxxxxx, x - bez znaczenia da w wyniku 0b01000000<br />//gdy ADCSRA jest równe 0bx0xxxxxx, x - bez znaczenia da w wyniku 0b00000000[/syntax]<br />Jest tu tak samo jak ze sterowaniem wyjściami portu i należy to sobie poćwiczyć celem utrwalenia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 8 sty 2016, o 16:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[natalia4646]]></name></author>
<updated>2016-01-08T00:42:56+01:00</updated>
<published>2016-01-08T00:42:56+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149935#p149935</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149935#p149935"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149935#p149935"><![CDATA[
Dziękuję bardzo za Wasze uwagi i wyjaśnienia, bardzo mi pomogły <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> poprawiłam i diody teraz świecą, ale bardzo słabiutko, ogólnie zauważyłam że kiedy korzystam z przerwań to światło diody jest ledwo widoczne, jaki wpływ mają przerwania na jasność świecenia diody? co robię nie tak? Kod poprawionego programu: <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 />#include &lt;stdlib.h&gt;    <br /><br />#define sensor1 PA1     //  ADC input1 of sensor1<br />#define sensor2 PA2//  ADC input2 of sensor2<br />#define sensor3 PA3//  ADC input3 of sensor3<br /><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 /><br />volatile uint8_t input = 2;//zmienna do zmiany wejscia adc, poczatkowo PA2  <br />volatile unsigned int AverageADCH;<br />volatile char flag;//flaga przerwania<br /><br /><br />void adc_timer0_init(void)<br />{<br />ADMUX |= (0&lt;&lt;REFS1)|(1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR)| input;//AVCC with external capacitor at AREF pin, left adjust result; initial input - PA2<br />ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADSC);//ADC enable<br />ADCSRA |= (0&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0);//prescaler 8, czêstotliwosc probkowania 9,6 KHz<br /><br />//ADCSRB |= (0&lt;&lt;ADTS2)|(1&lt;&lt;ADTS1)|(0&lt;&lt;ADTS0);//free running mode <br /><br /><br />TIMSK0 = (1&lt;&lt;TOIE0); //Timer/Counter0 Overflow Interrupt Enable<br />TCCR0B= (1&lt;&lt;CS01); // prescaler 8<br />//TIFR0 = (1&lt;&lt;TOV0); //Timer Overflow Flag<br />TCNT0 = 155;//poczatkowa wartosc timera<br /><br />DDRA &amp;= ~(1&lt;&lt;sensor1);        //Ustawienie pinów wejsciowych ADC - sensor1 PA1<br />DDRA &amp;= ~(1&lt;&lt;sensor2);        //Ustawienie pinów wejsciowych ADC - sensor2 PA2<br />DDRA &amp;= ~(1&lt;&lt;sensor3);        //Ustawienie pinów wejsciowych ADC - sensor3 PA3<br />}<br /><br /><br />   <br />int main(void) <br />{<br /><br />DDRD = 0x00001110;    //Ustawienie wyjsc dla diod - testowanie<br /><br />adc_timer0_init();<br />sei(); //globalne uruchomienie przerwañ<br /><br />while(1) {<br /><br />if (flag) {<br />ADCSRA &amp;= (1&lt;&lt;ADSC);<br />switch(input)  <br />{  <br />case 1://gdy PA1  <br />adc1=AverageADCH;     //odczytaj srednia z 8 pomiarow  <br /><br />PORTD &amp;= ~(1&lt;&lt;PD3);//wylacz diode 3<br />PORTD |=(1&lt;&lt;PD1);//wlacz diode 1<br />_delay_ms(1000);<br /><br />flag = 0;<br />break;  <br /><br />case 2://gdy PA2  <br />adc2=AverageADCH;     //odczytaj srednia z 8 pomiarow   <br /><br />PORTD &amp;= ~(1&lt;&lt;PD1);;//wylacz diode 1<br />PORTD |=(1&lt;&lt;PD2);//wlacz diode 2<br />_delay_ms(1000);<br /><br />flag = 0;<br />break;  <br /><br />case 3://gdy PA3  <br />adc3=AverageADCH;     //odczytaj srednia z 8 pomiarow   <br /><br />PORTD &amp;= ~(1&lt;&lt;PD2);//wylacz diode 2<br />PORTD |=(1&lt;&lt;PD3);//wlacz diode 3<br />_delay_ms(1000);<br /><br />flag = 0;<br />break;  <br />}  <br />  <br />if(input&lt;4)  //przejdz do kolejnego case'a - przelacz na kolejny kanal ADC<br />input++;  <br />else  <br />input=1;<br />}<br />}<br />}<br /><br /><br />ISR(TIMER0_OVF_vect)//przerwanie od przepelnienia timera0<br />{            <br />static uint8_t number=0; //liczba dotychczasowych pomiarow<br />static uint16_t SumADCH=0; //suma pomiarów ADC<br />AverageADCH=0;<br /><br />if(number != 7) <br />{<br />SumADCH += ADCH; <br />number++;<br />}<br />else <br />{<br />AverageADCH = (SumADCH/8); <br />ADMUX = 0; //kasowanie rejestru ADMUX<br />ADMUX |= (0&lt;&lt;REFS1)|(1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR)|(1&lt;&lt;input); //ustawienie wartosci ADMUX<br />TCNT0 = 155;//poczatkowa wartosc timera<br /><br />flag = 1; <br />}<br />}[/syntax]<br /><br />Wieem muszę się podszkolić troche odnośnie ADC, przewertowałam moją ulubioną niebieską książkę Pana Mirka, a poradniki po troszku, ale większość przede mną. Ale bardzo mi zależy na Waszej pomocy również  <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=12396">natalia4646</a> — 8 sty 2016, o 00:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-01-07T21:25:06+01:00</updated>
<published>2016-01-07T21:25:06+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149921#p149921</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149921#p149921"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149921#p149921"><![CDATA[
Obejrzyj ten <!-- m --><a class="postlink" href="http://mirekk36.blogspot.com/2013/06/przetwornik-adc-w-avr-dla-poczatkujacych.html" >http://mirekk36.blogspot.com/2013/06/pr ... acych.html</a><!-- m --><br />i resztę poradników o ADC. Wiele ci się wyjaśni.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 7 sty 2016, o 21:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2016-01-07T19:48:50+01:00</updated>
<published>2016-01-07T19:48:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149908#p149908</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149908#p149908"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149908#p149908"><![CDATA[
<div class="quotetitle">natalia4646 napisał(a):</div><div class="quotecontent"><br />W jaki sposób wykonać w moim programie ręczne wyzwolenie ADC?<br /></div><br />Należy ustawić bit ADSC - ADC Start Conversion w rejestrze ADCSRA. Robisz to zresztą na starcie, ale w każdym przerwaniu timera należy ponowić ustawianie tego bitu, ale dopiero na końcu, gdy już kanał jest przestawiony.<br /><br /><div class="quotetitle">natalia4646 napisał(a):</div><div class="quotecontent"><br />[syntax=c]PORTD =(0&lt;&lt;PD3);                //wylacz diode 3<br />PORTD =(1&lt;&lt;PD1);                //wlacz diode 1[/syntax]<br /></div><br />Tak nie rób. 0 &lt;&lt; x daje 0 i PORTD = 0 wyzeruje cały port, aby wyzerować tylko jeden bit/pin używa się takiej konstrukcji:<br />[syntax=c]PORTD &amp;= ~(1&lt;&lt;PD3);[/syntax]<br />Co jest równoważne z  PORTD = PORTD &amp; 0b11110111. 0 &lt;&lt; x jest nieprzydatne bo to zawsze 0<br />Ustawianie wybranego bitu bez wyzerowania pozostałych to:<br />[syntax=c]PORTD |=(1&lt;&lt;PD1); [/syntax]<br />Więcej takich pomocnych rad znajdziesz na blogu Mirka<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 7 sty 2016, o 19:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[natalia4646]]></name></author>
<updated>2016-01-07T19:00:49+01:00</updated>
<published>2016-01-07T19:00:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149902#p149902</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149902#p149902"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149902#p149902"><![CDATA[
Okej, faktycznie, nanoszę poprawki do kodu. Tylko nie rozumiem jednej rzeczy, w jaki sposób wyzwolić ręcznie ADC? Czy moja flaga, którą sama sobie zadeklarowałam i używam do wejścia / wyjścia z przerwania, ma odniesienie do bitów ADIF i ADIE w rejestrze ADCSRA? <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />• Bit 4 – ADIF: ADC Interrupt Flag<br />This bit is set when an ADC conversion completes and the Data Registers are updated. The ADC Conversion<br />Complete Interrupt is executed if the ADIE bit and the I-bit in SREG are set. ADIF is cleared by hardware when<br />executing the corresponding interrupt handling vector. Alternatively, ADIF is cleared by writing a logical one to<br />the flag. Beware that if doing a Read-Modify-Write on ADCSRA, a pending interrupt can be disabled. This also<br />applies if the SBI and CBI instructions are used.<br />• Bit 3 – ADIE: ADC Interrupt Enable<br />When this bit is written to one and the I-bit in SREG is set, the ADC Conversion Complete Interrupt is activated.<br /></div><br /><br />W jaki sposób wykonać w moim programie ręczne wyzwolenie ADC? Czy powinnam zrobić coś w stylu pętli while(ADCSRA &amp; (1&lt;&lt;ADSC)) w każdym case? A gdzie miejsce na odczyt flagi za pomocą ADIF? Czy to jest zbędne? Pewnie to herezja jakaś co mówię <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12396">natalia4646</a> — 7 sty 2016, o 19:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2016-01-07T13:03:08+01:00</updated>
<published>2016-01-07T13:03:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149877#p149877</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149877#p149877"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149877#p149877"><![CDATA[
Wirtam.<br /><br />Po przejrzeniu kodu kilka rzeczy rzuciło mi się w oczy.<br /><br />W przerwaniu timera zmienne number i SumADCH to zmienne lokalne, które na początku każdego przerwania będą miały wartość zero.<br />Warunek<br />[syntax=c]if(number != 7)<br />{<br />       SumADCH += ADCH;<br />       number++;<br />}[/syntax]<br />się spełni bo number==0. Program przypisze wartość ADCH do SumADCH i zwiększy wartość number o jeden. Ale w następnym przerwaniu zmienne number i SumADCH znów będą miały wartość zero. Kod po else nigdy się nie wykona. A tym samym zmienna flag nigdy nie przyjmie wartości równej jeden i cały kod w pętli while w warunku if(flag) się nie wykona. Dlatego diody się nie świecą.<br /><br />Zmienne number i SumADCH powinny być statyczne. Wtedy będą widoczne tylko w przerwaniu ale zachowają swoje wartości po wyjściu z przerwania. Tak jak zmienne globalne.<br />[syntax=c]ISR(TIMER0_OVF_vect)//przerwanie od przepelnienia timera0<br />{            <br />        static uint8_t number=0; //liczba dotychczasowych pomiarow<br />        static uint16_t SumADCH=0; //suma pomiarów ADC<br />}[/syntax]<br /><br />Jeśli chcesz mierzyć napięcie na kilku kanałach to lepiej na początek zrezygnuj z trybu Free Running i zastosuj najzwyklejszy tryb z ręcznym wyzwalaniem pomiaru. W trybie Free Running przełączanie kanałów jest troszkę bardziej skomplikowane.<br /><br />Wybór kanałów też masz błędny.<br />Jeśli zmienna input będzie miała wartość np. 2 to tą linią kodu<br />[syntax=c]ADMUX |= (0&lt;&lt;REFS1)|(1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR)|(1&lt;&lt;input);[/syntax]<br />wybierzesz kanał ADC4 a nie ADC2.<br />Kanał ADC2 to takie ustawienie rejestru ADMUX 0b00000010. A ta linia ustawi trzeci bit w ADMUX czyli 0b00000100. A to jest kanał ADC4. <br />Jeśli zmienna input przyjmuje wartości 1, 2 i 3 to zamiast kanałów ADC1 (0b00000001), ADC2 (0b00000010) i ADC3 (0b00000011) wybierasz ADC2 (0b00000010), ADC4 (0b00000100) i pomiar różnicowy na ADC0 i ADC0 (0b00001000).<br /><br />Wybór kanału powinie wyglądać tak, bez przesunięcia bitowego<br />[syntax=c]ADMUX |= (0&lt;&lt;REFS1)|(1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR)| input;[/syntax]<br />Teraz jeśli input będzie równe 2 to rejestr ADMUX zostanie ustawiony tak 0b00000010. Oczywiście w tym przykładzie pominąłem ustawienie trzech starszych bitów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 7 sty 2016, o 13:03</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[natalia4646]]></name></author>
<updated>2016-01-07T01:31:23+01:00</updated>
<published>2016-01-07T01:31:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149866#p149866</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149866#p149866"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149866#p149866"><![CDATA[
sorry faktycznie powinno być DDRD=0x00001110; ale zmieniłam i nadal nie działa ;/<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12396">natalia4646</a> — 7 sty 2016, o 01:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[eMCe2]]></name></author>
<updated>2016-01-06T22:15:59+01:00</updated>
<published>2016-01-06T22:15:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149851#p149851</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149851#p149851"/>
<title type="html"><![CDATA[Re: Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149851#p149851"><![CDATA[
Ustawiasz jako wyjściowe PD4, PD5, i PD6 a sterować chcesz PD1, PD2 i PD3... To gdzie te diody są?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1363">eMCe2</a> — 6 sty 2016, o 22:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[natalia4646]]></name></author>
<updated>2016-01-06T14:01:01+01:00</updated>
<published>2016-01-06T14:01:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149789#p149789</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149789#p149789"/>
<title type="html"><![CDATA[Atmega644PA - Obsługa przerwania, multipleksowanie ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=14100&amp;p=149789#p149789"><![CDATA[
Hej <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br /><br />Chcę podłączyć 3 czujniki odległości do kanałów ADC (porty PA1, PA2, PA3) i odczytywać z nich pomiary przez cały czas. Ponieważ po przetestowaniu czujników doszłam do wniosku że pewne czynniki wpływają na niestabilność pomiaru, chcę jako ostateczny wynik wziąć średnią arytmetyczną z 8 pomiarów przeprowadzonych w trakcie jednego cyklu pomarowego (mam nadzieję że dobrze się wyrażam <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />). Zatem włączyłam obsługę przerwań, i w przerwaniu taki proces zdefiniowałam. Przerwanie włącza się po przepełnieniu timera, flaga jest ustawiona na 0. Po dokonaniu sumowania i obliczeniu średniej następuje kasowanie i ustawienie od nowa rejestru ADMUX, powrót do poczatkowej wartości licznika i ustawienie flagi na 1 czyli wyjście z przerwania. W mainie przypisuję obliczoną średnią do zmiennej jako ostateczny wynik i przechodzę do kolejnego kanału, ustawiając flagę na 0 czyli wykonując kolejne przerwanie, itd. Aby sprawdzić czy faktycznie następuje multipleksowanie, w każdym case włączam kolejno diody. Tylko że te diody mi się nie świecą wcale <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> <br /><br />No i tu pytanie, czy coś robię mega źle? Nie wiem też czy ustawiłam częstotliwość próbkowania ADC i timera0 odpowiednio do 1MHz taktowania procesora. W ogóle, czy takie rozwiązanie ma sens <img src="https://forum.atnel.pl/images/smilies/icon_question.gif" alt=":?:" title="Znak zapytania" /> Bardzo proszę o pomoc :* <br />Kod poniżej: <br /><br /><div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br /><span style="color: #FF0000"><strong><em><span style="font-size: 150%; line-height: normal">#define F_CPU 1000000</span></em></strong> //czêstotliwoœc oscylatora na 1MHz &lt;---- tego NIGDY nie piszemy w kodzie .... a szczególnie na tym forum, bardzo o to proszę - mirekk36 ok?</span><br /></div><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 />#include &lt;stdlib.h&gt;    <br /><br />#define sensor1 PA1     //  ADC input1 of sensor1<br />#define sensor2 PA2//  ADC input2 of sensor2<br />#define sensor3 PA3//  ADC input3 of sensor3<br /><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 /><br />volatile uint8_t input = 2;//zmienna do zmiany wejscia adc, poczatkowo PA2  <br />volatile unsigned int AverageADCH;<br />volatile char flag;//flaga przerwania<br /><br /><br />void adc_timer0_init(void)<br />{<br />ADMUX |= (0&lt;&lt;REFS1)|(1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR)|(1&lt;&lt;input);//AVCC with external capacitor at AREF pin, left adjust result; initial input - PA2<br />ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADSC);//ADC enable<br />ADCSRA |= (0&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0);//prescaler 8, czêstotliwosc probkowania 9,6 KHz<br /><br />ADCSRB |= (0&lt;&lt;ADTS2)|(0&lt;&lt;ADTS1)|(0&lt;&lt;ADTS0);//free running mode <br /><br /><br />TIMSK0 = (1&lt;&lt;TOIE0); //Timer/Counter0 Overflow Interrupt Enable<br />TCCR0B= (1&lt;&lt;CS01); // prescaler 8<br />//TIFR0 = (1&lt;&lt;TOV0); //Timer Overflow Flag<br />TCNT0 = 155;//poczatkowa wartosc timera<br /><br />DDRA &amp;= ~(1&lt;&lt;sensor1);        //Ustawienie pinów wejsciowych ADC - sensor1 PA1<br />DDRA &amp;= ~(1&lt;&lt;sensor2);        //Ustawienie pinów wejsciowych ADC - sensor2 PA2<br />DDRA &amp;= ~(1&lt;&lt;sensor3);        //Ustawienie pinów wejsciowych ADC - sensor3 PA3<br />}<br /><br /><br />   <br />int main(void) <br />{<br /><br />DDRD = 0x01110000;    //Ustawienie wyjsc dla diod - testowanie<br /><br />adc_timer0_init();<br />sei(); //globalne uruchomienie przerwañ<br /><br />while(1) {<br /><br />if (flag) {<br />switch(input)  <br />{  <br />case 1://gdy PA1  <br />adc1=AverageADCH;     //odczytaj srednia z 8 pomiarow  <br /><br />PORTD =(0&lt;&lt;PD3);//wylacz diode 3<br />PORTD =(1&lt;&lt;PD1);//wlacz diode 1<br /><br />flag = 0;<br />break;  <br /><br />case 2://gdy PA2  <br />adc2=AverageADCH;     //odczytaj srednia z 8 pomiarow   <br /><br />PORTD= (0&lt;&lt;PD1);//wylacz diode 1<br />PORTD =(1&lt;&lt;PD2);//wlacz diode 2<br /><br />flag = 0;<br />break;  <br /><br />case 3://gdy PA3  <br />adc3=AverageADCH;     //odczytaj srednia z 8 pomiarow   <br /><br />PORTD =(0&lt;&lt;PD2);//wylacz diode 2<br />PORTD =(1&lt;&lt;PD3);//wlacz diode 3<br /><br />flag = 0;<br />break;  <br />}  <br />  <br />if(input&lt;4)  //przejdz do kolejnego case'a - przelacz na kolejny kanal ADC<br />input++;  <br />else  <br />input=1;<br />}<br />}<br />}<br /><br /><br />ISR(TIMER0_OVF_vect)//przerwanie od przepelnienia timera0<br />{            <br />unsigned int number=0; //liczba dotychczasowych pomiarow<br />unsigned int SumADCH=0; //suma pomiarów ADC<br />AverageADCH=0;<br /><br />if(number != 7) <br />{<br />SumADCH += ADCH; <br />number++;<br />}<br />else <br />{<br />AverageADCH = (SumADCH/8); <br />ADMUX = 0; //kasowanie rejestru ADMUX<br />ADMUX |= (0&lt;&lt;REFS1)|(1&lt;&lt;REFS0)|(1&lt;&lt;ADLAR)|(1&lt;&lt;input); //ustawienie wartosci ADMUX<br />TCNT0 = 155;//poczatkowa wartosc timera<br /><br />flag = 1; <br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=12396">natalia4646</a> — 6 sty 2016, o 14:01</p><hr />
]]></content>
</entry>
</feed>