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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-02-01T17:18:48+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=58&amp;t=10461&amp;mode</id>
<entry>
<author><name><![CDATA[Piter3132]]></name></author>
<updated>2015-02-01T17:09:46+01:00</updated>
<published>2015-02-01T17:09:46+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116779#p116779</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116779#p116779"/>
<title type="html"><![CDATA[Re: Źle działające AREF]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116779#p116779"><![CDATA[
Dziękuję panie Mirku <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /><br />Faktycznie mam teraz 1,1V i to nawet dokładny egzemplarz mi się udał, bo równo 1,100V <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br />W związku z literówką, to taki niezauważony błąd w pisaniu <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />Lecz nie rozumiem dlaczego w kodzie z początku tematu dzieją się takie cuda.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 17 minutach ]</span></strong><br /><br />Przy pomiarze te bity są maskowane, wiec to raczej nie tu jest błąd.<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 20 minutach ]</span></strong><br /><br />Mam! Znalazłem babola!<br />Nie zapisałem przy tym maskowaniu 0b i kompilator nie wiedział, że to binarny kod.<br />Zmieniało mi bity w rejestrze odpowiedzialne za ustawianie napięcia odniesienia.<br />Człowiek się uczy całe życie <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=7657">Piter3132</a> — 1 lut 2015, o 17:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[anshar]]></name></author>
<updated>2015-02-01T15:09:19+01:00</updated>
<published>2015-02-01T15:09:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116755#p116755</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116755#p116755"/>
<title type="html"><![CDATA[Re: Źle działające AREF]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116755#p116755"><![CDATA[
LM35 ma dokładność 0.5°C. Zobacz w nocie katalogowej. <!-- m --><a class="postlink" href="http://www.ti.com/lit/ds/symlink/lm35.pdf" >http://www.ti.com/lit/ds/symlink/lm35.pdf</a><!-- m --><br />0.5°C Ensured Accuracy (at +25°C)<br /><br />Więc to chyba nie wina ADC w Atmega328p tylko samego LM'a.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7157">anshar</a> — 1 lut 2015, o 15:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-02-01T14:59:08+01:00</updated>
<published>2015-02-01T14:59:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116753#p116753</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116753#p116753"/>
<title type="html"><![CDATA[Re: Źle działające AREF]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116753#p116753"><![CDATA[
<div class="quotetitle">Piter3132 napisał(a):</div><div class="quotecontent"><br />Jak widać na rysunku z noty katalogowej, aby uzyskać 1,1V na AREF trzeba ustawić oba te rejestry.<br /></div><br /><br />taka może mała literówka chodzi o oba bity w rejestrze, ale ... ok zapewniam cię że to zawsze dobrze działa, nie jeden raz korzystałem w tym procku z ADC. <br /><br />Mówisz, że nie masz zwarcia pinu AREF z VCC .... rozumiem, że sprawdzałeś to brzęczykiem przy wyłączonym układzie ? tak na wszelki wypadek ?<br /><br />w programie w main daj po inicjalizacji ADC pułapkę (żeby wyeliminować błąd że ci się np gdzieś procek nie wykrzacza w programie, że gdzieś nie zmieniasz wartości tych bitów)<br /><br />Init_ADC();     // inicjalizacja przetwornika ADC<br />while(1);<br /><br />i wtedy sprawdź miernikiem napięcie na AREF ... musi być 1,1V<br /><br />jeśli w tym momencie nie ma - to nie ma co tam sprawdzać dalej programu .... szukaj błędu wtedy w sprzęcie nie ma wyjścia<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 1 lut 2015, o 14:59</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Piter3132]]></name></author>
<updated>2015-02-01T14:51:49+01:00</updated>
<published>2015-02-01T14:51:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116752#p116752</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116752#p116752"/>
<title type="html"><![CDATA[Re: Źle działające AREF]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116752#p116752"><![CDATA[
Spotkał się ktoś już z takim problemem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7657">Piter3132</a> — 1 lut 2015, o 14:51</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Piter3132]]></name></author>
<updated>2015-02-01T17:18:48+01:00</updated>
<published>2015-02-01T11:53:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116730#p116730</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116730#p116730"/>
<title type="html"><![CDATA[Źle działające AREF]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=10461&amp;p=116730#p116730"><![CDATA[
Witam!<br />Postanowiłem zrobić miernik temperatury na lm35.<br />Program napisany dla ATmega328P, i wszystko działa dobrze za wyjątkiem tego, że nie mogę ustawić dobrego napięcia odniesienia, czyli 1,1V, aby mieć większą rozdzielczość.<br /><a href="http://forum.atnel.pl/_obrazki/o/7657/7d9a98e6c3923702f208bd506f8b5b6e.png"  class="postlink"><img src="http://forum.atnel.pl/_obrazki/o/thumb/7657/7d9a98e6c3923702f208bd506f8b5b6e.png" alt="Obrazek" /></a><br />Jak widać na rysunku z noty katalogowej, aby uzyskać 1,1V na AREF trzeba ustawić oba te rejestry.<br />Robiąc to uzyskuję na AREF równe AVCC (sprawdzałem i jestem pewien na 100%, że na pcb nie ma połączenia między tym pinami)<br />Patrząc na wszystkie możliwości wychodzi na to, że rejestr nie reaguje na ustawianie REFS1, bo czy jest ustawiony czy nie, to mam tylko 2 możliwości :<br />1 i 3 linijka - wyłączyć napięcie odniesienia<br />2 i 4 linijka - włączyć avcc na aref<br /><br />main:<br />[syntax=c]#include &lt;avr/io.h&gt;    // dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;// dołączenie pliku nagłówkowego do obsługi przerwań<br />#include &lt;util/delay.h&gt;     // dołączenie pliku do obsługi delay'a<br /><br />#include &quot;d_led.h&quot;   // dołączenie pliku nagłówkowego (obsługa LED)<br /><br /><br />/********************************* Deklaracje funkcji *********************************/<br /><br />void Init_ADC(void);<br />int16_t pomiar(uint8_t kanal);<br />void Wyswietl(uint16_t liczba);<br /><br />int main(void)<br />{<br />DDRB |= (1&lt;&lt;PB5);<br /><br />/*********************************** inicjalizacja ************************************/<br /><br />d_led_init();  // inicjalizacja wyświetlacza multipleksowanego<br />Init_ADC();     // inicjalizacja przetwornika ADC<br /><br />sei();// włączenie globalnego zezwolenia na przerwania<br /><br />/********************************** Zmienne globalne *********************************/<br /><br />uint16_t liczba = 0;<br /><br />/************************************ pętla główna ***********************************/<br /><br />while(1)<br />{<br />liczba = pomiar(PC4) * 5;<br />kropka3 = 1;<br /><br />Wyswietl(liczba);<br /><br />//if((liczba &gt;= 450) &amp; (liczba &lt;= 550) )PORTB |= (1&lt;&lt;PB5); else PORTB &amp;= ~(1&lt;&lt;PB5);<br />}<br />}<br /><br />/************************************ Moje funkcje **********************************/<br /><br />void Wyswietl(uint16_t liczba)<br />{<br />uint8_t d1,d2,d3,d4;<br /><br />d1=liczba/1000;<br />if(d1) cy1=d1; else cy1=NIC;<br /><br />d2=(liczba / 100) % 10;<br />if(d2) cy2=d2; else cy2=(liczba&gt;999)?0:NIC;<br /><br />d3=(liczba % 100) / 10;<br />if(d3) cy3=d3; else cy3=(liczba&gt;99)?0:NIC;<br /><br />d4=(liczba % 10);;<br />cy4=d4;<br /><br />_delay_ms(500);<br />}<br /><br /><br />void Init_ADC(void)<br />{<br />ADCSRA |= (1&lt;&lt;ADEN); //włącz ADC<br />ADCSRA |= (1&lt;&lt;ADPS0) | (1&lt;&lt;ADPS1) | (1&lt;&lt;ADPS2); //włącz preskaler 128 co przy 16MHz daje 125kHz<br />ADMUX |= (1&lt;&lt;REFS0) | (1&lt;&lt;REFS1); // napięcie odniesienia 1,1v<br />}<br /><br /><br />int16_t pomiar(uint8_t kanal)<br />{<br />ADMUX = (ADMUX &amp; 11111000) | kanal;<br />ADCSRA |= (1&lt;&lt;ADSC);<br />while(ADCSRA &amp; (1&lt;&lt;ADSC));<br />return ADCW;<br />}[/syntax]<br /><br />d_led.h :<br />[syntax=c]#ifndef _d_led_h// dyrektywy zabezpieczające przed wielokrotnym dołączaniem<br />#define _d_led_h// tego samego pliku nagłówkowego jeśli będzie dołączany<br />// w wielu różnych plikach programu<br /><br />// definicje portów i pinów wyświetlacza używanych dla ułatwienia w programie jako stałe preprocesora<br />#define LED_DATA PORTD// port z podłączonymi segmentami<br />#defineLED_DATA_DIR DDRD// rejestr kierunku portu anod wyświetlaczy<br />#define T_PORT PORTB// port z podłączonymi tranzystorami- 4 bity najmłodsze<br />#define T_DIR DDRB// rejestr kierunku portu tranzystorów wyświetlaczy<br /><br /><br />#define T1 (1&lt;&lt;PB0)// T1 oznacza bit nr.0 portu C<br />#define T2 (1&lt;&lt;PB1)// T2 oznacza bit nr.1 portu C<br />#define T3 (1&lt;&lt;PB2)// T3 oznacza bit nr.2 portu C<br />#define T4 (1&lt;&lt;PB3)// T4 oznacza bit nr.3 portu C<br /><br />// definicje bitów dla poszczególnych segmentów LED<br />#define SEG_A (1&lt;&lt;7)<br />#define SEG_B (1&lt;&lt;6)<br />#define SEG_C (1&lt;&lt;5)<br />#define SEG_D (1&lt;&lt;4)<br />#define SEG_E (1&lt;&lt;3)<br />#define SEG_F (1&lt;&lt;2)<br />#define SEG_G (1&lt;&lt;1)<br />#define SEG_DP (1&lt;&lt;0)<br /><br />#define NIC 10<br />#define MINUS 11<br /><br />// same DEKLARACJE zmiennych globalnych na potrzeby wykorzystania ich w innych plikach projektu<br />// przydomek externpowoduje, iż te zmienne będą dostępne we wszystkich modułach, które dołączą plik<br />// d_led.h za pomocą dyrektywy #include<br />extern volatile uint8_t cy1, cy2, cy3, cy4;<br />extern volatile uint8_t kropka1, kropka2, kropka3, kropka4;<br /><br /><br /><br />void d_led_init(void);<br /><br />#endif// koniec _d_led_h[/syntax]<br /><br />d_led.c :<br />[syntax=c]#include &lt;avr/io.h&gt;// dołączenie głównego systemowego  pliku nagłówkowego<br />#include &lt;avr/interrupt.h&gt;// dołączenie pl. nagłówkowego potrzebnego do obsł. przerwań<br />#include &lt;avr/pgmspace.h&gt;// dołączenie pl. nagłówkowego potrzebnego do odczytu<br />// danych zawartych w pamięci programu FLASH<br /><br />#include &quot;d_led.h&quot;// dołączenie naszego pliku nagłówkowego<br />// w nim znajdują się potrzebne tu m.in. definicje preprocesora<br /><br />// definicje zmiennych globalnych przechowujących cyfry do wyświetlania<br />// volatile – ponieważ będą wykorzystywane do odczytu i zapisu zarówno w przerwaniu i programie<br />// głównym. Trzeba więc wyłączyć optymalizację dostępu do nich. (zmienne ulotne)<br />volatile uint8_t cy1, cy2, cy3, cy4;<br />volatile uint8_t kropka1, kropka2, kropka3, kropka4;<br /><br /><br />// definicja tablicy zawierającej definicje bitowe cyfr LED<br />const uint8_t cyfry&#91;13&#93; PROGMEM = {<br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F),// 0<br />(SEG_B|SEG_C),// 1<br />(SEG_A|SEG_B|SEG_D|SEG_E|SEG_G),// 2<br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_G),// 3<br />(SEG_B|SEG_C|SEG_F|SEG_G),// 4<br />(SEG_A|SEG_C|SEG_D|SEG_F|SEG_G),// 5<br />(SEG_A|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 6<br />(SEG_A|SEG_B|SEG_C|SEG_F),// 7<br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_E|SEG_F|SEG_G),// 8<br />(SEG_A|SEG_B|SEG_C|SEG_D|SEG_F|SEG_G),// 9<br />(0x00),    // 10 NIC (puste miejsce)<br />(SEG_G)    // 11 kropka<br />};<br /><br /><br /><br />// ****** definicja funkcji inicjalizującej pracę z wyświetlaczem multipleksowanym<br />void d_led_init(void)<br />{<br />LED_DATA_DIR = 0xFF;   // wszystkie piny portu D jako WYJŚCIA(anody)<br />LED_DATA = 0x00;// wygaszenie wszystkich anod – stan niski<br />T_DIR |= T1 | T2 | T3 | T4;// 4 piny portu A jako WYJŚCIA (katody wyświetlaczy)<br />T_PORT |= T1 | T2 | T3  | T4;// wygaszenie wszystkich wyświetlaczy - katody<br /><br />// ustawienie TIMER0<br />TCCR0A |= (1&lt;&lt;WGM01);// tryb CTC<br />TCCR0B |= (1&lt;&lt;CS02)|(1&lt;&lt;CS00);// preskaler = 1024<br />OCR0A = 64;// dodatkowy podział przez 65 (rej. przepełnienia) 240Hz<br />TIMSK0 |= (1&lt;&lt;OCIE0A);// zezwolenie na przerwanie CompareMatch<br />}<br /><br /><br />// ================= PROCEDURA OBSŁUGI PRZERWANIA – COMPARE MATCH<br />ISR(TIMER0_COMPA_vect)<br />{<br />static uint8_t licznik=8;// zmienna do przełączania kolejno tranzystorów wyswietlacza<br /><br />T_PORT = (T_PORT &amp; 0xF0);// wygaszenie wszystkich wyświetlaczy<br /><br /><br />if(licznik==8)<br />        {<br />            if(kropka1 == 1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; ) | SEG_DP;             // gdy zapalony wyśw.1 podaj stan zmiennej c1 i włącz kropkę<br />            else LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy1&#93; );   // gdy zapalony wyśw.1 podaj stan zmiennej c1<br />        }<br />        else if(licznik==4)<br />        {<br />            if(kropka2 == 1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; ) | SEG_DP;<br />            else LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy2&#93; );           // gdy zapalony wyśw.2 podaj stan zmiennej c2<br />        }<br />        else if(licznik==2)<br />        {<br />            if(kropka3 == 1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; ) | SEG_DP;<br />            else LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy3&#93; );                   // gdy zapalony wyśw.3 podaj stan zmiennej c3<br />        }<br />        else if(licznik==1)<br />        {<br />            if(kropka4 == 1) LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; ) | SEG_DP;<br />            else LED_DATA = pgm_read_byte( &amp;cyfry&#91;cy4&#93; );                   // gdy zapalony wyśw.4 podaj stan zmiennej c4<br />        }<br />T_PORT = (T_PORT &amp; 0xF0) | (licznik &amp; 0x0F);// cykliczne przełączanie kolejnego tranzystora w każdym przerwaniu<br /><br />// operacje cyklicznego przesuwania bitu zapalającego anody w zmiennej licznik<br />licznik &gt;&gt;= 1;// przesunięcie zawartości bitów licznika o 1 w prawo<br />if(licznik&lt;1) licznik = 8;// jeśli licznik większy niż 8 to ustaw na 1<br />}[/syntax]<br /><br />Przy tym kodzie jak widać mam ustawione oba rejestry a mimi to na aref mam 5v czyli avcc.<br />Wie ktoś o co tu chodzi?<br /><br /><strong><span style="color: #808000">------------------------ [ Dodano po: 15 minutach ]</span></strong><br /><br />Na razie mam dokładność co 0,5*C.<br />A z tym, że wartość adc wzrasta co 0,48828125mV poradziłem sobie tak, że gdy adc większe od 50 to od adc zabieram 1 i dopiero mnożę przez 5.<br />[syntax=c]if(pomiar(PC4)&gt;50) liczba = (pomiar(PC4) - 1) * 5; else liczba = pomiar(PC4) * 5;[/syntax]<br />jest dokładnie ale do 50*C bo potem znowu podskoczy adc o jeden za dużo, ale mniejsza z tym <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><br />I tak taka dokładność mnie nie zadowala, bo co 0,5*C przez to AREF...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=7657">Piter3132</a> — 1 lut 2015, o 11:53</p><hr />
]]></content>
</entry>
</feed>