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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2012-11-08T17:48:34+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=1728&amp;mode</id>
<entry>
<author><name><![CDATA[senso]]></name></author>
<updated>2012-10-31T19:39:28+01:00</updated>
<published>2012-10-31T19:39:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17974#p17974</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17974#p17974"/>
<title type="html"><![CDATA[Re: ADC-problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17974#p17974"><![CDATA[
w nocie katalogowej na stronie 256 są rozpisane odpowiednio MUXy.<br />Mamy od MUX0 do MUX4 jesli MUX4 i MUX3 mamy ustawione na 1 to mamy Positive Differential Input(druga kolumna na zdjęciu)<br />jeśli MUX4 i MUX3 byłyby ustawione na 0 to wtedy mamy Single Ended Input (pierwsza kolumna)<br /><br />nie wiem jaka jest różnica pomiędzy nimi<br />poniżej tabeli jest napisane:<br />The differential input channels are not tested for devices in PDIP Package. This feature is only<br />guaranteed to work for devices in TQFP and VQFN/QFN/MLF Packages<br /><br />oto zdjęcie :<br /><!-- m --><a class="postlink" href="https://dl.dropbox.com/u/27190918/MUX.png" >https://dl.dropbox.com/u/27190918/MUX.png</a><!-- m --><br /><br />zlożylem kod i mi nie działa, pewnie zle zczytuje z tablicy<br />aha zmienilem na dwa wejścia ADC zeby bylo latwiej<br /><br />[syntax=c]<br /><br />#include &lt;avr\io.h&gt;<br />#include &lt;avr\interrupt.h&gt;<br />#include &lt;util\delay.h&gt;<br /><br />volatile uint8_t wyniki[256];<br /><br />#define ADC_0 (wyniki[0xF8])<br />#define ADC_1 (wyniki[0xF9])<br /><br /><br />ISR(ADC_vect);<br /><br />int main(void)<br />{<br />DDRC = 0x0F;<br />PORTC = 0xFF;<br />DDRA = 0x00;<br />PORTA = 0x00;<br /><br />ADCSRA |= ((1&lt;&lt;ADPS0)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS2));<br />ADMUX |= ((1&lt;&lt;REFS1)|(1&lt;&lt;REFS0));//2,56<br /><br />ADMUX |= (1&lt;&lt;ADLAR);<br />ADCSRA |= ((1&lt;&lt;ADIE)|(1&lt;&lt;ADEN));<br />      //ADC dzia³¹ gdy 1<br />//start conversion<br />sei();<br />ADCSRA |= ((1&lt;&lt;ADATE)|(1&lt;&lt;ADSC));<br /><br />while(1)<br />{<br />if((ADC_0 &gt; 200) )<br />{<br />PORTC &amp;=~(1&lt;&lt;0);<br />}<br />else PORTC |= (1&lt;&lt;0);<br /><br />if((ADC_1 &lt; 100) )<br />{<br />PORTC &amp;=~(1&lt;&lt;1);<br />}<br />else PORTC |= (1&lt;&lt;1);<br />}<br />}<br /><br /><br />ISR(ADC_vect)<br />{<br />register uint8_t mux = ADMUX &amp; 0xF8;<br />wyniki[ mux++ ] = ADCH;<br />ADMUX = (ADMUX &amp; 0xF8) | (mux &amp; 0x01);<br /><br />}<br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=452">senso</a> — 31 paź 2012, o 19:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-31T19:06:41+01:00</updated>
<published>2012-10-31T19:06:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17971#p17971</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17971#p17971"/>
<title type="html"><![CDATA[Re: ADC-problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17971#p17971"><![CDATA[
<div class="quotetitle">senso napisał(a):</div><div class="quotecontent"><br />ok prawie wszystko rozumiem.<br />Ostatnia sprawa, w mojej wersji ostatni pomiar musiał mieć odnośnik do pierwszego aby to zapętlić.<br />Czy tutaj też tak nie trzeba zrobić?<br />Ustalam muxa, wpisuje wartość do ADCH, i następnie zwiększam go o 1 i wpisuje do ADMUX, tak aż bedzie wartość ADMUX = 0xFF.<br /></div><br /><br />Zwróć uwagę że (mux &amp; 0x07) powoduje zapętlenie się licznika kanałów dokładnie w zakresie od 0 do 7 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> ... przecież jak wartość z 7 zwiększy się na 8 i zamaskujemy 5 starszych bitów - to do mux trafi 0 a nie 8 ... Ten sam sposób (trick) masz opisany i wykorzystany w książce podczas obsługi buforów cyklicznych przy obsłudze UART <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><br /><div class="quotetitle">senso napisał(a):</div><div class="quotecontent"><br />Czy po zakończonym procesie, sam ponownie pobierze wartość z rejestru ADMUX = 0xF8 aby zapętlić pomiary?<br /></div><br />Dlaczego po skończonym procesie - przecież przy każdym wejściu w przerwanie masz<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">mux = ADMUX &amp; 0xF8;</div><br /><br />czyli właśnie pobranie tylko 3 najmłodszych bitów w których trzymane są numery kanałów od 0 do 7<br /><br /><div class="quotetitle">senso napisał(a):</div><div class="quotecontent"><br />AHA Panie Mirku dlaczego proponuje Pan tutaj stosowanie Positive Differential Input zamiast Single Ended Input?.<br /></div><br /><br />A skąd wynika to co napisałeś - nie rozumiem gdzie ja ci to proponuję ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 31 paź 2012, o 19:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[senso]]></name></author>
<updated>2012-10-31T17:43:35+01:00</updated>
<published>2012-10-31T17:43:35+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17970#p17970</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17970#p17970"/>
<title type="html"><![CDATA[Re: ADC-problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17970#p17970"><![CDATA[
ok prawie wszystko rozumiem.<br />Ostatnia sprawa, w mojej wersji ostatni pomiar musiał mieć odnośnik do pierwszego aby to zapętlić.<br />Czy tutaj też tak nie trzeba zrobić?<br />Ustalam muxa, wpisuje wartość do ADCH, i następnie zwiększam go o 1 i wpisuje do ADMUX, tak aż bedzie wartość ADMUX = 0xFF.<br />Czy po zakończonym procesie, sam ponownie pobierze wartość z rejestru ADMUX = 0xF8 aby zapętlić pomiary?<br /><br />AHA Panie Mirku dlaczego proponuje Pan tutaj stosowanie Positive Differential Input zamiast Single Ended Input?<br />Przepraszam za tyle pytań, ale chciałbym dobrze zrozumieć temat.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=452">senso</a> — 31 paź 2012, o 17:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-31T14:42:26+01:00</updated>
<published>2012-10-31T14:42:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17960#p17960</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17960#p17960"/>
<title type="html"><![CDATA[Re: ADC-problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17960#p17960"><![CDATA[
W książce w rozdziale związanym z multipleksowaniem wyświetlaczy LED dokładnie opisuję i to praktycznie dokładnie takie samo maskowanie <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />[syntax=c]ADMUX = (ADMUX &amp; 0xF8) | (mux &amp; 0x07);[/syntax]<br /><br />nie będę więc teraz tutaj tego tak dokładnie opisywał ale spróbuj popatrzeć na to tak:<br /><br />1. musisz do rejestru wpisać kolejny numer kanału, ty robisz to co chwilę za pomocą linii typu:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">ADMUX = 0b11100010;  </div><br /><br />nadpisując bity REFS1, REFS2 i ADLAR - a po co ??? gdyby nagle przyszło ci zmodyfikować działanie ADC to musiałbyś poprawiać TYLE linii, a można tych bitów przecież w ogóle nie &quot;DOTYKAĆ&quot;, dlatego najpierw popatrz na to<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">(ADMUX &amp; 0xF8)</div><br /><br />co tu robimy - maskujemy wszystkie bity poza 3 najmłodszymi które zerujemy (to w nich ustala się numer kanału tak?) <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, potem druga część:<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">(mux &amp; 0x07)</div><br /><br />tu z kolei robimy odwrotną maskę, zerujemy wszystkie bity poza trzema pierwszymi z numerem kanału<br /><br />i teraz robimy operację OR pomiędzy tymi wyrażeniami, dzięki czemu <br /><br />1. NIE ZMIENIAMY ustawień REFS1, REFS0 i ADLAR<br />2. wpisujemy TYLKO nowy kanał <br /><br />i całość do ADMUX <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br />------------------<br /><br />ADEN panie kochany nie służy do wyzwalania TYLKO załącza cały ADC, robi się to RAZ w inicjalizacji więc nie wiem o czym mówisz, chyba że masz na myśli bit:<br /><br />oczywiście jeśli nie ustawiłeś w inicjalizacji bitu <strong><span style="color: #0040FF">Bit 5 – ADATE: ADC Auto Trigger Enable</span></strong><br />to naturalnie musiałbyś na koniec każdego przerwania inicjalizować pomiar bitem ADSC. Ale jeśli ten bit ustawisz w inicjalizacji to ustawiasz ADC w tryb Free Running Mode, dzięki czemu pomiary odbywają się automatycznie raz za razem a wystarczy TYLKO raz zainicjalizować przy starcie bitem ADSC<br /><br />możesz więc albo w ostatniej linii przerwania dodać<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">ADCSRA |= (1&lt;&lt;ADSC);</div><br /><br />ale po co ? lepiej w inicjalizacji ustaw ten bit<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">ADCSRA |= (1&lt;&lt;ADATE);</div><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 4 minutach ]</span></strong><br /><br />Ale jeśli jeszcze nawet po doczytaniu w książce o tym maskowaniu nie zaskoczysz to śmiało pytaj dalej - ZDECYDOWANIE WARTO to zrozumieć - bo będzie CIĄGLE przydatne w milionach sytuacji podczas pisania programów.<br /><br />z tym, że ja widzę, że nie do końca nauczyłeś się działania operatorów bitowych a szczególnie przesunięć. Wnioskuję to po twoim usilnym deklarowaniu kocich makr rodem ze starszych wersji GCC, które zostały wycofane gdyż wygląda kod jakby ktoś pisał w asemblerze. Zamiast więc pisać<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">sbi(ADCSRA,ADIE);</div><br /><br />ZDECYDOWANIE polecam ci zapomnieć o tych kocich makrach i przyzwyczaić się do<br /><br /><div class="codetitle"><b>Code:</b></div><div class="codecontent">ADCSRA |= (1&lt;&lt;ADIE);</div><br /><br />poczytaj na forum, każdy na początku miał z tym może trudności ale spróbuj po czasie zobaczyć i dopytać - większość przechodzi na jasną stronę mocy czyli poprawny zapis w czystym C<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 31 paź 2012, o 14:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[senso]]></name></author>
<updated>2012-10-31T14:23:54+01:00</updated>
<published>2012-10-31T14:23:54+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17959#p17959</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17959#p17959"/>
<title type="html"><![CDATA[Re: ADC-problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17959#p17959"><![CDATA[
krócej faktycznie, ale jak dla mnie mniej oczywiste. <br />Pewnie dlatego ze zaczynam przygode z mikrokontrolerami i nie mam takiego doświadczenia.<br /><br />ta linijka jest niezrozumiała<br />[syntax=c]ADMUX = (ADMUX &amp; 0xF8) | (mux &amp; 0x07);[/syntax]<br />po co do ADMUXA przypisywac same jedynki?<br /><br />nie trzeba wyzwolic nastepnego pomiary poprzez bit ADEN w ADCSRA?<br />i przypadkiem MUX3 nie powinien być 0 w rejestrze ADMUX? używam 3 bity, a nie 4 żeby obsłużyć 8 wejść?<br /><br /><br />mirekk36, ok teraz bede umieszał w [syntax =c]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=452">senso</a> — 31 paź 2012, o 14:23</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2012-10-30T23:07:02+01:00</updated>
<published>2012-10-30T23:07:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17954#p17954</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17954#p17954"/>
<title type="html"><![CDATA[Re: ADC-problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17954#p17954"><![CDATA[
ok to zastanów się nad takim kodem w przerwaniu:<br /><br />[syntax=c]ISR(ADC_vect) {<br /><br />  register uint8_t mux = ADMUX &amp; 0xF8;<br /><br />  wyniki[ mux++ ] = ADCH; <br /><br />  ADMUX = (ADMUX &amp; 0xF8) | (mux &amp; 0x07);<br /><br />}[/syntax]<br /><br />bo to robi dokładnie to samo co w twojej wersji przerwania - a przyznasz że krócej się pisze ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 30 paź 2012, o 23:07</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[senso]]></name></author>
<updated>2012-11-08T17:48:34+01:00</updated>
<published>2012-10-30T23:01:38+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17953#p17953</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17953#p17953"/>
<title type="html"><![CDATA[ADC-problem]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=1728&amp;p=17953#p17953"><![CDATA[
Witam mam problem z przetwornikami ADC. <br />oto moj program, wpisuje on wartosc z jednego ADC do wszystkich<br /><br /><br /><br />[syntax=c]#include &lt;avr\io.h&gt;<br />#include &lt;avr\interrupt.h&gt;<br />#include &lt;util\delay.h&gt;<br /><br /><br /><br />#define sbi(port, bit) (port)|=(1&lt;&lt;bit)// ustawienie bitu<br />#define cbi(port, bit) (port)&amp;=~(1&lt;&lt;bit)<br /><br />volatile uint8_t wyniki[13];<br /><br />//PRZETWORNIK ADC<br />#define WYNIK_ADC0 0<br />#define WYNIK_ADC1 1<br />#define WYNIK_ADC2 2<br />#define WYNIK_ADC3 3<br />#define WYNIK_ADC4 4<br />#define WYNIK_ADC5 5<br />#define WYNIK_ADC6 6<br />#define WYNIK_ADC7 7<br /><br />#define ADC_0 (wyniki[WYNIK_ADC0])<br />#define ADC_1 (wyniki[WYNIK_ADC1])<br />#define ADC_2 (wyniki[WYNIK_ADC2])<br />#define ADC_3 (wyniki[WYNIK_ADC3])<br />#define ADC_4 (wyniki[WYNIK_ADC4])<br />#define ADC_5 (wyniki[WYNIK_ADC5])<br />#define ADC_6 (wyniki[WYNIK_ADC6])<br />#define ADC_7 (wyniki[WYNIK_ADC7])<br /><br />ISR(ADC_vect);<br /><br />//sharpy oscyluja miedzy 60 a 640<br />int main(void)<br />{<br />DDRC = 0x0F;<br />PORTC = 0xFF;<br />DDRA = 0x00;<br />PORTA = 0x00;<br /><br />sbi(ADCSRA,ADPS0);     //16000000/128 = 125kHz ustalaja podzia³ czestotliwosci XTAL dla przetwornika<br />sbi(ADCSRA,ADPS1); // 9,6 kHz<br />sbi(ADCSRA,ADPS2);<br /><br /><br /><br />sbi(ADMUX, REFS1);//2,56<br />sbi(ADMUX, REFS0);//<br /><br />sbi(ADCSRA,ADIE);<br />sbi(ADCSRA,ADEN);      //ADC dzia³¹ gdy 1<br /><br /><br />sei();<br />sbi(ADCSRA,ADSC);    //start conversion<br /><br /><br />while(1)<br />{<br />if((ADC_0 &gt; 100) )<br />{<br />PORTC &amp;=~(1&lt;&lt;0);<br />}<br />else PORTC |= (1&lt;&lt;0);<br /><br />if((ADC_1 &lt; 100) )<br />{<br />PORTC &amp;=~(1&lt;&lt;1);<br />}<br />else PORTC |= (1&lt;&lt;1);<br />}<br />}<br /><br /><br /><br /><br />ISR(ADC_vect)<br />{<br /><br />switch(ADMUX)<br />{<br />case 0b11100000:<br /><br />//while(bit_is_set(ADCSRA,ADSC))<br />wyniki[WYNIK_ADC0] = ADCH;        //zapamiêtanie wyniku<br />ADMUX = 0b11100001;//zmiana kana³u wejsciowego ADC<br />break;<br /><br />case 0b11100001:<br />//while(bit_is_set(ADCSRA,ADSC))<br />wyniki[WYNIK_ADC1] = ADCH;        //zapamiêtanie wyniku<br />ADMUX = 0b11100010; //zmiana kana³u wejsciowego ADC<br />break;<br /><br />case 0b11100010:<br /><br />wyniki[WYNIK_ADC2] = ADCH;        //zapamiêtanie wyniku<br />ADMUX = 0b11100011; //zmiana kana³u wejsciowego ADC<br />break;<br /><br />case 0b11100011:<br /><br />wyniki[WYNIK_ADC3] = ADCH;        //zapamiêtanie wyniku<br />ADMUX = 0b11100100; //zmiana kana³u wejsciowego ADC<br />break;<br /><br />case 0b11100100:<br /><br />wyniki[WYNIK_ADC4] = ADCH;        //zapamiêtanie wyniku<br />ADMUX = 0b11100101; //zmiana kana³u wejsciowego ADC<br />break;<br /><br />case 0b11100101:<br /><br />wyniki[WYNIK_ADC5] = ADCH;        //zapamiêtanie wyniku<br />ADMUX = 0b11100110; //zmiana kana³u wejsciowego ADC<br />break;<br /><br />case 0b11100110:<br /><br />wyniki[WYNIK_ADC6] = ADCH;        //zapamiêtanie wyniku<br />ADMUX = 0b11100111; //zmiana kana³u wejsciowego ADC<br />break;<br /><br />case 0b11100111:<br /><br />wyniki[WYNIK_ADC7] = ADCH;        //zapamiêtanie wyniku<br />ADMUX = 0b11100000; //zmiana kana³u wejsciowego ADC<br />break;<br /><br />}<br /><br />}<br />[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=452">senso</a> — 30 paź 2012, o 23:01</p><hr />
]]></content>
</entry>
</feed>