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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2014-04-18T22:46:18+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=6801&amp;mode</id>
<entry>
<author><name><![CDATA[Dawid90]]></name></author>
<updated>2014-04-18T22:46:18+01:00</updated>
<published>2014-04-18T22:46:18+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6801&amp;p=78578#p78578</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6801&amp;p=78578#p78578"/>
<title type="html"><![CDATA[Re: Dźwięk przez moduły RFM73, optymalizacja kodu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6801&amp;p=78578#p78578"><![CDATA[
Powiem Ci że mimo to, kod działa. Specjalnie sprawdzałem co było odbierane przez moduł wysyłając to na UART. Tutaj też z tym kombinowałem aż się udało. Otrzymuje wartości z zakresu 0-255. I sterowanie diodą LED również działa. Zauważyłem jeszcze, a nie było z tym wcześniej problemu, że jak ustawie przy wysyłaniu pauze z jakimś czasem to komunikacja wygląda super. A jak ją zakomentuje. To po włączeniu zasilania komunikacja trwa przez 2-3 sekundy, następnie się urywa i wraca po jakiś 30-40 sekundach. Wcześniej tego nie było. Być może rejestry mam coś nie tak ustawione.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=203">Dawid90</a> — 18 kwi 2014, o 22:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Zaba]]></name></author>
<updated>2014-04-18T18:13:59+01:00</updated>
<published>2014-04-18T18:13:59+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6801&amp;p=78557#p78557</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6801&amp;p=78557#p78557"/>
<title type="html"><![CDATA[Re: Dźwięk przez moduły RFM73, optymalizacja kodu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6801&amp;p=78557#p78557"><![CDATA[
Witam <br />Zauważyłem że do konwersji używasz tablic<br />ASCII[3] czyli o trzech elementach<br />a po konwersji (o ile się nie mylę) funkcja &quot;itoa&quot; jeśli liczba będzie większa niż 99<br />odda łańcuch o długości czterech znaków<br />trzy skonwertowana liczba plus znak końca stringa<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1044">Zaba</a> — 18 kwi 2014, o 18:13</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[Dawid90]]></name></author>
<updated>2014-04-18T00:37:49+01:00</updated>
<published>2014-04-18T00:37:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=6801&amp;p=78496#p78496</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=6801&amp;p=78496#p78496"/>
<title type="html"><![CDATA[Dźwięk przez moduły RFM73, optymalizacja kodu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=6801&amp;p=78496#p78496"><![CDATA[
Witam<br />Chciałbym prosić o pomoc w ogarnięciu komunikacji dwóch procesorów Atmega8 przez moduły RFM73. Wygląda to tak: ADC -&gt; RFM73 -&gt; RFM73 -&gt; PWM.<br />Przesyłać mam próbkowany dźwięk drogą radiową i odtworzenie, puszczając go przez PWM. Teoretycznie wszystko działa. Ale nie mogę poradzić sobie z optymalizacją i dostrojenie tych modułów by działały jak najlepiej. Wiem że temat był poruszany w zielonej książce.<br />Problem polega na tym że jak sobie zrobię na jednym procesorze próbkowanie dźwięku i puszczę go od razu na PWM. To dźwięk wychodzi całkiem super mimo 8-bitowej rozdzielczości <img src="https://forum.atnel.pl/images/smilies/icon_e_smile.gif" alt=":)" title="Szczęśliwy" /> A jak chcę to przesłać przez moduły to występuje metaliczny dźwięk, no słychać że jest gorsza jakość. Najpierw przedstawię konfiguracje rejestrów modułów:<br /><br />[syntax=c]const uint8_t PROGMEM RFM70_cmd_adrRX0&#91;&#93; = { (0x20|0x0A), 0x34,0x43,0x10,0x10,0x01};<br />const uint8_t PROGMEM RFM70_cmd_adrTX&#91;&#93;  = { (0x20|0x10), 0x34,0x43,0x10,0x10,0x01};<br />const uint8_t PROGMEM RFM70_cmd_adrRX1&#91;&#93; = { (0x20|0x0B), 0x35,0x43,0x10,0x10,0x02};<br />const uint8_t PROGMEM RFM70_cmd_switch_cfg&#91;&#93; = { 0x50, 0x53 }; // zmiana rejestru<br />const uint8_t PROGMEM RFM70_cmd_flush_rx&#91;&#93; = { 0xe2, 0x00 }; // flush RX FIFO<br />const uint8_t PROGMEM RFM70_cmd_flush_tx&#91;&#93; = { 0xe1, 0x00 }; // flush TX FIFO<br />const uint8_t PROGMEM RFM70_cmd_activate&#91;&#93; = { 0x50, 0x73 }; // aktywacja<br />const uint8_t PROGMEM RFM70_cmd_tog1&#91;&#93;={ (0x20|0x04), 0xd9 | 0x06, 0x9e, 0x86, 0x0b };<br />const uint8_t PROGMEM RFM70_cmd_tog2&#91;&#93;={ (0x20|0x04), 0xd9 &amp; ~0x06, 0x9e, 0x86, 0x0b}; //set1&#91;4&#93;<br /><br />//Bank 0<br />const uint8_t PROGMEM RFM70_bank0Init&#91;&#93;&#91;2&#93; = {<br />{ (0x20|0x00), 0x0F }, //Disable CRC ,CRC=1byte, POWER UP, TX<br />{ (0x20|0x01), 0x3F }, //Enable auto acknowledgement data pipe0-5<br />{ (0x20|0x02), 0x3F }, //Enable RX Addresses pipe0-5<br />{ (0x20|0x03), 0x03 }, //RX/TX address field width 5byte<br />{ (0x20|0x04), 0xff }, //x = 250 ms = 4000ms, y = 15 tries<br />{ (0x20|0x05), 0x17 }, //channel = 0x17<br />{ (0x20|0x06), 0x07 }, //air data rate-2M,out power 5dbm,setup LNA gain high (0dBM)<br />{ (0x20|0x07), 0x07 }, //<br />{ (0x20|0x08), 0x00 }, //<br />{ (0x20|0x09), 0x00 }, //<br />{ (0x20|0x0C), 0xc3 }, //LSB Addr pipe 2<br />{ (0x20|0x0D), 0xc4 }, //LSB Addr pipe 3<br />{ (0x20|0x0E), 0xc5 }, //LSB Addr pipe 4<br />{ (0x20|0x0F), 0xc6 }, //LSB Addr pipe 5<br />{ (0x20|0x11), 0x20 }, //Payload len pipe0<br />{ (0x20|0x12), 0x20 }, //Payload len pipe0<br />{ (0x20|0x13), 0x20 }, //Payload len pipe0<br />{ (0x20|0x14), 0x20 }, //Payload len pipe0<br />{ (0x20|0x15), 0x20 }, //Payload len pipe0<br />{ (0x20|0x16), 0x20 }, //Payload len pipe0<br />{ (0x20|0x17), 0x20 }, //Payload len pipe0<br />{ (0x20|0x1C), 0x3F }, //Enable dynamic payload legth data pipe0-5<br />{ (0x20|0x1D), 0x07 } //Enables Dynamic Payload Length,Enables Payload with ACK<br />};<br /><br />//Bank 1<br />const uint8_t PROGMEM RFM70_bank1Init&#91;&#93;&#91;5&#93; = {<br />// address data<br />{ (0x20|0x00), 0x40, 0x4B, 0x01, 0xE2 },<br />{ (0x20|0x01), 0xC0, 0x4B, 0x00, 0x00 },<br />{ (0x20|0x02), 0xD0, 0xFC, 0x8C, 0x02 },<br />{ (0x20|0x03), 0x99, 0x00, 0x39, 0x41 },<br />{ (0x20|0x04), 0xb9, 0x9E, 0x86, 0x0B },<br />{ (0x20|0x05), 0x24, 0x06, 0x7F, 0xA6 },<br />{ (0x20|0x06), 0x00, 0x00, 0x00, 0x00 },<br />{ (0x20|0x07), 0x00, 0x00, 0x00, 0x00 },<br />{ (0x20|0x08), 0x00, 0x00, 0x00, 0x00 },<br />{ (0x20|0x09), 0x00, 0x00, 0x00, 0x00 },<br />{ (0x20|0x0a), 0x00, 0x00, 0x00, 0x00 },<br />{ (0x20|0x0b), 0x00, 0x00, 0x00, 0x00 },<br />{ (0x20|0x0C), 0x00, 0x12, 0x73, 0x00 },<br />{ (0x20|0x0D), 0x36, 0xb4, 0x80, 0x00 }<br />};<br /><br />//Bank1<br />const uint8_t PROGMEM RFM70_bank1R0EInit&#91;&#93; = {<br />// address Data...<br />(0x20|0x0E), 0x41,0x20,0x08,0x04,0x81,0x20,0xCF,0xF7,0xFE,0xFF,0xFF<br />};[/syntax]<br /><br />Bawiłem się nimi godzinami, googlowałem w poszukiwaniu działającej konfiguracji aż wreszcie zadziałało, ale czy to dobra konfiguracja? Chciałbym z tego wycisnąć maksimum.<br /><br />W części nadawczej opierałem się na rozdziale o ADC pana Mirka. Inicjacja modułu oraz kod odpowiedzialny za wysyłanie wygląda tak:<br /><br />[syntax=c]sei();//globalne odblokowanie przerwań<br /><br /><br />    initRFM(); //inicjalizacja RFM73<br />    setModeTX(); //tryb nadawania<br />    setChannel(8); // kanał 8<br />    setPower(3); // maksymalna moc (0: -10dBm | 1: -5dBm | 2: 0dBm | 3: 5dBm)<br /><br />    char ASCII&#91;3&#93;;<br /><br />    while (1)<br />    {<br />    ADCSRA |= (1&lt;&lt;ADSC);<br />    while(ADCSRA &amp; (1&lt;&lt;ADSC));<br /><br />    itoa(ADCH, ASCII, 10);<br /><br /><br />        sendPayload(&amp;ASCII&#91;0&#93;, 4, 0); //tablica, dlugosc, 0 - bez potwierdzenia | 1 - z potwierdzeniem<br />    }[/syntax]<br /><br />Miałem problemy z wysyłaniem wartości liczbowej, dlatego wysyłanie przez moduł rozwiązałem w ten sposób że konwertuje zmienną typu int na łańcuch znaków.<br /><br />Strona odbiorcza to: <br /><br />[syntax=c]DDRB |= (1&lt;&lt;PB1);<br /><br />    TCCR1A |= (1&lt;&lt;COM1A1) | (1&lt;&lt;COM1A0) | (1&lt;&lt;COM1B1) | (1&lt;&lt;COM1B0);<br />    TCCR1A |= (1&lt;&lt;WGM12) | (1&lt;&lt;WGM10);<br /><br />    TCCR1B |= (1&lt;&lt;CS10);<br /><br />sei();// globalne odblokowanie przerwań<br /><br />    uint8_t bufor&#91;32&#93;;<br /><br />    initRFM(); //inicjalizacja RFM73<br />    setModeRX(); //tryb odbioru<br />    setChannel(8); // kanał 8<br /><br />    uint8_t a;<br />    OCR1A = 0;<br />    while (1)<br />    {<br /><br />        if (receivePayload(bufor))<br />        {<br />     OCR1A = atoi((uint8_t*)bufor);<br />        }<br />    }[/syntax]<br /><br />Tutaj konwersja odwrotna. Do rejestru OCR1A przypisuje odebraną wartość liczbową i wysyłam na PWM.<br />Taktowanie procesorów mam aktualnie ustawione na 20MHz, ale próbowałem też z 24MHz by osiągnąć jak najlepszą jakość dźwięku.<br />Obsługa modułów jest bez używania przerwań.<br /><br />Czy da radę coś więcej z tego wycisnąć? Będę wdzięczny w naprowadzeniu co można było by zmienić.<br />Pozdrawiam<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=203">Dawid90</a> — 18 kwi 2014, o 00:37</p><hr />
]]></content>
</entry>
</feed>