PDA

View Full Version : سوال: ارسال داده به صورت زمان واقعی روی پورت سریال



majid zarei
دوشنبه 12 تیر 1391, 07:28 صبح
با سلام خدمت همه دوستان.
در یک پروژه من بر روی سخت افزار یک آی سی D/A دارم که به یک میکرو کنترل میشه و این میکرو با پورت سریال (115200-8N1) به pc وصل است . من میخواهم بتوانم هر 1m، 2m،3m و ... داده روی پورت بفرستم. در ابتدا با یک تایمر این کار را کردم ولی دیدم زمانها غیر واقعی است . مثلا وقتی که انتظار داشتم هر 5 میلی ثانیه داده روی پورت باشه ؛ با اسیلوسکوپ که دیدم این زمان متغیر بود و از 6 میلی تا 16 میلی بود.
لطفا راهنمایی کنید که بدجور گیر کردم. ممنون:گریه:

maikola
دوشنبه 12 تیر 1391, 10:53 صبح
اگه سمت کامپیوتر از برنامه خودتون استفاده می کنید از تایمر خود کامپیوتر استفاده کنید بعد از گذشت زمان مورد نظر یه کاراکتر مثل "n" به میکرو بفرستید برای میکرو هم تعیین کنید اگه این کاراکتر خاص رو گرفت اطلاعات را بفرستد
قبل از شروع پروسه ارتباط میکرو با کامپیوتر رو با ارسال و دریافت یه کاراکتر دیگه چک کنید

Saeed_m_Farid
دوشنبه 12 تیر 1391, 11:51 صبح
سلام
با تشکر از پاسخ دوستمون maikola (http://barnamenevis.org/member.php?113672-maikola) و در تکمیل صحبت‌های ایشون، تو یه تاپیک دیگه (اینجا (http://barnamenevis.org/showthread.php?347122&viewfull=1#post1530774)) انواع تایمر رو که معمولآً دوستان بهشون توجه ندارن، معرفی کردم؛‌ ولی حتی با System.Timers.Timer (http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx) هم شما تقریباً در Interval های کمتر یا معادل 15 میلی‌ثانیه به مشکل می‌خورید! (بنا به تجربه، نمیدونم مبنای علمی داره یا نه!) اگه از Windows.Forms.Timer (http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S1) استفاده کرده باشید که اوضاع وخیم تر هم میشه؛ درصورتیکه از هیچکدوم از اونها بازم نتیجه نگرفتین می‌تونید از کلاس Stopwatch (http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.aspx) استفاده کنید.
بازم! اگه مشکل‌تون حل نشد دیگه راهکارهای سخت افزاری باید دنبال کنید، درسته کلاسهایی مثل MicroTimer (http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer) برای اینکار نوشته شدن ولی اصولاً با دات نت بهتر از این (زمانهای پایین تر از میلی و درحد میکرو!) نمی‌تونید نتیجه بگیرید، برای اینکه ویندوز RTOS (http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFYQFjAA&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FReal-time_operating_system&ei=3FHxT9DIMaaB4gTp9MSGDg&usg=AFQjCNEU418Z76zilnc8PVdrDrlKRr3TGQ&sig2=c0cyggbt4DkWppX0B1nvuw) نیست!

maikola
دوشنبه 12 تیر 1391, 16:29 عصر
طبق آزمایشی که قبلا انجام دادم Intervalمربوط به تایمر اگر زیر 100 تعریف بشه تایمر دزست کار نمی کنه قبلا مقالش رو تو یکی از داکیومنت های ماکروسافت هم دیده بودم
خود 100میلی ثانیه هم خطا داره
درحقیقت اینتروال تایمر رو برای کار دقیق از 1000 نباید کمتر گرفت

Saeed_m_Farid
دوشنبه 12 تیر 1391, 17:07 عصر
طبق آزمایشی که قبلا انجام دادم Intervalمربوط به تایمر اگر زیر 100 تعریف بشه تایمر دزست کار نمی کنه قبلا مقالش رو تو یکی از داکیومنت های ماکروسافت هم دیده بودم
خود 100میلی ثانیه هم خطا داره
درحقیقت اینتروال تایمر رو برای کار دقیق از 1000 نباید کمتر گرفت

منبع؟

کاری می‌کنید آدم به اسمش هم شک می‌کنه! برای برنامه که برای اطمینان خودم! تست کردم:

static void Main(string[] args)
{
System.Timers.Timer timer = new System.Timers.Timer();
// DON'T Forget: using System.Timers;
timer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

// Set the Interval to 25 milliseconds
timer.Interval = 25;
timer.Enabled = true;

Console.WriteLine("Press [Enter] to exit ...");
Console.ReadLine();
}

// WriteLine Raised timestamp when the Elapsed event is raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
Console.WriteLine("Raised at {0:HH:mm:ss.fff}", e.SignalTime);
}


