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

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

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16032&amp;mode</id>
<entry>
<author><name><![CDATA[matiase]]></name></author>
<updated>2016-08-22T13:39:15+01:00</updated>
<published>2016-08-22T13:39:15+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166782#p166782</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166782#p166782"/>
<title type="html"><![CDATA[Re: przetwornik ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166782#p166782"><![CDATA[
Aaaa, ok. Już rozumiem jak z tego korzystać.<br />Po poprawkach wszystko hula.<br /><br />[syntax=c]//***************ustawianie przetwornika ADC*****************************<br />     <br />    ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // włączenie ADC, preskeler 128<br />    ADCSRA |= (1&lt;&lt;ADATE); // automatyczne wyzwalanie przetwornika<br />    ADCSRB &amp;= ~(1&lt;&lt;ADTS2)|(1&lt;&lt;ADTS1)|(1&lt;&lt;ADTS0);<br />    ADMUX |= (1&lt;&lt;REFS0) | (1&lt;&lt;MUX0) | (1&lt;&lt;MUX1); //napięcie odniesienia VCC, pomiar na PC3<br />    ADCSRA |= (1&lt;&lt;ADSC);<br /><br />    while (1) {<br />            uint16_t ADC_wynik = ADC;<br /><br />     ...<br />     ...<br />     ...<br /><br />    }[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14586">matiase</a> — 22 sie 2016, o 13:39</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-08-22T10:44:26+01:00</updated>
<published>2016-08-22T10:44:26+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166760#p166760</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166760#p166760"/>
<title type="html"><![CDATA[Re: przetwornik ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166760#p166760"><![CDATA[
<div class="quotetitle">matiase napisał(a):</div><div class="quotecontent"><br />dioda w ogóle nie zmienia swojej jasności. I nie rozumiem dlaczego.<br /></div><br />Jeśli ustawisz bit ADATE w rejestrze ADCSRA z wyzerowanymi bitami ADTS2:0, ADC pracuje w trybie Free Runnig.<br />W tej sytuacji konwersję startujesz tylko raz ustawiając bit ADSC w rejestrze ADCSRA (np. w Twoim przypadku przed pętlą <em>while(1)</em>). Nie sprawdzasz później zakończenia konwersji poprzez sprawdzenie bitu ADSC:<br />[syntax=c]while (ADCSRA &amp; (1&lt;&lt;ADSC));[/syntax]ponieważ jest on cały czas w stanie wysokim i program Ci się w tym miejscu zapętli. Rejestr ADC jest aktualizowany na bieżąco automatycznie, wystarczy go po prostu odczytywać.<br /><br />Jak już wspomniał kolega <strong>kicajek</strong> nie kombinuj z konstrukcjami typu:[syntax=c]uint16_t ADC_wynik = ADCH&lt;&lt;8 | ADCL;<br />// zdecydowanie lepiej będzie<br />uint16_t ADC_wynik = ADC;[/syntax] i nie chodzi tu tylko o estetykę kodu.<br />Rejestr ADC jest rejestrem dwubajtowym i jest bardzo istotne, aby jego bajty były odczytywane w odpowiedniej kolejności (poczytaj w datasheet o <strong>Accessing 16-bit Registers</strong>). Taki odczyt, jak zrobiłeś, może spowodować, że kompilator odczyta najpierw rejestr ADCH, a powinien odczytać ADCL. W drugim przypadku nie będzie miał takich wątpliwości.<br /><br />Zamiast trybu Free Running zalecałbym startowanie konwersji w równych odstępach czasowych za pomocą jakiegoś timera.<br />Nie zaszkodziło by też zastosowanie jakiegoś uśredniania wartości odczytywanych z ADC, bo na granicach zakresów możesz uzyskać &quot;mrużenie&quot; diod.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 22 sie 2016, o 10:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matiase]]></name></author>
<updated>2016-08-21T20:42:44+01:00</updated>
<published>2016-08-21T20:42:44+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166721#p166721</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166721#p166721"/>
<title type="html"><![CDATA[Re: przetwornik ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166721#p166721"><![CDATA[
<div class="quotetitle">ryba84 napisał(a):</div><div class="quotecontent"><br />Spójrz na linię 18. Masz ustawione jednokrotne wywołanie konwersji. Albo ustaw na free running, albo po każdym odczycie startuj ponownie konwersję.<br /></div><br /><br />Ok, ale właśnie takie ustawienie bitów:<br /><br />[syntax=c]int main (void) {<br />     <br />    DDRD |= (1&lt;&lt;PD6); //ustawienie pinu PD6 jako wyjście<br />    DDRC &amp;= ~(1&lt;&lt;PC3); //ustawienie pinu PC3 jako wejście<br />     <br />    PORTD &amp;= ~(1&lt;&lt;PD6);<br />     <br />    TCCR0A |= (1&lt;&lt;WGM00)|(1&lt;&lt;WGM01) //tryb fast PWM<br />               |  (1&lt;&lt;COM0A0)|(1&lt;&lt;COM0A1) //tryb odwracający dla OC0A<br />               |  (1&lt;&lt;COM0A0)|(1&lt;&lt;COM0B1); //tryb odwracający dla OC0B<br />    TCCR0B |= (1&lt;&lt;CS00); //preskaler=1<br />     <br />     <br />     <br />    //***************ustawianie przetwornika ADC*****************************<br />     <br />    ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // włączenie ADC, preskeler 128<br />    ADCSRA |= (1&lt;&lt;ADATE); // automatyczne wyzwalanie przetwornika<br />    ADCSRB &amp;= ~(1&lt;&lt;ADTS2)|(1&lt;&lt;ADTS1)|(1&lt;&lt;ADTS0);<br />    ADMUX |= (1&lt;&lt;REFS0) | (1&lt;&lt;MUX0) | (1&lt;&lt;MUX1); //napięcie odniesienia VCC, pomiar na PC3<br />     <br />    while (1) {<br />     <br />            ADCSRA |= (1&lt;&lt;ADSC);<br />            while (ADCSRA &amp; (1&lt;&lt;ADSC));<br />            uint16_t ADC_wynik = ADCH&lt;&lt;8 | ADCL;<br />     <br />                    if (ADC_wynik&gt;100) OCR0A=50;<br />                    if (ADC_wynik&gt;300) OCR0A=100;<br />                    if (ADC_wynik&gt;500) OCR0A=150;<br />                    if (ADC_wynik&gt;700) OCR0A=200;<br />                    if (ADC_wynik&gt;900) OCR0A=255;<br />    }<br />    }[/syntax]<br /><br />niestety sprawia, że dioda w ogóle nie zmienia swojej jasności. I nie rozumiem dlaczego. <br />Co do if'ów wiem, że trochę bez sensu, ale chodzi mi tylko o to aby widzieć efekt działania programu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14586">matiase</a> — 21 sie 2016, o 20:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[kicajek]]></name></author>
<updated>2016-08-21T20:30:19+01:00</updated>
<published>2016-08-21T20:30:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166717#p166717</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166717#p166717"/>
<title type="html"><![CDATA[Re: przetwornik ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166717#p166717"><![CDATA[
Witam<br />Zamiast <br />[syntax=c]uint16_t ADC_wynik = ADCH&lt;&lt;8 | ADCL;[/syntax] (?) <br />wystarczy ADC_wynik = <strong>ADC</strong>;<br />Po drugie, takie kaskadowe sprawdzanie:<br />[syntax=c]if (ADC_wynik&gt;100) OCR0A=50;<br />                if (ADC_wynik&gt;300) OCR0A=100;<br />                if (ADC_wynik&gt;500) OCR0A=150;<br />                if (ADC_wynik&gt;700) OCR0A=200;<br />                if (ADC_wynik&gt;900) OCR0A=255;[/syntax]<br />- pomyśl ile if'ów się wykona gdy ADC_wynik&gt;(np.)700 ?<br /><br />Pozdr.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=826">kicajek</a> — 21 sie 2016, o 20:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[ryba84]]></name></author>
<updated>2016-08-21T20:22:02+01:00</updated>
<published>2016-08-21T20:22:02+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166716#p166716</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166716#p166716"/>
<title type="html"><![CDATA[Re: przetwornik ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166716#p166716"><![CDATA[
Spójrz na linię 18. Masz ustawione jednokrotne wywołanie konwersji. Albo ustaw na free running, albo po każdym odczycie startuj ponownie konwersję.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3170">ryba84</a> — 21 sie 2016, o 20:22</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matiase]]></name></author>
<updated>2016-08-21T19:50:34+01:00</updated>
<published>2016-08-21T19:50:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166714#p166714</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166714#p166714"/>
<title type="html"><![CDATA[Re: przetwornik ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166714#p166714"><![CDATA[
Przepraszam Panowie, trochę pogmatwałem. Jest to mikrokontroler Atmega328p. <br />Po naniesionych poprawkach, widzę że PWM działa. Problem polega natomiast na tym, że aby zmienić jasność świecenia, muszę przekręcić potencjometr i na nowo wgrać program. Wygląda na to że przetwornik odczytuje jeden raz wartość napięcia i się zatrzymuje. Ja natomiast chciałbym aby odczytywał w sposób ciągły.<br /><br />Poprawiony kod:<br /><br />[syntax=c]int main (void) {<br /><br />DDRD |= (1&lt;&lt;PD6); //ustawienie pinu PD6 jako wyjście<br />DDRC &amp;= ~(1&lt;&lt;PC3); //ustawienie pinu PC3 jako wejście<br /><br />PORTD &amp;= ~(1&lt;&lt;PD6);<br /><br />TCCR0A |= (1&lt;&lt;WGM00)|(1&lt;&lt;WGM01) //tryb fast PWM<br />   |  (1&lt;&lt;COM0A0)|(1&lt;&lt;COM0A1) //tryb odwracający dla OC0A<br />   |  (1&lt;&lt;COM0A0)|(1&lt;&lt;COM0B1); //tryb odwracający dla OC0B<br />TCCR0B |= (1&lt;&lt;CS00); //preskaler=1<br /><br /><br /><br />//***************ustawianie przetwornika ADC*****************************<br /><br />ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // włączenie ADC, preskeler 128<br />//ADCSRA |= (1&lt;&lt;ADATE); // automatyczne wyzwalanie przetwornika<br />//ADCSRB |= 0x00;<br />ADMUX |= (1&lt;&lt;REFS0) | (1&lt;&lt;MUX0) | (1&lt;&lt;MUX1); //napięcie odniesienia VCC, pomiar na PC3<br /><br />while (1) {<br /><br />ADCSRA |= (1&lt;&lt;ADSC);<br />while (ADCSRA &amp; (1&lt;&lt;ADSC));<br />uint16_t ADC_wynik = ADCH&lt;&lt;8 | ADCL;<br /><br />if (ADC_wynik&gt;100) OCR0A=50;<br />if (ADC_wynik&gt;300) OCR0A=100;<br />if (ADC_wynik&gt;500) OCR0A=150;<br />if (ADC_wynik&gt;700) OCR0A=200;<br />if (ADC_wynik&gt;900) OCR0A=255;<br />}<br />}[/syntax]<br /><br />Pin PD6 (OC0A) ustawiam jako wyjście, bo to moje PWM i to do tego pinu podłączam diodę LED, PC3 ustawiam jako wejście, z którego przetwornik mierzy wartość napięcia.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14586">matiase</a> — 21 sie 2016, o 19:50</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[andrews]]></name></author>
<updated>2016-08-21T18:19:40+01:00</updated>
<published>2016-08-21T18:19:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166706#p166706</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166706#p166706"/>
<title type="html"><![CDATA[Re: przetwornik ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166706#p166706"><![CDATA[
<div class="quotetitle">matiase napisał(a):</div><div class="quotecontent"><br />Diodę LED podłączam anodą do pinu PC6 (OC0A), a katodą przez rezystor do masy.<br /></div>OC0A to pin wyjściowy PWM timera 0, a w programie konfigurujesz timer 2. PC6 to pin portu C, a w programie jako wyjścia konfigurujesz piny portu D. Nie napisałeś jaki mikrokontroler, więc nie powiem jak to powinno wyglądać, ale coś tu jest ewidentnie nie tak.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14165">andrews</a> — 21 sie 2016, o 18:19</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[xisco24]]></name></author>
<updated>2016-08-21T16:35:52+01:00</updated>
<published>2016-08-21T16:35:52+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166689#p166689</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166689#p166689"/>
<title type="html"><![CDATA[Re: przetwornik ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166689#p166689"><![CDATA[
Proponował bym na początek sprawdzić czy PWM działa prawidłowo. Jesli dziala to dalej szukac przyczyny w ADC. Jaki to procek?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=2868">xisco24</a> — 21 sie 2016, o 16:35</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[matiase]]></name></author>
<updated>2016-08-21T15:32:08+01:00</updated>
<published>2016-08-21T15:32:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166680#p166680</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166680#p166680"/>
<title type="html"><![CDATA[przetwornik ADC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16032&amp;p=166680#p166680"><![CDATA[
Witam, <br /><br />Chcę wykonać pomiar napięcia na pinie PC3 i w zależności od tego ustawić odpowiednie wypełnienie PWM. Ustawiłem za punkt odniesienia napięcie zasilania. Wiem, że może jest to niedokładne, ale na razie mi na tym nie zależy. Pin AREEF mam podłączony przez kondensator do masy, AVCC do zasilania +5V, równolegle także podłączyłem kondensator. Diodę LED podłączam anodą do pinu PC6 (OC0A), a katodą przez rezystor do masy. <br /><br />Mój kod:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br /><br />int main (void) {<br /><br />uint16_t pomiar(void);<br /><br />DDRD |= (1&lt;&lt;PD5); //ustawienie pinu PD5 jako wyjście<br />DDRD |= (1&lt;&lt;PD6); //ustawienie pinu PD6 jako wyjście<br />DDRC &amp;= ~(1&lt;&lt;PC0); //ustawienie pinu PC0 jako wejście<br /><br />PORTD &amp;= ~(1&lt;&lt;PD5);<br />PORTD &amp;= ~(1&lt;&lt;PD6);<br /><br /><br />TCCR2A |= (1&lt;&lt;WGM20)|(1&lt;&lt;WGM21) //tryb fast PWM<br />   |  (1&lt;&lt;COM2A0)|(1&lt;&lt;COM2A1) //tryb odwracający dla OC2A<br />   |  (1&lt;&lt;COM2A0)|(1&lt;&lt;COM2B1); //tryb odwracający dla OC2B<br />TCCR2B |= (1&lt;&lt;CS00); //preskaler=1<br /><br /><br /><br />//***************ustawianie przetwornika ADC*****************************<br /><br />ADCSRA |= (1&lt;&lt;ADEN)|(1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1)|(1&lt;&lt;ADPS0); // włączenie ADC, preskeler 128<br />//ADCSRA |= (1&lt;&lt;ADATE); // automatyczne wyzwalanie przetwornika<br />//ADCSRB |= 0x00;<br />ADMUX |= (1&lt;&lt;REFS0) | (1&lt;&lt;MUX0) | (1&lt;&lt;MUX1); //napięcie odniesienia VCC, pomiar na PC3<br /><br />while (1) {<br /><br />ADCSRA |= (1&lt;&lt;ADSC);<br />while (ADCSRA &amp; (1&lt;&lt;ADSC));<br />uint16_t ADC_wynik = ADCH&lt;&lt;8 | ADCL;<br /><br />if (ADC_wynik&gt;100) OCR0A=50;<br />if (ADC_wynik&gt;300) OCR0A=100;<br />if (ADC_wynik&gt;500) OCR0A=150;<br />if (ADC_wynik&gt;700) OCR0A=200;<br />if (ADC_wynik&gt;900) OCR0A=255;<br />}<br />}[/syntax]<br /><br />Niestety dioda jak martwa, pomimo zmiany podawanego napięcia na pin PC3, nie chce się zapalić. Zmianę napięcia ustalam potencjometrem 10k i najprostszym dzielnikiem napięcia, zmierzyłem woltomierzem i układ ten działa prawidłowo. Nie do końca wiem czy potrzebuję uruchamiać tryb Free Running Mode i zmieniać rejestry ADATE i ADCSRB. Tak czy siak program i tak nie chce działać prawidłowo.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=14586">matiase</a> — 21 sie 2016, o 15:32</p><hr />
]]></content>
</entry>
</feed>