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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2016-10-05T20:57:08+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=16256&amp;mode</id>
<entry>
<author><name><![CDATA[fundomikey]]></name></author>
<updated>2016-10-05T20:57:08+01:00</updated>
<published>2016-10-05T20:57:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=170561#p170561</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=170561#p170561"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=170561#p170561"><![CDATA[
Jak się pozbyć zakłóceń na SPI? Ciagle w kółko pojawiają się jakieś losowe dane czasem mi się wydaje że np 6 wartości sie w kółko pokazuje, odłączyłem SPI od ADC i dalej pokazuje jakieś losowe wartości. Podczas pracy przetwornika pojawia sie stan niski, czyli jak mi się wydaje, że przetwornik daje mi wynik konwersacji ale i tak on ginie w tych zakłóceniach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13403">fundomikey</a> — 5 paź 2016, o 20:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fundomikey]]></name></author>
<updated>2016-10-02T14:54:45+01:00</updated>
<published>2016-10-02T14:54:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=170194#p170194</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=170194#p170194"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=170194#p170194"><![CDATA[
Ma ktoś jeszcze jakąś koncepcje co mogę jeszcze zrobić? Nie mam oscyloskopu, ale za pomocą multimetru i funkcji pomiaru poziomów TTL, w czasie gdy mam podłączony programator, zmieniają się stany logiczne na pinie RD(informacja o zakończonej konwersji) i CS przetwornika ADC, co jak mi się wydaje świadczy o tym że przetwornik odpowiada na to co mu wysyłam, a na wyświetlaczu pojawiają mi się w kółko 4-5 tych  samych wartości. Gdy odepnę programator od USB i jeszcze odłączę linie RESET od niego, tu się dzieje inna bajka. Program działa całkiem inaczej, pin RD prawie wgl nie zmienia swojego stanu, raczej albo ma stan wysoki, albo niski ale wtedy program i tak już jest zawieszony. Pin CS po zresetowaniu procka parę razy zmienia swój stan, po czym zawiesza się procek i albo CS zostaje na stanie wysokim albo niskim, czyli program się wiesza w różnych momentach, albo przy odbieraniu albo wysyłaniu bajtów. Po każdym Resecie program zachowuje się za każdym razem inaczej. Zanim się procek zawiesi wyświetla parę wartości(wtedy również linia CS zmienia swoje stany). Gdy już się program zawiesi wyświetlacz głupieje, albo zaświecając wszystkie segmenty albo wyświetlając jakieś dziwne znaki. Już nie mam pojęcia co może być nie tak. Myślałem że to przez linie RESET, teraz mam ją podłączoną, tak jak znalazłem na jednej ze stron:<br /><a href="https://obrazkiforum.atnel.pl/13403/313c2db37d587dd4bf09e8ee2e5700fb.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/13403/313c2db37d587dd4bf09e8ee2e5700fb.JPG" alt="Obrazek" /></a><br />Ma ktoś jeszcze jakieś sugestie co może być nie tak ?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13403">fundomikey</a> — 2 paź 2016, o 14:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fundomikey]]></name></author>
<updated>2016-09-29T09:26:12+01:00</updated>
<published>2016-09-29T09:26:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169862#p169862</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169862#p169862"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169862#p169862"><![CDATA[
ATmege zasilam zewnętrznym zasilaniem 5V, Piny Vcc i AVcc podłączone do 5V i obie GND do masy, miałem z początku problem z masą ponieważ miałem nie równe zasilania na płytce stykowe, i teraz po podłączeniu masy w wielu punktach udało się uzyskać poprawne zasilanie, pin RESET procka mam podpięty do Vcc przez rezystor 10k, nic to nie dało nadal mam odmienne działanie programu z programatorem i bez.<br />Dodatkowo wchodzi kwestia tego że bez podłączonego programatora, czasem wariuje mi wyświetlacz, tak jakby sie resetował i zaświecają się wszystkie segmenty, po czym normalnie wyświetla liczby. Poza tym wydaje mi się że bez programatora przetwornik odpowiada na to co mu wysyłam.   <br />Jeszcze później kupie i spróbuje z rezystorami 100 Ohm na SPI.<br /><br /><br />EDIT:<br />Zmieniłem rezystory na SPI na 100 Ohm, i pojawiły sie błędy przy programowaniu procka, dlatego spowrotem powróciłem do rezystorów 10k, i już nie ma błędów, ale i tak mam problemy z komunikowaniem się z ADC<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13403">fundomikey</a> — 29 wrz 2016, o 09:26</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HomoChemicus]]></name></author>
<updated>2016-09-28T22:53:34+01:00</updated>
<published>2016-09-28T22:53:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169836#p169836</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169836#p169836"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169836#p169836"><![CDATA[
10k to trochę dużo. Nie masz niczego poniżej 1k om?<br /><br />Tak z ciekawości, bo nie ma tego na schemacie. Jak wygląda u ciebie zasilanie i podciągnięcie resetu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10470">HomoChemicus</a> — 28 wrz 2016, o 22:53</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fundomikey]]></name></author>
<updated>2016-09-28T22:30:43+01:00</updated>
<published>2016-09-28T22:30:43+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169834#p169834</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169834#p169834"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169834#p169834"><![CDATA[
Dodałem rezystory po 10k, bo akurat takie teraz mam pod ręką i podziałało:) nie mam już błędów podczas programowania, ale zauważyłem że zwłaszcza jeśli chodzi o komunikacje SPI, i wnioskując z tego co wyświetlam na wyświetlaczu to dalej widzę że programator chyba wpływa na całą komunikacje. Kiedy mam podpięty programator, wyświetlają mi się na zmianę dwie wartości niezależnie czy mam podpięte ADC przez SPI czy nie, natomiast gdy odłączę programator(wypinam USB, oraz odpinam linie RESET), to program zdaje się ruszać, oraz po zbadaniu pinu RD przetwornika, widać że przetwornik reaguje na to co mu się wysyła a przynajmniej tak mi się wydaje. Co jeszcze mogę zrobić? Dalej coś jest nie tak na liniach SPI.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13403">fundomikey</a> — 28 wrz 2016, o 22:30</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[HomoChemicus]]></name></author>
<updated>2016-09-27T18:36:00+01:00</updated>
<published>2016-09-27T18:36:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169747#p169747</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169747#p169747"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169747#p169747"><![CDATA[
Wlutuj rezystory na liniach SPI tak z 100-200 om i po sprawie.<br />A schemat trochę poplątany, ledwo można się połapać co gdzie i jak.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10470">HomoChemicus</a> — 27 wrz 2016, o 18:36</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fundomikey]]></name></author>
<updated>2016-09-27T14:44:12+01:00</updated>
<published>2016-09-27T14:44:12+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169726#p169726</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169726#p169726"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169726#p169726"><![CDATA[
Dalej z tą komunikacją jest coś nie tak, mógłby ktoś sprawdzić schemat, czy dobrze podłączyłem?<br /><a href="https://obrazkiforum.atnel.pl/13403/ea66212651aa42a9f4f31b25b8d44b39.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/13403/ea66212651aa42a9f4f31b25b8d44b39.JPG" alt="Obrazek" /></a><br /><br />Ponadto mam błędy podczas programowania, np takie:<br />[syntax=c]avrdude_mk.exe: verifying ...<br />avrdude_mk.exe: verification error, first mismatch at byte 0x0202<br />                0x0f != 0xff<br />avrdude_mk.exe: verification error; content mismatch<br /><br />avrdude_mk.exe: safemode: Fuses OK<br /><br />avrdude_mk.exe done.  Thank you.[/syntax]<br /> myślałem że to przez złe zasilanie, sprawdziłem wszystkie połączenia dodałem dodatkowe kondensatory filtrujące ale winna okazała się linia MISO, i po jej odpięciu programowanie przebiega bez problemu. Co mogę jeszcze zrobić żeby nie musieć odpinać tej lini podczas programowania?<br />Poza tym program działa tak że wyświetlają mi się na zmianę dwie wartości, wyświetlają się nawet wtedy gdy odłączę linie MISO, MOSI od ADC. Sprawdziłem już bity jakie wysyłam czy na pewno są poprawne a mianowicie:<br />1) wysyłam jeden bajt do COMMUNICATIONS REGISTER(nastepnę wysyłane bajty będa wpisywane do MODE REGISTER)<br />2) wysyłam dwa bajty(zakres+/-1,28V;Continuous conversion; Bipolar input; reference 2,5V; wejścia AIN1-AIN2)<br />3) wysyłam jeden bajt do COMMUNICATIONS REGISTER(ciągły odczyt Data Register-wrtość pomiaru-24bit)<br />Teraz moja funkcja do odbierania wygląda tak:<br />[syntax=c]uint32_t ReceiveTreeSpi(void)           // odebranie 3 bajtow<br />{<br />   uint32_t odb1, odb2, odb3, odb;<br />   odb=0; <br />   PORTB &amp;= ~(1&lt;&lt;CS);<br />   odb1 = ReceiveSpi();<br />   odb2 = ReceiveSpi();<br />   odb3 = ReceiveSpi();<br />   while(!(PINB &amp;(1&lt;&lt;PB0)))<br /><br />   odb = (odb1&lt;&lt;16) | (odb2&lt;&lt;8) | (odb3) ;<br />   PORTB |= (1&lt;&lt;CS);<br /><br />return odb;<br /><br />}[/syntax]<br />Nie wiem już czego się teraz złapać bo próbuje ciągle czegoś nowego i ciągle ten sam efekt :/<br />Jakieś sugestie co może być nie tak?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13403">fundomikey</a> — 27 wrz 2016, o 14:44</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fundomikey]]></name></author>
<updated>2016-09-21T15:38:53+01:00</updated>
<published>2016-09-21T15:38:53+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169250#p169250</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169250#p169250"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169250#p169250"><![CDATA[
<strong><em>Sparrow-hawk</em></strong> Rzeczywiście mam błąd, nie wiem jak to mogłem źle przepisać, a przepisywałem z książki Pana Mirka.<br />Jednak przepisałem dobrze ale Eclipse pokazał mi ostrzeżenie o zmienieniu &amp; na &amp;&amp; i stąd ten błąd.<br />Teraz komunikacja ruszyła, pokazuje mi sie na ekranie szybko zmieniająca 8 cyfrowa liczba czyli tak jak powinno być, ale z podłączonym na sztywno do masy pinem sprawdzającym stan pinu RD przetwornika, gdyż jak podłącze do przetwornika to komunikacja sie zatrzymuje, dalej coś jest nie tak. Spróbuje jeszcze raz prześledzić to co wysyłam do przetwornika, może błąd leży po stronie jego konfiguracji, albo poprastu z tym przetwornikiem coś jest nie tak, bo znalazłem na angielskim forum podobny przypadek z brakiem stanu niskiego na pinie RD przetwornika, i okazało się że dwa przetworniki jakie posiadał ten Pan były zepsute.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13403">fundomikey</a> — 21 wrz 2016, o 15:38</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dzikidziku]]></name></author>
<updated>2016-09-21T08:57:42+01:00</updated>
<published>2016-09-21T08:57:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169168#p169168</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169168#p169168"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169168#p169168"><![CDATA[
Poza tym, albo używasz klamerek w if, albo, co wyglądałoby znacznie lepiej, pętli while: <br />[syntax=c]while (stanWysokiNaPB0) ;[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13388">dzikidziku</a> — 21 wrz 2016, o 08:57</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Sparrow-hawk]]></name></author>
<updated>2016-09-21T07:24:00+01:00</updated>
<published>2016-09-21T07:24:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169159#p169159</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169159#p169159"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169159#p169159"><![CDATA[
Tutaj masz błąd:<br />[syntax=c]uint8_t ReceiveSpi()<br />{<br />        while(!SPSR &amp;&amp; (1&lt;&lt;SPIF)) ;<br />        return SPDR;<br />}[/syntax]<br />Powinno być raczej:<br />[syntax=c]uint8_t ReceiveSpi()<br />{<br />        while(!(SPSR &amp; (1&lt;&lt;SPIF))) ;<br />        return SPDR;<br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=10614">Sparrow-hawk</a> — 21 wrz 2016, o 07:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fundomikey]]></name></author>
<updated>2016-09-20T20:11:57+01:00</updated>
<published>2016-09-20T20:11:57+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169112#p169112</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169112#p169112"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169112#p169112"><![CDATA[
Teraz funkcja odbierania wygląda tak:<br />[syntax=c]uint32_t ReceiveTreeSpi(void)           // odebranie 3 bajtow<br />{<br />   uint32_t odb1, odb2, odb3, odb;<br /><br />   if(!(PINB &amp;(1&lt;&lt;PB0)))<br />   PORTB &amp;= ~(1&lt;&lt;CS);<br />   odb1 = ReceiveSpi();<br />   odb2 = ReceiveSpi();<br />   odb3 = ReceiveSpi();<br /><br />   odb = (odb1&lt;&lt;16) | (odb2&lt;&lt;8) | (odb3) ;<br />  PORTB |= (1&lt;&lt;CS);<br /><br />return odb;<br /><br />}[/syntax]<br /><br />Wysyłanie raczej już jest ok, problem z odbiorem bo gdy chce odebrać te 3 bajty, program zatrzymuje się gdzieś w tej funkcji, próbowałem też bez sprawdzania stanu na pinie RD ale to nic nie daje. Za to gdy w petle główną dam odbieranie tylko jednego bajtu to na wyświetlaczu pojawiają się szybko zmieniające się liczby 3 cyfrowe, także coś przetwornik wysyła.. Może problem leży w czasach pomiędzy odbieraniem poszczególnych bajtów?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13403">fundomikey</a> — 20 wrz 2016, o 20:11</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dzikidziku]]></name></author>
<updated>2016-09-20T17:17:17+01:00</updated>
<published>2016-09-20T17:17:17+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169087#p169087</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169087#p169087"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169087#p169087"><![CDATA[
No, ale po odebraniu bajtów musisz ustawić linię CS ponownie na &quot;1&quot;, prawda? W kodzie tego nie masz. <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13388">dzikidziku</a> — 20 wrz 2016, o 17:17</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fundomikey]]></name></author>
<updated>2016-09-20T16:54:37+01:00</updated>
<published>2016-09-20T16:54:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169086#p169086</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169086#p169086"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169086#p169086"><![CDATA[
Zmieniłem ale nic to nie dało, ale raczej trzeba linie CS wprowadzić w stan niski.  Jedynie od czasu do czasu pojawia się jakaś wartość na wyświetlaczu, ale jest ona tylko przez chwile i pojawia się przy resetowaniu procka. Program się zatrzymuje przy podłączeniu lini MOSI, czyli dalej jest cos nie tak z wysyłaniem.. Poza tym mam konflikt pomiędzy SPI a ISP, ponieważ żeby zaprogramować procka muszę odłączać linie MOSI, próbowałem już poprzez rezystor podciągać linie SS do zasilania ale żadnego pozytywnego efektu to nie dało.<br />Zmieniłem jeszcze funkcje do odbierania:<br />[syntax=c]uint32_t ReceiveTreeSpi(void)           // odebranie 3 bajtow<br />{<br />   uint32_t odb1, odb2, odb3, odb;<br />if(!(PINB &amp;(1&lt;&lt;PB0))) //jeśli wystąpi stan niski na pinie RD to odbieraj bajty<br />   PORTB &amp;= ~(1&lt;&lt;CS);<br />   odb1 = ReceiveSpi();<br />   odb2 = ReceiveSpi();<br />   odb3 = ReceiveSpi();<br />   //while(!(PINB &amp;(1&lt;&lt;PB0))); //sprawdzenie stanu RD z przetwornika<br />  // informujacego o zakończeniu przesyłania bajtów<br />   odb = (odb1&lt;&lt;16) | (odb2&lt;&lt;8) | (odb3) ;<br /><br />return odb;<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13403">fundomikey</a> — 20 wrz 2016, o 16:54</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[dzikidziku]]></name></author>
<updated>2016-09-20T14:02:29+01:00</updated>
<published>2016-09-20T14:02:29+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169077#p169077</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169077#p169077"/>
<title type="html"><![CDATA[Re: ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169077#p169077"><![CDATA[
Nie chcę namieszać ale wydaje mi się, że zgodnie z rys.16, str.34, funkcja SendSpi powinna wyglądać nieco inaczej:<br /><br />[syntax=c]PORTB &amp;= ~(1&lt;&lt;CS); //stan niski na CS<br /><br />SPDR = dataHigh; //załadowanie bajtu do bufora<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br /><br />PORTB |= (1&lt;&lt;CS); //stan wysoki na CS[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13388">dzikidziku</a> — 20 wrz 2016, o 14:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[fundomikey]]></name></author>
<updated>2016-09-20T15:13:27+01:00</updated>
<published>2016-09-20T13:35:37+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169072#p169072</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169072#p169072"/>
<title type="html"><![CDATA[ATMega32 komunikacja z AD7731 po SPI]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=16256&amp;p=169072#p169072"><![CDATA[
Witam, <br />Mam problem z komunikacją pomiędzy ATMega32A a przetwornikiem ADC AD7731(link do noty: <!-- m --><a class="postlink" href="http://www.analog.com/media/en/technical-documentation/data-sheets/AD7731.pdf" >http://www.analog.com/media/en/technica ... AD7731.pdf</a><!-- m -->).<br />Problem polega na tym że coś jest chyba nie tak w funkcji do odbioru 3 bajtów, podejrzewam że może to być brak stanu niskiego na pinie RD przetwornika, ale usuwałem ten fragment gdzie jest sprawdzenie czy wystąpił stan niski i nic to nie dało. Dodałem sobie diodę, żeby widzieć czy program w ogóle działa, dioda zaczyna migać a sygnał na lini SCK zaczyna być aktywny gdy odłączę od przetwornika sygnał MOSI, nie wiem dlaczego tak się dzieje. Na to wychodzi że nic nie mogę wysłać do przetwornika, dlatego mam problem z odbiorem. Używając funkcji do odbioru pojedynczego bajtu  i wyświetleniu jej na wyświetlaczu pojawiają się losowe liczby z zakresu 0..255(oczywiście tylko wtedy gdy linia MOSI jest odłączona, gdy jest podłączona nic się nie wyświetla i program się jakby zawiesza)<br /><br />Daje tutaj schemat podłączenia, podłączyłem na podstawie noty katalogowej, z wyjątkiem pinu CS przetwornika, który w nocie był podłączony do masy, a ja go podłączyłem do pinu SS ATmegi. <br /><a href="https://obrazkiforum.atnel.pl/13403/1035c7601ef3ea478d7f21d5a17e0734.JPG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/13403/1035c7601ef3ea478d7f21d5a17e0734.JPG" alt="Obrazek" /></a><br /><br />Do podłączenia musiałem użyć bufor napięciowy, gdyż zasilanie przetwornika to 3V i nie można go przekroczyć, ATMega zasilana jest napięciem 5V, bufor również jest zasilany takim napięciem.<br />Kod programu:<br />[syntax=c]#include &lt;avr/io.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;string.h&gt;<br />#include &quot;lcd44780.h&quot;<br />#include &lt;stdlib.h&gt;<br /><br />typedef struct {<br />uint16_t adc_mid;<br />uint32_t ref_a; //wspólczynnik &quot;a&quot; prostej y=ax, pomnozona ak by nie było przecinka<br />uint16_t ref_v;<br />char v1&#91;3&#93;;<br />char v2&#91;3&#93;;<br /><br />}value;<br /><br />value stale;<br /><br /><br />/* hardware SPI */<br />#define MOSI PB5//   &lt;---- A (SER IN)<br />#define SCK PB7//   &lt;---- SHIFT CLOCK (SC)<br />#define CS PB4// &lt;---- LATCH CLOCK (LC)<br /><br />//dane do wysyłania po SPI<br />//////////////////////////////////////////////////////////////////////////////////////<br /><br />#define CR1 0b00000010 //Ustawienie R. komunikacyjnego na pojedyncze wpisanie danych do Mode Register<br />#define CR2 0b00100001 //Ustawienie R. komunikacyjnego na ciągły odczyt danych z Data Register<br />#define MSBMR2 0b10000001 // starszy bajt z dwóch bajtów Mode Register-&gt;internal zero scale  calibration(AIN1-AIN2)<br />#define LSBMR2 0b01110100 // młodszy baj z dwóch bajtów MOde Register-&gt;internal zero scale  calibration<br />#define MSBMR3 0b10000001 // starszy bajt z dwóch bajtów Mode Register-&gt;internal full scale  calibration<br />#define LSBMR3 0b01110100 // młodszy baj z dwóch bajtów MOde Register-&gt;internal full scale  calibration(AIN1-AIN2)<br />#define LSBMR4 0b01110101 //  młodszy baj z dwóch bajtów MOde Register-&gt; kalibracja  wejśc (AIN3-AIN4)<br />#define LSBMR5 0b01110110 //  młodszy baj z dwóch bajtów MOde Register-&gt; kalibracja  wejśc (AIN5-AIN6)<br />#define MSBMR 0b00100001 //starszy bajt z dwóch bajtów Mode Register<br />#define LSBMR 0b01110100 //młodszy baj z dwóch bajtów MOde Register<br /><br />///////////////////////////////////////////////////////////////////////////////////////<br />void InitSpi(void);/* inicjalizacja sprzętowego SPI */<br />void send_spi_buf(uint8_t *buffer, uint8_t len);<br />uint8_t ReceiveSpi(void);<br />void format(uint32_t adc, value *voltage);<br />uint32_t ReceiveTreeSpi(void);<br />void calibration(void);<br />void SendSpi( uint8_t bajt );/* wysłanie bajtu - sprzętowe SPI */<br />uint8_t buf&#91;&#93; = {CR1, MSBMR, LSBMR, CR2 };<br />uint8_t *buffer;<br />uint8_t i;<br />uint32_t zmienna;<br />int main(void)<br />{<br />DDRC |= (1&lt;&lt;PC0);<br />InitSpi();<br />lcd_init();<br />PORTB |= (1&lt;&lt;PB0); //podciaganie klawisz do VCC<br /><br />SendSpi(0xFF);<br />SendSpi(0xFF);<br />SendSpi(0xFF);<br />SendSpi(0xFF);<br />send_spi_buf(&amp;buf&#91;0&#93;, 3); // wysłanie bitów konfiguracyjnych<br />//void calibration(void);<br /><br />while(1)<br />{<br /><br />_delay_ms(200);<br />PORTC ^= (1&lt;&lt;PC0);<br />lcd_locate(0,0);<br />//send_spi_buf(&amp;buf&#91;0&#93;, 3);<br />lcd_int(ReceiveTreeSpi());<br /><br />//zmienna = ReceiveTreeSpi();<br />//lcd_locate(1,0);<br />//lcd_int(zmienna);<br />//lcd_int(ReceiveSpi());<br />// void lcd_cls(void);<br />//lcd_locate(0,5);<br />//lcd_int(ReceiveSpi());<br /><br />// format(zmienna, &amp;stale);<br />// lcd_str(stale.v1);<br />// lcd_str(&quot;.&quot;);<br />// lcd_str(stale.v2);<br /><br /><br />}<br />}<br /><br /><br />void InitSpi(void)<br />{<br />/* ustawienie kierunku wyjściowego dla linii MOSI, SCK i CS */<br />DDRB |= (1&lt;&lt;MOSI)|(1&lt;&lt;SCK)|(1&lt;&lt;CS);<br />/* aktywacja  SPI, tryb pracy Master, prędkość zegara Fosc/64 */<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1);<br />}<br /><br />/* definicja  funkcji wysyłającej bajt */<br />void SendSpi( uint8_t bajt )<br />{<br />/* wysyłamy bajt do układu Slave */<br />SPDR = bajt;<br />/* czekamy aż zostanie wysłany ostatni bit */<br />while( !(SPSR &amp; (1&lt;&lt;SPIF)) );<br /><br />/* zbocze narastające sygnału „Latch Clock” powoduje<br /> * przepisanie wartości rejestru do wyjść Qa - Qh */<br />PORTB |= (1&lt;&lt;CS);<br /><br />/* przywracamy stan niski na linii LE dzięki czemu<br /> * podczas wysyłania następnego bajtu nie będą widoczne zmiany<br /> * na wyjściach Qa-Qh podczas przesuwania się rejestru do czasu<br /> * ponownego zatrzaśnięcia całego bajtu */<br />PORTB &amp;= ~(1&lt;&lt;CS);<br />}<br /><br />void send_spi_buf(uint8_t *buffer, uint8_t len)<br />{<br />        int i=0;<br />        for (i=0; i&lt;len; i++)<br />        {<br />                uint8_t b = *buffer++;<br />                SendSpi(b);<br />        }<br />}<br /><br />uint8_t ReceiveSpi()<br />{<br />while(!SPSR &amp;&amp; (1&lt;&lt;SPIF)) ;<br />return SPDR;<br />}<br /><br />uint32_t ReceiveTreeSpi(void)           // odebranie 3 bajtow<br />{<br />   uint32_t odb1, odb2, odb3, odb;<br /><br />   odb1 = ReceiveSpi();<br />   odb2 = ReceiveSpi();<br />   odb3 = ReceiveSpi();<br />   while(!(PINB &amp;(1&lt;&lt;PB0))); //sprawdzenie stanu RD z przetwornika<br />  // informujacego o zakończeniu przesyłania bajtów<br />   odb = (odb1&lt;&lt;16) | (odb2&lt;&lt;8) | (odb3) ;<br /><br />return odb;<br />}<br /><br />void calibration(void)<br />{<br /><br />SendSpi(CR1);<br />SendSpi(MSBMR2);<br />SendSpi(LSBMR2);<br />while(!(PINB &amp;(1&lt;&lt;PB0)));                              //AIN1-AIN2<br />SendSpi(CR1);<br />SendSpi(MSBMR3);<br />SendSpi(LSBMR3);<br />while(!(PINB &amp;(1&lt;&lt;PB0)));<br /><br />SendSpi(CR1);<br />SendSpi(MSBMR2);<br />SendSpi(LSBMR4);<br />while(!(PINB &amp;(1&lt;&lt;PB0)));//AIN3-AIN4<br />SendSpi(CR1);<br />SendSpi(MSBMR3);<br />SendSpi(LSBMR4);<br />while(!(PINB &amp;(1&lt;&lt;PB0)));<br /><br />SendSpi(CR1);<br />SendSpi(MSBMR2);<br />SendSpi(LSBMR5);<br />while(!(PINB &amp;(1&lt;&lt;PB0)));//AIN5-AIN6<br />SendSpi(CR1);<br />SendSpi(MSBMR3);<br />SendSpi(LSBMR5);<br />while(!(PINB &amp;(1&lt;&lt;PB0)));<br />}<br /><br />void format(uint32_t adc, value *voltage)<br />{<br />uint32_t wynik = (adc * (uint32_t)voltage-&gt;ref_a);<br />div_t divmod = div(wynik,100); // wynik dzielony przez 100<br />itoa(divmod.quot, voltage-&gt;v1,10); // jednostki wrzucamy do v1<br />itoa(divmod.rem, voltage-&gt;v1,10); // reszte z dzielenia wrzucamy do v2<br /><br />if(divmod.rem&lt;10)<br />{<br />voltage-&gt;v2&#91;0&#93;=0;<br />voltage-&gt;v2&#91;1&#93;=divmod.rem+0;<br />}<br /><br />voltage-&gt;v1&#91;2&#93;=0;<br />voltage-&gt;v2&#91;2&#93;=0;<br />}[/syntax]<br /><br />Założenie jest takie że wysyłam do rejestru komunikacyjnego bajt informujący przetwornik o kolejnej operacji wpisania bitów do Mode register i wysłaniu 16bitów do rejestru konfiguracyjnego(Mode Register), następnie jeszcze raz wysyłam bajt do R. komunikacyjnego, żeby uruchomić ciągłe odbieranie danych z Data register(odbieranie 3 bajtów).  <br /><br />Proszę o pomoc, już nie wiem od której strony mam do tego podejść, sprawdziłem już parę razy podłączenie, i nie wiem czy wina leży po stronie programowej czy sprzętowej czy po obu stronach.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=13403">fundomikey</a> — 20 wrz 2016, o 13:35</p><hr />
]]></content>
</entry>
</feed>