EthernetSNTP
This sample program uses the SNTP protocol to obtain the time and date from a remote time server. The time and date returned is encoded, so we use the utility module "UTCDateTime.bas" to decode the returned value. Here's what you need to do.
- Plug a network cable into your board and connect to your network. For example, just plug your Ethernet board into your broadband router, which will act as a DHCP server.
- Compile and then program the code into your device.
- Start the Swordfish Serial Communicator plugin, and a connect to your MCUs USART at 115200 baud.
- Reset the MCU.
If all goes well, something like the following should be displayed in the Serial Communicator window
Waiting for DHCP... Host Name : SWORDFISH MAC Address : $00 $04 $A3 $00 $00 $00 IP address : 192.123.223.1 Mask : 255.255.255.0 Gateway : 192.123.223.254 Primary DNS : 192.123.223.254 Secondary DNS : 158.123.223.58 Enter 't' to display UTC time
Now all you need to do is enter "t" and press enter. The value returned will look something like this
Wed 06/02/2008 09:00:31
An interesting feature of the Swordfish SNTP (time server) module is that is does not repeatedly interrogate a time server for information. Instead, the PIC uses and internal millisecond counter and polls the time server every ten minutes or so to resynchronise.
Sample Code
// device and clock - code will work on an 18F452 as well... Device = 18F4680 Clock = 20 // important configurations... #option ENC28J60_CS = PORTD.6 #option NET_ICMP = true // enable ping #option NET_DHCP = true // enable Dynamic Host Configuration Protocol (DHCP) #option NET_NBNS = true // enable NETBIOS #option NET_SNTP = true // enable time server Include "NETApp.bas" // always first! // TCPIP stack specifics... Include "NETTypes.bas" Include "SNTP.bas" // program helpers... Include "NETAppDisplay.bas" Include "usart.bas" Include "convert.bas" Include "UTCDateTime.bas" { **************************************************************************** * Name : UTCTime * * Purpose : Gets the UTC time and formats the output to * * : DayOfWeek DAY MONTH YEAR HOUR:MINS:SECS * **************************************************************************** } Function UTCTime() As String(24) Dim Seconds As DWORD Seconds = SNTPGetUTCSeconds UTC.Decode(Seconds) result = UTC.DayOfWeek(DateTime.DOW) + " " + DecToStr(DateTime.Day,2) + "/" + DecToStr(DateTime.Month,2) + "/" + DecToStr(DateTime.Year) + " " + DecToStr(DateTime.Hour,2) + ":" + DecToStr(DateTime.Min,2) + ":" + DecToStr(DateTime.Sec,2) End Function // program start... SetBaudrate(br115200) #if NET_DHCP Write("Waiting for DHCP...",13,10) #else DisplayConfig USART.Write("Enter 't' to display UTC time",13,10) #endif // loop forever... While true // This task performs normal stack task including checking for incoming // packet, type of packet and calling appropriate stack entity to process it. NETApp.Task // read USART value - if equal to "t" then display UTC time... If DataAvailable Then If USART.ReadByte = Byte("t") Then USART.Write(UTCTime,13,10) EndIf EndIf // If DHCP is enabled, display configuration when a DHCP event // has occurred... #if NET_DHCP If NETApp.DHCPEvent() Then DisplayConfig() USART.Write("Enter 't' to display UTC time",13,10) EndIf #endif Wend