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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2013-05-17T13:18:20+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=30&amp;t=3042&amp;mode</id>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-05-17T13:18:20+01:00</updated>
<published>2013-05-17T13:18:20+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=37163#p37163</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=37163#p37163"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC MAX5231]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=37163#p37163"><![CDATA[
W zasadzie teraz to już mam regulowany &quot;zasilacz&quot; ładnie się reguluje od 0do4,1V po 1mV. Dodatkowo jest fajna funkcja shutdown, oraz wejście LDAC, dzięki czemu można pracować w dwu trybach, albo wyjście &quot;idzie&quot; za wejściowym buforem, albo ustawiamy bufor i cyk, mamy na wyjściu to co w buforze, albo programowo albo softwerowo <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />.<br /><br />Teraz tylko muszę przywalczyć z CS5532 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, bo przydał by się i jakiś pomiar napięcia <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />.<p>Statystyki: Napisane przez Gość — 17 maja 2013, o 13:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-05-16T12:47:22+01:00</updated>
<published>2013-05-16T12:47:22+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=37095#p37095</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=37095#p37095"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC MAX5231]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=37095#p37095"><![CDATA[
No i działa <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /><br /><br />[syntax=c]/*<br /> * MAX5231.c<br /> *<br /> *  Created on: 06-05-2013<br /> *      Author: Sylwester Taras<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &quot;MAX5231.h&quot;<br />#include &quot;../common.h&quot;<br /><br />#include &quot;../LCD/lcd44780_I2C.h&quot;<br /><br /><br />// ************ Inicjacja obsługi SPI *******************************<br />void InitSpi(void) {<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/16 */<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR0)|(1&lt;&lt;SPR1);<br />}<br /><br />void SendSpiWord (uint16_t word){ // MSB First<br />PORTB &amp;= ~(1&lt;&lt;CS);<br /><br />SPDR = word &gt;&gt;8;<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br />SPDR = word &amp; 0xFF;<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br />PORTB |= (1&lt;&lt;CS);<br />}<br /><br />// ************ Podstawowe funkcje obsługi MAX5231 ******************<br /><br />// Load input register A; DAC registers are unchanged<br />void  LoadInAreg(uint16_t dacA_value){<br />SendSpiWord( (dacA_value &lt;&lt; 1) | (1 &lt;&lt; C0) );<br />}<br /><br />// Load input register A; all DAC registers are updated<br />void LoadInAregUp(uint16_t dacA_value){<br />SendSpiWord( (dacA_value &lt;&lt; 1) | (1 &lt;&lt; C1) );<br />}<br /><br />// Load input register B; DAC registers are unchanged<br />void LoadInBreg(uint16_t dacB_value){<br /> SendSpiWord( (dacB_value &lt;&lt; 1) | (1&lt;&lt;C2) | (1&lt;&lt;C0) );  // Dla S0<br />}<br /><br />// Load input register B; all DAC registers are updated<br />void LoadInBregUp(uint16_t dacB_value){<br />SendSpiWord( (dacB_value &lt;&lt; 1) | (1&lt;&lt;C2) | (1&lt;&lt;C1) );<br />}<br /><br />// Load all DAC registers from the shift register<br />// (start up both DACs with new data, and load the input registers)<br />void LoadAllDAC(uint16_t dac_value){<br />SendSpiWord( (dac_value &lt;&lt; 1) | (1 &lt;&lt; C1) | (1 &lt;&lt; C0) );<br />lcd_locate(2,0);<br />lcd_hex(( (dac_value &lt;&lt; 1) | (1 &lt;&lt; C1) | (1 &lt;&lt; C0) ));<br />}<br /><br />// Update all DAC registers from the shift register<br />// (start up both DACs with new data, and load the input registers)<br />void UpdateAllDAC(void){<br />SendSpiWord(dac_data |= (1 &lt;&lt; C2) );<br />}<br /><br />// Update DAC register A from input register A<br />// (start up DAC A with data previously stored in input register A)<br />void UpdateRegDACA(void){<br />uint16_t dac_data = 0;<br />SendSpiWord( dac_data |= (1&lt;&lt;10) );<br />}<br /><br />// Update DAC register B from input register A<br />// (start up DAC B with data previously stored in input register A)<br />void UpdateRegDACB(void){<br />uint16_t dac_data = 0;<br />SendSpiWord( dac_data |= (1 &lt;&lt; 12) | (1 &lt;&lt; 10) );<br />}<br /><br />// Shut down both DAC, respectively, according to bits P1A and P1B<br />// (see Table 3). Internal bias and reference remain active.<br />void ShutDownAllDAC(void){<br />uint16_t dac_data=0;<br />dac_data |= (1&lt;&lt;C2)|(1&lt;&lt;C1)|(1&lt;&lt;C0);<br />// bit 12 i 11 to P1A i P1B zgodnie z tabelą 3, chwilowo nie wykorzystane<br />}<br /><br />// Full Power-Down. Power Down the main bias generator and shut down<br />// both DACs, respectively, according to bits P1A and P1B (see Table 3)<br />void PowerDownAllDAC(void){<br />}<br /><br />// Mode 0 = DOUT clocked out on SCLK falling edge (default)<br />// Mode 1 = DOUT clocked out on SCLK rising edge<br />void ModeDAC(uint8_t Mode_DAC){<br />}[/syntax]<br /><br />przykładowy main.c<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 2013-05-15<br /> *       Autor: Sylwester Taras<br /> */<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/eeprom.h&gt;<br />#include &lt;util/delay.h&gt;<br /><br />#include &quot;Keys/keys.h&quot;<br />#include &quot;LCD/lcd44780_I2C.h&quot;<br />#include &quot;MAX5231/MAX5231.h&quot;<br /><br />#include &quot;common.h&quot;<br /><br /><br />volatile uint16_t Timer1, Timer2, Timer3, Timer4;<br />uint16_t dac_value = 0x06fd; // testowo 3/4 wartości Vref<br /><br />int main(void)<br />{<br />PORTA |= K_set_up | K_set_down | K_load | K_update;<br />/*Przerywanie wygonywane jest z czestotliwoscia ok 10ms (100 razy na secunde)*/<br />/* Timer2 – inicjalizacja przerwania co 10ms */<br />TCCR2A = (1&lt;&lt;WGM21);// tryb pracy CTC<br />TCCR2B = (1&lt;&lt;CS22)|(1&lt;&lt;CS20);// preskaler = 1024<br />OCR2A = 108;// przerwanie porównania co 10ms (100Hz)<br />TIMSK2 = (1&lt;&lt;OCIE2A);// Odblokowanie przerwania CompareMatch<br /><br />InitSpi();<br />lcd_init();<br />lcd_cls();<br /><br />lcd_str_P(PSTR(&quot;Witam...&quot;));<br /><br />//LoadInAregUp(dac_value);<br /><br />sei();<br />while(1){<br />lcd_locate(1,0);<br />lcd_str(&quot;test&quot;);<br />static uint8_t load, update, set_up, set_down;<br />SuperDebounce(&amp;set_up, &amp;PINA, K_set_up, 20, 500, SetUpDAC, SetUpDAC);<br />SuperDebounce(&amp;set_down, &amp;PINA, K_set_down, 20, 500, SetDownDAC, SetDownDAC);<br />SuperDebounce(&amp;load, &amp;PINA, K_load, 20, 500, Load, 0);<br />SuperDebounce(&amp;update, &amp;PINA, K_update, 20, 500, Update, 0);<br /><br />}<br /><br />}<br /><br />void Update(void){<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;UpdateDAC&quot;));<br />UpdateAllDAC();<br />lcd_str_P(PSTR(&quot; OK&quot;));<br />}<br /><br />void Load(void){<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;LoadDAC = &quot;));<br />lcd_hex(dac_value);<br />LoadAllDAC(dac_value);<br />lcd_str_P(PSTR(&quot; OK&quot;));<br />}<br /><br />void SetUpDAC(void){<br /><br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;LoadDACA = &quot;));<br />lcd_hex(dac_value);<br />LoadInAregUp(dac_value);<br />lcd_str_P(PSTR(&quot; OK&quot;));<br />}<br /><br />void SetDownDAC(void){<br />lcd_locate(0,0);<br />lcd_str_P(PSTR(&quot;DownDACA = &quot;));<br />lcd_hex(dac_value-800);<br />LoadInAregUp(dac_value-800);<br />lcd_str_P(PSTR(&quot; OK&quot;));<br />}<br /><br />ISR(TIMER2_COMPA_vect)<br />{<br />uint16_t n;<br /><br />n = Timer1;/* 100Hz Timer1 */ // n*10ms<br />if (n) Timer1 = --n;<br />n = Timer2;/* 100Hz Timer2 */<br />if (n) Timer2 = --n;<br />n = Timer3;/* 100Hz Timer2 */<br />if (n) Timer3 = --n;<br />n = Timer4;/* 100Hz Timer2 */<br />if (n) Timer4 = --n;<br />}[/syntax]<br /><br />Dzięki ci Krauser jeszcze raz, teraz reszta funkcji napisać obsługę tylko za pomocą wskaźników<br /><br />PS. przydał się też bardzo Acute <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />, bo funkcja Mirkowa <br />SendSpiWord  była nie do końca zgodna z moimi potrzebami bo jeżeli był LSB pierwszy to ok, ale jeżeli MSB to trzeba było zamienić miejscami j/w przerzucanie danych do SPDR, by się kolejność danych zgadzała <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />.<br /><br />PS2, zaczyna mi się podobać te pisanie sterowników <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> bo jest to najbliżej sprzętu jak się tylko da, a to bardziej rozumiem, niż abstrakcyjne twory klas, dziedziczenia itp <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<p>Statystyki: Napisane przez Gość — 16 maja 2013, o 12:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-05-15T08:06:45+01:00</updated>
<published>2013-05-15T08:06:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36980#p36980</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36980#p36980"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC MAX5231]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36980#p36980"><![CDATA[
Dzięki, Krauser <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> jak zwykle prostujesz moje koślawe postawy programistyczne <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />Po uwagach kolegi Krauser wygląda to tak.....<br /><br />[syntax=c]// ************ Podstawowe funkcje obsługi MAX5231 ******************<br /><br />// Load input register A; DAC registers are unchanged<br />void  LoadInAreg(uint16_t dacA_value){<br />SendSpiWord( (dacA_value &lt;&lt; 1) | (1 &lt;&lt; C0) );<br />}<br /><br />// Load input register A; all DAC registers are updated<br />void LoadInAregUp(uint16_t dacA_value){<br />SendSpiWord( (dacA_value &lt;&lt; 1) | (1 &lt;&lt; C1) );<br />}<br /><br />// Load input register B; DAC registers are unchanged<br />void LoadInBreg(uint16_t dacB_value){<br /> SendSpiWord( (dacB_value &lt;&lt; 1) | (1&lt;&lt;C2) | (1&lt;&lt;C0) );  // Dla S0<br />}<br /><br />// Load input register B; all DAC registers are updated<br />void LoadInBregUp(uint16_t dacB_value){<br />SendSpiWord( (dacB_value &lt;&lt; 1) | (1&lt;&lt;C2) | (1&lt;&lt;C1) );<br />}<br /><br />// Load all DAC registers from the shift register<br />// (start up both DACs with new data, and load the input registers)<br />void LoadAllDAC(uint16_t dac_value){<br />SendSpiWord( (dac_value &lt;&lt; 1) | (1 &lt;&lt; C1) | (1 &lt;&lt; C0) );<br />}<br /><br />// Update all DAC registers from the shift register<br />// (start up both DACs with new data, and load the input registers)<br />void UpdateAllDAC(void){<br />SendSpiWord(dac_data |= (1 &lt;&lt; C2) );<br />}<br /><br />// Update DAC register A from input register A<br />// (start up DAC A with data previously stored in input register A)<br />void UpdateRegDACA(void){<br />uint16_t dac_data = 0;<br />SendSpiWord( dac_data |= (1&lt;&lt;10) );<br />}<br /><br />// Update DAC register B from input register A<br />// (start up DAC B with data previously stored in input register A)<br />void UpdateRegDACB(void){<br />uint16_t dac_data = 0;<br />SendSpiWord( dac_data |= (1 &lt;&lt; 12) | (1 &lt;&lt; 10) );<br />}<br /><br />// Shut down both DAC, respectively, according to bits P1A and P1B<br />// (see Table 3). Internal bias and reference remain active.<br />void ShutDownAllDAC(void){<br />uint16_t dac_data=0;<br />dac_data |= (1&lt;&lt;C2)|(1&lt;&lt;C1)|(1&lt;&lt;C0);<br />// bit 12 i 11 to P1A i P1B zgodnie z tabelą 3, chwilowo nie wykorzystane<br />}<br />}[/syntax]<p>Statystyki: Napisane przez Gość — 15 maja 2013, o 08:06</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Krauser]]></name></author>
<updated>2013-05-14T19:32:59+01:00</updated>
<published>2013-05-14T19:32:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36943#p36943</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36943#p36943"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC MAX5231]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36943#p36943"><![CDATA[
Tylko, że we wszystkich funkcjach za wyjątkiem ostatniej nie ma definicji zmiennej dac_data, czyli tak jakbyś chciał korzystać ze zmiennej globalnej, która będzie oczywiście cały czas zajmowała pamięć.<br />Właściwie to nie potrzebujesz nawet tej zmiennej lokalnej, bo możesz zrobić np. tak:<br />[syntax=c]void LoadInBreg(uint16_t dac_value){            // Load input register B; DAC registers are unchanged<br />        SendSpiWord( (dac_value &lt;&lt; 1) | (1&lt;&lt;C2)|(1&lt;&lt;C0) );  // Dla S0<br />}[/syntax]<br />a w ostatniej funkcji nie musisz zerować wystarczy że zamiast |= użyjesz =<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=465">Krauser</a> — 14 maja 2013, o 19:32</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-05-14T11:41:59+01:00</updated>
<published>2013-05-14T11:41:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36897#p36897</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36897#p36897"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC MAX5231]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36897#p36897"><![CDATA[
Tylko teraz się zastanowiłem i nie wiem czy nie lepiej było by zrobić tak<br /><br />[syntax=c]void  LoadInAreg(uint16_t dac_value){// Load input register A; DAC registers are unchanged<br />dac_data = dac_value &lt;&lt; 1; // Dla S0<br />dac_data |= (1&lt;&lt;C0);// Dla C2=0, C1=0, C0=1<br />SendSpiWord(dac_data);<br />}[/syntax]<br /><br />Zamiast tak<br />[syntax=c]uint16_t LoadInAreg(uint16_t dac_value){// Load input register A; all DAC registers are updated<br />dac_data = dac_value &lt;&lt; 1;// Dla S0<br />dac_data |= (1&lt;&lt;C0);<br />return dac_data;<br />}[/syntax]<br /><br />Bo po co tworzyć kolejną funkcję pośredniczącą, jak już te &quot;modelujące&quot; dane dla DAC mogą od razu przekazywać<br />je do SendSpiWord(....);<br /><br />No i dopisałem trochę nowych linijek <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, spróbuję dzisiaj to puścić po SPI zobaczymy jakie dane wychodzą<br /><br />[syntax=c]// ************ Podstawowe funkcje obsługi MAX5231 ******************<br /><br />void  LoadInAreg(uint16_t dac_value){// Load input register A; DAC registers are unchanged<br />dac_data = dac_value &lt;&lt; 1; // Dla S0<br />dac_data |= (1&lt;&lt;C0);// Dla C2=0, C1=0, C0=1<br />SendSpiWord(dac_data);<br />}<br /><br />void LoadInAregUp(uint16_t dac_value){// Load input register A; all DAC registers are updated<br />dac_data = dac_value &lt;&lt; 1;// Dla S0<br />dac_data |= (1&lt;&lt;C1);<br />SendSpiWord(dac_data);<br />}<br /><br />void LoadInBreg(uint16_t dac_value){// Load input register B; DAC registers are unchanged<br />dac_data = dac_value &lt;&lt; 1;// Dla S0<br />dac_data |= (1&lt;&lt;C2)|(1&lt;&lt;C0);<br />SendSpiWord(dac_data);<br />}<br /><br />void LoadInBregUp(uint16_t dac_value){// Load input register B; all DAC registers are updated<br />dac_data = dac_value &lt;&lt; 1;// Dla S0<br />dac_data |= (1&lt;&lt;C2)|(1&lt;&lt;C1);<br />SendSpiWord(dac_data);<br />}<br /><br />void LoadAllDAC(uint16_t dac_value){// Load all DAC registers from the shift register<br />dac_data = dac_value &lt;&lt; 1;// Dla S0// (start up both DACs with new data, and load the input registers)<br />dac_data |= (1&lt;&lt;C1)|(1&lt;&lt;C0);<br />SendSpiWord(dac_data);<br />}<br /><br />void UpdateAllDAC(void){// Update all DAC registers from the shift register<br />dac_data |= (1&lt;&lt;C2);// (start up both DACs with new data, and load the input registers)<br />SendSpiWord(dac_data);<br />}<br /><br />void UpdateRegDACA(uint16_t dac_value){// Update DAC register A from input register A<br />dac_data = dac_value &lt;&lt; 1;// (start up DAC A with data previously stored in input register A)<br />dac_data |= (1&lt;&lt;10);<br />SendSpiWord(dac_data);<br />}<br /><br />void UpdateRegDACB(uint16_t dac_value){// Update DAC register B from input register A<br />dac_data = dac_value &lt;&lt; 1;// (start up DAC B with data previously stored in input register A)<br />dac_data |= (1&lt;&lt;12)|(1&lt;&lt;10);<br />SendSpiWord(dac_data);<br />}<br /><br />void ShutDownAllDAC(void){// Shut down both DAC, respectively, according to bits P1A and P1B<br />uint16_t dac_data=0;// (see Table 3). Internal bias and reference remain active.<br />dac_data |= (1&lt;&lt;C2)|(1&lt;&lt;C1)|(1&lt;&lt;C0);<br />// bit 12 i 11 to P1A i P1B zgodnie z tabelą 3, chwilowo nie wykorzystane<br />}[/syntax]<br /><br />PS. Nie wiem, czy nie dobrze było by jakoś inicjować zmienne dac_data ?, tj. jeżeli są one tworzone jako zmienne lokalne, to czy trzeba by je zainicjować za każdym razem?, czy wystarczy że, zadeklarujemy zmienną globalną dac_data?, chyba nie, bo przecież, przy każdej funkcji tworzona jest nowa zmienna dac_data, coś mi się zdaje, że albo najlepiej było by użyć wskaźnika hmm, albo za każdym razem inicjować zmienna dac_data w każdej funkcji.<br />Macie jakąś podpowiedź?<p>Statystyki: Napisane przez Gość — 14 maja 2013, o 11:41</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-05-14T10:18:45+01:00</updated>
<published>2013-05-14T10:18:45+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36890#p36890</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36890#p36890"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC MAX5231]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36890#p36890"><![CDATA[
To już nie problem, bo nawet jest podpowiedź w przebiegach samego DAC, można śmiało wysyłać dwie 8bitowe dane. <br />I tak konstrukcja całego słowa 16bitowego będzie robiona za pomocą przesunieć bitowych, bo dana samej wartości przetwornika jest w &quot;środku&quot; między S0, a C0,C1,C2 <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" />.<br />U mnie hardware za pomocą bibliotek Mirka powstaje, co prawda ostatnio nie bardzo miałem czas, ale może na dniach do tego siądę.<br /><br />Ostatnio robiłem testy czy aby przesunięcia bitowe działają zgodnie z moimi założeniami......<br /><br />A tu początek biblioteki z inicjacją SPI<br /><br />[syntax=c]// ************ Inicjacja obsługi SPI *******************************<br />void InitSpi(void) {<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/8 */<br />SPCR |= (1&lt;&lt;SPE)|(1&lt;&lt;MSTR)|(1&lt;&lt;SPR1);<br />}<br /><br />void SendSpiWord (uint16_t word){<br />PORTB &amp;= ~(1&lt;&lt;CS);<br />SPDR = word &amp; 0xFF;<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br />SPDR = word &gt;&gt;8;<br />while(!(SPSR &amp; (1&lt;&lt;SPIF)));<br />PORTB |= (1&lt;&lt;CS);<br />}[/syntax]<br /><br />Oraz, definicje funkcji (chwilowo same nazwy;)), oraz opisy funkcji by łatwiej napisać obsługę.<br />[syntax=c]// ************ Podstawowe funkcje obsługi MAX5231 ******************<br /><br />uint16_t  LoadInAreg(uint16_t dac_value){// Load input register A; DAC registers are unchanged<br /><br />return dac_data;<br />}<br /><br />uint16_t LoadInAregUp(uint16_t dac_value){// Load input register A; all DAC registers are updated<br /><br />return dac_data;<br />}<br /><br />uint16_t LoadInBreg(uint16_t dac_value){// Load input register B; DAC registers are unchanged<br /><br />return dac_data;<br />}<br /><br />uint16_t LoadInBregUp(uint16_t dac_value){// Load input register B; all DAC registers are updated<br /><br />return dac_data;<br />}<br /><br />uint16_t LoadAllDAC(uint16_t dac_value){// Load all DAC registers from the shift register<br />// (start up both DACs with new data, and load the input registers)<br />return dac_data;<br />}<br /><br />void UpdateAllDAC(void){// Update all DAC registers from the shift register<br />// (start up both DACs with new data, and load the input registers)<br />}<br /><br />void UpdateRegDACA(void){// Update DAC register A from input register A<br />// (start up DAC A with data previously stored in input register A)<br />}<br /><br />void UpdateRegDACB(void){// Update DAC register B from input register A<br />// (start up DAC B with data previously stored in input register A)<br />}<br /><br />void ShutDownAllDAC(void){// Shut down both DAC, respectively, according to bits P1A and P1B<br />// (see Table 3). Internal bias and reference remain active.<br />}<br /><br />void PowerDownAllDAC(void){// Full Power-Down. Power Down the main bias generator and shut down<br />// both DACs, respectively, according to bits P1A and P1B (see Table 3)<br />}<br /><br />void ModeDAC(uint8_t Mode_DAC){// Mode 0 = DOUT clocked out on SCLK falling edge (default)<br />// Mode 1 = DOUT clocked out on SCLK rising edge<br />}<br /><br />}[/syntax]<p>Statystyki: Napisane przez Gość — 14 maja 2013, o 10:18</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-05-14T10:13:11+01:00</updated>
<published>2013-05-14T10:13:11+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36889#p36889</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36889#p36889"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC MAX5231]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36889#p36889"><![CDATA[
Nie dałem rady wcześniej, ale jestem <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> <br />Pierwszą rzeczą jaka rzuca mi się w oczy, to sterowanie za pomocą słów 16-bitowych. Przydała by się jakaś podpowiedź czy i jak wysłać sprzętowo słowo 16-bitowe przy pomocy AVRa <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> Ja u siebie zaimplementowałem programową obługę SPI, miedzy innymi z tego względu, ale nie wiem czy takie rozwiązanie Cie satysfakcjonuje <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=185">coolpablos</a> — 14 maja 2013, o 10:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-05-08T07:10:42+01:00</updated>
<published>2013-05-08T07:10:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36486#p36486</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36486#p36486"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36486#p36486"><![CDATA[
Fakt <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />, sorry literówka, ma być MAX5231 <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.........<p>Statystyki: Napisane przez Gość — 8 maja 2013, o 07:10</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Mscichu]]></name></author>
<updated>2013-05-07T21:08:19+01:00</updated>
<published>2013-05-07T21:08:19+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36447#p36447</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36447#p36447"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36447#p36447"><![CDATA[
Jakbyś mógł to sprawdź, czy to NAPEWNO jest ten model DAC? Podałeś MAX5321 i link do dokumentacji, ale niegdzie nie ma tego konkretnego elementu, może cyferki Ci się zamieniły?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=853">Mscichu</a> — 7 maja 2013, o 21:08</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-05-07T07:47:34+01:00</updated>
<published>2013-05-07T07:47:34+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36355#p36355</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36355#p36355"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36355#p36355"><![CDATA[
A tu są dokumentacje<br /><br /><!-- m --><a class="postlink" href="https://www.dropbox.com/sh/fa033q1mdjqnt27/QINuBUVhEK" >https://www.dropbox.com/sh/fa033q1mdjqnt27/QINuBUVhEK</a><!-- m --><br /><br />Przypomniałem sobie o projekcie AVT2999, ale niestety to wewnętrzny DAC atxmegi i troszkę inaczej do niego się podchodzi <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br /><!-- m --><a class="postlink" href="http://minikombajn-pomiarowy.googlecode.com/svn/trunk/XMEGA/src/DAC.c" >http://minikombajn-pomiarowy.googlecode ... /src/DAC.c</a><!-- m --><p>Statystyki: Napisane przez Gość — 7 maja 2013, o 07:47</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[coolpablos]]></name></author>
<updated>2013-05-06T19:31:28+01:00</updated>
<published>2013-05-06T19:31:28+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36295#p36295</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36295#p36295"/>
<title type="html"><![CDATA[Re: Przykładowy Kod przetwornika DAC]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36295#p36295"><![CDATA[
Możesz podesłać link do dokumentacji? Za Chiny nie mogę znaleźć żadnych informacji o tym przetworniku. Sam robię sterowanie do zasilacza dokładnie w ten sam sposób więc możliwe, że będę mógł pomóc <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=185">coolpablos</a> — 6 maja 2013, o 19:31</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Anonymous]]></name></author>
<updated>2013-05-08T09:24:34+01:00</updated>
<published>2013-05-06T14:05:08+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36263#p36263</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36263#p36263"/>
<title type="html"><![CDATA[Przykładowy Kod przetwornika DAC MAX5231]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=3042&amp;p=36263#p36263"><![CDATA[
Potrzebował bym &quot;jakiś&quot; &quot;profesjonalny&quot; czyli w stylu Mirka <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" /> kod obsługi przetwornika DAC.............<br /><br />Próbuję napisać sterownik do MAX5321, ale nie wiem jak zacząć, nie wiem, czy nazywać funkcje obsługi DACa z nazwą tj. modelem przetwornika, bo przy użyciu kilku różnych trzeba będzie jakoś różnicować je w projekcie.<br /><br />Potrzebował bym jakiś przykładowy kod, jak to należy robić, nie wiem, szukałem na pudn bo na sourcecode nie mam punktów. Ale wszystkie przykłady to jakieś śmiechu warte są, coś na zasadzie byle działało nie ważne jak.<br /><br />Przetworniki są najczęściej po SPI miło by było jak by przykład był na podobnym rozwiązaniu.<br /><br />Nie wiem, czy nie mam weny, ale za cholerę nic mi nie przychodzi do głowy.......<br />Oczywiście kod tylko w C <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.<br /><br />PS. Od dłuższego czasu chodzi za mną projekt zasilacza w stylu laboratoryjnych rozwiązań Agilent, HP itp. Czyli pełna regulacja cyfrowa, w dodatku z możliwością &quot;zaprogramowania&quot; kiedy i jak zmienić napięcie itp.<br />Dodatkowo potem będzie rozbudowany o możliwość, badania i ładowania ogniw Liton itp.<br />Część analogową praktycznie mam wstępnie obmyśloną.......<p>Statystyki: Napisane przez Gość — 6 maja 2013, o 14:05</p><hr />
]]></content>
</entry>
</feed>