PDA

View Full Version : مشالی لز کار با میکروکنترلر avr atmega16



ahmadsystemco
سه شنبه 03 شهریور 1388, 23:11 عصر
سلام
کسی از دوستان مثال و یا مقاله ای از ارتباط بین C# و میکروکنترلر avr atmega16 داره؟
اگر راهنمایی کنید ممنون می شم.

ehsan-avr
چهارشنبه 04 شهریور 1388, 01:11 صبح
سلام دوست عزیز میشه بهتر توضیح بدین که چی میخواین؟
میشه از طریق کنترل Serial Port و پورت سریال میکرو AVR رو به کامپیوتر متصل کنین و هر چی خواستین برای میکرو بفرستین و از اون ور هم هر چی خواستین بگیرین:چشمک:
کار با کنترل Serial Port هم خیلی ساده است و یه سرچ بزنی یه چیزایی پیدا میکنی.
ممکنه بعدا تو سایتم یه سورس نمونه نرم افزار و سخت افزار تو همین مایه ها (مثلا دماسنج) بزارم.
اینم آدرس:
www.EhsanAvr.Com

ahmadsystemco
چهارشنبه 04 شهریور 1388, 17:21 عصر
سلام دوست عزیز میشه بهتر توضیح بدین که چی میخواین؟
میشه از طریق کنترل Serial Port و پورت سریال میکرو AVR رو به کامپیوتر متصل کنین و هر چی خواستین برای میکرو بفرستین و از اون ور هم هر چی خواستین بگیرین:چشمک:
کار با کنترل Serial Port هم خیلی ساده است و یه سرچ بزنی یه چیزایی پیدا میکنی.
ممکنه بعدا تو سایتم یه سورس نمونه نرم افزار و سخت افزار تو همین مایه ها (مثلا دماسنج) بزارم.
اینم آدرس:
www.EhsanAvr.Com (http://www.EhsanAvr.Com)
سلام دوست عزیز
بالاخره یک حرفه ای میکرو پیدا کردم ( اینجا)
من می خواهم مثلا یک برنامه با بسکام و یا ... بنویسم و در آن کاری کنم که هر وقت دستوری از serial port در C# به آن داده شد آن کار را انجام دهد.
مثلا یک نوشته به آن بفرستم و سپس آن نوشته در میکرو محاسبه شده و بر روی یک تابلو روان نمایش داده شود.
و یا نمایش عدد به کمک seven - segment
و یا ...
منتظر راهنماییتان هستم

pirmard
چهارشنبه 04 شهریور 1388, 17:25 عصر
سلام دوست عزیز
بالاخره یک حرفه ای میکرو پیدا کردم ( اینجا)
من می خواهم مثلا یک برنامه با بسکام و یا ... بنویسم و در آن کاری کنم که هر وقت دستوری از serial port در C#‎ به آن داده شد آن کار را انجام دهد.
مثلا یک نوشته به آن بفرستم و سپس آن نوشته در میکرو محاسبه شده و بر روی یک تابلو روان نمایش داده شود.
و یا نمایش عدد به کمک seven - segment
و یا ...
منتظر راهنماییتان هستم

توی کدوم قسمتش مشکل دارین ؟
توی ارتباط سریال ؟ سخت افزار لازم برای ارتباط سریال رو ساختین ؟
اگه ساختین آیا با هایپرترمینال تونستین باهاش ارتباط برقرار کنین ؟

ahmadsystemco
چهارشنبه 04 شهریور 1388, 17:32 عصر
سلام
توی ارتبات و فرستادن دستورات مشکل دارم.
اگر دیده باشید در C# با serial port ما میتوانیم بایت و یا رشته بفرستیم
حال چگونه به میکرو بفهمانم که چگونه این اطلاعات را دریافت کند و آنها را پردازش کند.
آیا شما مثالی از seven segment و یا .. دارید که بتوان با c# آن را کنترل کرد.
اصلا یک صورت مساله:
برنامه ای داریم که یک تایمر است و ما می خواهیم این تایمر درون یک صفخه ال سی دی و یا سون سگمنت نمایش داده شود. این برنامه تحت دات نت بوده و باید تایمر حتما در C# باشد نه اینکه در avr باشد. ارتباط بین کامپیوتر و میکرو از طریق پورت سریال است.

خوب سرتان را درد نیاورم: من نیاز به یک مثال دارم تا بتوانم درک کنم که چگونه بین میکرو و C# ارتباط بر قرار کنم.
منتظرم D:

pirmard
چهارشنبه 04 شهریور 1388, 17:36 عصر
سلام
توی ارتبات و فرستادن دستورات مشکل دارم.
اگر دیده باشید در C#‎ با serial port ما میتوانیم بایت و یا رشته بفرستیم
حال چگونه به میکرو بفهمانم که چگونه این اطلاعات را دریافت کند و آنها را پردازش کند.
آیا شما مثالی از seven segment و یا .. دارید که بتوان با C#‎ آن را کنترل کرد.
اصلا یک صورت مساله:


خوب سرتان را درد نیاورم: من نیاز به یک مثال دارم تا بتوانم درک کنم که چگونه بین میکرو و C#‎ ارتباط بر قرار کنم.
منتظرم D:


پس سخت افزار رو ساختین (max232( ؟
اگه توی هایپرترمینال ارتباطتون با میکرو موفقیت آمیز بوده باید برین سراغ برنامه نویسیش توی سی شارپ
تا جایی که یادمه توی سی شارپ برای این کار لازم بود که عملیات رو توی یه ترد جداگانه انجام می دادین . اما دقیق یادم نیست .



برنامه ای داریم که یک تایمر است و ما می خواهیم این تایمر درون یک صفخه ال سی دی و یا سون سگمنت نمایش داده شود. این برنامه تحت دات نت بوده و باید تایمر حتما در C#‎ باشد نه اینکه در avr باشد. ارتباط بین کامپیوتر و میکرو از طریق پورت سریال است.

برای اینکار نیازی به استفاده از میکرو ندارید.

ehsan-avr
چهارشنبه 04 شهریور 1388, 22:24 عصر
سلام.یه کد نمونه برات میزارم اساس کار رو یاد بگیر.اونوقت خودت برنامشو بنویس.
تو این برنامه از Uart سخت افزاری خود میکرو استفاده کردم.اینم کدهاش:


$regfile = "m16def.dat"
$crystal=8000000
$baud=9600
dim a as string*10
Do
input "Password?",s
if s<>"Serial Port" then
print "Invalide Password!!!"
exit do
end if
print "valid Password."
input "What's Your Name?",s
print "Hello " ;s
Exit Do
Loop
Print " Program End!!!"
End

تو این برنامه اول میکرو یه پیغام Password? به پورت میفرسته و شما میتوین تا حداکثر 10 کاراکتر تایپ کنین و براش بفرستین.اگه پسوردتون برابر Serial Port نبود برنامه پیغام میده که پسورد اشتباه است و از حلقه خارج میشه.ولی اگه پسورد درست بود پیغام میده پسورد درسته و دوباره پیغام میده و اسمتونو میپسه.وقتی که اسمتونو براش فرستادین جوابتونو میده.بعدش هم از حلقه بینهایت خارج میشه و پیغام Program End میده
به همین راحتی:اشتباه:
البته من تو این برنامه از سریال سخت افزاری میکرو استفاده کردم و میشه از سریال نرم افزاری هم استفاده کرد به این معنی که پایه های کلاک و دیتا رو خومون میتونیم تعیین کنیم.

ahmadsystemco
چهارشنبه 04 شهریور 1388, 23:09 عصر
سلام
حالا میشه بهم بگید چجوری در C# رمز را به میکرو بفرستم و جواب بگیرم :لبخند:

naatamam
پنج شنبه 05 شهریور 1388, 00:58 صبح
سلام
من با کد ویژن کار میکنم و در فرستادن و گرفتن اطلاعات سریال به روش پولینگ مشگلی ندارم ولی در روش اینتراپتی درست نمیدانم باید چکار کنم ؟
در واقع موقعی که اینتراپت دریافت اطلاعات سریال را در میکرو فعال میکنم باید کدها را در کجا بنویسم ؟

یک سوال دیگه هم مربوط میشه به برنامه #C که در این رابطه نوشتم . در اینجا من برای فرستادن اطلاعات مشکلی ندارم ولی در موقع دریافت اطلاعات سریال از میکرو اگر اطلاعاتی به برنامه #C نرسد برنامه در همان خط متوقف می شود و ادامه برنامه اجرا نمی شود ! برای رفع این مشکل چکار باید بکنم ؟؟

ahmadsystemco
پنج شنبه 05 شهریور 1388, 14:20 عصر
سلام
من با کد ویژن کار میکنم و در فرستادن و گرفتن اطلاعات سریال به روش پولینگ مشگلی ندارم ولی در روش اینتراپتی درست نمیدانم باید چکار کنم ؟
در واقع موقعی که اینتراپت دریافت اطلاعات سریال را در میکرو فعال میکنم باید کدها را در کجا بنویسم ؟

یک سوال دیگه هم مربوط میشه به برنامه C#‎ که در این رابطه نوشتم . در اینجا من برای فرستادن اطلاعات مشکلی ندارم ولی در موقع دریافت اطلاعات سریال از میکرو اگر اطلاعاتی به برنامه C#‎ نرسد برنامه در همان خط متوقف می شود و ادامه برنامه اجرا نمی شود ! برای رفع این مشکل چکار باید بکنم ؟؟
سلام
مشکل شما این است که باید دستور خواندن اطلاعات را در یک thread دیگر قرار دهید.

میشه به من هم بگید چگونه در میکرو دستوراتی گذاشتید که بتواند دستورات C# را بگیرد.

A.S.Roma
پنج شنبه 05 شهریور 1388, 16:14 عصر
با سلام

شما در CodeWizard موجود در Codevision تیک اینتراپت RX را بزنید.
یک زیر روال به برنامه تان اضافه می کند.
در این زیر روال مقدار دیتای دریافتی از پورت سریال در یک رجیستر ذخیره می شود. ( متاسفانه نام رجیستر را یادم نیست. ) سپس طی دستوری مقدار آن رجیستر در یک متغییر Local به نام data ذخیره می شود. ( قبل از if ) بعد از آن شما به راحتی می توانید با مقدار data کار کنید.

ضمنا" Max232 فراموش نشود.

EhsanAvr
جمعه 06 شهریور 1388, 21:03 عصر
سلام دوستان ببخشین یه خورده دیر شد.آخه اومدم ایمیل اکانتم رو عوض کنم که بعد از عوض کردن،ایمیل فعال سازی برام نمیومد! و مجبور شدم با اکانت جدید بیام!
برای ارسال اطلاعات از کامپیوتر به AVR باید اول یه کنترل Serail Port بزاری روی فرم.بعد در رویداد Form Load یا هر جای دیگه ای پورت رو باز کنی.


serialPort1.Open();

بعد میتونی با دستور Write روی پورت از نوع بایت بنویسی،با دستور Write Line رشته بفرستی،با Read وReadline هم بخونی.بقیش هم که سادست و نیازی به توضیح نداره!
اصلا برین کنترل Serial Port رو بزارین و باهاش ور برین تا یاد بگیرین:چشمک:

naatamam
شنبه 07 شهریور 1388, 01:34 صبح
سلام


میشه به من هم بگید چگونه در میکرو دستوراتی گذاشتید که بتواند دستورات C#‎‎ را بگیرد.

در میکرو دستوراتی نذاشتم که دستور ها سی شارپ را بگیرد ، گفتم که از طریق پورت سریال با میکرو ارتباط بر قرار کردم ....

در مورد خواندن اطلاعات از پورت سریال کامپیوتر هنوز مشکل من حل نشده ؟؟؟

EhsanAvr
شنبه 07 شهریور 1388, 13:52 عصر
اینجا هر کی میاد برا خودش به یه زبونی برنامه میزاره:گیج:
شما برنامه رو به چه زبانی میخواین؟

ahmadsystemco
شنبه 07 شهریور 1388, 17:40 عصر
اینجا هر کی میاد برا خودش به یه زبونی برنامه میزاره:گیج:
شما برنامه رو به چه زبانی میخواین؟
دوست عزیز آیا شما می توانید مثالی برای مثلا سون سگمنت در سایت بگذارید که با گرفتن یک عدد از سریال پورت آن را نمایش دهد ؟
اگر این کار را بکنید مشکل خیلی از بچه ها حل می شود.
من که با C# رشته ها را از طریق سریال پورت می فرستم.
زبان میکرو هم فرقی نداره bascom یا C => codevisisn
با تشکر

EhsanAvr
یک شنبه 08 شهریور 1388, 00:58 صبح
سلام.
از همین الان شروع می کنم و یه پروژه عملی آماده میکنم.هم برای Bascom و هم برای Codevision.
فکر کنم تا فردا تموم بشه. راستی شما فایل شبیه سازی شده ی Proteus رو هم میخواین؟

ahmadsystemco
یک شنبه 08 شهریور 1388, 01:31 صبح
سلام.
از همین الان شروع می کنم و یه پروژه عملی آماده میکنم.هم برای Bascom و هم برای Codevision.
فکر کنم تا فردا تموم بشه. راستی شما فایل شبیه سازی شده ی Proteus رو هم میخواین؟
سلام
اگر آن فایل را هم قرار دهید که دیگه نمرتون 21 میشه D:

naatamam
دوشنبه 09 شهریور 1388, 13:11 عصر
با سلام

شما در CodeWizard موجود در Codevision تیک اینتراپت RX را بزنید.
یک زیر روال به برنامه تان اضافه می کند.
در این زیر روال مقدار دیتای دریافتی از پورت سریال در یک رجیستر ذخیره می شود. ( متاسفانه نام رجیستر را یادم نیست. ) سپس طی دستوری مقدار آن رجیستر در یک متغییر Local به نام data ذخیره می شود. ( قبل از if ) بعد از آن شما به راحتی می توانید با مقدار data کار کنید.

ضمنا" Max232 فراموش نشود.

با تشکر از شما

اگر منظور شما را درست متوجه شده باشم یعنی در روال زیر ، در متغییر data اطلاعاتی که میکرو در یافت کرده ذخیره شده است ؟
و از اطلاعات این متغییر میتوانم در برنامم استفاده کنم.



// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}



http://www.free-picture-host.com/viewimage.php?file=/images/rrJ5bt1251709062.jpg

naatamam
دوشنبه 09 شهریور 1388, 15:11 عصر
سلام
مشکل شما این است که باید دستور خواندن اطلاعات را در یک thread دیگر قرار دهید.



سلام

ممکن است در مورد thread کمی توضیح دهید و یک مثال بزنید.

من برای خواندن اطلاعات از پورت سریال و نمایش آن در تکست باکس به طریق زیر




//Read data to serial port
txt_Receive.Text = serialPort1.ReadLin();




حالا هم مشکلم این است که اگر اطلاعاتی به پورت سریال ارسال نشود برنامه در همین خط تا در یافت اطلاعات منتظر میشود.

ahmadsystemco
دوشنبه 09 شهریور 1388, 22:02 عصر
سلام
شما ابتدا یک Thread میسازی که اطلاعات را از سریال پورت بگیرد.


System.Threading.Thread readThread =

new System.Threading.Thread(new System.Threading.ThreadStart(ReadData));




در این کد ما یک ترید می سازیم و به آن می گوییم که متد ReadData را اجرا کن
پس باید یک متد به نام ReadData بسازیم که از نوع void باشد


به این صورت



public void ReadData()
{
if(serialPort.IsOpen)
{
data = serialPort.ReadLine(); در این جا اطلاعات خوانده می شود حالا به هر نحوی و در یک متغییر ذخیره می شود
}
}



حال برای اینکه ترید راه بیفتد ( مثلا هنگامی که دکمه Open Port زده شد از کد زیر استفاده می کنیم.



readThread.Start();


خوب شرمنده بیش از این نمی تونم توضیح بدم تا همین الان زوری این کد ها را کاری کردم که درست نشون داده بشه :لبخند:
خوب دیگه با خودتونه که چک کنید کی لازمه این اطلاعات را استفاده کنید. لازم به ذکر است که برای تغییر یک کنترل از درون تریدی به جز ترید اصلی از مثلا textbox.Invoke(new MethodInvoker(method)) استفاده کنید.
بهتره به مثال هایی که مربوط به ترید هست یک سری بزنید
با تشکر ( ببخشید )

naatamam
پنج شنبه 12 شهریور 1388, 17:27 عصر
خوب دیگه با خودتونه که چک کنید کی لازمه این اطلاعات را استفاده کنید. لازم به ذکر است که برای تغییر یک کنترل از درون تریدی به جز ترید اصلی از مثلا textbox.Invoke(new MethodInvoker(method)) استفاده کنید.




دست شما درد نکنه از مثالها و توضیحات مفیدتان .
تمام مطالب برای من قابل درک و فهم بود الا این موضوع آخر !
این خط

textbox.Invoke(new MethodInvoker(method))

چکار میکند ؟

ahmadsystemco
پنج شنبه 12 شهریور 1388, 17:55 عصر
دست شما درد نکنه از مثالها و توضیحات مفیدتان .
تمام مطالب برای من قابل درک و فهم بود الا این موضوع آخر !
این خط

textbox.Invoke(new MethodInvoker(method))

چکار میکند ؟
سلام
ببین وقتی شما داخل یک ترید به غیر از ترید اصلی یا MainThread هستید نمی توانید به کنترل هایی که در ترید های دیگر قرار دارد دسترسی پیدا کنید.
یک مثال :
حتما خیلی از دوستان هنگامی که مثلا یک کاری را در برنامه انجام می دهند و می خواهند کاربر از پیشرفت حاصله اطلاع یابد و آن کاری که انجام می شود در یک ترید غیر اصلی است , هنگامی که از درون آن ترید متغیر Value مربوط به ProgressBar را تغییر می دهند در هنگام Debug ویژوال استادیو از آن ها خطا می گیرد.
حال راه چاره چیست؟
خوب معلومه. پراپرتی هر کنترل را در همان تریدی که ساخته شده تغییر دهیم.
چگونه ؟ هه
خوب از این دستور استفاده کنید


myControl.Invoke(new MethodeInvoker(****Your Method ***));

در اینجا شما به جای YourMethod نام متدی که کار شما را انجام میدهد را می گذارید مثلا همونی که ProgressBar را تغییر می دهد.
و یا یک روش دیگه:


myControl.Invoke(Your Delegate, object[] parametrs);

خوب حالا این چیه ؟
این یکی می آید و یک Delegate را اجرا می کند ( در همون تریدی که فرم ایجاد شده ) و پارامتر های آن را نیز به آن می فرستد ولی شما باید یک delegate تعریف کنید که اونم به این صورت: از خود MSDN آوردم:



public delegate void AddListItem(String myString);
public AddListItem myDelegate;


بعد از اینکه تعریف کردید در سازنده کلاس این کد را بگذارید:


myDelegate = new AddListItem(AddListItemMethod);


و این هم متد شما که کار ها را انجام می دهد


public void AddListItemMethod(String myString)
{
myListBox.Items.Add(myString);
}


اینم طریقه خواندن آن از تریدی دیگر:


myFormControl1.Invoke(myFormControl1.myDelegate,
new Object[] {myString});



می دونم من خیلی حرف می زنم پس اگر سوالی داشتید بپرسید :لبخند:
با تشکر AHS

EhsanAvr
شنبه 28 شهریور 1388, 14:57 عصر
سلام دوستان ببخشین خیلی دیر شد:چشمک:
یه برنامه ی نمونه نوشتم.اینم عکسش:
http://ehsanavr.com/wp-content/uploads/2009/09/SerialPort.PNG
اینم لینک توضیحات و دانلود:
http://ehsanavr.com/1388/06/28/ارتباط-با-پورت-سریال-و-میکروکنترلر-avr-در/

mjelecom
یک شنبه 29 شهریور 1388, 00:12 صبح
سلام
یه سر به سایت eca.ir بزن چیزای خوبی دستگیرت میشه.
من با این سایت همه چیزو یاد گرفتم. البته قسمت سخت افزارشو.
برنامه ای هم که دوستمون گذاشتند برای شروع کار کافیه.
راستی به فرکانس کاری uart دقت کن و جدول خطاها رو با دقت بخون.
یادت باشه که هرگز بدون کریستال اقدام به کار با پورت نکنی چون به ندرت
جواب می گیری .
موفق باشید