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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2017-09-21T22:55:14+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=18&amp;t=19236&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-09-21T22:55:14+01:00</updated>
<published>2017-09-21T22:55:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195566#p195566</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195566#p195566"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195566#p195566"><![CDATA[
<div class="quotetitle"><b>Quote:</b></div><div class="quotecontent"><br />Sterowanie przepływem odbywa się prawidłowo, sprawdzone oscyloskopem.<br /></div><br />No to nie ma o czym rozmawiać skoro prawidłowo <img src="https://forum.atnel.pl/images/smilies/icon_e_wink.gif" alt=";)" title="Puszcza oko" />.... czyli wszystko działa - gratulacje<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 21 wrz 2017, o 22:55</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robosom]]></name></author>
<updated>2017-09-21T10:24:21+01:00</updated>
<published>2017-09-21T10:24:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195530#p195530</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195530#p195530"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195530#p195530"><![CDATA[
Przecież dodałem, co z resztą widać na załączonym kodzie bootloadera:<br /><br />[syntax=c]static void UART_TX_Byte(const uint8_t ch)<br />{<br />  while(!(UCSRA &amp; (1&lt;&lt;UDRE))) wdt_reset();      // wait for empty transmit buffer<br /> <br />  PORTA |= (1&lt;&lt;PA1);            // switch to TX mode<br />  UDR = ch;                        // write char<br />  while(!(UCSRA &amp; (1&lt;&lt;TXC))) wdt_reset();    // wait for UDR to be empty<br />  UCSRA |= (1&lt;&lt;TXC);                   // clear flag<br />  PORTA &amp;= ~(1&lt;&lt;PA1);           // switch to RX mode<br />}[/syntax]<br /><br />Sterowanie przepływem odbywa się prawidłowo, sprawdzone oscyloskopem. Dodatkowo sygnały zmierzone na kablu RS485 pokazują komunikację w dwie strony.<br /><br />Przejściówka po stronie komputera też działa, gdyż na komputerze mam uruchomiony docklight do symulacji urządzeń slave kiedy pracuję w sieci (oczywiście kiedy programuję to odłączam wszystkie pozostałe układy i wyłączam docklight'a).<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1077">robosom</a> — 21 wrz 2017, o 10:24</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-09-21T00:21:49+01:00</updated>
<published>2017-09-21T00:21:49+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195522#p195522</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195522#p195522"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195522#p195522"><![CDATA[
Podpowiem - w bootloaderze musisz dodać odpowiednie sterowanie kierunkiem przepływu.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 21 wrz 2017, o 00:21</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-09-20T23:15:14+01:00</updated>
<published>2017-09-20T23:15:14+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195520#p195520</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195520#p195520"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195520#p195520"><![CDATA[
<div class="quotetitle">robosom napisał(a):</div><div class="quotecontent"><br />Co do full-duplexu chodziło mi o to, że w trybie rs232 jest możliwa wymiana full-duplex i w tej konfiguracji wszystko pasuje lecz w sieci RS485 już mamy tylko half-duplex więc program musiałby niejako wystawić slot czasowy i poczekać na odpowiedź procesora po każdej stronie wysłanego kodu, czyż nie?<br /></div><br /><br />odpowiem tak: czyż nie<br /><br />a kolega wie co to jest MAX485 i sterowanie linią kierunku przepływu danych?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 wrz 2017, o 23:15</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robosom]]></name></author>
<updated>2017-09-20T22:48:50+01:00</updated>
<published>2017-09-20T22:48:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195519#p195519</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195519#p195519"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195519#p195519"><![CDATA[
<div class="quotetitle">mirekk36 napisał(a):</div><div class="quotecontent"><br />Trzeba sobie zatem samemu przerobić kod BLS we wasnym zakresie do komunikacji we własnej sieci RS485 i wcale nie musi być żaden ful duplex ... toż wystarczy prawidłowo strować kierunkiem przepływu - czego pewnie nie robisz w ogóle albo źle robisz. Trzeba sobie nadawać adresu urządzeń i jakoś je adresować - no chyba że chodzi ci o połączenie 1:1 po RS485 to wtedy najmniejszy problem<br /></div><br /><br />Tak, chodzi o połączenie 1:1. Sterowanie przepływem na pewno działa prawidłowo gdyż urządzenie już pracuje w sieci i komunikuje się z innymi, Z reszta na jednym z oscylogramów widać, że do transmisji od strony PC próbuje wbić się procesor, przez to poziom sygnału jest podniesiony i zaburzony. <br /><br />Co do full-duplexu chodziło mi o to, że w trybie rs232 jest możliwa wymiana full-duplex i w tej konfiguracji wszystko pasuje lecz w sieci RS485 już mamy tylko half-duplex więc program musiałby niejako wystawić slot czasowy i poczekać na odpowiedź procesora po każdej stronie wysłanego kodu, czyż nie?<br /><br />Nie wiem tylko do końca jak działa protokół wymiany danych programu z bootloaderem. Gdyby ktoś nakierował mnie na to to rozwiązałbym problem sam.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1077">robosom</a> — 20 wrz 2017, o 22:48</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[north]]></name></author>
<updated>2017-09-20T21:16:13+01:00</updated>
<published>2017-09-20T21:16:13+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195516#p195516</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195516#p195516"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195516#p195516"><![CDATA[
Ooo to może wrócą wtorki z Delphi <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=4901">north</a> — 20 wrz 2017, o 21:16</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2017-09-20T21:02:16+01:00</updated>
<published>2017-09-20T21:02:16+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195514#p195514</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195514#p195514"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195514#p195514"><![CDATA[
Ja jestem do końca tygodnia tutaj:<br /><br /><!-- m --><a class="postlink" href="http://delphi.pl/zlot/" >http://delphi.pl/zlot/</a><!-- m --><br /><br />czytam sobie jednak wątek i się dziwię, skąd koledze przyszło do głowy, że MkBootloader działa natywnie z RS485? Czy ja gdzieś o tym pisałem? Mówiłem?<br /><br />nigdzie teggo nie mówiłem ani nie pisałem<br /><br />Trzeba sobie zatem samemu przerobić kod BLS we wasnym zakresie do komunikacji we własnej sieci RS485 i wcale nie musi być żaden ful duplex ... toż wystarczy prawidłowo strować kierunkiem przepływu - czego pewnie nie robisz w ogóle albo źle robisz. Trzeba sobie nadawać adresu urządzeń i jakoś je adresować - no chyba że chodzi ci o połączenie 1:1 po RS485 to wtedy najmniejszy problem<br /><br />wielu ludzi zrobiło sobie komunikację po RS485 - ja nie bo nie miałem jak na raze takiej potrzeby a przecież kod BLS do procka masz otwarty w programie<br /><br />więc zacznij od jego przeróbki i prawidłowego sterowania linią kierunku przepływu scalaka MAX485 - to podstawa<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 20 wrz 2017, o 21:02</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robosom]]></name></author>
<updated>2017-09-20T20:28:48+01:00</updated>
<published>2017-09-20T20:28:48+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195509#p195509</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195509#p195509"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195509#p195509"><![CDATA[
Zrobiłem próby z generowaniem plików z kreatora i z własnych plików. Oba bootloadery działają lecz nie działa tryb RS485. <br />Mam wrażenie, że program przygotowany jest do pracy Full-duplex co odcina pracę w sieci RS485. Na załączonym screenie procesor odpowiada lecz program nawet nie przewidział dla niego okna czasowego na odpowiedź, przez co dostajemy odpowiedź  w programie &quot;time out&quot;.<br /><br />Panie Mirku, poradzi Pan coś?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1077">robosom</a> — 20 wrz 2017, o 20:28</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-09-20T15:42:01+01:00</updated>
<published>2017-09-20T15:42:01+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195491#p195491</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195491#p195491"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195491#p195491"><![CDATA[
W bootloader kreatorze kieruj się wybranym prockiem i podpowiedzią z boku rozwijanej listy adresów.<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 20 wrz 2017, o 15:42</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robosom]]></name></author>
<updated>2017-09-20T14:25:40+01:00</updated>
<published>2017-09-20T14:25:40+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195488#p195488</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195488#p195488"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195488#p195488"><![CDATA[
Właśnie na RS232 wszystko działa jak należy. Co ciekawe gdy wygeneruje z czystych plików bootloader to program działa i wszystko się ładuje poprawnie, nawet gdy wprowadzę zmiany dla rs485 a wyślę program przez rs232 to poprawnie wchodzi.<br /><br />Ciekawi mnie fakt dlaczego BLS_Start jest inny względem obliczeń a inny względem opisu w programie:<br /><a href="https://obrazkiforum.atnel.pl/1077/d593dfa21a5943d0822ea831d3c27b03.PNG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1077/d593dfa21a5943d0822ea831d3c27b03.PNG" alt="Obrazek" /></a><br /><br />w stosunku do obliczeń ze strony: 0x7E00 *2 = 0xFC00<br /><br />W sumie nawet na stronie z obliczeniami są błędy. Sam już nic nie wiem<br /><a href="https://obrazkiforum.atnel.pl/1077/4931f01199422e71166b71ee91a86ed8.PNG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1077/4931f01199422e71166b71ee91a86ed8.PNG" alt="Obrazek" /></a><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1077">robosom</a> — 20 wrz 2017, o 14:25</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[micky]]></name></author>
<updated>2017-09-20T12:46:42+01:00</updated>
<published>2017-09-20T12:46:42+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195484#p195484</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195484#p195484"/>
<title type="html"><![CDATA[Re: MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195484#p195484"><![CDATA[
Na RS232 wszystko jest ok? Jak tak to może źle sterujesz kierunkiem przepływu?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1546">micky</a> — 20 wrz 2017, o 12:46</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robosom]]></name></author>
<updated>2017-09-20T11:29:21+01:00</updated>
<published>2017-09-20T11:29:21+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195481#p195481</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195481#p195481"/>
<title type="html"><![CDATA[MkBootloader + RS485: Problem z wgraniem wsadu]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=19236&amp;p=195481#p195481"><![CDATA[
Witam serdecznie.<br /><br />Pracuję na mikrokontrolerze ATmega64 i ładuje wsady przez bootloader. Wsad bootloadera generowany z &quot;plików wzorcowych&quot;. Prędkość to 115200 bodów transmitowane przez USB i przejściówke na FT232.<br />Urządzenie docelowo ma pracować w sieci opartej o RS485<br /><br />postanowiłem więc od nowa wygenerować bootloader do pracy w sieci. Natknąłem się na wątek:<br /><a href="http://forum.atnel.pl/topic2168.html?hilit=mkbootloader%20485"  class="postlink">http://forum.atnel.pl/topic2168.html?hilit=mkbootloader%20485</a><br />gdzie bardzo fajnie została opisana zmiana bootloadera. Ustawiłem więc wszystko tak jak w artykuje:<br /><br />[syntax=c]////////////////////////////////////////////////////////////////////////////////<br />/* Bootloader<br /> * Autor: Mirosław Kardaś (2009-06-16)<br /> * Modyfikacje: Paweł Szramowski (2009-07-08)<br /> * Wersja: 2009-07-03 04:00 */<br />////////////////////////////////////////////////////////////////////////////////<br /><br />////////////////////////////////////////////////////////////////////////////////<br />/* Dołączenie bibliotek */<br />////////////////////////////////////////////////////////////////////////////////<br /><br />/* biblioteki avr-libc */<br />#include &lt;stdbool.h&gt;<br />#include &lt;stdint.h&gt;<br />#include &lt;avr/boot.h&gt;<br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;avr/wdt.h&gt;<br />#include &lt;util/delay.h&gt;<br />//#include &lt;util/setbaud.h&gt;<br /><br />////////////////////////////////////////////////////////////////////////////////<br />/* Definicje stałych programowych i makr */<br />////////////////////////////////////////////////////////////////////////////////<br /><br />//#define UART_BAUD 57600// tu definiujemy interesującą nas prędkość<br />#define __UBRR ((F_CPU+BAUD*8UL)/(16UL*BAUD)-1)  // obliczamy UBRR dla U2X=0<br /><br />/* wersja bootloadera */<br />#define BOOTLOADER_VERSION 1<br /><br />/* ustawienia UART */<br />#define UART_DATA_BITS 8<br />#define UART_PARITY 'n'<br />#define UART_STOP_BITS 1<br /><br />/* czas przesyłania jednego znaku przez UART &#91;us&#93; */<br />#if UART_PARITY == 'n'<br />    #define UART_BYTE_TIME \<br />        ( 1000000UL / ( BAUD / ( 1 + UART_DATA_BITS + UART_STOP_BITS ) ) )<br />#elif ( UART_PARITY == 'e' ) || ( UART_PARITY == 'o' )<br />    #define UART_BYTE_TIME \<br />        ( 1000000UL / ( BAUD / ( 1 + UART_DATA_BITS + 1 + UART_STOP_BITS ) ) )<br />#endif<br /><br />/* podstawienie nazwa rejestrów UART */<br />#ifndef UCSRA<br />    #define UCSRA UCSR0A<br />#endif<br />#ifndef UCSRB<br />    #define UCSRB UCSR0B<br />#endif<br />#ifndef UCSRC<br />    #define UCSRC UCSR0C<br />#endif<br />#ifndef UBRRL<br />    #define UBRRL UBRR0L<br />#endif<br />#ifndef UBRRH<br />    #define UBRRH UBRR0H<br />#endif<br />#ifndef UDR<br />    #define UDR UDR0<br />#endif<br /><br />/* podstawienie nazw bitów w rejestrze UCSRA */<br />#ifndef RXC<br />    #define RXC RXC0<br />#endif<br />#ifndef TXC<br />    #define TXC TXC0<br />#endif<br />#ifndef UDRE<br />    #define UDRE UDRE0<br />#endif<br />#ifndef FE<br />    #define FE FE0<br />#endif<br />#ifndef DOR<br />    #define DOR DOR0<br />#endif<br />#ifndef UPE<br />    #define UPE UPE0<br />#endif<br />#ifndef U2X<br />    #define U2X U2X0<br />#endif<br />#ifndef MPCM<br />    #define MPCM MPCM0<br />#endif<br /><br />/* podstawienie nazw bitów w rejestrze UCSRB */<br />#ifndef RXCIE<br />    #define RXCIE RXCIE0<br />#endif<br />#ifndef TXCIE<br />    #define TXCIE TXCIE0<br />#endif<br />#ifndef UDRIE<br />    #define UDRIE UDRIE0<br />#endif<br />#ifndef RXEN<br />    #define RXEN RXEN0<br />#endif<br />#ifndef TXEN<br />    #define TXEN TXEN0<br />#endif<br />#ifndef UCSZ2<br />    #define UCSZ2 UCSZ02<br />#endif<br />#ifndef RXB8<br />    #define RXB8 RXB80<br />#endif<br />#ifndef TXB8<br />    #define TXB8 TXB80<br />#endif<br /><br />/* podstawienie nazw bitów w rejestrze UCSRC */<br />#ifndef UMSEL<br />    #ifdef UMSEL0<br />        #define UMSEL UMSEL0<br />    #else<br />        #define UMSEL UMSEL00<br />        #define UMSEL0 UMSEL00<br />        #define UMSEL1 UMSEL01<br />    #endif<br />#endif<br />#ifndef UPM1<br />    #define UPM1 UPM01<br />#endif<br />#ifndef UPM0<br />    #define UPM0 UPM00<br />#endif<br />#ifndef USBS<br />    #define USBS USBS0<br />#endif<br />#ifndef UCSZ1<br />    #define UCSZ1 UCSZ01<br />#endif<br />#ifndef UCSZ0<br />    #define UCSZ0 UCSZ00<br />#endif<br />#ifndef UCPOL<br />    #define UCPOL UCPOL0<br />#endif<br /><br />/* ustawienia bitów konfiguracyjnych UART */<br />#if UART_DATA_BITS == 5<br />    #define UCSRB_DATA_BITS ( 0 &lt;&lt; UCSZ2 )<br />    #define UCSRC_DATA_BITS ( 0 &lt;&lt; UCSZ1 | 0 &lt;&lt; UCSZ0 )<br />#elif UART_DATA_BITS == 6<br />    #define UCSRB_DATA_BITS ( 0 &lt;&lt; UCSZ2 )<br />    #define UCSRC_DATA_BITS ( 0 &lt;&lt; UCSZ1 | 1 &lt;&lt; UCSZ0 )<br />#elif UART_DATA_BITS == 7<br />    #define UCSRB_DATA_BITS ( 0 &lt;&lt; UCSZ2 )<br />    #define UCSRC_DATA_BITS ( 1 &lt;&lt; UCSZ1 | 0 &lt;&lt; UCSZ0 )<br />#elif UART_DATA_BITS == 8<br />    #define UCSRB_DATA_BITS ( 0 &lt;&lt; UCSZ2 )<br />    #define UCSRC_DATA_BITS ( 1 &lt;&lt; UCSZ1 | 1 &lt;&lt; UCSZ0 )<br />#elif UART_DATA_BITS == 9<br />    #define UCSRB_DATA_BITS ( 1 &lt;&lt; UCSZ2 )<br />    #define UCSRC_DATA_BITS ( 1 &lt;&lt; UCSZ1 | 1 &lt;&lt; UCSZ0 )<br />#endif<br /><br />#if UART_PARITY == 'n'<br />    #define UCSRC_PARITY ( 0 &lt;&lt; UPM1 | 0 &lt;&lt; UPM0 )<br />#elif UART_PARITY == 'e'<br />    #define UCSRC_PARITY ( 1 &lt;&lt; UPM1 | 0 &lt;&lt; UPM0 )<br />#elif UART_PARITY == 'o'<br />    #define UCSRC_PARITY ( 1 &lt;&lt; UPM1 | 1 &lt;&lt; UPM0 )<br />#endif<br /><br />#if UART_STOP_BITS == 1<br />    #define UCSRC_STOP_BITS ( 0 &lt;&lt; USBS )<br />#elif UART_STOP_BITS == 2<br />    #define UCSRC_STOP_BITS ( 1 &lt;&lt; USBS )<br />#endif<br /><br />/* makro zamieniające podany argument na łańcuch znaków */<br />#define TOSTRING( x ) STRINGIFY( x )<br />#define STRINGIFY( x ) #x<br /><br />////////////////////////////////////////////////////////////////////////////////<br />/* Deklaracje funkcji statycznych */<br />////////////////////////////////////////////////////////////////////////////////<br /><br />static void UART_TX_Byte(<br />    const uint8_t Data );<br /><br />static void UART_TX_String_P(<br />    const char *String_Ptr );<br /><br />static uint16_t _UART_RX_Wait(<br />    uint16_t Timeout );<br /><br />/* Makro przeliczające argument w milisekundach na przyjmowaną przez funkcję <br /> * _UART_RX_Wait wielokrotność czasu przesyłania jednego znaku. */<br />//#define UART_RX_Wait( x ) _UART_RX_Wait( ( ( x ) &gt; UART_BYTE_TIME ) ? \<br />//    ( ( ( x ) * 1000UL ) / UART_BYTE_TIME ) : 1 )<br />    <br />#define UART_RX_Wait( x ) _UART_RX_Wait( ( x * 1000UL ) / UART_BYTE_TIME )  <br /><br />////////////////////////////////////////////////////////////////////////////////<br />/* Definicje funkcji */<br />////////////////////////////////////////////////////////////////////////////////<br /><br />static void __vectors( <br />    void )<br />    __attribute__ (( section( &quot;.vectors&quot; ), naked, used ));<br />static void __vectors( <br />    void )<br />{<br />    /* skok do sekcji .init2 (konieczny ze względu na umieszczanie stałych z <br />     * pamięci programu pomiędzy sekcjami .vectors a .init0, a więc na samym <br />     * początku programu w przypadku wykorzystania opcji -nostartfiles */<br />    asm (<br />        &quot;rjmp __init2&quot; &quot;\n\t&quot;<br />        : : );<br />}<br /><br />static void __init2( <br />    void )<br />    __attribute__ (( section( &quot;.init2&quot; ), naked, used ));<br />static void __init2( <br />    void )<br />{<br />    /* inicjalizacja wskaźnika stosu, rejestru z zerem i rejestru flag */<br />asm volatile (<br />&quot;out __SP_L__, %A0&quot; &quot;\n\t&quot;<br />&quot;out __SP_H__, %B0&quot; &quot;\n\t&quot;<br />&quot;clr __zero_reg__&quot; &quot;\n\t&quot;<br />&quot;out __SREG__, __zero_reg__&quot; &quot;\n\t&quot;<br />        : : &quot;r&quot;( ( uint16_t )( RAMEND ) ) );<br />}<br /><br />#ifdef WDIF<br />    static void __init3( <br />        void )<br />        __attribute__ (( section( &quot;.init3&quot; ), naked, used ));<br />    static void __init3( <br />        void )<br />    {<br />        /* wyłączenie watchdoga (w tych mikrokontrolerach, w których watchdog <br />         * ma możliwość generowania przerwania pozostaje on też aktywny po <br />         * resecie) */<br />        MCUSR = 0;<br />        _WD_CONTROL_REG = 1 &lt;&lt; _WD_CHANGE_BIT | 1 &lt;&lt; WDE;<br />        _WD_CONTROL_REG = 0;<br />    }<br />#endif<br /><br />static void __init9( <br />    void )<br />    __attribute__ (( section( &quot;.init9&quot; ), naked, used ));<br />static void __init9( <br />    void )<br />{<br />    /* skok do funkcji main */<br />asm (<br />&quot;rjmp main&quot; &quot;\n\t&quot;<br />        : : );<br />}<br /><br />int main( <br />    void )<br />    __attribute__ (( noreturn ));<br />int main( <br />    void )<br />{<br />    /* konfiguracja i włączenie interfejsu UART */<br />    UBRRH = __UBRR&gt;&gt;8;//UBRRH_VALUE;<br />    UBRRL = __UBRR;//UBRRL_VALUE;<br />    /*<br />    #if USE_2X<br />        UCSRA = 1 &lt;&lt; U2X;<br />    #else<br />        UCSRA = 0;<br />    #endif<br />    */<br />    //wyjscie do rs485<br />    DDRA |= (1&lt;&lt;PA1);<br />    PORTA &amp;= ~(1&lt;&lt;PA1);  //odbieranie<br />    <br />    #ifdef URSEL<br />        UCSRC = 1 &lt;&lt; URSEL | UCSRC_DATA_BITS | UCSRC_PARITY | UCSRC_STOP_BITS;<br />    #else<br />        UCSRC = UCSRC_DATA_BITS | UCSRC_PARITY | UCSRC_STOP_BITS;<br />    #endif<br />    UCSRB = 1 &lt;&lt; RXEN | 1 &lt;&lt; TXEN | UCSRB_DATA_BITS;<br />    <br />    /* deklaracja zmiennych */<br />    uint16_t Received_Char;<br />    <br />    /* wysyłanie znaku '?' do odebrania znaku 'u' lub upłynięcia czasu <br />     * oczekiwania */<br />for ( uint8_t Retries_Left = BOOT_WAIT * 10; Retries_Left; --Retries_Left )<br />    {<br />UART_TX_Byte( '?' );<br />//_delay_ms(100);<br />        <br />        if ( ( uint8_t )UART_RX_Wait( 100 ) == 'u' )<br />        {<br />            /* definicja zmiennych */<br />            bool Is_Comm_Lost = false;<br />            <br />            while ( 1 )<br />            {<br />                /* odebranie znaku */<br />                uint16_t Received_Char = UART_RX_Wait( 1000 );<br />                <br />                if ( ( uint8_t )Received_Char == 'i' )<br />                {<br />                    /* jeśli odebrano znak 'i', to wysłanie ciągu znaków <br />                     * identyfikujących mikrokontroler i bootloader */<br />                    UART_TX_String_P( PSTR( &quot;\r\n&quot; &quot;&amp;&quot; <br />                        TOSTRING( SPM_PAGESIZE ) &quot;,&quot; <br />                        TOSTRING( BLS_START ) &quot;,&quot; <br />                        TOSTRING( MCU ) &quot;,&quot; <br />                        TOSTRING( XTAL ) &quot;,&quot; <br />                        TOSTRING( BOOTLOADER_VERSION )<br />                        &quot;*&quot; &quot;\r\n&quot; ) );<br />                }<br />                else if ( ( uint8_t )Received_Char == 'w' )<br />                {<br />                <br />                    /* odczekanie do zakończenia operacji na pamięci EEPROM <br />                     * i Flash */<br />                    eeprom_busy_wait();<br />                    boot_spm_busy_wait();<br />                    <br />                    /* kasowanie całej pamięci programu */<br />                    for ( uint32_t Page_Address = 0; Page_Address &lt; BLS_START; <br />                        Page_Address += SPM_PAGESIZE )<br />                    {<br />                        /* skasowanie strony pamięci */<br />                        boot_page_erase( Page_Address );<br />                        boot_spm_busy_wait();<br />                    }<br />                    <br />                    /* programowanie pamięci programu */<br />                    for ( uint32_t Page_Address = 0; Page_Address &lt; BLS_START; <br />                        Page_Address += SPM_PAGESIZE )<br />                    {<br />                        /* wysłanie znaku '@' */<br />                        UART_TX_Byte( '@' );<br />                        <br />                        /* jeśli odebrano zero lub upłynął czas oczekiwania na <br />                         * odpowiedź, to zakończenie pracy bootloadera */<br />                        Received_Char = UART_RX_Wait( 1000 );<br />                        if ( !Received_Char || Received_Char &gt; 0xff )<br />                            break;<br />                        <br />                        /* zapełnienie bufora strony */<br />                        for ( uint16_t Byte_Address = 0; <br />                            Byte_Address &lt; SPM_PAGESIZE; Byte_Address += 2 )<br />                        {<br />                            /* próba odebrania młodszego bajtu słowa z pamięci <br />                             * programu */<br />                            if ( ( Received_Char = UART_RX_Wait( 1000 ) ) <br />                                &gt; 0xff )<br />                            {<br />                                Is_Comm_Lost = true;<br />                                break;<br />                            }<br />                            <br />                            uint16_t Instruction = Received_Char;<br />                            <br />                            /* próba odebrania starszego bajtu słowa z pamięci <br />                             * programu */<br />                            if ( ( Received_Char = UART_RX_Wait( 1000 ) ) <br />                                &gt; 0xff )<br />                            {<br />                                Is_Comm_Lost = true;<br />                                break;<br />                            }<br />                            <br />                            Instruction += Received_Char &lt;&lt; 8;<br />                            <br />                            /* zapisanie instrukcji do bufora */<br />                            boot_page_fill( Byte_Address, Instruction );<br />                        }<br />                        <br />                        if ( Is_Comm_Lost )<br />                            break;<br />                        <br />                        /* zapisanie strony pamięci */<br />                        boot_page_write( Page_Address );<br />                        boot_spm_busy_wait();<br />                    }<br />                    <br />                    /* odblokowanie sekcji Read-While-Write */<br />                    boot_rww_enable();<br />                    <br />                    /* zakończenie pracy bootloadera */<br />                    break;<br />                }<br />                else<br />                {<br />                    /* jeśli odebrano inny znak lub upłynął czas oczekiwania na <br />                     * odpowiedź, to zakończenie pracy bootloadera */<br />                    break;<br />                }<br />            }<br />            <br />            /* jeśli komunikacja z komputerem urwała się podczas przesyłania <br />             * strony, to bootloader jest uruchamiany ponownie, w przeciwnym <br />             * przypadku zakończenie pracy bootloadera */<br />            if ( Is_Comm_Lost )<br />                Retries_Left = BOOT_WAIT * 10;<br />            else<br />                break;<br />        }<br />}<br /><br />    /* wyłączenie interfejsu UART (dzieje się to dopiero po zakończeniu <br />     * wysyłania) i odczekanie do końca ewentualnej transmisji */<br />UCSRB = 0;<br />    //_delay_us( UART_BYTE_TIME );<br />    <br />    /* skok do właściwego programu */<br />    #if defined( __AVR_HAVE_JMP_CALL__ )<br />        asm volatile ( <br />            &quot;jmp 0&quot; &quot;\n\t&quot;<br />            : : );<br />    #elif defined( EIND )<br />        EIND = 0;<br />        asm volatile ( <br />            &quot;eijmp&quot; &quot;\n\t&quot;<br />            : : &quot;z&quot; ( 0 ) );<br />    #else<br />        asm volatile ( <br />            &quot;ijmp&quot; &quot;\n\t&quot;<br />            : : &quot;z&quot; ( 0 ) );<br />    #endif<br />    <br />    /* nieskończona pętla (konieczna, by kompilator nie wygenerował <br />     * niepotrzebnego kodu) */<br />    while ( 1 )<br />        {}<br />}<br /><br /><br />static void UART_TX_Byte(const uint8_t ch)<br />{<br />  while(!(UCSRA &amp; (1&lt;&lt;UDRE))) wdt_reset();      // wait for empty transmit buffer<br /> <br />  PORTA |= (1&lt;&lt;PA1);            // switch to TX mode<br />  UDR = ch;                        // write char<br />  while(!(UCSRA &amp; (1&lt;&lt;TXC))) wdt_reset();    // wait for UDR to be empty<br />  UCSRA |= (1&lt;&lt;TXC);                   // clear flag<br />  PORTA &amp;= ~(1&lt;&lt;PA1);           // switch to RX mode<br />}<br /><br />static void UART_TX_String_P(<br />    const char *String_Ptr )<br />{<br />uint8_t Single_Char;<br />    <br />    #ifdef __AVR_HAVE_ELPM__<br />        while ( ( Single_Char = pgm_read_byte_far( (BLS_START&amp;0xF0000UL) + (uint32_t)(uint16_t)String_Ptr++ ) ) )<br /><br />    #else<br />        while ( ( Single_Char = pgm_read_byte_near( String_Ptr++ ) ) )<br />    #endif<br />            UART_TX_Byte( Single_Char );<br /><br />}<br /><br />static uint16_t _UART_RX_Wait( <br />    uint16_t Timeout )<br />{<br />do<br />    {<br />if ( UCSRA &amp; 1 &lt;&lt; RXC )<br />            return ( uint16_t )UDR;<br />        <br />        _delay_us( UART_BYTE_TIME );<br />} while ( --Timeout );<br />    <br />return 0xffff;<br />}[/syntax]<br /><br />Plik makefile ustawiony tak:<br /><br />[syntax=c]# MCU name<br />MCU = atmega64<br /><br /># MCU frequency (without UL suffix)<br />F_CPU = 14745600<br /><br /># Bootloader options<br /># m128, m1284p  = 0x1FC00<br /># m32, m328 = 0x7E00<br /># m16, m168 = 0x3E00<br /># m8, m88 = 0x1E00<br />BLS_START = 0xFE00<br /><br /># dla połączeń Bluetooth czas oczekiwania min 3 s<br />BOOT_WAIT = 5<br /><br />BAUD_RATE = 9600[/syntax]<br /><br />BLS start ustawiony tak jak w &quot;plikach wzorcowych&quot; czyli 0xFE00<br />Wszystko się bardzo dobrze kompiliuje i wgrywa do procka. Fusebity ustawione tak:<br /><a href="https://obrazkiforum.atnel.pl/1077/ad679e8281f88a7f9e8e37b0b8ec4fe4.PNG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1077/ad679e8281f88a7f9e8e37b0b8ec4fe4.PNG" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/1077/16bef51b1a79ac2de57e178a78dc0084.PNG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1077/16bef51b1a79ac2de57e178a78dc0084.PNG" alt="Obrazek" /></a><br /><br />Jednak podczas próby wgrania programu przez RS485 występuje błąd. <br /><a href="https://obrazkiforum.atnel.pl/1077/7526448ab11fcc05eced6eabda2bd4c4.PNG"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1077/7526448ab11fcc05eced6eabda2bd4c4.PNG" alt="Obrazek" /></a><br /><br />Procesor odzywa się i wysyła wszystkie dane na temat bootloadera, jednak w momencie kiedy program wysyła dane, procek spóźnia się z odesłaniem potwierdzenia &quot;@&quot; albo wysyła go w momencie kiedy wysyłane są dane z komputera (dwie wysokie szpilki na drugim screenie).<br /><a href="https://obrazkiforum.atnel.pl/1077/73b19f0c8168d88a4f1a63f2966c49fe.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1077/73b19f0c8168d88a4f1a63f2966c49fe.png" alt="Obrazek" /></a><a href="https://obrazkiforum.atnel.pl/1077/0bff3b23ee755e6d050f67b0a5034437.png"  class="postlink"><img src="https://obrazkiforum.atnel.pl/thumb/1077/0bff3b23ee755e6d050f67b0a5034437.png" alt="Obrazek" /></a><br /><br /><br />Myślałem, że źle ustawiłem parametry bootloadera, i za drugim razem ustawiłem BLS_START tak jak na stronie:<br /><a href="http://atnel.pl/mkbootloader.html"  class="postlink">http://atnel.pl/mkbootloader.html</a><br />czyli: 0x7E00 *2 = 0xFC00, Ustawiłem więc nowy BLS lecz problem dalej pozostał ten sam.<br /><br />Nie wiem czy jest to problem z przejściówką (opartą o FT232 i MAX485) czy programu ale skoro odczyt parametrów odbywa się poprawnie to nie wiem dlaczego transmisja już nie.<br />Jakieś podpowiedzi co ustawione jest źle?<br /><br />Błagam, męczę się z tym już kilka dni a deadline goni  <img src="https://forum.atnel.pl/images/smilies/icon_e_confused.gif" alt=":?" title="Boi się" /><p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=1077">robosom</a> — 20 wrz 2017, o 11:29</p><hr />
]]></content>
</entry>
</feed>