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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-08-02T22:41:27+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=3728&amp;mode</id>
<entry>
<author><name><![CDATA[aothunterpl]]></name></author>
<updated>2013-08-02T22:41:27+01:00</updated>
<published>2013-08-02T22:41:27+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44225#p44225</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44225#p44225"/>
<title type="html"><![CDATA[Re: ADC, przerwania pomiar np. dwóch kanałów.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44225#p44225"><![CDATA[
Witam dzięki za odpowiedzi no tak parę baboli narobiłem miałem trochu przerwy od C a teraz ostro do przodu jest motywacja trzeba prace mgr skończyć <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br /><br />Poprawiłem co nieco w chwili obecnej przygotowałem program wg wcześniejszych założeń realizujący pomiar na 2 kanałach a potem zwracający wartości uśrednione (bez przeliczenia na V) - bo jeszcze będą zaraz dalsze kombinacje.<br /><br />Wersja 1 testowa programu, napisana bez obsługi przerwań, ale już działa prawidłowo.<br /><br />- najważniejszy cel &gt; naprzemienny pomiar z 2 kanałów (64 pomiary dla każdego) + wyliczenie średniej<br /><br />Myślę, że spróbuje w miarę rozbudowy na przerwaniach + timery ewentualnie.<br /><br /><strong>Proszę o sugestie co do optymalizacji kodu / lub innego podejścia do tematu tak aby pomiar nie mulił procka i był wykonywany bardzo szybko.</strong><br /><br />Poniżej działający kodzik:<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 />#include &quot;MYUART/myuart.h&quot;<br />#include &quot;MK_TERMINAL/mk_term.h&quot;<br /><br />//deklaracje funkcji<br />void ADC_init();<br />void wyswietl_uart ();<br />void zerowanie_zmiennych_wynik();<br />uint16_t pomiar (uint8_t kanal);<br />uint32_t pomiar_srednia(uint32_t dane_kanal);<br /><br /><br />#define LED (1&lt;&lt;PB1)<br />#define LED_TOG PORTB ^= LED<br /><br />// zmiena na potrzeby obliczenia ADC &gt;&gt; 64 pomiary * max (1023) = 65427<br />// gdzie dla u_16 = 2^16 = 65535, jest ok nie przepełni się<br />volatile uint16_t wynik1 = 0; //<br />volatile uint16_t wynik2 = 0; //<br />// zmienna na potrzeby obl sredniej<br />volatile uint32_t wynik_sredni1 = 0;<br />volatile uint32_t wynik_sredni2 = 0;<br /><br />int main (void)<br />{<br />DDRB |= LED;<br />// inicjalizacja ADC<br />ADC_init();<br />// inicjalizacja UART<br />uart_init(__UBRR);<br />tr_cls(0);<br />_delay_ms(1);<br />tr_cls(1);<br /><br />for(;;)<br />{<br />int i=0;<br />while (i&lt;64)<br />{<br />wynik1 += pomiar(PA5);<br />wynik2 += pomiar(PA7);<br />i++ ;<br />}<br />// funkcje obliczajace srednią dla kanalu 1 oraz 2<br />wynik_sredni1 = pomiar_srednia(wynik1);<br />wynik_sredni2 = pomiar_srednia(wynik2);<br /><br />// w tym momencie następuje wywietlenie danych<br />// ważna sprawa minusem jest spowolnienie programu przez UART - sygnalizuje to dioda<br />// ustawiona na 10ms, a w rzeczywistosci mryga duzo wolniej<br />// gdyby nie to sam pomiar ADC idzie szybko, ale co tam domyslnie bedzie trochu lepiej LCD<br /><br />wyswietl_uart ();<br />zerowanie_zmiennych_wynik();<br /><br />LED_TOG;<br />_delay_ms(10);<br />}<br /><br /><br />}<br /><br /><br /><br />// definicja funkcji inicjalizującej ADC<br />void ADC_init()<br />{<br />// inicjalizacja ADC<br />// wloncz ADC, aktywacja przerwania, nastawa prescalera x64<br />ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADIE)| (1&lt;&lt;ADPS2) | (1&lt;&lt;ADPS1) ;<br />ADCSRA &amp;= ~(1&lt;&lt;ADPS0); // prescaler x64<br />ADCSRA &amp;= ~(1&lt;&lt;ADATE);  // tryb pracy pojedynczy, na żądanie<br />ADMUX  |= (1&lt;&lt;REFS1) | (1&lt;&lt;REFS0); // wewn 2.56V<br />}<br /><br /><br />// definicja funkcji odkonującej pomiaru<br />uint16_t pomiar (uint8_t kanal)<br />{<br />ADMUX = (ADMUX &amp; 0b11111000) | kanal; // wybor kanału<br />// ustaw odpowednio rejestr portu, i port jako wejsciowy<br />DDRA  &amp;= ~(1&lt;&lt;kanal);//<br />PORTA &amp;= ~(1&lt;&lt;kanal);//<br /><br />ADCSRA |= (1&lt;&lt;ADSC); // start ADC<br />while ( ADCSRA &amp; (1&lt;&lt;ADSC) ); // czekamy az bit zmieni sie na 0 - koniec konwersji<br />return ADCW; // powoduje zwrocenie pary rejestrów ADCL i ADCH do zmiennej 16bir<br />}<br /><br /><br />// definicja funkcji usredniajacej wynik pomiaru ADC<br />uint32_t pomiar_srednia(uint32_t dane_kanal)<br />{<br /><br />  uint32_t temp=0;<br />  uint32_t usredniony_pomiar=0;<br />  //usredniony_pomiar=0;<br />  //temp=0;<br />  temp = dane_kanal;<br />  usredniony_pomiar = (temp * 1000) / 65536 ;<br />  // (wartoć ADC * 1000) / (1024 * 64 probki)<br />  return(usredniony_pomiar); // prawidlowy pomiar =&gt;  musze podzielić przez 1000<br />}<br /><br /><br />// definicja funkcji zerującej zmienne &quot;wynik pomiaru ADC&quot;<br />void zerowanie_zmiennych_wynik()<br />{<br />wynik1=0;<br />wynik2=0;<br />wynik_sredni1=0;<br />wynik_sredni2=0;<br />}<br /><br /><br />// definicja funkcji wyswietlania danych<br />void wyswietl_uart ()<br />{<br />tr_locate(0,3); // położenie kursora<br />tr_attr(1,YELLOW, BLACK); // kolor kursora / tekstu<br />uart_puts(&quot;ATMEGA16_test_VDI&quot;); // wywietlenie łańcucha stringtr_locate(3,3);<br /><br />tr_locate(3,3);<br />tr_attr(1,MAGENTA, BLACK);<br />uart_puts(&quot;wartosc ADC1:&quot;);<br />tr_pen_color(RED);<br />uart_putlong(wynik1,10);<br />uart_puts(&quot;  &quot;);<br /><br />tr_locate(5,3);<br />tr_attr(1,MAGENTA, BLACK);<br />uart_puts(&quot;wartosc ADC2:&quot;);<br />tr_pen_color(RED);<br />uart_putlong(wynik2,10);<br />uart_puts(&quot;  &quot;);<br /><br />tr_locate(7,3);<br />tr_attr(1,MAGENTA, BLACK);<br />uart_puts(&quot;srednie ADC1:&quot;);<br />tr_pen_color(RED);<br />uart_putlong(wynik_sredni1,10);<br />uart_puts(&quot;  &quot;);<br /><br />tr_locate(8,3);<br />tr_attr(1,MAGENTA, BLACK);<br />uart_puts(&quot;srednie ADC2:&quot;);<br />tr_pen_color(RED);<br />uart_putlong(wynik_sredni2,10);<br />uart_puts(&quot;  &quot;);<br />}[/syntax]<br /><br /><br /><a href="http://forum.atnel.pl/_obrazki/o/132/b8525fe69e8e00b1b4c78a403ac3964f.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/132/b8525fe69e8e00b1b4c78a403ac3964f.JPG" alt="Obrazek" /></a><br /><br /><br /><br /><br /><br />Pozdrawiam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=132">aothunterpl</a> — 2 sie 2013, o 22:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[LogTeam]]></name></author>
<updated>2013-08-02T00:01:41+01:00</updated>
<published>2013-08-02T00:01:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44140#p44140</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44140#p44140"/>
<title type="html"><![CDATA[Re: ADC, przerwania pomiar np. dwóch kanałów.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44140#p44140"><![CDATA[
Co do przełączania kanałów to jakiś czas temu probowalem zrobic automatycznie zmienianie kanalow adc <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> .<br />Polegało to na tym że : stworzylem tablice a w niej piny adc... tab(3) = { 1, 2, 3 }. Walnalem petle for(...) a w niej zmienna  ktora sie dodawala. W Mirkowej bilbilotece jest funkcja pomiar(kanal). Dalem pomiar (kanal(tab[i]) ) w petli for. No i wynik dawalem do tablicy kolejnej choc moglem to inaczej zrobic. Powinno dzialac <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />. Moga byc male bledy bo pisze z pamieci ale mysle ze jakos Ci pomoglo <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=738">LogTeam</a> — 2 sie 2013, o 00:01</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-08-01T19:33:41+01:00</updated>
<published>2013-08-01T19:33:41+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44115#p44115</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44115#p44115"/>
<title type="html"><![CDATA[Re: ADC, przerwania pomiar np. dwóch kanałów.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44115#p44115"><![CDATA[
Twój program napotykając na pętle for będzie nie czekając na jakiekolwiek przerwania czy zakończenie konwersji rozpoczynał ją na nowo i przełączał kanał.<br />To raczej należy w funkcji ADC_init rozpocząć pierwszą konwersję i w przerwaniu przełączać kanał oraz po wykonaniu 100 pomiarów ustawić flagę/zmienną na 1, która poinformuje program główny, że można przejść dalej. Zamiast pętli for powinno być:<br />[syntax=c]while(!flaga_zakonczenia_konwersji); //czekaj na zebranie 50 wyników[/syntax]<br />PS.<br />Tak się nie wywołuje funkcji:<br />[syntax=c]// inicjalizacja ADC<br />void ADC_init();<br />uint32_t oblicz_adc1();[/syntax]<br />tylko wystarczy sama nazwa z argumentem.<br />Nie potrzeba tak kombinować:<br />[syntax=c]uint8_t a2 = 0b00000001;<br />//<br />void ADC_start(uint8_t a1);[/syntax]<br />należy zrobić tak:<br />[syntax=c]ADC_start(1); //lub ADC_start(0);[/syntax]<br />To źle zadziała:<br />[syntax=c]ADMUX = (ADMUX &amp; 0b11100000) | 0b11100000;              //wyzerowanie poprzednich wejć MUX[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 1 sie 2013, o 19:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[aothunterpl]]></name></author>
<updated>2013-08-01T17:51:42+01:00</updated>
<published>2013-08-01T17:51:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44083#p44083</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44083#p44083"/>
<title type="html"><![CDATA[ADC, przerwania pomiar np. dwóch kanałów.]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3728&amp;p=44083#p44083"><![CDATA[
Witam właśnie jestem po obejrzeniu poradników ADC.<br /><br />Napisałem program który (na początek ma za zadanie) pomierzyć jak najszybciej dwa kanały w których zmienia się napięcie stałe.<br /><br />Mam nadzieje że mam dobra koncepcję:<br /><br /><strong>W skrócie moje podejście do problemu:</strong><br /><br />1. Ustaw ADC (tryb pojedynczej konwersji, przerwanie od ADC, ustawienie wejść, prescalera, nap. rev itd)<br /><br />2. Start ADC (kanał 1)<br /><br />3. koniec konwersji -&gt; przerwanie, zapisz wynik do zmiennej1 / sumuj następne wyniki, zlicz licznik próbkowania [50 pomiarów]<br /><br />4. przełącz na kanał 2   -- &gt; Start ADC (kanał2)<br /><br />5. koniec konwersji -&gt; przerwanie, zapisz wynik do zmiennej2 / sumuj następne wyniki, zlicz licznik próbkowania [50 pomiarów]<br /><br />6. leć na początek Start ADC (kanał1)  i tak 50 razy na przemian.<br /><br /><br />7. Gdy 50 pomiarów zrealizowane przejdź do funkcji obliczającej  --&gt; licz wartość średnią dla: kanał1, kanał2    (suma pomiarów ADC ze zmiennej * Vref) / (1024 *50 -- ilość pomiarów)<br /><br />8. Wyświetl (na początek) wartość dziesiętne po uarcie.<br /><br />----------------------------------------------------------------------------------------------<br /><br />W czym mam problem sam nie wiem, napisałem sobie kod programu ale jak to początkujący pewnie zrobiłem jakiś głupi błąd i nie wiem gdzie.<br /><br />Program po wgraniu (atmega 16) wyświetla:<br /><br />Atmega16_nowa<br /><br />Wartosc ADC1 = 0 <br />Wartosc ADC2 = 0 <br /><br />... i nic się nie dzieje jak kręcę potkiem :/<br /><br /><a href="http://forum.atnel.pl/_obrazki/o/132/2cedcb4f6f2b5e8a53df93431770b61c.JPG"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/132/2cedcb4f6f2b5e8a53df93431770b61c.JPG" alt="Obrazek" /></a><br /><br /><br />Musze dodać, że poprzedni program, który pisałem  (wg. poradników 3-4 ADC) działa mi prawidłowo.<br />(czyli płyta prototypowa, procek, zasilanie, konfiguracja przejściówki USB/rs232 idt jest ok)<br /><br /><br />Pozdrawiam i z góry dziękuje za naprowadzenie na dobra drogę.<br /><br />Pozdrawiam <br /><br />aothunterpl<br /><br />poniżej przedstawiam opracowany kod kod:<br /><br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt; // funkcje sei(), cli()<br />#include &lt;util/delay.h&gt;<br />#include &lt;util/atomic.h&gt;  // do funkcji atomic<br /><br />#include &quot;MYUART/myuart.h&quot;<br />#include &quot;MK_TERMINAL/mk_term.h&quot;<br /><br />#define PROBKI 49 // definicja ilosci pomiarów (50)<br /><br /><br />void ADC_init(); // deklaracja funkji inicjalizacja ADC<br />void ADC_start(uint8_t wejscie);// deklaracja funkji startu konwersji<br />uint32_t oblicz_adc1();<br />uint32_t oblicz_adc2();<br /><br />uint8_t a1 = 0b00000000; // zmienne do wyboru kanału<br />uint8_t a2 = 0b00000001; //<br />uint8_t kanal = 0;<br />uint32_t wynik1 = 0;<br />uint32_t wynik2 = 0;<br /><br />volatile uint16_t wartosc_adc1 = 0; //volatile  zmienna wykozystywana zarowno w przerwaniu jak i programie to musi byc volatile<br />volatile uint16_t wartosc_adc2 = 0;<br /><br />// przerwanie od ADC<br />ISR(ADC_vect)<br />{<br />static uint16_t Akumulator1;<br />static uint16_t Akumulator2;<br />static uint8_t licznik_probek1;<br />static uint8_t licznik_probek2;<br /><br />if (kanal==1)<br />{<br />Akumulator1 += ADC;<br />licznik_probek1++; // 0-49 = 50 pomiarow<br />if (licznik_probek1 == PROBKI) // probki = 49<br />{<br />wartosc_adc1= Akumulator1;<br />Akumulator1 = 0;<br />licznik_probek1 = 0;<br />}<br />}<br /><br />else if (kanal==2)<br />{<br />Akumulator2 += ADC;<br />licznik_probek2++;<br />if (licznik_probek2 == PROBKI)<br /><br />{<br />wartosc_adc2= Akumulator2;<br />Akumulator2 = 0;<br />licznik_probek2 = 0;<br />}<br />}<br />}<br /><br />int main (void)<br />{<br /><br />uart_init(__UBRR);<br />tr_cls(0); // zdefiniowany skrot z biblioteki do czyszczenia okna po wyswietleniu<br />_delay_ms(5);<br />tr_cls(1); // kasuje ekran i kursor<br /><br />// zdefiniowane komendy wywietlania (funkcje), makra itp.<br /><br />tr_locate(0,3); // położenie kursora<br />tr_attr(1,YELLOW, BLACK); // kolor kursora / tekstu<br />uart_puts(&quot;ATMEGA16_nowa&quot;); // wywietlenie łańcucha string<br /><br />// inicjalizacja ADC<br /><br />sei(); // wloncz globalna obsluge przerwań<br /><br />// inicjalizacja ADC<br />void ADC_init();<br />// start adc w zaleznosci od kanału<br /><br />for (int i = 0; i &lt; 50; i++) // 0-49 = 50 pomiarów<br /><br />{<br />// po każdej konwersji wystąpi przerwanie<br />void ADC_start(uint8_t a1);<br />void ADC_start(uint8_t a2);<br />}<br /><br />uint32_t oblicz_adc1();<br />uint32_t oblicz_adc2();<br />// po 50 przerwaniach od każdego, i obiegu pętli for, trzeba policzyć ursedniony wynik i wyswietlić<br /><br /><br />while(1)<br />{<br /><br />// tutaj wyswietlaj wyniki pomairów<br /><br />tr_locate(3,3);<br />tr_attr(1,MAGENTA, BLACK);<br />uart_puts(&quot;wartosc ADC1:&quot;);<br />tr_pen_color(RED);<br />uart_putlong(wynik1,10); // wywietlam wynik ADC<br />uart_puts(&quot;  &quot;);<br /><br />tr_locate(4,3);<br />tr_attr(1,MAGENTA, BLACK);<br />uart_puts(&quot;wartosc ADC2:&quot;);<br />tr_pen_color(RED);<br />uart_putlong(wynik2,10); // wywietlam wynik ADC<br />uart_puts(&quot;  &quot;);<br />}<br /><br />}<br /><br /><br />void ADC_init()<br />{<br /><br />/*<br /><br />OPIS ADC:<br /><br />ADCSRA &#91;7-0&#93; = &#91;ADEN,ADSC,ADATE,ADIF,ADIE,ADPS2,ADPS1,ADPS0&#93;<br />ADEN - wloncz/wyloncz (1)<br />ADSC - rozpocznuj konwersje (1)<br />ADATE - tryb automatyczny (1), ustawienia (ADTS,SFIOR) 2..0<br />ADIF - zakonczneie konwersji (1)<br />ADIE - AKTYWACJA PRZERWANIA OD PRZETWORNIKA<br />ADPS - nastawa prescalera /64<br /><br />ADMUX &#91;7-0&#93; = &#91;REFS1,REFS0,ADLAR,MUX4,MUX3,MUX2,MUX1,MUX0&#93;<br />REF - wybor nap. odniesienia<br />ADLAR - reprezentacja wyniku  10,8 lub 6 bit<br />MUX - wybur kanału wejciowego (różnicówka itp<br /><br />ADCL, ADCH - wynik konwersji<br /><br />SFIOR (special funcion rejestr) &#91;7-0&#93; = &#91;ADT2,ADT1,ADT0,ADHSM&#93;<br />ADT - zródło wyzwalania<br />ADHSM - szybsza konwersja , wiecej mocy (1)<br /><br />*/<br /><br />// po przerwaniu ADEN chyba znowu wlonczyć<br />ADCSRA |= (1&lt;&lt;ADEN) | (1&lt;&lt;ADIE)| (1&lt;&lt;ADPS2) | (1&lt;&lt;ADPS1) ; // wloncz ADC, aktywacja przerwania (zobaczyc jeszcze SREG), nastawa prescalera x64<br />ADCSRA &amp;= ~(1&lt;&lt;ADPS0); // prescaler x64<br />ADCSRA &amp;= ~(1&lt;&lt;ADATE);  // tryb pracy pojedynczy, na żądanie<br /><br />ADMUX  |= (1&lt;&lt;REFS1) | (1&lt;&lt;REFS0); // wewn 2.56V<br />//ADMUX = (ADMUX &amp; 0b11111000) | 0b101;// wybor portu (pin)<br />//DDRA   &amp;= ~(1&lt;&lt;PA5);// portA (PA5) ust. pinu jako wejciowego, pozostale wylonczyc<br />}<br /><br /><br />void ADC_start(uint8_t wejscie)<br />{<br />if (wejscie==a1)<br />{<br />kanal = 1;<br /><br />} else<br />{<br />kanal = 2;<br />}<br /><br />//wybor wejscia ADC atmega 16;<br /><br />//ADMUX |= wejscie &amp; (1&lt;&lt;MUX4);<br />//ADMUX |= wejscie &amp; (1&lt;&lt;MUX3);<br />//ADMUX |= wejscie &amp; (1&lt;&lt;MUX2);<br />//ADMUX |= wejscie &amp; (1&lt;&lt;MUX1);<br />//ADMUX |= wejscie &amp; (1&lt;&lt;MUX0);<br /><br />// pa0 = 00000<br />// pa1 = 00001<br />// pa2 = 00010<br /><br /><br />//ADMUX &amp;= 0xF0;//wyzerowanie poprzednich wejć MUX<br />ADMUX = (ADMUX &amp; 0b11100000) | 0b11100000; //wyzerowanie poprzednich wejć MUX<br />//ADMUX |= (wejscie &amp; 0x0F); // wybór wejcia<br />    ADMUX = (ADMUX &amp; 0b11111000) | wejscie; // wybór wejcia, portu<br /><br />DDRA  &amp;= ~(1&lt;&lt;wejscie);<br />PORTA &amp;= ~(1&lt;&lt;wejscie);<br /><br />//uruchomienie konwersji<br />ADCSRA |= (1&lt;&lt;ADSC);<br />}<br /><br /><br />uint32_t oblicz_adc1() // przeliczanie na wynik<br />{<br />uint16_t adc1; // zmienna pomocnicza<br /><br />ATOMIC_BLOCK (ATOMIC_FORCEON) // funkcja ktora pozwala na poziomie atomowym (szybko) przekazac zawartosc adc do zmiennej<br />{<br />adc1=wartosc_adc1;<br />}<br />return wynik1=(adc1*25600UL)/(1024UL*50); // ADS srednie = (suma wartości ADC * Vref) / (1024 * 50 &lt;&lt;- pomiarów)<br />}<br /><br />uint32_t oblicz_adc2()<br />{<br />uint16_t adc2;<br />ATOMIC_BLOCK (ATOMIC_FORCEON)<br />{<br />adc2=wartosc_adc2;<br />}<br />return wynik2=(adc2*25600UL)/(1024UL*50);<br />}[/syntax]<br /><br /><br /><br /><br /><br /><span style="color: #FF0000">Kod wklejamy przy pomocy syntax=c - Różowy J.</span><br /><br />Ok dzięki źle mi się wstawiło ;]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=132">aothunterpl</a> — 1 sie 2013, o 17:51</p><hr />
]]></content>
</entry>
</feed>