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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-04-26T15:33:23+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6872&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-04-26T15:33:23+01:00</updated>
<published>2014-04-26T15:33:23+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79235#p79235</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79235#p79235"/>
<title type="html"><![CDATA[Re: ADC ATMega8 język C avr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79235#p79235"><![CDATA[
<div class="quotetitle">mateusz19955 napisał(a):</div><div class="quotecontent"><br />Jak zrobić żeby tak się nie działo?<br /></div><br /><br />dość prosto - obejrzeć panie kochany to: <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br /><br /><!-- m --><a class="postlink" href="https://www.youtube.com/playlist?list=PLtXXWLsA5QNi_R9uDXpHRpo5hRnig_f23" >https://www.youtube.com/playlist?list=P ... 5hRnig_f23</a><!-- m --><br /><br />wszystko po kolei jasno i klarownie wyjaśnione na różnych przykładach i w różnych zastosowaniach <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=54">mirekk36</a> — 26 kwi 2014, o 15:33</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateusz19955]]></name></author>
<updated>2014-04-26T11:47:13+01:00</updated>
<published>2014-04-26T11:47:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79183#p79183</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79183#p79183"/>
<title type="html"><![CDATA[Re: ADC ATMega8 język C avr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79183#p79183"><![CDATA[
Dobra, zrobiłem tak jak pisaliście.<br />Teraz mam problem bo jak mierzę napięcie na baterii czy jakimś zasilaczu to zamiast mi pokazać np. 4,96V, to wynik mi skacze. Raz jest 4,86 a za kawałek 4,96. Dzieje się to tak szybko, że wydaje się jak by wyświetlacze wskazywały 4,88.<br />Jak zrobić żeby tak się nie działo? <br /><br />[syntax=c]#include &lt;avr/io.h&gt;//dołączenie biblioteki avr/io<br />#include &lt;avr/interrupt.h&gt;//dołączenie biblioteki avr/interrupt<br /><br />#define wys1_on PORTC |= (1&lt;&lt;PC2)//makro załączające Wyświetlacz 1<br />#define wys2_on PORTC |= (1&lt;&lt;PC3)//makro załączające Wyświetlacz 2<br />#define wys3_on PORTC |= (1&lt;&lt;PC4)//makro załączające Wyświetlacz 3<br />#define wys4_on PORTC |= (1&lt;&lt;PC5)//makro załączające Wyświetlacz 4<br /><br />#define wys1_off PORTC &amp;= ~(1&lt;&lt;PC2)//makro wyłączające Wyświetlacz 1<br />#define wys2_off PORTC &amp;= ~(1&lt;&lt;PC3)//makro wyłączające Wyświetlacz 2<br />#define wys3_off PORTC &amp;= ~(1&lt;&lt;PC4)//makro wyłączające Wyświetlacz 3<br />#define wys4_off PORTC &amp;= ~(1&lt;&lt;PC5)//makro wyłączające Wyświetlacz 4<br /><br />#define kropka 0x7F//makro załączające kropkę na wyśw. 2<br /><br />const uint8_t tablica&#91;&#93; = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//tablica kodów cyfr<br /><br />volatile uint8_t w1, w2, w3, w4;//deklaracja zm. globalnych<br />uint16_t wyn_pom, liczba;//deklaracja zm. globalnych<br />uint32_t wynik;//deklaracja zm. globalnej<br /><br />void init_timer(void);//deklaracja funkcji init_timer<br />void init_adc(void);//deklaracja funkcji init_adc<br />void init_pin(void);//deklaracja funkcji init_pin<br />void wyswietl(uint32_t);//deklaracja funkcji wyswietl<br />uint16_t pomiar(void);//deklaracja funkcji pomiar<br /><br />void init_adc(void)//funkcja inicjalizująca ADC<br />{<br />ADMUX |= (1&lt;&lt;REFS1)|(1&lt;&lt;REFS0);//Vref = 2,56V<br />ADMUX |= (1&lt;&lt;MUX0);//odczyt wartości z PC1 <br />ADCSRA |= (1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1);//preskaler ADC = 64<br />ADCSRA |= (1&lt;&lt;ADEN);//włączenie przetwornika ADC<br />}<br /><br />void init_pin(void)//funkcja inicjalizująca piny<br />{<br />DDRD = 0xFF;//cały PORTD - wyjścia <br />DDRC = 0xFC;//PC2...PC6 - wyjścia<br />}//PC0...PC1 - wejścia<br /><br />void init_timer(void)//funkcja inicjalizująca Timer1<br />{<br />TCCR1B |= (1&lt;&lt;WGM12);//tryb CTC<br />TCCR1B |= (1&lt;&lt;CS12)|(1&lt;&lt;CS10);//preskaler 1024<br />OCR1A = 39;//podział przez 39<br />TIMSK |= (1&lt;&lt;OCIE1A);//odblokowanie przerwania CTC<br />}<br /><br />void wyswietl(uint32_t wartosc)//definicja i początek funkcji wyświetl<br />{<br />liczba = wartosc/100;<br /><br />w1 = liczba/1000;<br />w2 = (liczba/100)%10;<br />w3 = (liczba/10)%10;<br />w4 = liczba%10;<br />}<br /><br />uint16_t pomiar(void)//definicja i początek funkcji pomiar<br />{<br />ADCSRA |= (1&lt;&lt;ADSC);<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));<br /><br />return ADCW;<br />}<br /><br />int main(void)//funkcja główna programu<br />{<br />init_pin();//wywołanie funkcji init_pin<br />init_timer();//wywołanie funkcji init_timer<br />init_adc();//wywołanie funkcji init_adc<br /><br />sei();//odblokowanie globalnego systemu przerwań<br />while(1)//pętla główna programu<br />{<br />wyn_pom = pomiar();//zmienna wyn_pom przyjmuje wartość funkcji pomiar<br />wynik = wyn_pom * 850;//wynik=wyn_pom*(2,56/1024)*34(podział dzielnika)<br /><br />wyswietl(wynik);//wywołanie funkcji wyświetl, parametrem funkcji jest zm. wynik<br />}//koniec pętli głównej<br />}//koniec funkcji głównej<br /><br />ISR (TIMER1_COMPA_vect)//wektor przerwania Timera1<br />{<br />static uint8_t i;//deklaracja statycznej zmi. lokalnej<br />i++;//zwiększ wartość i o 1<br /><br />if(i &gt; 3)//jeżeli i większe od 3<br />{<br />i = 0;//wyzeruj i<br />}<br /><br />switch (i)//początek instrukcji switch<br />{<br />case 0://jeżeli i=0<br /><br />wys4_off;//wyłącz wyśw. 4<br />PORTD = tablica&#91;w1&#93;;<br />wys1_on;//włącz wyśw. 1<br />break;<br /><br />case 1://jeżeli i=1<br /><br />wys1_off;//wyłącz wyśw. 1<br />PORTD = tablica&#91;w2&#93; &amp; kropka;<br />wys2_on;//włącz wyśw. 2<br />break;<br /><br />case 2://jeżeli i=2<br /><br />wys2_off;//wyłącz wyśw. 2<br />PORTD = tablica&#91;w3&#93;;<br />wys3_on;//włącz wyśw. 3<br />break;<br /><br />case 3://jeżeli i=3<br /><br />wys3_off;//wyłącz wyśw. 3<br />PORTD = tablica&#91;w4&#93;;<br />wys4_on;//włącz wyśw. 4<br />break;<br />}//koniec instrukcji switch<br />}//koniec przerwania Timer1[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3621">mateusz19955</a> — 26 kwi 2014, o 11:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[jacekk232]]></name></author>
<updated>2014-04-24T22:45:05+01:00</updated>
<published>2014-04-24T22:45:05+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79110#p79110</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79110#p79110"/>
<title type="html"><![CDATA[Re: ADC ATMega8 język C avr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79110#p79110"><![CDATA[
Ja jeszcze dodam, że wkradła ci się mała nieścisłość w tym kawałku kodu<br />[syntax=c]TCCR1B |= (1&lt;&lt;WGM12)|(1&lt;&lt;CS12);<br />OCR1A = 15;  &lt;------<br />TIMSK |= (1&lt;&lt;OCIE1B);  &lt;------<br /><br />ISR (TIMER1_COMPB_vect)  &lt;------[/syntax]<br />Wpisujesz wartość porównania do OCR1A a potem używasz OCIE1B i TIMER1_COMPB_vect. Może to i działa ale lepiej zrobić to tak jak ma być czyli<br />[syntax=c]TCCR1B |= (1&lt;&lt;WGM12)|(1&lt;&lt;CS12);<br />OCR1A = 15;  &lt;<br />TIMSK |= (1&lt;&lt;OCIE1A);  <br /><br />ISR (TIMER1_COMPA_vect)[/syntax]<br /><br />Skoro jesteśmy już przy timerze to przy takim ustawieniu timera przerwanie będzie ci się wywoływać z częstotliwością  2kHz czyli co 0,5ms (8000000Hz / 256(preskaler) / 15(OCR1A) = 2kHz). Dużo jak na obsługę multipleksowania. Do czterech wyświetlaczy spokojnie wystarczy wywoływać przerwanie z częstotliwością  200Hz czyli co 5ms. Trzeba tylko troszkę zmienić ustawienia timera na takie<br />[syntax=c]//tryb CTC - przerwanie co 5ms dla taktowania 8MHz<br />TCCR1B |= (1&lt;&lt;WGM12); //tryb CTC<br />TCCR1B |= (1&lt;&lt;CS12) | (1&lt;&lt;CS10);//preskaler 1024<br />OCR1A = 39;//dodatkowy podział przez 39<br />TIMSK |= (1&lt;&lt;OCIE1A);//odblokowanie przerwania Compare Match[/syntax]<br /><br />Mi osobiście byłoby szkoda tracić Timer1 na multipleksowanie i zamiast niego wybrał bym np. Timer2, który to również posiada wygodny tryb CTC.<br /><br />I z takich kosmetycznych poprawek to zamiast w każdym case gasić jeden wyświetlacz można przed switch gasić wszystkie. Wtedy nie trzeba się zastanawiać, że w danym case trzeba zgasić wyświetlacz włączony w poprzednim case.<br /><br />No i ten warunek [syntax=c]if(i &gt; 4) i = 0;[/syntax]zmień na [syntax=c]if(i &gt; 3) i = 0;[/syntax] Bo teraz to zmienna &quot;i&quot; przyjmuje wartości od 0 do 4 i dopiero gdy osiągnie wartość 5 to zostanie wyzerowana.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=204">jacekk232</a> — 24 kwi 2014, o 22:45</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-04-24T21:59:07+01:00</updated>
<published>2014-04-24T21:59:07+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79105#p79105</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79105#p79105"/>
<title type="html"><![CDATA[Re: ADC ATMega8 język C avr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79105#p79105"><![CDATA[
<div class="quotetitle">mokrowski napisał(a):</div><div class="quotecontent"><br />Jeśli koleżanki/koledzy chcą coś dodać albo naprostować to co napisałem<br />to... wiem że nic nie wiem jeszcze o programowaniu na MCU. Jedynie (trochę) wiem o C...<br /></div><br /><br />Łeee, no panie kochany - PIĘKNA ANALIZA i SUPER podpowiedzi dla autora kodu <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> .... rewelacja - poważnie.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 24 kwi 2014, o 21:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2014-04-24T21:24:59+01:00</updated>
<published>2014-04-24T21:24:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79102#p79102</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79102#p79102"/>
<title type="html"><![CDATA[Re: ADC ATMega8 język C avr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79102#p79102"><![CDATA[
<span style="color: #FF0000"><em>#define F_CPU 8000000UL</em></span><br /><br />to jest pierwszy i PODSTAWOWY BŁĄD, i proszę nie powielaj tego przynajmniej na naszym forum bo wpisywanie tego w kodzie programu to niestety MEGA BZDURA <img src="https://forum.atnel.pl/images/smilies/icon_e_sad.gif" alt=":(" title="Smutny" /><br /><br />obejrzyj sobie ten poradnik od tego momentu:<br /><br /><!-- m --><a class="postlink" href="https://www.youtube.com/watch?v=UhcyBpM57vo#t=2993" >https://www.youtube.com/watch?v=UhcyBpM57vo#t=2993</a><!-- m --><br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 1 minucie ]</span></strong><br /><br />Poza tym kod wygląda OK ... ale hmmm jest jeszcze jedno ALE ....<br /><br />brakuje komentarzy - a bez komentarzy jak wiemy nie jest do kod pisany w dobrym stylu programowania<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 24 kwi 2014, o 21:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mateusz19955]]></name></author>
<updated>2014-04-24T20:20:17+01:00</updated>
<published>2014-04-24T20:20:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79094#p79094</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79094#p79094"/>
<title type="html"><![CDATA[ADC ATMega8 język C avr]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6872&amp;p=79094#p79094"><![CDATA[
Witam wszystkich. <br /><br />Napisałem dzisiaj kod do woltomierza wykorzystując przetwornik ADC w języku C. <br />Kod napisałem dla mikrokontrolera ATMega8. <br />Wynik pomiaru wyświetlany jest na czterech wyświetlaczach LED wspólna anoda. <br />Anody wyświetlacza podłączone są do PORTD, a cztery katody do PORTC. <br />Multipleksacja tych wyświetlaczy wykonuje się w przerwaniu. <br />Program działa, chciałem tylko aby ktoś sprawdził i napisał czy jest on poprawnie napisany(czy dobrze napisane funkcje, czy dobrze je wywołuje i wszystko co w tym kodzie jest). <br />Uczę się pisania w C i sporo już się nauczyłem.<br />Chciałbym wiedzieć jakich błędów nie popełniać na przyszłość. <br />Mierzone napięcie podaję przez dzielnik napięciowy, który ma wsp. podziału 34, na pin PC1 mikrokontrolera. <br /><br />[syntax=c]#define F_CPU 8000000UL<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />//#include &lt;util/delay.h&gt;<br /><br />#define wys1_on PORTC |= (1&lt;&lt;PC2)<br />#define wys2_on PORTC |= (1&lt;&lt;PC3)<br />#define wys3_on PORTC |= (1&lt;&lt;PC4)<br />#define wys4_on PORTC |= (1&lt;&lt;PC5)<br /><br />#define wys1_off PORTC &amp;= ~(1&lt;&lt;PC2)<br />#define wys2_off PORTC &amp;= ~(1&lt;&lt;PC3)<br />#define wys3_off PORTC &amp;= ~(1&lt;&lt;PC4)<br />#define wys4_off PORTC &amp;= ~(1&lt;&lt;PC5)<br /><br />uint8_t tablica&#91;&#93; = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};<br />uint8_t tablica_kropka&#91;&#93; = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10};<br /><br />volatile uint8_t w1, w2, w3, w4; <br />uint8_t i;<br />uint16_t wyn_pom, liczba;<br />uint32_t wynik;<br /><br />void init_timer(void);<br />void init_adc(void);<br />void init_pin(void);<br />void wyswietl(uint32_t);<br />uint16_t pomiar(void);<br /><br />void init_adc(void)<br />{<br />ADMUX |= (1&lt;&lt;REFS1)|(1&lt;&lt;REFS0)|(1&lt;&lt;MUX0);<br />ADCSRA |= (1&lt;&lt;ADPS2)|(1&lt;&lt;ADPS1);<br />ADCSRA |= (1&lt;&lt;ADEN);<br />}<br /><br />void init_pin(void)<br />{<br />DDRD = 0xFF;<br />DDRC = 0xFC;<br />}<br /><br />void init_timer(void)<br />{<br />TCCR1B |= (1&lt;&lt;WGM12)|(1&lt;&lt;CS12);<br />OCR1A = 15;<br />TIMSK |= (1&lt;&lt;OCIE1B);<br />}<br /><br />void wyswietl(uint32_t wartosc)<br />{<br />liczba = wartosc/100;<br /><br />w1 = liczba/1000;<br />w2 = (liczba/100)%10;<br />w3 = (liczba/10)%10;<br />w4 = liczba%10;<br />}<br /><br />uint16_t pomiar(void)<br />{<br />ADCSRA |= (1&lt;&lt;ADSC);<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));<br /><br />return ADCW;<br />}<br /><br />int main(void)<br />{<br />init_pin();<br />init_timer();<br />init_adc();<br /><br />sei();<br />while(1)<br />{<br />wyn_pom = pomiar();<br />wynik = wyn_pom * 850;//wynik=wyn_pom*(2,56/1024)*34(podział dzielnika)<br /><br />wyswietl(wynik);<br />}<br />}<br /><br />ISR (TIMER1_COMPB_vect)<br />{<br />i++;<br /><br />if(i &gt; 4) i = 0;<br /><br />switch (i)<br />{<br />case 0:<br /><br />wys4_off;<br />PORTD = tablica&#91;w1&#93;;<br />wys1_on;<br />break;<br /><br />case 1:<br /><br />wys1_off;<br />PORTD = tablica_kropka&#91;w2&#93;;<br />wys2_on;<br />break;<br /><br />case 2:<br /><br />wys2_off;<br />PORTD = tablica&#91;w3&#93;;<br />wys3_on;<br />break;<br /><br />case 3:<br /><br />wys3_off;<br />PORTD = tablica&#91;w4&#93;;<br />wys4_on;<br />break;<br />}<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=3621">mateusz19955</a> — 24 kwi 2014, o 20:20</p><hr />
]]></content>
</entry>
</feed>