سلام
ما یه مدت که زدیم تو codevision انگار خیلی از bascome بهتره و قویتره.
حالا یه مشکل دارم . چطور می تونم با codevision ارتباط سریال رو با interrupt بنویسم.
میشه یه مثال بهم معرفی کنید که کامل باشه!؟ درواقه چیزی از رجیسترهایی که باید تنظیم شه و رسمالخط نوشتن تابع interrupt نمیدونم
ممنون
بابا کاری نداره که یه ویزارد داره با اون اگه بنویسی سه سوت حل می شه یعنی با چند تا کلیک می تونی انتخاب کنی که با interrupt برای سریال کد هاشو برات می نویسه از همون جا هم می تونی نحوه نوشتن اینتراپت رو هم ببینی
هادی جان خورت یه امتحان بکن wizardوقتی میخواد interrupt رو ساپورت کنه گنگ و پیچیده ماشه
اصلا محل تابع interrupt معلوم نیست
یه چک کن و نظرتو بگو
ممنون
کد:
interrupt [USART_TXC] void usart_tx_isr(void)
{
if (tx_counter)
{
--tx_counter;
UDR=tx_buffer[tx_rd_index];
if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
};
}
این اینتراپت ارسال برای مثال
اول می بینی آیا چیزی توی بافر هست یا نه اگه هست یکی از تعدادش کم می کنه و یکی از بافر می خونه می ریزه تو UDR بعد محل داده ها رو یکی افزایش می ده تا به داده بعدی اشاره کنه و اگه از آخر زد بیرون مییاد به اول اشاره می کنه این یه جور بافر که مثل دایره می مونه فرض کن 8 تا جای خالی داره که مثلا 7 تا داده داری توی اولی تا هفتمی می ریزی بعد از اول شروع می کنی 3 تا رو خوندن حالا اگه 2 تا دیگه به خوای بریزی یکی رو تو هشتمی و بعدی رو که باید تو نهمی بریزی که نداری می ریزی تو اولی مثل این می مونه که آخرش به اول وصل چون اولی رو هم قبلا خوندی پس مهم نیست می شه پاکش کرد البته باید چک کنی که رو هم ننویسی یعنی جایی رو که نخوندی روش چیزی ننویسی
البته اگه نفهمیدی مهم نیست هر جور دوست داری بنویس یا از همون getchar و putchar که خودش نوشته استفاده کن
هادی جان به خدا هرکاری می کنم نمیشه
خودت تاحالا واسه usart از interrupt استفاده کردی؟
راهنماییت کمکی بهم نکرد
میشه یه مثال ساده اما کامل در ارسال با وقفه برام بزنی
ممنون
من استفاده کردم با همین تابع ها هم کار کردم
این اینتراپت ها اولا 2 تا هستند یکی برای ارسال یکی برای دریافت
یکی شون دریافت داده رو بهت اعلام می کنه یعنی می گه داده آماده دریافت اون چیزی که می بینی نوشته این رو می گیره می زاره توی یه متغیر که بعدا در یافت کنی چون یه بایت بیشتر نیست و معمولا یه بایت به درد نمی خوره باید همه دریافت بشن
و اون یکی ارسال رو بهت اطلاع می ده که باید داده ها رو توی یه متغیر بزاری و وقتی ارسال یک بایت تموم شد بایت بعدی رو بخونی و ارسال کنی باید تعدادشون هم بدونی تا وقتی تموم شد الکی نفرستی این تابع دوم هم این کارو می کنه (همین که مثال زدم)
می گم که کاریت نباشه هرچی خواستی بفرستی با putchar و هر چی خواستی بگیری با getchar بگیر تو اول کار هم بگو با اینتراپت کار کنه خودش درست می شه :wink:
ممنون هادی جان .درست شد . تا اینجا که مشکلم حل شد
قربونت
سلام
اگر بخواهیم که دوتا میکرو که با هم ارتباط سریال دارن ، هر دوتاشون هم فرستنده باشن و هم گیرنده، توی برنامه نویسیش نکته ی خواصی را می خواد رعایت کرد؟؟؟؟
منظورم اینه که delay می خواد ؟؟؟ اینتراپت می خواد؟؟؟؟ چیزی لازم داره؟؟؟؟؟ یا همینطوری پشت سر هم توابع ارسال و دریافت ها را مینویسیم؟؟؟؟
شما تست کن !
کار کنی می فهمی چی می خواد و چی نمی خواد !!!
دو روزه دارم بهش ور میرم و نمیفهمم که چه جوریه!!!!!!!!!!
از اینتراپت استفاده میکنم.
واسه آیسی 2 مینویسم وقتی که rx_counter یک میشه اطلاعات را از پورت سریال دریافت کن.
دریافت میکنه. و دستورات مربوط بهش را انجام میده
ولی وقتی میخوام همین اطلاعات یا هر اطلاعاتی دیگه را واسه میکرو فرستنده (آیسی شماره 1) بفرستم ، هیچ اطلاعاتی نمیفرسته!!!!!
انگار توی حلقه ی دریافت گیر میکنه!!!!! فقط دریافت میکنه!!!!! یعنی هر اطلاعاتی توسط آیسی 1 براش بفرستم، دریافت میکنه ولی از ارسال خبری نیست.
در ضمن همون آیسی شماره 1 هم انگار توی حلقه ارسال گیر میکنه و از دریافت خبری نیست!!!!!
من با کدویژن کار میکنم ، ولی توی رجیسترها فکر نمیکنم فرقی داشته باشه با بیسکام.
اگه میشه گین مشکل من از کجاست؟؟؟؟ یه جا دارم سوتی میدم ولی خودم متوجه نیستم!!!!!
اینم برنامه هر دوتاش
[
attachment=5802]
این واسه کسایی که کدویژن ندارن
برنامه آیسی 1
کد:
while (1){
PORTC.1=1;
PORTC.0=1;
delay_ms(300);
a=PINA;
putchar(a);
PORTC.0=0;
delay_ms(300);
if (rx_counter>0){
b=getchar();
PORTB=b;
PORTC.1=0;
delay_ms(300);
}
};
برنامه آیسی دوم
کد:
while (1)
{
PORTC.0=1;
delay_ms(300);
if (rx_counter>0){
b=getchar();
PORTB=b;
PORTC.0=0;
delay_ms(300);
putchar(b);
}
};
آقا من سوتیم را گرفتم. بعدا میام مفصل توضیح میدم که کسی دیگه این سوتی را نده!!!!!