خروجی :


Press [Enter] to exit ...
Raised at 16:24:04.021
Raised at 16:24:04.046
Raised at 16:24:04.080
Raised at 16:24:04.114
Raised at 16:24:04.139
Raised at 16:24:04.174
Raised at 16:24:04.199
Raised at 16:24:04.233
Raised at 16:24:04.267
Raised at 16:24:04.302
Raised at 16:24:04.327
Raised at 16:24:04.361
Raised at 16:24:04.395
Raised at 16:24:04.420
Raised at 16:24:04.455
Raised at 16:24:04.480
Raised at 16:24:04.514
Raised at 16:24:04.548
Raised at 16:24:04.582
Raised at 16:24:04.607
Raised at 16:24:04.642
Raised at 16:24:04.667
Raised at 16:24:04.701
Raised at 16:24:04.735
Raised at 16:24:04.770
Raised at 16:24:04.795
Raised at 16:24:04.829
Raised at 16:24:04.863
Raised at 16:24:04.888
...

اشتباهات 1 میلی ثانیه‌ای! که می‌بینید صرفاً بابت رند کردن هستند، و اکثراً در سیکل بعدی جبران شده اند...

majid zarei
سه شنبه 13 تیر 1391, 06:51 صبح
با تشکر از شما دوست عزیز، یک سوال : آیا این برنامه شما برای زمان 1 میلی ثانیه هم کار میکند؟ برای این سوال را پرسیدم جون به نظر برنامه شما به صورت consol است و برنامه من در windows form می باشد. و با انتقال این برنامه به form به نظرم(البته اگه درت نوشته باشم) زمانبندی ها درست نبود. برای تست من از ساعت استفاده نکردم بلکه در event تایمر ، عددی روی پورت سریال می نوشتم و خروجی را با اسکوپ نگاه کردم.
باز هم تشکر میکنم از راهنمایی شما. اگر جایی دارم اشتباه می کنم لطفا باز هم ما را راهنمایی کنید. ممنون:متفکر:

Saeed_m_Farid
سه شنبه 13 تیر 1391, 08:17 صبح
...آیا این برنامه شما برای زمان 1 میلی ثانیه هم کار میکند؟ برای این سوال را پرسیدم جون به نظر برنامه شما به صورت consol است و برنامه من در windows form می باشد...
البته از بابت فرم و کنسول بودن که اصولاً نباید تفاوتی بکنه؛ ولی مطمئناً شما برای Interval یک میلی ثانیه نمی‌تونید از هیچکدوم از کلاس‌های Timer دات نت استفاده کنید؛ در پست قبلی من یه لینک دادم برای MicroTimer (http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer) که اینجا کدش رو میذارم همراه با خروجی (ضمیمه رو ببینید)؛ ولی بازهم امکان اشتباه (هرچند خیلی کمتر و درحد میکروثانیه!) هست، که ممکنه در کار شما اختلال ایجاد کنه:
static void Main(string[] args)
{
Program program = new Program();
program.MicroTimerTest();
}

private void MicroTimerTest()
{
// Instantiate new MicroTimer and add event handler
MicroLibrary.MicroTimer microTimer = new MicroLibrary.MicroTimer();
microTimer.MicroTimerElapsed +=
new MicroLibrary.MicroTimer.MicroTimerElapsedEventHand ler(OnTimedEvent);

microTimer.Interval = 1000; // Call micro timer every 1000µs (1ms)

// Can choose to ignore event if late by Xµs (by default will try to catch up)
// microTimer.IgnoreEventIfLateBy = 500;

microTimer.Enabled = true; // Start timer

// Do something whilst events happening, for demo sleep 2000ms (2sec)
System.Threading.Thread.Sleep(2000);

microTimer.Enabled = false; // Stop timer

// Wait for user input
Console.ReadLine();
}

