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

<title>ATNEL tech-forum</title>
<link href="https://forum.atnel.pl/index.php" />
<updated>2015-07-02T20:09:55+01:00</updated>

<author><name><![CDATA[ATNEL tech-forum]]></name></author>
<id>https://forum.atnel.pl/feed.php?f=4&amp;t=12165&amp;mode</id>
<entry>
<author><name><![CDATA[mirekk36]]></name></author>
<updated>2015-07-02T20:09:55+01:00</updated>
<published>2015-07-02T20:09:55+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133496#p133496</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133496#p133496"/>
<title type="html"><![CDATA[Re: enc28j60 problem z NTP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133496#p133496"><![CDATA[
<div class="quotetitle">robi99956 napisał(a):</div><div class="quotecontent"><br />Wystarczyło zmienić serwer NTP z którego korzystałem i wszystko ruszyło<br /></div><br />To są właśnie &quot;fajne&quot; klimaty i niestety - takich uszkodzeń hmmm ala uszkodzeń trzeba szukać samemu najczęściej ...<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=54">mirekk36</a> — 2 lip 2015, o 20:09</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robi99956]]></name></author>
<updated>2015-07-02T18:00:00+01:00</updated>
<published>2015-07-02T18:00:00+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133480#p133480</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133480#p133480"/>
<title type="html"><![CDATA[Re: enc28j60 problem z NTP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133480#p133480"><![CDATA[
Ehh i okazuje się że tylko syf na forum zrobiłem... Wystarczyło zmienić serwer NTP z którego korzystałem i wszystko ruszyło <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />  <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" />.<br />Zostawiam kod dla innych początkujących, na razie jest tam tylko inicjalizacja i zdobycie czasu unixowego, ale mając to będzie o wiele łatwiej.<br />[syntax=c]/*<br /> * main.c<br /> *<br /> *  Created on: 29 cze 2015<br /> *      Author: Robert Krauze<br /> */<br /><br />#include &lt;avr/io.h&gt;<br />#include &lt;avr/interrupt.h&gt;<br />#include &lt;util/delay.h&gt;<br />#include &lt;avr/pgmspace.h&gt;<br />#include &lt;stdlib.h&gt;<br /><br />#include &quot;TCP_IP/enc28j60.h&quot;<br />#include &quot;TCP_IP/ip_arp_udp_tcp.h&quot;<br />#include &quot;TCP_IP/ip_config.h&quot;<br />#include &quot;TCP_IP/net.h&quot;<br />#include &quot;TCP_IP/dhcp_client.h&quot;<br /><br />#include &quot;led_7_seg/led.h&quot;<br />#include &quot;UART/uart.h&quot;<br />#include &quot;PCF8583/pcf8583.h&quot;<br />#include &quot;I2C/i2c.h&quot;<br /><br />#include &quot;time/timeconversions.h&quot;<br />#include &quot;time/timeout.h&quot;<br /><br /><br />//---------------------------------------------------------------------------------------------------------------<br />#define macstep 0xff<br /><br />// ustalamy adres MAC<br />static uint8_t mymac&#91;6&#93; = {0x00,'M','I','R','E',macstep};<br />//adres IP urządzenia<br />static uint8_t myip&#91;4&#93;;<br />// adres IP bramy domyślnej<br />static uint8_t gwip&#91;4&#93;;<br />#define TRANS_NUM_GWMAC 1<br />// maska podsieci<br />static uint8_t netmask&#91;4&#93;;<br />// IP serwera NTP<br />static uint8_t ntp_ip&#91;4&#93; = {17,171,4,15};<br />// MAC adres serwera NTP(LAN) lub GW(WAN)<br />static uint8_t ntp_routing_mac&#91;6&#93;;<br /><br /><br />// ustalamy wielkość bufora dla ramek TCP/UDP<br />#define BUFFER_SIZE 650<br />static uint8_t buf&#91;BUFFER_SIZE+1&#93;;<br /><br />uint16_t plen, datp;<br /><br />uint32_t time; // zmienna na czas UNIX<br /><br />uint8_t ntpclientportL;<br />uint8_t ntp_state;<br /><br />enum{ dont_need_request, wait_for_answer, need_request };<br /><br />volatile uint16_t cnt;<br /><br />char tmp_time&#91;20&#93;;<br /><br />#define odbierz_pakiet() plen = enc28j60PacketReceive(BUFFER_SIZE, buf)<br />#define refresh_ip_via_DHCP() plen = packetloop_dhcp_renewhandler(buf, plen)<br /><br />// the __attribute__((unused)) is a gcc compiler directive to avoid warnings about unsed variables.<br />void arpresolver_result_callback(uint8_t *ip __attribute__((unused)),uint8_t reference_number,uint8_t *mac) // działa<br />{<br />        uint8_t i=0;<br />        if (reference_number==TRANS_NUM_GWMAC){<br />                // copy mac address over:<br />                while(i&lt;6){ntp_routing_mac&#91;i&#93;=mac&#91;i&#93;;i++;}<br />        }<br />}<br /><br />void find_ntp_patch( void ) // działa<br />{<br />if( route_via_gw(ntp_ip) ) get_mac_with_arp(gwip, TRANS_NUM_GWMAC, arpresolver_result_callback );<br />else get_mac_with_arp( ntp_ip, TRANS_NUM_GWMAC, arpresolver_result_callback );<br />}<br /><br />void NTP_EVENT( void )<br />{<br />if( plen &gt; 0 &amp;&amp; datp == 0)<br />{<br />        // UDP/NTP protocol handling and idel tasks<br />        // check if ip packets are for us:<br />        if(eth_type_is_ip_and_my_ip(buf,plen)){<br />            DDRC |= (1&lt;&lt;PC7);<br /><br />                if (client_ntp_process_answer(buf,&amp;time,ntpclientportL)){<br />                        // convert to unix time:<br />                        if ((time &amp; 0x80000000UL) ==0){<br />                                // 7-Feb-2036 @ 06:28:16 UTC it will wrap:<br />                                time+=2085978496;<br />                        }else{<br />                                // from now until 2036:<br />                                time-=GETTIMEOFDAY_TO_NTP_OFFSET;<br />                        }<br />                ltoa(time, tmp_time, 10);<br />                uart0_puts(tmp_time);<br />                uart0_puts(&quot;\r\n&quot;);<br />                }<br />        }<br /><br />ntp_state = dont_need_request;<br />}<br />else<br />if( ntp_state == need_request )<br />{<br />ntpclientportL++;<br />client_ntp_request(buf, ntp_ip, ntpclientportL, ntp_routing_mac);<br />ntp_state = wait_for_answer;<br />}<br />}<br /><br />void enc28j60_link( void ) // działa<br />{<br />    while (enc28j60linkup()==0){<br />            // wait a bit then try again:<br />    _delay_ms(250);<br />            }<br />}<br /><br />void get_ip_from_DHCP( void ) // działa<br />{<br />uint8_t i = 0;<br /><br />    while(i==0)<br />    {<br />            plen=enc28j60PacketReceive(BUFFER_SIZE, buf);<br />            buf&#91;BUFFER_SIZE&#93;='\0';<br />            i=packetloop_dhcp_initial_ip_assignment(buf,plen,mymac&#91;5&#93;);<br />    }<br /><br />    // we have an IP:<br />    dhcp_get_my_ip(myip,netmask,gwip);<br />}<br /><br /><br />inline void timer_init( void ) // działa<br />{<br />    TCCR0A |= (1&lt;&lt;WGM01); // timer 0 CTC<br />    TCCR0B |= (1&lt;&lt;CS00) | (1&lt;&lt;CS02); // preskaler 1024<br />    OCR0A = 108; // dod podział<br />    TIMSK0 |= (1&lt;&lt;OCIE0A); // zezwolenie na comp match<br />}<br /><br />int main(void)<br />{<br />    uart0_init(UBRR_0);<br /><br />    DDRC |= (1&lt;&lt;PC7);<br /><br />/********** inicjalizacja funkcji obsługi stosu TCP *********************/<br />    /*inicjalizacja układu enc28j60*/<br />    enc28j60Init(mymac);<br /><br />    // konfiguracja diod LED w gnieździe RJ45<br />    // zielona (LEDA) - link<br />    // żółta (LEDB) - rx/tx<br />    // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10);<br />    enc28j60PhyWrite(PHLCON,0x476);<br /><br />    enc28j60_link();<br /><br />    timer_init();<br />sei();<br /><br />    init_mac(mymac);<br /><br />    get_ip_from_DHCP();<br /><br />    client_ifconfig(myip, netmask);<br /><br />    led_init();<br /><br />led_liczba(myip&#91;3&#93;);<br /><br />find_ntp_patch();<br /><br />while(1)<br />{<br />odbierz_pakiet();<br />buf&#91;BUFFER_SIZE&#93; = 0;<br />refresh_ip_via_DHCP();<br />datp = packetloop_arp_icmp_tcp(buf, plen);<br />NTP_EVENT();<br />}<br />}<br /><br />ISR( TIMER0_COMPA_vect ) // timer 100Hz<br />{<br />if(cnt++ == 600)<br />{<br />dhcp_6sec_tick();<br />cnt = 0;<br />ntp_state = need_request;<br />}<br /><br />}[/syntax]<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4938">robi99956</a> — 2 lip 2015, o 18:00</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robi99956]]></name></author>
<updated>2015-07-02T16:43:50+01:00</updated>
<published>2015-07-02T16:43:50+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133475#p133475</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133475#p133475"/>
<title type="html"><![CDATA[Re: enc28j60 problem z NTP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133475#p133475"><![CDATA[
Dobra, przyznam się szczerze że troszkę spanikowałem na widok rozmiarów pętli głównej w przykładzie z tuxgraphic. Ostatnio troszkę przysiadłem i udało się uruchomić klienta DHCP i przez ARP wyciągnąć z routera jego adres MAC <img src="https://forum.atnel.pl/images/smilies/icon_e_biggrin.gif" alt=":D" title="Bardzo szczęśliwy" /> Tylko, że główna funkcjonalność na której mi zależało, czyli NTP nadal nie odpowiada. Do jego obsługi powołałem takie zdarzenie:<br />[syntax=c]void NTP_EVENT( void )<br />{<br />if( plen &gt; 0 &amp;&amp; datp == 0)<br />{<br />        // UDP/NTP protocol handling and idel tasks<br />        // check if ip packets are for us:<br />        if(eth_type_is_ip_and_my_ip(buf,plen)){<br /><br />                if (client_ntp_process_answer(buf,&amp;time,ntpclientportL)){<br />                        // convert to unix time:<br />                        if ((time &amp; 0x80000000UL) ==0){<br />                                // 7-Feb-2036 @ 06:28:16 UTC it will wrap:<br />                                time+=2085978496;<br />                        }else{<br />                                // from now until 2036:<br />                                time-=GETTIMEOFDAY_TO_NTP_OFFSET;<br />                        }<br />                ltoa(time, tmp_time, 10);<br />                uart0_puts(tmp_time);<br />                }<br />        }<br /><br />ntp_state = dont_need_request;<br />}<br />else<br />if( ntp_state == need_request )<br />{<br />ntpclientportL++;<br />client_ntp_request(buf, ntp_ip, ntpclientportL, ntp_routing_mac);<br />ntp_state = wait_for_answer;<br />}<br />}[/syntax] <br /><br />Przed jego wywołaniem znajduje się taka konstrukcja:<br />[syntax=c]plen=enc28j60PacketReceive(BUFFER_SIZE, buf);<br />                buf&#91;BUFFER_SIZE&#93;='\0'; // http is an ascii protocol. Make sure we have a string terminator.<br />                // DHCP renew IP:<br />                plen=packetloop_dhcp_renewhandler(buf,plen); // for this to work you have to call dhcp_6sec_tick() every 6 sec<br />                dat_p=packetloop_arp_icmp_tcp(buf,plen);[/syntax]<br /><br />Wyrzucenie danych na uarta ma mi powiedzieć, kiedy przyjdzie odpowiedź i czy będzie miała jakiś sens.<br /><br />Metodą &quot;ledowego debuggera&quot; doszedłem, że przychodzący pakiet nie jest pakietem ipv4, a wyrzucająć przez uart jego identyfikator ustaliłem, że jest to pakiet ARP, mimo że zapytanie o mac wysyłam tylko raz na początku programu.(sprawdzone &quot;debuggerem&quot;)<br /><br />Czasem zdarza się, że pakiet przejdzie ten test, ale wtedy wysypuje się na trzecim ifie z tej funkcji:<br />[syntax=c]uint8_t eth_type_is_ip_and_my_ip(uint8_t *buf,uint16_t len){<br />        uint8_t i=0;<br />        //eth+ip+udp header is 42<br />        if (len&lt;42){<br />                return(0);<br />        }<br />        if(buf&#91;ETH_TYPE_H_P&#93;!=ETHTYPE_IP_H_V ||<br />           buf&#91;ETH_TYPE_L_P&#93;!=ETHTYPE_IP_L_V){<br />           uart0_putint( buf&#91;ETH_TYPE_H_P&#93; &lt;&lt; 8 | buf&#91;ETH_TYPE_L_P&#93;);<br />                return(0);<br />        }<br />        if (buf&#91;IP_HEADER_LEN_VER_P&#93;!=0x45){ // &lt;--- Tu najdalej udało się dojść<br />                // must be IP V4 and 20 byte header<br />                return(0);<br />        }<br />        while(i&lt;4){<br />                if(buf&#91;IP_DST_P+i&#93;!=ipaddr&#91;i&#93;){<br />                        return(0);<br />                }<br />                i++;<br />        }<br />        return(1);<br />}[/syntax]<br /><br />Do sprawdzania poprawności ip nigdy nie udało się dojść.<br /><br />Pokazałem wyżej w zasadzie cały kod obsługi sieci oprócz inicjalizacji, która, wnioskując z działania DHCP i tego, że mac GW jest dobry, jest poprawna.<br />Widzi któryś kolega co robię źle?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4938">robi99956</a> — 2 lip 2015, o 16:43</p><hr />
]]></content>
</entry>
<entry>
<author><name><![CDATA[robi99956]]></name></author>
<updated>2015-06-30T11:23:39+01:00</updated>
<published>2015-06-30T11:23:39+01:00</published>
<id>https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133251#p133251</id>
<link href="https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133251#p133251"/>
<title type="html"><![CDATA[enc28j60 problem z NTP]]></title>

<content type="html" xml:base="https://forum.atnel.pl/viewtopic.php?t=12165&amp;p=133251#p133251"><![CDATA[
Witam, ostatnio wpadł mi do głowy pomysł, aby stworzyć zegarek synchronizowany przez NTP. Kiedy szukałem natchnienia natrafiłem na przykład ze strony tuxgraphic.org, który jest po prostu świetny, ale nie o to mi chodziło. Chciałbym się najpierw dowiedzieć jak wygląda najprostsza obsługa, bez bajerów typu DHCP.<br /><br />Na razie przyjąłem następujące założenia:<br /><br />1. Inicjalizacja<br />Skoro NTP korzysta z UDP, to przyjąłem, że wystarczy skopiować odpowiedni fragment z lekcji o UDP, czyli<br />[syntax=c]/********** inicjalizacja funkcji obsługi stosu TCP *********************/<br />    /*inicjalizacja układu enc28j60*/<br />    enc28j60Init(mymac);<br /><br />    // konfiguracja diod LED w gnieździe RJ45<br />    // zielona (LEDA) - link<br />    // żółta (LEDB) - rx/tx<br />    // enc28j60PhyWrite(PHLCON,0b0000 0100 0111 01 10);<br />    enc28j60PhyWrite(PHLCON,0x476);<br /><br />    // inicjalizacja stosu TCP<br />    init_ip_arp_udp_tcp(mymac,myip,80);<br /><br />    // inicjalizacja bramy domyślnej<br />    // konieczne dla funkcji klienckich<br />    client_set_gwip(gwip);[/syntax] <br /><br />2. Wysłanie zapytania<br />Moim zdaniem wystarczy ta jedna funkcja:<br />[syntax=c]client_ntp_request(buf, ntp_ip, ntpclientportL);[/syntax]<br />Tylko nie wiem za bardzo dlaczego zmienna ntpclientportL była w przykładzie od tak inkrementowana. Czy to znaczy, że może mieć dowolną wartość?<br /><br />3. Odbiór odpowiedzi<br />Na podstawie przykładu skręciłem coś takiego:<br />[syntax=c]plen = enc28j60PacketReceive(BUFFER_SIZE, buf);<br /><br />packetloop_icmp_tcp(buf, plen);<br /><br />if( plen &gt; 0)<br />{<br />        if (client_ntp_process_answer(buf,&amp;time,ntpclientportL)){<br />                // convert to unix time:<br />                if ((time &amp; 0x80000000UL) ==0){<br />                        // 7-Feb-2036 @ 06:28:16 UTC it will wrap:<br />                        time+=2085978496;<br />                }else{<br />                        // from now until 2036:<br />                        time-=GETTIMEOFDAY_TO_NTP_OFFSET;<br />                }<br />                haveNTPanswer=1;<br /><br /><br />        }<br />ltoa(time, tmp_time, 10); // sygnalizacja jakiegokolwiek działania<br />uart0_puts(tmp_time);<br />}[/syntax]<br /><br />Niestety, nie chce to działać. Diody w gnieździe ethernetowym podpowiadają, że coś się dzieje.<br /><br />Adresy ip itd.:<br />[syntax=c]// ustalamy adres MAC<br />static uint8_t mymac&#91;6&#93; = {0x00,'M','I','R','E','K'};<br />// ustalamy adres IP urządzenia<br />static uint8_t myip&#91;4&#93; = {192,168,1,7};<br /><br />// ustalamy porty UDP z jakich będziemy korzystać<br />// może ich być dowolna ilość<br />static uint16_t myport&#91;&#93; = {1200,22700};<br />// ustalamy adres IP bramy domyślnej w sieci LAN<br />static uint8_t gwip&#91;4&#93; = {192,168,1,1};<br />// IP serwera NTP<br />static uint8_t ntp_ip&#91;4&#93; = {212,244,36,227};[/syntax]<br /><br />Jak siebie znam to pewnie jest gdzieś banalny błąd, ale pierwszy raz podchodzę do tematu i jeszcze wielu rzeczy nie rozumiem. Widzi ktoś gdzie jest problem?<p>Statystyki: Napisane przez <a href="https://forum.atnel.pl/memberlist.php?mode=viewprofile&amp;u=4938">robi99956</a> — 30 cze 2015, o 11:23</p><hr />
]]></content>
</entry>
</feed>