با سلام و خسته نباشید.
دوستان من ی ی قطعه کد دارم که تقریبا هر چیزی رو از توش تونستم درست کنم بجز این مورد.
میخوام زمانی که وقته EXTI4_IRQHandler اجرا میشه. اولین خط توی این وقفه این وقفه رو غیر فعال کنه. بعد برنامم میاد کلی کار انجام میده. تموم که شد این وقفه فعل بشه دوباره(البته این فعال شدن توی ی تابعی خارج از این تابع باشه.)
کد هایی که استفاده میکنم ایناست.
و میکرو هم stm32f103 اینه.
به نظرتون چطوری از این مشکل جلوگیری کنم.این وقفه مربوط به دریافت وایرلسه. وایرلس که رسید اینو اجرا میکنه. نمیخوام همزمان 2 تا اجرا بشه. چیزی حدود 100 تا نود پیشه همه که همه باید ریپیت کنن. به مشکل برمیخورم.
خودم از فلگ استفاده کردم جواب نداد. تنها چیزی به ذهنم خورد اینه که کلا اینو غیر فعال کنم.
ممنون از همکاری شما پیشاپیش.
کد:
void EXTI4_IRQHandler(void) // Hi current occured
{
char t=0,b=4,view;
if(end){EXTI->PR |= (1<<4);return;}
if (EXTI->PR & (1<<4)) // EXTI1 interrupt pending?
{
// while(((GPIOB->IDR & 0x0002) == 0)&&(t<=b)){ t++; }// prn=1; printf("%d,",t); prn=3;
while(((GPIOC->IDR & 0x0010) == 0)&&(t<=b)){ t++; }
if(t>=b)
{
if(tr == 0)
{
view=RF_Recieve_Payload(SPI1,recieve_data,32);
// prn=1;SendChar(data[0]);SendChar(data[1] );prn=3;
//prn=1;SendChar(view);prn=3;
if(view == RF_DATA_RECEIVED)
{
if(wifi_main==0)
{
// prn=1;SendChar(0x33);prn=3;
t_count=0;
transmit=0;
view=NPacket_checking();
//prn=1;SendChar(data[2]);prn=3;
if(view==1)
{
//if(data[5]==2 && resend_c1==0)resend_counter=2;
requested=1;
}
if(dont_send==1)
{
dont_send=0;requested=0;
}
}
}
}
else
if(tr==1)
{
view= Check_Sending_Payload();
if(view== RF_DATA_SEND_ACK_RECEIVED_OK){RX_Mode();}
}
}
EXTI->PR |= (1<<4);
}// clear pending interrupt
}
سلام.
از STM تا حالا استفاده نکردم، اما به طور کلی ...
برای غیر فعال کردن وقفه باید از تابع زیر استفاده کنید.
کد php:
;(NVIC_DisableIRQ(handler_IRQn
در روتین وقفه غیر فعال کنید و بیرون وقفه با تابع زیر فعال کنید.
کد php:
;(NVIC_EnableIRQ(handler_IRQn
بجای
handler_IRQn هندلر مورد نظر رو بنویسید.
البته بخاطر قابلیت های خاص سیستم وقفه ARM معمولا نیازی به این کار نیست و شخصا تا حالا پیش نیومده استفاده کنم، اما با توجه به خواسته شما برای فعال و غیر فعال کردن وقفه ، همچین کاری می تونید انجام بدید.
موفق باشید.
راستی اینم بگم که من از u Vision استفاده میکنم واسه کد نویسی.
من کلا مشکلمو شرح میدم ببینید شما چه پیشنهادی واسش دارین.
من این تابعی که گذاشتم بالا رو برای وفقه وایرلس گذاشتم(یعنی از قبل اینو گذاشتن, من تازه این کدها رو دادن بهم). هر زمانی که ماژول وایرلس فعال میشه, یه پکیج دریافت میکنه این تابع فعال میشه. (یدونه میکرو دارم و یدونه ماژول وایرلس, که زمانی وایرلس دریافت انجام میده, وقفه رو به پین ارسال میکنه و تابع رو واسم اجرا میکنه)
حالا من چیزی حدود 100 تا نود دارم که همه با هم دریافتو انجام میدن و میتونن اونو ریپیت کنن که به ماژول های دورتر هم برسه. الان مشکلی که دارم اینه, وقتی اینا با هم ارسال میکنن و 2 تا وقفه با فاصلهی خیلی کمی اجرا میشه, ی سری از متغیرها توی وقفه ی قبلی تغییر میکنه اما خوب وقفه جدید که اجرا میشه همه محاسبات رو بهم میریزه و ماژولم دیگه وفقه نمیگیره تا برقشو قطع و وصل کنم.
تنها چیزی که به ذهنم رسید ایه که اگه اون وقفه غیر فعال بشه توی خط اول اجرای خودش و زمانی که همه کارهای من تموم شد. دوباره اونو فعال کنم. مشکلم حل بشه.
اگه چیزایی که نوشتم ناقصه اینو بزارین بابت کم تجربه بودن من توی keil و سخت افزار. کلا یک ماهه دارم کار میکنم این فاز برنامه نویسی رو.
اما در کل شما واسه این مشکل من چه چیزی رو پیشنهاد میکنین. خودم که دیگه هنگ کردم.
الان سوالم اینه. من تابع NVIC_DisableIRQ رو چجوری استفاده کنم. اسم تابعی هم که دارم رو بالا گذاشتم. تو این موندم.
بازم ممنون بابت راهنمایی های شما.
ماژول های وایرلس چی هستند؟
بنظرم نودها نباید جوری قرار بگیرن که چندباره روی هم اثر بذارن. روش کار می تونه به ماژول ها بستگی داشته باشه.
آیا جای نودها ثابت هست؟ آیا امکانش هست چند رپیتر در جاهای خاص و معین قرار بگیره و هر ریپیتر اطلاعات رو به یه سری از نودها برسونه؟
ماژول مورد استفاده چند باند فرکانسی دارهه؟
موردی که اشاره کردید فکر نمی کنم با غیر فعال کردن وقفه حل بشه ، اینطور که از گفته اتون متوجه شدم ، ماژول ها هنگ می کنن ، نه میکرو! درسته؟
نقل قول: الان سوالم اینه. من تابع NVIC_DisableIRQ رو چجوری استفاده کنم. اسم تابعی هم که دارم رو بالا گذاشتم. تو این موندم.
بازم ممنون بابت راهنمایی های شما.
روش استفاده رو بالا گفتم، شما الان از وقفه خارجی 4 ام استفاده می کنید، ببینید تو سورس هاتون با چه اسمی اومده.
احتمالا باید EXTI4_IRQn باشه.
آره ماژول ها هنگ میکنن, چون همون لحظه وقتی که از یو اس بی میخونم جواب میده میکرو.
نودها ثابت هستند. برای مزرعه خورشیدی. الان بصورت تست 100 تا نود ولی بعدا قراره این نودها به تعداد حدود 20-30 هزار نود قرار بگیره. مجبوریم نودهای رو کنار هم بزاریم. و هر نود احتمالا 8 الی 10 نود دیگرو میبینه. الگوریتمم جوری نوشته شده که از بین این همه نود اون مسیری رو که مد نظرمه رو ارسال داشته باشیم ولی خوب اگه من 20هزار نود داشته باشیم اگه با دورترین گره کار داشته باشم حداقل 200 بار ریپیت رو انجام میده واسم. و این 200 بار ریپیت شده دردسرم. نمیتونم ریپیتره مستقل بزارم چون الگوریتمم اینو قبول نمیکنه و مجبورم از بایت های داده هام کمتر کنم که کلا این کارو نمیتونم کنم.
این اسم ماژول منه که استفاده میکنم. همچین چیزی روی جعبه زده.
nRF24L01
Single Chip 2.4GHz Transceiver
Product Specification
مدل آنتن دار و اصل این ماژول 1Km برد داره ، مدل های بدون آنتن هم زیر 100 متر. البته در فضای آزاد. شعاع مزرعه خورشیدی مد نظر چقدر هست؟
شما باید با توجه به برد ماژول ها مکان مناسبی براشون انتخاب کنید و یک ماژول رو می تونید برای چند دستگاه استفاده کنید و دستگاه های کنار هم رو با سیم ارتباط بدید.
جدا از این دقت کنید که این ماژول صنعتی نیست و بیشتر جهت هابی هست و چند بار در فروم های خارجی دیدم که ذکر کردن برای کار صنعتی استفاده نکنید.
اینه که در پروژه تون نباید به ماژول ها 100% اعتماد کنید.
جدا از این کاری که شما انجام می دید و ماژول هنگ می کنه ، احتمال زیاد بخاطر تداخل فرکانسیی هست که داره بوجود می یاد، طبیعی هم هست.
در الگوریتمتون فواصل ماژول تا ماژول هم در نظر بگیرید. باندهای فرکانسی هم به همچنین ( تا جایی که یادمه فکر کنم 5 باند فرکانسی داشت ) و همچنین فاصله زمانی ارسال و دریافت.
اطلاعات فقط در یک جهت فرستاده می شه درسته؟
در نهایت شاید مجبور بشید الگوریتم هم عوض کنید.
موفق باشید.
متاسفانه مساحت مزرعه بزگه شاید تا چند هکتار حجم بگیره. ما از بدون آنتن استفاده میکنیم که بردش کمتره.
مشکلی که هست, اگه سیم استفاده کنیم هزینه این سیم خودش کلی میشه. از طرفی هم نمیتونیم که بگیم نود ها رو جوری بزاریم که بهترین حالت بهینه باشن که هر کدوم فقط اطراف خودت کمترین نود باشه. اونجوری اگه بنا به هر دلیلی نود خراب بشه, شاید اطلاعات به دست اطرافیاش نرسه.
میتونم لینک اون سایتو ببینم که نوشته برای صنعتی استفاده نکنید.
الان مشکل رو برطرف کردم. برای این هنگی. کلا توی اینتراپتم فقط یک فلگ گذاشتم و توی حلقه while اون فلگو چک میکنم. که اگه حتی چند بار هم اینتراپت بوجود اومد چیزی تغییر نده و همون فلگ رو تغییر بده.
ارسال اطلاعات دو طرفست. اگه با نود کار داشته باشه و فرضا بخواد بدونه جهت آینه ها الان کجاست نود باید پاسخ بده.
من برای رفت و آمد اطلاعات الگوریتمی نوشتم که به صورت خطی اطلاعاتو رد میکنه. الگوریتمم خوب بهیه شده تقریبا. دورترین نود با 200 گره میره سمتش. حالا اگه هر نود فقط تا 4 نود کناره خودشو ببینه این عدد بر 4 تقسیم میشه.
الان به نظر شما این ماژول وایرلسو عوض کنم؟
اگه تداخل ارسال باشه, همزمان با هم 2تا نود ارسال رو انجام بدن, میشه کاری کرد که این اطلاعات خراب نشه؟ الان مشکلی که دارم اینه. اگه راهی واسه این پیدا بشه, بنظرم 90% مشکلاتم برطرف شده.
ممنون از راهنماییاتون؟
وقتی قسمتی با سیم باشه به مفهومه چندتا ماژول کمتر هست، هزینه اش فکر نمی کنم بیشتر بشه!
به هر حال جزئیات و شرایط پروژه تون رو خودتون بهتر می دونید.
نقل قول: میتونم لینک اون سایتو ببینم که نوشته برای صنعتی استفاده نکنید.
برای خیلی وقت پیش بود و در بحث های تو فروم بود ... ! می تونید خودتونم سرچ بزنید شاید موارد بهتری پیدا کردید.
به هر حال جای شکی نیست که NRF24l01 و zigbee و ... جهت هابی هستن و نه صنعت.
اون فلگ هم روش درستی هست.
نظری راجع به تعویض ماژول ندارم، بلاخره اینجا ایرانه ... ، اما پیشبینی اینکه ماژول هویجوری از کار بیفته هم کنید. با یه سری تست تجربی هر یه مدت زمانی ریست بدید مثلا.
به شرایط دمایی و بارندگی و ... که تاثیر رو برد ماژول ها می ذاره هم دقت کنید.
تو پست قبلی هم اشاره کردم ، فکر کنم 5 باند فرکانسی داشت که فرستنده و گیرنده هر 2 باید در یک فرکانس باشن تا بتونن تبادل اطلاعات داشته باشن. در این صورت 5 تا ارسال و دریافت همزمان در حضور هم دیگه می تونن داشته باشن.
موفق باشید.
ممنون
[b]sharin[/b] عزیز.
پس باید زیاد روی این یکی کار کنم.
بسیار بابت این وقتی که گذاشتی.