Forum Rule: Always post complete source code & details to reproduce any issue!
Results 1 to 3 of 3

Thread: Teensy 3.6 + wiz820io NTP example problem

  1. #1

    Teensy 3.6 + wiz820io NTP example problem

    Hello everyone!

    I'm havingsome problems with the NTP example. If I use the provided example everything works fine. The sketch sends a UDP request to the time server and I get a correct response.

    But if I assign a fixed IP it stps working even if I assign the same IP that the router has provided me before when I used the provided example

    Code:
    /*
    
     Udp NTP Client
    
     Get the time from a Network Time Protocol (NTP) time server
     Demonstrates use of UDP sendPacket and ReceivePacket
     For more on NTP time servers and the messages needed to communicate with them,
     see http://en.wikipedia.org/wiki/Network_Time_Protocol
    
     created 4 Sep 2010
     by Michael Margolis
     modified 9 Apr 2012
     by Tom Igoe
     modified 02 Sept 2015
     by Arturo Guadalupi
    
     This code is in the public domain.
    
     */
    
    #include <SPI.h>
    #include <Ethernet.h>
    #include <EthernetUdp.h>
    
    // Enter a MAC address for your controller below.
    // Newer Ethernet shields have a MAC address printed on a sticker on the shield
    byte mac[] = {
      0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED
    };
    IPAddress ip(192, 168, 0, 177);
    unsigned int localPort = 8888;       // local port to listen for UDP packets
    
    const char timeServer[] = "time.nist.gov"; // time.nist.gov NTP server
    
    const int NTP_PACKET_SIZE = 48; // NTP time stamp is in the first 48 bytes of the message
    
    byte packetBuffer[NTP_PACKET_SIZE]; //buffer to hold incoming and outgoing packets
    
    // A UDP instance to let us send and receive packets over UDP
    EthernetUDP Udp;
    
    void setup() {
      // You can use Ethernet.init(pin) to configure the CS pin
      Ethernet.init(10);  // Most Arduino shields
      //Ethernet.init(5);   // MKR ETH shield
      //Ethernet.init(0);   // Teensy 2.0
      //Ethernet.init(20);  // Teensy++ 2.0
      //Ethernet.init(15);  // ESP8266 with Adafruit Featherwing Ethernet
      //Ethernet.init(33);  // ESP32 with Adafruit Featherwing Ethernet
    
      // Open serial communications and wait for port to open:
      Serial.begin(9600);
      while (!Serial) {
        ; // wait for serial port to connect. Needed for native USB port only
      }
    
      // start Ethernet and UDP
      //Ethernet.begin(mac); // <------------- THIS WORKS
      Ethernet.begin(mac, ip); // <------------- THIS  DOES NOT WORK
      
      Udp.begin(localPort);
    }
    
    void loop() {
      sendNTPpacket(timeServer); // send an NTP packet to a time server
    
      // wait to see if a reply is available
      delay(1000);
      if (Udp.parsePacket()) {
        // We've received a packet, read the data from it
        Udp.read(packetBuffer, NTP_PACKET_SIZE); // read the packet into the buffer
    
        // the timestamp starts at byte 40 of the received packet and is four bytes,
        // or two words, long. First, extract the two words:
    
        unsigned long highWord = word(packetBuffer[40], packetBuffer[41]);
        unsigned long lowWord = word(packetBuffer[42], packetBuffer[43]);
        // combine the four bytes (two words) into a long integer
        // this is NTP time (seconds since Jan 1 1900):
        unsigned long secsSince1900 = highWord << 16 | lowWord;
        Serial.print("Seconds since Jan 1 1900 = ");
        Serial.println(secsSince1900);
    
        // now convert NTP time into everyday time:
        Serial.print("Unix time = ");
        // Unix time starts on Jan 1 1970. In seconds, that's 2208988800:
        const unsigned long seventyYears = 2208988800UL;
        // subtract seventy years:
        unsigned long epoch = secsSince1900 - seventyYears;
        // print Unix time:
        Serial.println(epoch);
    
    
        // print the hour, minute and second:
        Serial.print("The UTC time is ");       // UTC is the time at Greenwich Meridian (GMT)
        Serial.print((epoch  % 86400L) / 3600); // print the hour (86400 equals secs per day)
        Serial.print(':');
        if (((epoch % 3600) / 60) < 10) {
          // In the first 10 minutes of each hour, we'll want a leading '0'
          Serial.print('0');
        }
        Serial.print((epoch  % 3600) / 60); // print the minute (3600 equals secs per minute)
        Serial.print(':');
        if ((epoch % 60) < 10) {
          // In the first 10 seconds of each minute, we'll want a leading '0'
          Serial.print('0');
        }
        Serial.println(epoch % 60); // print the second
      }
      // wait ten seconds before asking for the time again
      delay(10000);
      Ethernet.maintain();
    }
    
    // send an NTP request to the time server at the given address
    void sendNTPpacket(const char * address) {
      // set all bytes in the buffer to 0
      memset(packetBuffer, 0, NTP_PACKET_SIZE);
      // Initialize values needed to form NTP request
      // (see URL above for details on the packets)
      packetBuffer[0] = 0b11100011;   // LI, Version, Mode
      packetBuffer[1] = 0;     // Stratum, or type of clock
      packetBuffer[2] = 6;     // Polling Interval
      packetBuffer[3] = 0xEC;  // Peer Clock Precision
      // 8 bytes of zero for Root Delay & Root Dispersion
      packetBuffer[12]  = 49;
      packetBuffer[13]  = 0x4E;
      packetBuffer[14]  = 49;
      packetBuffer[15]  = 52;
    
      // all NTP fields have been given values, now
      // you can send a packet requesting a timestamp:
      Udp.beginPacket(address, 123); // NTP requests are to port 123
      Udp.write(packetBuffer, NTP_PACKET_SIZE);
      Udp.endPacket();
    }
    So if I change Ethernet.begin(mac); to Ethernet.begin(mac, ip); the sketch does not work but I can ping the Teensy and even send fake UDP packets to it without any problem...

    Is this a bug or an router issue?

    Thank you!

  2. #2
    Senior Member+ manitou's Avatar
    Join Date
    Jan 2013
    Posts
    1,861
    if you kept the MAC address the same when flipping between fixed IP and DHCP, then you may have ARP problems at other hosts/routers, because they have ARP address indexed by the MAC address. Try using different MAC address for fixed vs DHCP

  3. #3
    I fixed it!
    After some digging I noticed that my setup was incomplete.. I was only assigning the mac and IP... I needed to assign gateway, subnet and DNS... So the teensy can access the outside world ... Stupid me!!

    Code:
    Ethernet.begin(mac, ip, dns, gateway, subnet);
    Thank you anyway for taking you time to help me!

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •