Vra

Ek programmering n Netduino raad met behulp van die NET Mikro Raamwerk 4.1 en wil 'n hoër tyd resolusie as kry millisekondes. Dit is omdat ek 'n poging om 'n LED dowwe deur flikkerende dit regtig vinnig.

Die probleem is dat die voorbeeld kode gebruik Thread.Sleep (..) wat 'n aantal millisekondes neem.

Voorbeeld kode van http://netduino.com/projects/ wat die kwessie ter sprake:

OutputPort ledOnboard = new OutputPort(Pins.ONBOARD_LED, false);
while (true)
{
    ledOnboard.Write(true);
    Thread.Sleep(1); // << PROBLEM: Can only get as low as 1 millisecond

Selfs al is daar 'n ander manier om te bereik verduistering deur nie die gebruik van 'n groter tyd resolusie, ek is game.

Was dit nuttig?

Oplossing

Dit beteken nie jou vraag te beantwoord oor die manier waarop 'n beter tyd resolusie, maar dit beteken los jou probleem met die helderheid verander op 'n LED . Jy moet met behulp van die PWM module vir die Netduino.

Netduino Basics: Die gebruik van pulswydte modulasie ( PWM) is 'n groot artikel oor hoe om dit te gebruik.

Ander wenke

Ek het 'n soortgelyke probleem in die verlede gehad het en gebruik die volgende metode om tyd in die micro reeks. Die eerste reël bepaal hoeveel bosluise is in 'n millisekonde (sy was 'n rukkie sedert ek gebruik dit nie, maar ek dink 1 bosluis was 10 mikrosekondes). Die tweede lyn kry die hoeveelheid tyd wat die stelsel is op (in bosluise). Ek hoop dit help.

public const Int64 ticks_per_millisecond = System.TimeSpan.TicksPerMillisecond;

public static long GetCurrentTimeInTicks()
{
    return Microsoft.SPOT.Hardware.Utility.GetMachineTime().Ticks;
}

Jy kan 'n timer te gebruik om 'n gebeurtenis te samel in plaas van die gebruik van slaap.

Die interval eiendom op 'n timer is 'n dubbel so jy minder kan hê as 'n millisekonde op dit.

http://msdn.microsoft.com /en-us/library/0tcs6ww8(v=VS.90).aspx

In sy kommentaar op antwoord Seidleroni se BrainSlugs83 stel "sit in 'n besige lus en wag vir die gewenste aantal bosluise te verloop. Sien die funksie Ek het bygevoeg in die wysig ". Maar ek kan die funksie bygevoeg om die wysig nie sien nie. Ek neem aan dit sal so iets wees:

using System;
using Microsoft.SPOT.Hardware;

private static long _TicksPerMicroSecond = TimeSpan.TicksPerMillisecond/1000;

private void Wait(long microseconds)
{
    var then = Utility.GetMachineTime().Ticks;
    var ticksToWait = microseconds * _TicksPerNanoSecond;
    while (true)
    {
        var now = Utility.GetMachineTime().Ticks;
        if ((now - then) > ticksToWait) break;
    }
}

'n punt wat jy nie kan dink oor is dat jou kode is 'n beroep op die NET System naamruimte, wat gebaseer is op die werklike tyd klok in jou rekenaar. Let daarop dat die antwoorde staatmaak op die timer in die toestel.

Vorentoe beweeg, ek stel voor dat jy 'n oomblik neem om die bron van die inligting wat jy gebruik in jou kode kwalifiseer - is dit NET behoorlike (wat fundamenteel gebaseer op jou rekenaar), of die toestel die kode is loop op (wat 'n ander as System naamruimte sal hê, byvoorbeeld)?

PWM is 'n goeie manier om DC huidige kunsmatig beheer (deur wisselende die pulswydte), maar wisselende die PWM frekwensie sal nog 'n funksie van tyd wees aan die einde van die dag.

In plaas daarvan gebruik vertragings .... soos Slaap .... jy wil dalk 'n draad kuit en het dit die bestuur van die glans. Die gebruik van Slaap is nog basies 'n reguit lyn prosedurele metode en jou kode sal slegs in staat wees om hierdie een ding te doen as jy 'n enkele draad te gebruik.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top