private void OnTimedEvent(object sender,
MicroLibrary.MicroTimerEventArgs timerEventArgs)
{
// Do something small that takes significantly less time than Interval
Console.WriteLine(string.Format(
"Count = {0:#,0} Timer = {1:#,0} µs | " +
"LateBy = {2:#,0} µs | ExecutionTime = {3:#,0} µs",
timerEventArgs.TimerCount, timerEventArgs.ElapsedMicroseconds,
timerEventArgs.TimerLateBy, timerEventArgs.CallbackFunctionExecutionTime));
}


و قسمتی از نتیجه:


Count = 1 Timer = 1,000 µs | LateBy = 0 µs | ExecutionTime = 129 µs
Count = 2 Timer = 2,732 µs | LateBy = 732 µs | ExecutionTime = 1,731 µs
Count = 3 Timer = 3,000 µs | LateBy = 0 µs | ExecutionTime = 768 µs
Count = 4 Timer = 4,000 µs | LateBy = 0 µs | ExecutionTime = 25 µs
Count = 5 Timer = 5,000 µs | LateBy = 0 µs | ExecutionTime = 14 µs
Count = 6 Timer = 6,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 7 Timer = 7,000 µs | LateBy = 0 µs | ExecutionTime = 14 µs
Count = 8 Timer = 8,000 µs | LateBy = 0 µs | ExecutionTime = 14 µs
Count = 9 Timer = 9,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 10 Timer = 10,000 µs | LateBy = 0 µs | ExecutionTime = 11 µs
Count = 11 Timer = 11,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 12 Timer = 12,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 13 Timer = 13,000 µs | LateBy = 0 µs | ExecutionTime = 61 µs
Count = 14 Timer = 14,000 µs | LateBy = 0 µs | ExecutionTime = 18 µs
Count = 15 Timer = 15,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 16 Timer = 16,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 17 Timer = 17,000 µs | LateBy = 0 µs | ExecutionTime = 11 µs
Count = 18 Timer = 18,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 19 Timer = 19,000 µs | LateBy = 0 µs | ExecutionTime = 64 µs
Count = 20 Timer = 20,000 µs | LateBy = 0 µs | ExecutionTime = 23 µs
Count = 21 Timer = 21,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 22 Timer = 22,000 µs | LateBy = 0 µs | ExecutionTime = 36 µs
Count = 23 Timer = 23,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 24 Timer = 24,000 µs | LateBy = 0 µs | ExecutionTime = 35 µs
Count = 25 Timer = 25,000 µs | LateBy = 0 µs | ExecutionTime = 15 µs
Count = 26 Timer = 26,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 27 Timer = 27,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 28 Timer = 28,000 µs | LateBy = 0 µs | ExecutionTime = 12 µs
Count = 29 Timer = 29,000 µs | LateBy = 0 µs | ExecutionTime = 21 µs
Count = 30 Timer = 30,000 µs | LateBy = 0 µs | ExecutionTime = 18 µs
Count = 31 Timer = 31,000 µs | LateBy = 0 µs | ExecutionTime = 37 µs
Count = 32 Timer = 32,000 µs | LateBy = 0 µs | ExecutionTime = 14 µs
Count = 33 Timer = 33,000 µs | LateBy = 0 µs | ExecutionTime = 15 µs
...


ضمناً من این رو نفهمیدم:

...برای تست من از ساعت استفاده نکردم بلکه در event تایمر ، عددی روی پورت سریال می نوشتم و خروجی را با اسکوپ نگاه کردم... چطور میشه از ساعت استفاده کرد! شما می‌تونید هریک از این property ها رو به اسیلوسکوپ بفرستید تا نتیجه دقیق‌تر بدست بیارین :


ElapsedMicroseconds
TimerLateBy
CallbackFunctionExecutionTime

موفق باشید./

maikola
سه شنبه 13 تیر 1391, 08:22 صبح
http://uploadfa.net/uploads/13412890851.rar

