به نام خدا : تو این مطلب از سری مطالب آموزش آردوینو میخوام انواع روش ریست نرم افزاری میکرو کنترلر رو توضح بدم که چطور میشه از داخل خود میکروکنترلر، میکروکنترلر رو ریست کرد و این ریست کردن دست ما باشه و هر موقع دوست داشتیم میکروکنترلر رو ریست کنیم.
انواع روش ریست نرم افزاری میکرو
توجه : تو این مطلب من میکرویی که استفاده میکنم آردوینو هستش ولی این مطلب برای تمام میکروکنترلرها هستش و صرفا برای آردوینو فقط نیست، چون آردوینو یکم سریع تره، ازش استفاده کردم تا مطلب رو سریع تر بنویسم.
انواع روش های ریست کردن میکرو از داخل خود میکرو به صورت زیر هستش :
- این که یه تابع تعریف کنید که آدرسش ۰ باشه! و وقتی تابع فراخونی میشه میکرو میره به موقعیت ۰ حافظه، یعنی جایی که میکرو وقتی ریست میشه، میره اونجا.
- راه بعدی اینه که یه پایه میکرو رو به پایه ریست میکرو وصل کنیم و اینطوری میکرو رو ریست کنیم که اگه میکرو پایه کم داشته باشه شاید روش خوبی نباشه.
- یه سری روش دیگه برا ریست میکرو هستش که اونا میرن تو بحث ریست سخت افزاری که مربوط به این مطلب نمیشه، یه وصل کردن یه دکمه به پایه ریست که اینم مربوط نمیشه به این مطلب!؛ اگه روش دیگه ای میدونید بگید…
۱ – استفاده از یک پایه میکروکنترلر برای ریست کردن میکرو
تو این روش یکی از پایه های میکرو رو خروجی تعریف کنید و به پایه ریست وصل کنید، و با یک کردن پایه مد نظر، میکرو ریست میشه، به همین راحتی ^_^
نکته مهم : اول به صورت شکل زیر، پایه مد نظرتون رو به پایه Reset وصل نکنید، بعد از این که میکرو رو پروگرام کردید، وصل کنید، وگرنه میکرو پروگرام نمیشه.
شماتیک پروژه :
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#define RESET_Pin 2 void setup() { pinMode(RESET_Pin, OUTPUT); digitalWrite(RESET_Pin, HIGH); Serial.begin(115200); } void loop() { Serial.println("on"); delay(1000); Serial.println("off"); delay(1000); Serial.println("resetting"); delay(1000); digitalWrite(RESET_Pin, LOW); Serial.println("this never happens"); } |
۲ – ریست کردن نرم افزاری میکرو بدون استفاده از پایه
تو این روش همون طور که قبلا گفتم و از عنوان معلومه، از هیچ پایه میکرو استفاده نمیکنیم و یه تابع تعریف میکنیم که آدرسش ۰ هستش ( توابع هم مثل متغییر ها آدرس دارن ) و وقتی تابع مربوطه فراخوانی بشه، میکرو میره به حافظه ۰ – به همین راحتی ^_^ نحوه تعریف این تابع با آدرس ۰ به صورت زیر هستش :
1 |
void(*Reset) (void) = 0; |
کد پروژه :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
void(*Reset) (void) = 0; void setup() { Serial.begin(115200); } void loop() { Serial.println("on"); delay(1000); Serial.println("off"); delay(1000); Serial.println("resetting"); delay(1000); Reset(); delay(1000); Serial.println("never happens"); } |
توجه : در پروژه بالا، در نرم افزار آردوینو، کد هگزو از پروژه بگیرید و در شبیه ساز پروتئوس، به میکرو بدید تا شبیه ساز کار کنه!
خب امیدوارم این مطلب ناچیز مفید باشه براتون، فعلا یا علی، خدافظ.
مهمان
سلام خسته نباشید
ببخشید برای میکروم یه مشکل پیش اومده اساسی
می خوام ریست کار خونه کنم یعنی کلا بشه از اول
باید چی کار کنم؟
مهمان
سلام میخاستم بدونم که میشه میکروکنترلرها رو بدون پروگرامر برنامشون رو پاک کرد؟
مهمان
سلام
ممنونم از شما
خیلی عالی بود
فقط نوشتن این سابروتین رو یه توضیحی بدید و اینکه نوشتن سابروتین در آردوینو
به چه شکلی هست…
void(*Reset) (void) = 0;
Reset();
ممنون از لطف شما
مهمان
نکته جالب و مهمی بود ، ممنون از توضیحاتتون
مهمان
سلام تو ریست نرم افزاری بدون استفاده از میکرو برنامه ای نوشتم که مثلا اگر پایه 10 در وضعیت high بود میکرو ریست بشه ولی نمیشه لطفا کمک میکنید
نویسنده این مطلب
سلام
1-تو کدتون از LED_BUILTIN استفاده کردید ولی جایی تعریفش نکردید!
2-این delay بعد reset برا چیه دیگه؟ باید قبل reset تابع delay رو قرار بدی!
کدو و شماتیکی هم که من تست کردم رو هم نیم ساعت دیگه پیوست میکنم به مطلب / الان کار دارم.
نویسنده این مطلب
به مطلب پیوست شد.
مهمان
خدا خیرتون بده
ممنون که وقت گذاشتید
مهمان
سلام مهندس در این کد در عمل هرگز نباید
Serial.println(“never happens”);
اجرا بشه درست متوجه شدم ؟
چون قبلش تابع ریست اجرا میشه.
نویسنده این مطلب
سلام-بله.
مهمان
با سلام وخسته نباشید
توی قسمت اول مثالی که زدید ابتدا پایه ریست را high کردید بعد ان را خروجی کردید لطفا اصلاح کنید
نویسنده این مطلب
سلام-ممنون.اصلاح شد.
مهمان
سلام در مورد
asm volatile(“jmp 0”):
نتوضیح میدید؟
مهمان
سلام بزرگوار. لطفا کمکم کن . فک نکنم کسی جز شما بتونه کمکم کنه
من وقتی میخوام بوت لودر رو بریزم رو atmega8 با استفاده از uno دفه اول اوکی بود اما از دوم و سوم به بعد همش این ارور رو میده :
avrdude: error: programm enable: target doesn’t answer. 1
avrdude: initialization failed, rc=-1
Double check connections and try again, or use -F to override
this check.
چه کنم ؟
(۱۰۰۰ بار اتصالات رو چک کردم درسته)
نویسنده این مطلب
سلام-با uno نمیدونم – با پروگرامر این کارو میکردم موردی نبود- از بردهای آردینو تاحالا به عنوان پروگرامر من استفاده نکردم حقیقتا-شرمنده.
مهمان
اوکی.ممنون
مهمان
یعنی دوبار میخای بوت لودرو رو یه میکرو بریزی؟
مهمان
سلام.با یه میکرو دیگه تسط کن با کریستال ۱۶ مگا بذار.اگر بدون کریستال بذاری این خطا میاد و دیگه میکرو کار نمیکنه
چون فیوزبیت میکرو گیر کرده
مهمان
دمت گرم داداش.
مهمان
سلام البته باید به گراند وصل بشه ریست
مهمان
سلام ممنون از سایت خودتون
مهمان
سلام
میشه یکم بیشتر درباره کد ریست کردن در قسمت دوم توضیح بدید که چجور کار میکنه
void(*Reset) (void) = 0;
مهمان
سلام من کد بالا رو برای 1768 چک کردم و حواب نداد
توی این سایت این کد رو معرفی کرده بود
https://os.mbed.com/questions/4680/reset-command-soft-reset/
NVIC_SystemReset();
که جواب داد
یاحق
مهمان
سلام آقا مهدی توی روش اول برای این که به مشکل پروگرام نشدن برخورد نکرد باید اول اون پایه رو ۱ کنیم و بعد به عنوان خروجی تعریفش کنیم هر وقتم خواستیم ریست کنیم پایه رو صفر کنیم.
مهمان
با سلام و خداقوت
بنظرم یه روش دیگه میتونه ریست نرم افزاری با تایمر واچ داگ باشه، به این صورت که با فشار دادن یه باتن برنامه بره داخل
یه حلقه while(1) گیر کنه و توسط واچ داگ تایمر، میکرو ریست شه
نویسنده این مطلب
سلام – خب چه کاریه – همون دکمه رو وصل میکنیم به پایه ریست میکرو دیگه
ولی خب حرفت به عنوان یه روش قابل قبول هستش ولی منطقی نیست.
مهمان
من یه سوال دیگه داشتم یادم رفت ،
مگه ولتاژ پین ها tx و rx ماژول hc05 نباید ۳٫۳ ولت باشه ، پس چرا مستقیم به میکرو avr وصل کردیم ، خروجی پین ها ۵ ولت هست؟
البته من وصل کردم ، نسوخت.
نویسنده این مطلب
سلام
یه تقسیم ولتاژ بزن – ولی همین کارو برا ماژول sim900 نکنی ( یعنی تقسیم ولتاژ نزنی ) درجا میسوزه
مهمان
سلام
الان من همین طوری استفاده کنم میسوزه ؟ چون تو شماتیک یکی از پروژه هاتون دیدم مستقیم وصل کردین به میکرو .
ماژول من هدربوردی هست .
باود ریت پروژه های hc05 رو ۹۶۰۰ بذارم بهتره یا ۱۱۵۲۰۰ ؟
اگر استفاده طولانی از میکرو و بلوتوث بشه ، باید از وقفه استفاده کرد ؟ اگر نکنیم میسوزه؟ (برای چند ماه استفاده شبانه روزی).
ممنون.
نویسنده این مطلب
سیم۹۰۰ آره ولی بلوتوث رو نمیدونم دقیقا –
B.R رو هم تو دیتاشیت میزان خطای هر کدوم رو زده – ولی من باشم ۱۱۵۲۰۰ رو انتخاب میکنم.
سوختن ربطی به استفاده کردن/نکردن از وقفه نداره.
مهمان
سلام.
راهی هست که بشه فلش ریست بشه یا حافظه اییپرام (پاک بشه)، مثلا با یه کد یا یا زدن کلید یا افت ولتاژ؟ یه فیوز بیت بود که از ۲٫۷ ولت پایین تر میومد ، حافظه موقت پاک میشد ، همچین چیزی برای اییپرام یا فلش وجود داره؟
آخرین سوال : فروشگاه eca چطوره ؟ مثل ایران میکرو نیست؟
ممنون.
نویسنده این مطلب
سلام
حافظه فلش برا چی ریست بشه؟
حافظه ایپرام رو ریست کنی در صورت کاهش ولتاژ؟ چراااااااااا؟
eca مشکلات ایران میکرو رو نداره – حداقل من تاحالا ندیدم ازش.
مهمان
باعرض سلام خدمت دوست خوبم آقای مهدی دمرچیلو

