پاسخ : کوچ کردن از کدویژن به AtmelStudio
این تابع خیلی سر سخته میشه کلا آموزش بدین که چطوری تابع مینویسین؟
تو خیلی موارد به کار میاد
فکر کنم خیلی ها مشکل دارن
نوشته اصلی توسط RubeuS
سلام
در رابطه با برنامه بالا......
اصلا بزارید اول یه چیزی بگم : شما که دیگه نباید اینجوری رجیسترها را مقداردهی کنید!!
پس اون شیفت و ... نحوه ی مقدار دهی رجیسترها که به خوانایی برنامه کمک میکنه چی شد؟ :icon_razz: :rolleyes: پست 10 همین تاپیک
مقداردهی رجیسترها باتوجه به دیتاشیت مگا 16 و مگا32 و... درسته(البته بهتره بگید چه میکرویی استفاده میکنید . تو gcc وقتی از هدر io استفاده میکنید ، چون دیگه با دیدن فایل اصلی برنامه نمیشه فهمید میکروتون چیه بهتره جلو اینکلود io یک کامنت بزارید و بگید مثلا MCU برابر فلان میکرو )
درضمن وقتی از delay استفاده میشه.... F_CPU فراموش نشه.
نکته : به وارنینگهایی که کامپایلر بتون میده توجه کنید. الان کامپایلر یه وارنینگ برای مشخص نکردن F_CPU حتما بتون داده.
خوب حالا بریم سراغ برنامه :
همون طور که گفتم ، رجیسترها درست مقداردهی شده اگر فرکانس کلاک سی پی یو روی 8 مگاهرتز تنظیم شده باشه ،با این مقادیر usart روی 9600bps تنظیم میشه. ( 8 بیتی - بدون پریتی - 1دونه stop bit - فعال سازی ارسال اطلاعات )
البته بهتره قبلش پین مربوط به ارسال اطلاعات خروجی بشه. ولی نشه هم فکر نکنم مشکلی پیش بیاد.
خوب در رابطه با printf : بله مشکل همینجاست. شما اگه بجاش بنویسید مثلا ;UDR=0xAA میبینید که درست کار میکنه .
واقعیتش من زیاد (زیاد که نه اصلا) با این توابع کار نمیکنم و همیشه خودم یه تابع برای اینکار مینویسم و یا در اکثر اوقات از وقفه برای اینکار استفاده میکنم .(وقت پردازنده ارزش داره ، وقتی رو یک فلگ داره busy waiting انجام میشه یعنی وقت پردازنده داره الکی تلف میشه).
سه گزینه پیش روتون میزارم:
1- برم ته تو printf رو در بیارم. ( خودم این گزینه را زیاد دوست ندارم :mrgreen: )
2- یه تابع براتون بنویسم که اینکار رو کنه.
3- بتون توضیح بدم که چجوری با وقفه رشته تون را بفرستید.( اینو خیلی دوست دارم چون این کار یک عمقی نگریه)
راستی الان یادم اومد : حتما قبل از انتخاب برید پست زیر را بخونید ، خیلی خوبه ( در همین رابطه است) :
http://www.eca.ir/forum2/index.php?topic=45733.msg488342#msg488342
در رابطه با برنامه بالا......
اصلا بزارید اول یه چیزی بگم : شما که دیگه نباید اینجوری رجیسترها را مقداردهی کنید!!
پس اون شیفت و ... نحوه ی مقدار دهی رجیسترها که به خوانایی برنامه کمک میکنه چی شد؟ :icon_razz: :rolleyes: پست 10 همین تاپیک

مقداردهی رجیسترها باتوجه به دیتاشیت مگا 16 و مگا32 و... درسته(البته بهتره بگید چه میکرویی استفاده میکنید . تو gcc وقتی از هدر io استفاده میکنید ، چون دیگه با دیدن فایل اصلی برنامه نمیشه فهمید میکروتون چیه بهتره جلو اینکلود io یک کامنت بزارید و بگید مثلا MCU برابر فلان میکرو )
درضمن وقتی از delay استفاده میشه.... F_CPU فراموش نشه.
نکته : به وارنینگهایی که کامپایلر بتون میده توجه کنید. الان کامپایلر یه وارنینگ برای مشخص نکردن F_CPU حتما بتون داده.
خوب حالا بریم سراغ برنامه :
همون طور که گفتم ، رجیسترها درست مقداردهی شده اگر فرکانس کلاک سی پی یو روی 8 مگاهرتز تنظیم شده باشه ،با این مقادیر usart روی 9600bps تنظیم میشه. ( 8 بیتی - بدون پریتی - 1دونه stop bit - فعال سازی ارسال اطلاعات )
البته بهتره قبلش پین مربوط به ارسال اطلاعات خروجی بشه. ولی نشه هم فکر نکنم مشکلی پیش بیاد.
خوب در رابطه با printf : بله مشکل همینجاست. شما اگه بجاش بنویسید مثلا ;UDR=0xAA میبینید که درست کار میکنه .
واقعیتش من زیاد (زیاد که نه اصلا) با این توابع کار نمیکنم و همیشه خودم یه تابع برای اینکار مینویسم و یا در اکثر اوقات از وقفه برای اینکار استفاده میکنم .(وقت پردازنده ارزش داره ، وقتی رو یک فلگ داره busy waiting انجام میشه یعنی وقت پردازنده داره الکی تلف میشه).
سه گزینه پیش روتون میزارم:
1- برم ته تو printf رو در بیارم. ( خودم این گزینه را زیاد دوست ندارم :mrgreen: )
2- یه تابع براتون بنویسم که اینکار رو کنه.
3- بتون توضیح بدم که چجوری با وقفه رشته تون را بفرستید.( اینو خیلی دوست دارم چون این کار یک عمقی نگریه)
راستی الان یادم اومد : حتما قبل از انتخاب برید پست زیر را بخونید ، خیلی خوبه ( در همین رابطه است) :
http://www.eca.ir/forum2/index.php?topic=45733.msg488342#msg488342
تو خیلی موارد به کار میاد
فکر کنم خیلی ها مشکل دارن
دیدگاه