Saeed_m_Farid
سه شنبه 13 تیر 1391, 08:53 صبح
http://uploadfa.net/uploads/13412890851.rar
من منطق برنامه شما رو درک نکردم! ولی به هرصورت اولاً در کارهای سیستمی و Embedded هیچوقت از Windows.Forms.Timer (http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S1) استفاده نمی‌کنن، چون غیرقابل اطمینان‌ترین‌شون هست! درثانی استفاده از کدهایی مثل ()label_x.Text = c_x.ToString در چنین روندهایی کار درستی نیست و جواب درستی نمی‌ده، حداقل نتیجه رو می‌ریختین تو یه ListBox...
________________
درمورد Timer ها قبلاً توضیحی داده بودم که اینجا باز هم بهش استناد می‌کنم :

چند نوع تایمر داریم : Threading.Timer (http://msdn.microsoft.com/en-us/library/system.threading.timer.aspx) ، Timers.Timer (http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx) و Windows.Forms.Timer (http://msdn.microsoft.com/en-us/magazine/cc164015.aspx#S1)


http://i.msdn.microsoft.com/cc164015.fig01%28en-us%29.gif

Windows.Forms.Timer فقط برای کارهایی که یک تایمر براتون کافیه و استفاده زیادی از کنترل های روی فرم میشه، مورد استفاده قرار میگیره (معمولاً!) ولی Timers.Timer رو می تونید تو هرکلاسی استفاده کنید و با توجه به اینکه اونهم از ComponentModel.Component منشعب شده، به شما اجازه میده که به کامپوننت ها دسترسی داشته باشید و می تونید ازش تو ویندوز فرم و ... استفاده کنید.
به احتمال زیاد شما دارین کارهای سیستمی یا سخت افزاری/الکترونیکی و ... میکنید والّا اینهمه تایمر برای یه پروژه ویندوز فرم غیر معمول هست؛ اگه اینطور هست ادامه مطلب رو بخونید، والا همون دومی رو استفاده کنید.
و اما! اگه شما با عناصر روی فرم کاری ندارین بهتره با Threading.Timer کار کنید، این یکی تا حدودی پیچیده تر هست، اما سطح بالاتری از کنترل رو به شما میده و بهترین گزینه (در صورت عدم استفاده از BachgroundWorker و Callback و ... که خیلی در موردشون صحبت کردیم و اگه لازم شد، بازم صحبت میکنم!) برای یک برنامه نویس سیستم (Embedded، الکترونیک، سخت افزار و ...) هست؛ و خوب بالطبع نسبت به امکاناتی که در اختیار یه برنامه نویس حرفه ای قرار میده، پیچیدگی بیشتری هم خواهد داشت! اگه احساس می کنید که به اون نیاز خواهید داشت، بهتره این مقاله رو بخونید:

Comparing the Timer Classes in the .NET Framework Class Library
(http://msdn.microsoft.com/en-us/magazine/cc164015.aspx)

http://i.msdn.microsoft.com/cc164015.fig02%28en-us%29.gif
...


So Many Timers, So Little Time
Unfortunately, the FCL actually ships with several timers, and it is not clear to most programmers what makes each timer unique. Let me attempt to explain:
System.Threading’s Timer class This is the timer discussed in the previous section, and it is the best timer to use when you want to perform periodic background tasks on a thread pool thread.
System.Windows.Forms’s Timer class Constructing an instance of this class tells Windows to associate a timer with the calling thread (see the Win32 SetTimer function). When this timer goes off, Windows injects a timer message (WM_TIMER) into the thread’s message queue. The thread must execute a message pump that extracts these messages and dispatches them to the desired callback method. Notice that all of the work is done by just one thread—the thread that sets the timer is guaranteed to be the thread that executes the callback method. This also means that your timer method will not be executed by multiple threads concurrently.
System.Windows.Threading’s DispatcherTimer class This class is the equivalent of the System.Windows.Forms’s Timer class for Silverlight and WPF applications.
System.Timers’s Timer class This timer is basically a wrapper around System. Threading’s Timer class that causes the CLR to queue events into the thread pool when the timer comes due. The System.Timers.Timer class is derived from System. ComponentModel’s Component class, which allows these timer objects to be placed on a design surface in Visual Studio. Also, it exposes properties and events, allowing it to be used more easily from Visual Studio’s designer. This class was added to the FCL years ago while Microsoft was still sorting out the threading and timer stuff. This class probably should have been removed so that everyone would be using the System. Threading.Timer class instead. In fact, I never use the System.Timers.Timer class, and I’d discourage you from using it, too, unless you really want a timer on a design surface.




راه دیگه هم استفاده از برنامه‌نویسی Multithread و System.Threading هست، امیدوارم حوصله مطالعه اش رو داشته باشید:
Multithreaded Programming for Components with System.Threading (http://msdn.microsoft.com/en-us/library/tak05yx0.aspx) (+ (http://msdn.microsoft.com/en-us/library/3es4b6yy%28v=vs.100%29.aspx))
در مورد MicroTimer (http://www.codeproject.com/Articles/98346/Microsecond-and-Millisecond-NET-Timer) هم که در پست قبلی توضیح دادم.
ممنون./

majid zarei
سه شنبه 13 تیر 1391, 10:45 صبح
با تشکر از شما دوست عزیز؛ متاسفانه طبق صحبت شما این تایمرها در حد 1 میلی ثانیه جواب نمی دهند. در صورت امکان در مورد میکرو تایمر یک مثال windows form بزنید چون نتونستم راش بندازم. ممنون
در ضمن یک سوال دیگه : چطور می تونیم برناممون رو با set priority به شکل real time تنظیم و اجرا کنیم.

Saeed_m_Farid
چهارشنبه 14 تیر 1391, 12:40 عصر
خواهش:




متاسفانه طبق صحبت شما این تایمرها در حد 1 میلی ثانیه جواب نمی دهند.
در صورت امکان در مورد میکرو تایمر یک مثال windows form بزنید چون نتونستم راش بندازم.
در ضمن یک سوال دیگه : چطور می تونیم برناممون رو با set priority به شکل real time تنظیم و اجرا کنیم.




خوشبختانه ما چنین صحبتی نکردیم، میکروتایمر (به شرطی که کار زمان‌بری درون رویداد OnTimedEvent انجام ندین) با دقّت زیادی جوابگوی نیازهای میلی‌ثانیه‌ای شما هست، شما تو سیستم خودتون امتحان کنید، ببینید با چقدر خطا جواب می‌گیرید، در سیستم من 0.34 درصد (7 مورد از 2003 مورد) خطا داشت که هیچکدوم به 1 میلی ثانیه نرسیده بودند! (ضمیمه output پست قبلی‌ام)
متاسفانه مثال windows form برای میکروتایمر نمیشه زد، چون هرنوع آپدیتی در فرم بیشتر از این مقدار زمان می‌بره و برنامه هنگ می‌کنه! البته کدی که به ذهنم میرسه رو من میذارم ولی به احتمال 99.99% کار نمی‌کنه:
private void btnMicorTimer_Click(object sender, EventArgs e)
{
// Instantiate new MicroTimer
MicroLibrary.MicroTimer microTimer = new MicroLibrary.MicroTimer();
// Add event handler
microTimer.MicroTimerElapsed +=
new MicroLibrary.MicroTimer.MicroTimerElapsedEventHand ler(OnTimedEvent);

// Call micro timer every 1000µs (1ms)
microTimer.Interval = 1000;

// Can choose to ignore event if late by Xµs (by default will try to catch up)
// microTimer.IgnoreEventIfLateBy = 500;

microTimer.Enabled = true; // Start timer

// Do something whilst events happening, for demo sleep 2000ms (2sec)
System.Threading.Thread.Sleep(500);

microTimer.Enabled = false; // Stop timer
}

/// <summary>
///
/// </summary>
/// <param name="sender"></param>
/// <param name="timerEventArgs"></param>
private void OnTimedEvent(object sender,
MicroLibrary.MicroTimerEventArgs timerEventArgs)
{
string response = string.Format(
"Count = {0:#,0} Timer = {1:#,0} µs | " +
"LateBy = {2:#,0} µs | ExecutionTime = {3:#,0} µs",
timerEventArgs.TimerCount, timerEventArgs.ElapsedMicroseconds,
timerEventArgs.TimerLateBy, timerEventArgs.CallbackFunctionExecutionTime);

// Do something small that takes significantly less time than Interval
if (listBox1.InvokeRequired)
{
Invoke(new MethodInvoker(
delegate
{
listBox1.Items.Add(response);
}));
}
else
listBox1.Items.Add(response);
}
ضمناً چرا نتونستین راش بندازین؟ همون exe رو اجرا کنید و نتیجه رو ببینید.
برای اینکار خطرناک‌ترین چیزی که ممکن بود به ذهن‌تون برسه همین هست! اولاً Real time به معنای واقعی در ویندوز نداریم و ثانیاً کافیه همچین کاری رو برای برنامه‌ای مثل میکروتایمر بکنید، بعدش پشیمونی دیگه فایده‌ای نداره! من توصیه اکید می‌کنم که از اینکار منصرف بشید ولی صلاح مملکت خویش خسروان دانند:


89202

Saeed_m_Farid
چهارشنبه 14 تیر 1391, 13:18 عصر
متاسفانه مثال windows form برای میکروتایمر نمیشه زد، چون هرنوع آپدیتی در فرم بیشتر از این مقدار زمان می‌بره و برنامه هنگ می‌کنه! البته کدی که به ذهنم میرسه رو من میذارم ولی به احتمال 99.99% کار نمی‌کنه ...
حرف خودم رو پس می‌گیرم! برنامه رو اینطوری تغییر دادم، کار کرد؛ شما هم امتحان کنید و نتیجه رو اینجا بذارید بیزحمت:

private List<string> responses =
new List<string>();

private void btnMicorTimer_Click(object sender, EventArgs e)
{
MicroLibrary.MicroTimer microTimer = new MicroLibrary.MicroTimer();
microTimer.MicroTimerElapsed +=
new MicroLibrary.MicroTimer.MicroTimerElapsedEventHand ler(OnTimedEvent);

microTimer.Interval = 1000;

// microTimer.IgnoreEventIfLateBy = 500;

microTimer.Enabled = true;

// Do something whilst events happening, for demo sleep 2000ms (2sec)
System.Threading.Thread.Sleep(2000);

microTimer.Enabled = false;

foreach (string item in responses)
listBox1.Items.Add(item);
}

private void OnTimedEvent(object sender,
MicroLibrary.MicroTimerEventArgs timerEventArgs)
{
responses.Add(string.Format(
"Count = {0:#,0} Timer = {1:#,0} µs | " +
"LateBy = {2:#,0} µs | ExecutionTime = {3:#,0} µs",
timerEventArgs.TimerCount, timerEventArgs.ElapsedMicroseconds,
timerEventArgs.TimerLateBy, timerEventArgs.CallbackFunctionExecutionTime));
}

majid zarei
چهارشنبه 14 تیر 1391, 14:33 عصر
سلام مجدد. من هنوز مشکلم حل نشده. اما یک راه بدون حل به نظرم اومد : ایا می توان برنامه رو طوری نوشت که قبل از شروع ارسال real time ، بتونم داده ها رو در DMA بریزم و با تنظیم زمانی (یا...) برای کانال dma , عمل ارسال داده به پورت رو اون کانال DMA انجامش بده ؟
از دوستانی که منو راهنمایی می کنند بسیار ممنونم.:متفکر:

Saeed_m_Farid
پنج شنبه 15 تیر 1391, 22:24 عصر
سلام
منتظر دوستان شدم، گفتم الان میگین: آقا ما جواب شما رو نخوایم کی رو باید ببینیم! ولی دیگه دلم طاقت نیاورد:لبخند:




من هنوز مشکلم حل نشده.
اما یک راه بدون حل به نظرم اومد : ایا می توان برنامه رو طوری نوشت که قبل از شروع ارسال real time ، بتونم داده ها رو در DMA بریزم و با تنظیم زمانی (یا...) برای کانال dma , عمل ارسال داده به پورت رو اون کانال DMA انجامش بده ؟




میشه بفرمائید چی هنوز حل نشده؟ یعنی حتی میکروتایمر جوابگوی نیاز شما نبود؟ مثال Windows Form خواستین که اونهم نوشتم براتون، دیگه مشکل چیه که ازش استفاده نمی کنید؟ تا اونجایی که یادم میاد خواسته شما این بود:
مثلا وقتی که انتظار داشتم هر 5 میلی ثانیه داده روی پورت باشه و نتیجه ای که من براتون گذاشتم، به میزان بسیار زیادی دقیق تر از این خواسته شما بود :
در سیستم من 0.34 درصد (7 مورد از 2003 مورد) خطا داشت که هیچکدوم به 1 میلی ثانیه نرسیده بودند! اگه بازم یه چیز دقیق تر می خواهید، اولاً برید سراغ زبانهای native، بعدش هم همانطورکه قبلاً هم خدمت تون عرض کردم، ویندوز سیستم عامل Real-time (یعنی RTOS (http://www.google.com/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CFYQFjAA&url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FReal-time_operating_system&ei=3FHxT9DIMaaB4gTp9MSGDg&usg=AFQjCNEU418Z76zilnc8PVdrDrlKRr3TGQ&sig2=c0cyggbt4DkWppX0B1nvuw)) نیست...
چرا می زنین جاده خاکی؟! با DMA (+ (http://windowsnetworking.com/articles_tutorials/Direct-Memory-Access.html)) می خواین چکار کنید؟ کرنل توسعه میدین؟ مشکلاتی که یک همچین سولوشنی رو غیرقابل قبول و بی معنی میکنه و حتی درصورت امکان چنین چیزی! ممکنه پروژه رو تحت الشعاع قرار بدن:




اولاً با #C شدیداً برای کار مستقیم با چیپ ست های مادربرد مشکل خواهید داشت (اگه اصلاً بشه!) کار در یک زبان مدیریت شده (مثل #C) با Segment و Offset address و ... واقعاً بی معنی هست، فکر می کنید #C چقدر دست تون رو برای کار با pointer ها و کدهای unsafe باز میذاره؟
ثانیاً گذشته از پیچیدگی بسیار زیاد (بررسی وضعیت سیستمی، درایور، Memory leak، عدم دسترسی و ...) در کار کردن با Direct Memory Access اصلاً نمیشه ارتباطی بین مشکل شما با کاربرد این چیپ ست برقرار کرد! مشکل شما در عدم توانایی (یا عدم نیاز / اولویت و ...) ویندوز در بکارگیری دقیق سیکل های پردازنده و بالطبع Real-Time نبودن این سیستم عامل هست، نه مشکل (سرعت کم) ارتباط پردازنده با حافظه که شما بخواین در این زمینه دنبال راه دیگه ای باشید...
فرضاً چنین کاری رو با موفقیت انجام دادین (فرض کنیم من منظور شما رو در استفاده از DMA متوجه نشدم و شما با یک سری کدهای خرق عادت! با #C تونستین در حد کرنل کد بنویسید) در نهایت شما وقتی برنامه رو از حالت عادی خارج می کنید، درگیر مسائلی می شین که برای یک برنامه معمولیِ مدیریت شده، کاملاً حل شده هستند و برای شما یک کابوس! بعنوان مثال:

نصب نبودن راه انداز سخت افزاری مادربرد برای چیپ ست DMA (مثلاً Intel 8237 chip) در مقصد
درگیر بودن کانالهای DMA توسط پروسس / ماژول / درایور و ... دیگه
و مهمتر از همه: عدم داشتن دسترسی های مدیریتی لازم برای اینکار در سیستم مقصد، نسخه ویندوز، نسخه درایور و ...





من نمیگم درایور نویس هستم ولی در زمینه کدهای مدیریت شده تازه کارم و بیشتر عمر کاری ام صرف برنامه های سیستمی شده و با کدهای native کار کردم، مشقّاتی که ممکن هست در چنین رویکردهایی باهاشون درگیر بشین (غیر از برنامه نویسی و بیشتر مسائل جانبی)، رو میدونم: نمونه اش این (http://barnamenevis.org/showthread.php?240629)، که حل هم نشد و هنوز هم که هنوزه هروقت سیستم درست کار نمی کنه یا ... که ربطی به برنامه من نداره یا باید اون custom درایور رو حدف و مجدداً نصب کنند (که حضور فیزیکی پشتیبان ضروری هست، مثلاً زاهدان :"(( باید بره!) یا هزار تا بامبول باید دربیاریم که به ویندوز حالی کنیم بابا ریسورس ما رو خالی کن کارش داریم ...

majid zarei
سه شنبه 20 تیر 1391, 09:45 صبح
ممنون از راهنمایی شما

majid zarei
چهارشنبه 21 تیر 1391, 10:09 صبح
با سلام ؛ متاسفانه روی فرم نتونستنم راش بندازم.
سوال: برای اضافه کردن کلاس چه باید کرد؟:گریه:

Saeed_m_Farid
چهارشنبه 21 تیر 1391, 10:55 صبح
متاسفانه روی فرم نتونستنم راش بندازم.
سوال: برای اضافه کردن کلاس چه باید کرد؟:گریه:
پست 12 (http://barnamenevis.org/showthread.php?348930&p=1540850&viewfull=1#post1540850) رو با دقت بخونید، البته بی‌دقت هم بخونید چیز پیچیده‌ای نیست که نتونید راش بندازید! فقط کافیه یه Button و ListBox روی فرمتون بندازین، بعد: Copy / Paste

majid zarei
چهارشنبه 21 تیر 1391, 14:01 عصر
با سلام به همه دوستان و تشکر از آقای saeed_m_Farid
به کمک راهنمایی شما دوستان من به جواب رسیدم. حال اگر کسی تمایل به دونستن ریز این پروژه داره؛ بگه تا رو سایت بزارم. اما خلاصش اینه که :
ما یک برد سخت افزاری ساختیم که با یک پورت سریال به pc وصل میشه و یک کانال D2A 16bit که قادر هر خروجی ( که داده هاش از فایل خوانده میشه) تا حداکثر فرکانس 1000 هرتز رو درست کنه. دامنه خروجی از 10- تا 10+ هست. بعلاوه برد دارای 8 کانال A2D 16bit هست که با SampleRate حداقل 1 میلی ثانیه قادر به نمونه برداری می باشد . هسته برد یک میکرو PIC می باشد. و برنامه pc اون به زبان C# 2008 نوشته شده است.
ممنون از همه

Saeed_m_Farid
چهارشنبه 21 تیر 1391, 16:56 عصر
یعنی برد / پروژه شما هم Digital to Analog Converter هست هم برعکس؟ خوشم اومد از پروژه...
چند تا سوال داشتم:


چه فرمت‌ / فایل هایی رو می‌تونید بخونید؟
با این مشخصات که شما می‌گین، فقط صداهای بم درمیاره! درسته؟
با چند Khz نمونه برداری می‌کنید؟
16 بیت، استریو ضبط می‌کنید؟ چه خبره 8 کانال! حجم فایلها زیاد نمیشه؟
کنترلی روی quantization دارید یا نه؟
سخت افزار حدوداً چقدر واستون آب خورد؟ با این ICE-PIC5XL (http://wiki.ice-online.com/wiki/ICE-PIC5XL) قابل مقایسه هست؟ اگه نه، برنامه دارین برین سمت همچین ماژولی؟
و کلی سوال دیگه که مثل همین‌ها جاشون اینجا نیست :لبخند:

majid zarei
پنج شنبه 22 تیر 1391, 10:37 صبح
سلام.
بله همونطور که گفتید هم D2A هست و هم A2D که هر دو با دقت 16 bit هستن.
نمونه برداری در صورتی که یک کانال داشته باشی : 1000 هرتز ؛ و برای 3 کانال نمونه برداری 500 هرتز به درستی جواب داده.
در ضمن این کار برای یک تستر بوده و برای نمونه برداری از صدا نیست. در واقع برای شناسایی سیستم یک موتور است. کامند بهش بدیم و فیدبک بخونیم.
8 کانال برای اینکه 2 کانال برای کار جمله قبل و یک کانال برای کالیبراسیون و بقیه رزرو.
قیمت سخت افزار حدود : 600000 تومان
و فعلا فرمت txt داده ذخیره می شند اما باید به فرمت mat. که فرمت Matlab هست در بیاد.

Saeed_m_Farid
پنج شنبه 22 تیر 1391, 10:51 صبح
در ضمن این کار برای یک تستر بوده و برای نمونه برداری از صدا نیست. در واقع برای شناسایی سیستم یک موتور است. کامند بهش بدیم و فیدبک بخونیم.
آهان از اون لحاظ!