بسیار بسیار بسیار از سایت خوب شما ممنون و سپاسگذارم
من از سایت شما خیلی مطالب یاد گرفتم ،چون تمام مطالب رو به زبان خیلی ساده بیان میکنید و این عالیه
اگر امکان داره و اگر اشکال نداره ایمیل خودتون رو در اختیار من بگذارید تا مطالب و اشکالات و سوالاتم رو مستقیم به ایمیلتان بفرستم برای گرفتن پاسخ سریعتر
انشالله که خداوند توفیق روز افزون به شما عطا کند
ممنون و سپاسگذارم
نویسنده این مطلب
سلام-سوالات فقط در سایت یا گروه تلگرامی.
مهمان
سلام
بابت سایت خوبتون تشکر می کنم
خیلی خوبه .
اجرتون با امام حسین علیه السلام .
مهمان
سلام.
از کدوم سایت ها بخرم بهتره؟
روبوایکیو خوبه؟
ممنون.
نویسنده این مطلب
سلام – خوبه بد نیست
مهمان
سلام آقای دمرچیلو.
من می خوام اینترنتی خرید کنم ، کلی قطعه سفارش دادم توی سایت ایران میکرو ، می خواستم بدونم ایران میکرو چجوریه؟ از بقیه بهتره ؟ همه چیز رو درست میفرسته؟(قطعات اشتباه نشن) آخه ۶۰۰ قلم جنسه.
اگه میشه هرچه سریعتر جواب بدین، امروز آخرین مهلت ثبت سفارش هست.
ممنونم.
نویسنده این مطلب
سلام
دیر میفرسته – ممکنه بعضی چیزا رو از قلم بندازن و هزینش رو ندن ( برا خودم رخ داده این مشکل )