سلام
اقا من یه مدت مسافرت بودم
خوب من کل مطالب قبل رو به صورت یه فایل PDF در آوردم تا یه جا حمع باشه دوستان اگه ایرادی داشت نظر بدن در خدمتیم
اینم لینک دانلودش
http://persiandrive.net/856440
من یه برنامه برای ارتباط دو میکرو با RS422 نوشتم و در پروتئوس از SN75179 استفاده کردم و سیموله کردم. RS422 جواب داد و مشکلی نبود
اما در این ارتباط سریال، Master برای Slave کدش رو ارسال میکنه و اگه Slave با چنین کدی وجود داشت پیام تصدیق رو ارسال میکنه
اما سناریو:
- Slave باید در وقفه دریافت Usart به Master پاسخ بده. چون قراره در حالت عادی به کارهای دیگه ای بپردازه و فقط زمانی که Master چیزی ارسال کرد بره سراغ وقفه و کارای دیگه رو متوقف کنه
- پروتکل رو طوری تعریف کردم که پس از آنکه وقفه Usart فعال شد و رفت به روتین وقفه، حالا وقفه دریافت رو موقتا غیر فعال کنه و به Master جواب بده و آنگاه منتظر دریافت کد دستور باشه و ببینه که مستر چه چیزی میفرسته و بره دستورات رو انجام بده و وقتی Master بایتی با نام Stop_Byte رو که براشون تعریف کردم دریافت کرد ارتباط را تمام کنه و وقفه دریافت Usart رو فعال کنه
- اما مشکل اینجاست که وقتی وقفه فعال شد و کد رو خواندم و وقفه دریافت رو موقتا غیر فعال کردم
ابتدا هر چی که Master میفرسته رو Slave به خوبی دریافت میکنه و میتونم به زیر برنامه ها برم
سپس اگه Slave هم چیزی بفرسته Master دریافت میکنه
اما از این پس هرچه Master برای Slave میفرسته دریافت نمیشه
برنامه ساده ای از این مشکل رو ببینید:
Master :
b = 2;
putchar(b);
b = 3;
putchar(b);
b = 4;
putchar(b);
b = 5;
putchar(b);
lcd_putsf("OK1"
b = getchar();
if (b == Acknowledge)
{
b = getchar();
if (b == 0b00000010)
{
lcd_gotoxy(0,0);
lcd_putsf("OK2"
}
} b = 6;
putchar(b);
lcd_putsf("OK3"
}
Master هر آنچه که ابتدای ارتباط Usart ارسال میکند Slave دریافت میکند
تا آنجا که Slave جواب تصدیق میدهد و پس از آن هم هر آنچه Slave بفرستد Master دریافت میکند
اما زمانی که Master مجددا چیزی ارسال میکند دیگر دریافت نمیشود(خطوط قرمز رنگ)
این هم برنامه Slave:
در روتین وقفه دریافت Usart تابع test فراخوانده میشود
void test(void)
{
#asm("sei"
lcd_init(20); a = getchar(); // Reading a Byte from Bufer of Reciving USART
code = PINA; // 5 bits in LSB of this Port is the code of Slave
code &= 0b00011111;
if (a == code)
{
lcd_putsf("OK1"
delay_ms(100);
} UCSRB=0x18; a = getchar();
if (a == 3)
{
lcd_putsf("OK3"
delay_ms(100);
}
a = getchar();
if (a == 4)
{
lcd_putsf("OK4"
delay_ms(100);
}
a = getchar();
if (a == 5)
{
lcd_putsf("OK5"
delay_ms(100);
} putchar(Acknowledge);
putchar(code);
a = getchar();
if (a == 6)
{
lcd_putsf("OK6"
delay_ms(100);
}
}
ابتدا بایتی از Master خوانده میشود و درصورتی که با کد قرار گرفته بر روی پورتی ار میکرو برابر بود پیامی رو LCD مینویسد
حال وقفه دریافت Usart غیر فعال میشود
چندین کد دیگر هم که برای امتحان عملکرد برنامه قرار دادم را دریافت میکند (3و4و5)
برای Master پیام تصدیق و کد را ارسال میکند
حال که Master پیام دیگری را ارسال میکند دیگر کدی دریافت نمیشود(6)
یعنی در این شرایط فقط یکبار Slave از Master دریافت اطلاعات میکند و پس از ارسال به Master دیگر چیزی دریافت نمیکند.
ایراد کار در Slave و فقط در بخش دریافت از Usart است
آقای بزرافشان خیلی ممنونم از مطالبی که تا حالا تو این پست گذاشتین
خواهشا اگه امکانش هست ادامه بدین
من برای ارتباط دو میکرو از یوزارت و واسط485استفاده کردم و برای اینکه ارتباطم به صورت فول باش از دو آی سی در مستر و دو آی سی در سلیو یکی برای ارسال و یکی دیگر برای دریافت استفاده کردم و برای دریافت از وقفه دریافت کمک گرفتم ولی مشکل اینجاست که چون برنامه زود به زود به وقفه پرش میکند روتین اصلی برنامه اصلا کار نمیکند نمیدونم باید چیکار کنم
من نه آنم که زبونی کشم از چرخ فلک
چرخ بر هم زنم ار غیر مرادم باشد
دیدگاه