- Netduino Forums
- → Nobby's Content
Nobby's Content
There have been 66 items by Nobby (Search limited from 29-April 23)
#30581 Netduino Reset Button Issues
Posted by Nobby on 12 June 2012 - 08:05 AM in Netduino Plus 2 (and Netduino Plus 1)
#31948 Any plans for have ParameterizedThreadStart available in the MF?
Posted by Nobby on 13 July 2012 - 03:41 AM in General Discussion
Good day everyone.
Any plans to have ParameterizedThreadStart available in the MF?
Thanks
You can use lambda expressions in conjunction with the standard ThreadStart class. It allows you to have type-safe targets as well.
class MyClass { Thread myThread = null; public MyClass() { this.myThread = new Thread(() => MyClass.threadFunc(this)); this.myThread.Start(); } private static void threadFunc(MyClass myClassObject) { //do stuff here } }
Target delegate doesn't have to be static either
#31951 Timing Accuracy Issues
Posted by Nobby on 13 July 2012 - 03:54 AM in General Discussion
#31953 Timing Accuracy Issues
Posted by Nobby on 13 July 2012 - 05:01 AM in General Discussion
Hi Nobby,
Is the elapsed time from timers/Stopwatch not matching the increase in DateTime.Now?
Losing 10 seconds in 15 minutes is a lot (~1.1%).
Can you post a quick code snippet showing how you're calculating and writing out the time? We should be able to run it on our Netduinos to reproduce...
Finally...just curious: if you reflash the mainboard with Netduino firmware (instead of Netduino Plus) do you get the same results?
Chris
Hey Chris,
Due to the nature of my project, I can't share code but I have created a new project which is dedicated to the task of timing using Ticks.
The project has three threads. The main program thread, aka Main(), sits in a for(; loop with a Thread.Sleep(500) call. It does this after it initialises a class that manages the time measurements.
The second thread is fed a time object and reduces its time until it reaches zero or less. The thread is executed with default priority through a lambda expression.
private static void timerFunc(Clock clock) { if (clock == null) return; long startTicks = Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks; long endTicks, delta; while (clock.time > 0) { endTicks = Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks; delta = (endTicks - startTicks) / m_tick; //where m_tick is System.TimeStamp.TicksPerMillisecond clock.time -= delta; startTicks = Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks; Thread.Sleep(50); } }
The third thread is one that runs in the clock class. It sleeps for 100ms and then uses COM1 to write, in ASCII text, the value of the time of the format "mm:ss.f".
I just started a 15min test against my sports wristwatch and PC application. 10mins into the test, clock.time is eight seconds higher than the timer on my watch.
I haven't tried flashing my Netduino Plus with the Netduino firmware. I have a regular Netduino to use and a handfull of Netduino Plus devices I can downgrade if necessary.
Currently, I'm stuck with the newest firmware for my commercial project. Purely because of the Socket runtime code footprint providing a much needed 10K.
Thanks for having a look at this
#31955 Timing Accuracy Issues
Posted by Nobby on 13 July 2012 - 05:19 AM in General Discussion
#31958 Timing Accuracy Issues
Posted by Nobby on 13 July 2012 - 05:31 AM in General Discussion
Hey Nobby,
Thank you for the additional information. Let's boil it down a bit more, to isolate any potential code or threading issues...
Can you please try creating an app which simply does the following:
- Create and open an instance of the SerialPort class
- In a loop: write the current time to the serial port and then sleep 500ms
And then share that code along with your results? If that basic case is losing 1+ seconds per minute...or if it's not...then we'll have a good basis for diagnostics.
Thank you, Nobby.
Chris
Getting onto that right now.
#31963 Timing Accuracy Issues
Posted by Nobby on 13 July 2012 - 07:50 AM in General Discussion
-mainThread.png shows your experiment rules. Over four mins, there is no clock drift between PC and Netduino DateTime.Now
-threadedMachineTime.png shows the same experiment except data transmission is done every 100ms on one thread and the current machine time is stored in clock.time on another thread every 50ms. There is no drift apart from 100ms synchronisation conflicts between threads every now and then which go back to zero anyway.
-stopwatch.png System.Diagnostics.StopWatch approach shows a drift of about 200ms every two minutes. Clock.time is incremented by stop_ticks - start_ticks after a thread.sleep(50). The itterative code is shown below. It should essentially always match the netduino machine time. There is only 1 line of code overhead separating
for(;;) { endTicks = Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks; delta = endTicks - startTicks; startTicks = Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks; clock.time += delta; //clock.time = Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks; //this was used in the second experiment Thread.Sleep(50); }
-internalDrift.png shows how clock.time drifts away from the Netduino system time. The netduino experiment code was modified to only transmit the drift between Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks and clock.time(shown in the Current Column for Netduino). The results show that the Netduino clock doesn't drift compared to the PC clock rather clock.time is drifting behind the Netduino clock. As you can see from the code above though, there's nothing to it. Certainly no reason for such a rediculous lack of accuracy. Even if I changed the code so that start_ticks = end_ticks after calculating delta, it doesn't make much of a difference. I did notice that if I reduce or increase the sleep time from 50 down to 25 or up to 100, the accuracy of timing was affected but minimally.
What can you tell me about operations and overhead with large datatypes such as System.Long? Could it be significant?
I will restructure this experiment to perform stopwatch-based approach in the main thread and see what results I get.
#31973 Timing Accuracy Issues
Posted by Nobby on 13 July 2012 - 12:41 PM in General Discussion
long startTicks = Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks, endTicks=0, delta=0; int sleepTime = 50, choice=1; clock.start = startTicks; for(;;) { if (choice == 0) { Thread.Sleep(sleepTime); //Sleep to regulate timing intervals. 50ms here. endTicks = Utility.GetMachineTime().Ticks; //Get the current Netduino time delta = endTicks - startTicks; //Calculate the time difference startTicks = endTicks; //Assume significant overhead from the previous line of code clock.time += delta; //Increment instance member time value } else if (choice == 1) { Thread.Sleep(sleepTime); endTicks = Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks; delta = endTicks - startTicks; startTicks = Utility.GetMachineTime().Ticks; //Assume no overhead from the previous line of code and this line as well clock.time += delta; } else if (choice == 2) { //Choices 2 & 3 just involve a different order of operations but have the same logic as 1 & 2 endTicks = Utility.GetMachineTime().Ticks; delta = endTicks - startTicks; startTicks = endTicks; //Assume overhead from the previous line of code clock.time += delta; Thread.Sleep(sleepTime); } else if (choice == 3) { endTicks = Utility.GetMachineTime().Ticks; delta = endTicks - startTicks; startTicks = Utility.GetMachineTime().Ticks; //Assume no overhead from last and this line of code clock.time += delta; Thread.Sleep(sleepTime); } }
I performed some optimisations on my original timing code which was not optimised at the time. There was still drift. The results were fairly conclussive though. Choices 0 & 2 provided identical and ideal results. There was no slip between clock.time, the Netduino time and the PC time.
Choices 1 & 3 resulted in the slip of 100ms every 30seconds. The only difference in code was using startTicks = Utility.GetMachineTime().Ticks vs startTicks = endTicks. The previous line of code, delta = endTick - startTicks and the alternative code in choices 1 & 3 were resulting in what appears to be significant overhead. Based on the results and a loop interval of roughly 50ms, it works out to be roughly 166us of slip per itteration.
Not being a huge fanatic of investigating the inner workings of the micro framework, I'm just going to accept that I can't be lazy in design with respect to these things. Failing longer duration tests for choices 0 & 2, There's no evidence of any chronic issue with timing accuracy.
#32008 RFID Reader
Posted by Nobby on 14 July 2012 - 05:50 AM in General Discussion
Hi,
Just wondering if anyone can recommend an RFID reader that is compatible with the Netduino. I need one that can read from at least 30cm.
Can anyone help?
Thanks
I've used the Texas Instruments RFID readers in the past with AVR based projects. Unfortunately, there's no way you're going to get 30cm read range out of most units. Purely because the most available and popular units are High Frequency RFIDs(used in keycard access etc).
All the long range options are the low frequency devices(cattle tags, anti-theft etc). I can't remember off-hand what those are but the high freq devices operate at 6MHz and the low frequency devices are in the hundreds of kHz.
Either way you go, all communications are TTL/RS232 with a possible USB option.
#32011 Timing Accuracy Issues
Posted by Nobby on 14 July 2012 - 08:44 AM in General Discussion
#32088 Netduino Plus Socket Server Help
Posted by Nobby on 17 July 2012 - 06:16 AM in Netduino Plus 2 (and Netduino Plus 1)
#32090 GPS shield odd results. Novice user.
Posted by Nobby on 17 July 2012 - 06:30 AM in Netduino Plus 2 (and Netduino Plus 1)
Sometimes the data can contain characters which are non punctuation, letters, numbers etc because certain bytes are acutally bit-fields of configuration and satelite data. String constructors might return NULL based on these non-alpha numeric characters. Instead, make a string, use a for/foreach loop and append each byte onto the string but cast it as a char.
change this
Debug.Print(new string(Encoding.UTF8.GetChars(buffer)));
to this
string dataString = ""; foreach(byte b in buffer) dataString+=(char)b; Debug.Print(dataString);
Good luck
#32163 Multiple questions from someone thinking about picking up a netduino
Posted by Nobby on 18 July 2012 - 02:21 AM in General Discussion
#32165 Netduino Plus Network Interface Controller
Posted by Nobby on 18 July 2012 - 02:33 AM in Netduino Plus 2 (and Netduino Plus 1)
#32184 StreamReader detect end of file
Posted by Nobby on 18 July 2012 - 11:07 AM in Netduino Plus 2 (and Netduino Plus 1)
string fileLine = ""; while((line=sr.ReadLine())!=null) { Debug.Print(fileLine); } sr.Close();
#32186 I2C communication with GainSpan GS1011
Posted by Nobby on 18 July 2012 - 11:18 AM in Netduino Plus 2 (and Netduino Plus 1)
#32491 Multiple questions from someone thinking about picking up a netduino
Posted by Nobby on 23 July 2012 - 01:50 AM in General Discussion
#32508 Microsecond timing
Posted by Nobby on 23 July 2012 - 07:59 AM in Netduino Plus 2 (and Netduino Plus 1)
#32510 Netduino Plus Network Interface Controller
Posted by Nobby on 23 July 2012 - 08:02 AM in Netduino Plus 2 (and Netduino Plus 1)
#32581 Passing Servo's to another thread.
Posted by Nobby on 24 July 2012 - 12:03 AM in Netduino Plus 2 (and Netduino Plus 1)
#32642 Netduino Plus Network Interface Controller
Posted by Nobby on 25 July 2012 - 02:23 AM in Netduino Plus 2 (and Netduino Plus 1)
---Netduino Software---
A threaded socket listener accepting TCP connection requests. It's a non-blocking approach utilising Socket.Poll to check for pending connection requests before calling Socket.Accept. Detection of NIC being up or down is monitored using the WinSock socket exception code 10050. Once the network status is up, I tried two methods that involve either retaining the existing listening socket object or recreating the listening socket.
- Netduino is using static IP and gateway (192.168.1.95, 255.255.255.0, 192.168.1.1)
- Experiment involved starting a debugger on the netduino with the network cable plugged in or unplugged
- A separate thread does a Debug.Print of the current IP address and default gateway of the Netduino every three seconds
---PC Software---
A simple app which allows you to enter an ip address and port number. A "Connect" button which attempts to create a TCP connection to the remote host at the defined address and port. A "Ping" button which broadcasts an IMCP echo request to the defined address. All connection and ping results displayed in a listBox.
---Results---
Starting the debugger with the network cable initially plugged in produces positive results. The device is pingable and TCP connections can be made. Unplugging the device from the network results in WinSock 10050 exceptions on Socket.Poll as expected. Plugging the Netduino back into the network and recreating the listener socket resumes desirable behaviour. The device is pingable and TCP connections can be made.
Starting the debugger with the network cable initially unplugged is where it all goes wrong. The frequently displayed IP address of the Netduino is correct. After any length of time, the netduino is plugged in, all related link/activity etc lights come on. WinSock 10050 errors cease to occur when calling Socket.Poll as expected. However, the device is unpingable and TCP connections cannot be made to 192.168.1.95. No amount of time changes the conditions of connectivity without restarting the device.
Is anybody familiar with the inner workings of the .Net Microframework runtime startup in the Netduino and how NICs are affected by it? Fortunately, the only vulnerability of the product I'm developing is that it must be plugged in and active at both ends of the network cable before the product is powered up. I would like that to not be a requirement.
This thread http://forums.netdui...?showtopic=3420 alerted me that sometimes the Netduino needs to be rebooted. Is there any other functionality that isn't as brutal as a reboot?
I'm now using Socket.Poll to detect the initial NIC connection state and rebooting the device upon the NIC status changing to up, if it was originally down. I can't exactly do this if the product is in the middle of being used.
#32649 Release COM2 (CTS, RTS)
Posted by Nobby on 25 July 2012 - 07:54 AM in Netduino Plus 2 (and Netduino Plus 1)
#32651 start multi-projetc's on netduino
Posted by Nobby on 25 July 2012 - 08:04 AM in Netduino Plus 2 (and Netduino Plus 1)
- Add a new project to solution
- Choose "Class Library" instead of "Netduino Plus Application" under Visual C# -> Micro Framework. This what you mean by DLL?
- Write the code in your class library
- Go to your Netduino Plus application project, choose to add a reference
- In the projects tab, choose your new class library as the reference
- You can now use your class library in the Netduino Plus application!!
#32652 SD card trouble
Posted by Nobby on 25 July 2012 - 08:20 AM in Netduino Plus 2 (and Netduino Plus 1)
- The file test.txt already exists on the SD card
- The name of the root directory isn't \SD\
It may seem long-winded but I always query
VolumeInfo[] drives = VolumeInfo.GetVolumes();
It serves to ensure there is an SD card inserted(there are also other ways to check this). The objects also indicate the name of the root directory.
I haven't looked up the reference to Directory.GetCurrentDirectory for Micro Framework. It's standard usage is to return the current working directory which only applies to application domains running normal .Net Framework applications on a PC etc. Since the Netduino executes code from Flash rather than a virtualised application domain run from media, it doesn't use working directories.
#32654 Controlling Netduino from PC
Posted by Nobby on 25 July 2012 - 10:48 AM in General Discussion
- Netduino Forums
- → Nobby's Content
- Privacy Policy