سلام دوستان.
چطور می شود هم از UART1 و هم از UART2 میکروی atmega128 استفاده کرد؟
شما از چه کامپایلری استفاده میکنید؟
برای usart0 رجیستر های زی رو داریم:
UCSR0A=;
UCSR0B=;
UCSR0C=;
UBRR0H=;
UBRR0L=;
وبرای usar1 داریم:
UCSR1A=;
UCSR1B=;
UCSR1C=;
UBRR1H=;
UBRR1L=;
که توابع getchar putchar با usart0 وتوابع getchar1 ,putchar1 با usart1 کار میکنند در ضمن توابع سطح بالا (( مثل printf ,scanf)) که در آنها از توابع قبلی استفاده می شود با usart0 کار می کنند
مگر اینکه دوباره redifine بشوند که یک مثال خود کدویژن در فولدر example برای کار با دو usart وارسال به lcd توسط printf رو داره
سلام
خسته نباشین
اقا ببینم اساتید به من هم کمک میکنند یا نه ؟ :cry2:
من وقتی یه پایه از ای سی رو تحریک میکنم یه عددی رو واسه ای سی گیرنده میفرسته مثلا عدد دو رو
اما تو گیرنده وقفه دریافت که اجرا میشه بلافاصله سع عدد دیگه هم دریافت میشند یعنی وقفه دریافت سه بار اجرا میشه در حالی که من برنامه وقفه دریافت رو اینجوری نوشتم
dim daryaft as byte
daryaft= udr
نمی دونم چرا 4بار این وقفه دریافت اجرا میشه و همچنین و معمولا اعداد 13_ 48_ 10_ رو دریافت میکنه
یه جا خوندم تا وقتی که udr خالی نشه وقف دریافت اجرا میشه من متوجه نشدم چطور میشه پس از اینکه محتویات اون. خوند صفرش کرد تا دیگه وقفه دریافت اجرا نشه تا دریافت بعد
ضمنا یه چیزی رو یادم شد بگم اینکه ای سی دریافت اولین عددی رو که دریافت میکنه همون چیزی هست که از فرستنده ارسال میشه اما این سه عدد دیگه رو نمی دونم به چه مناسبتی دریافت میکنه :angry: :angry: :angry: :angry:
خواهشا کمکم کنین عزیزان
سلام
خسته نباشین
اقا ببینم اساتید به من هم کمک میکنند یا نه ؟ :cry2:
من وقتی یه پایه از ای سی رو تحریک میکنم یه عددی رو واسه ای سی گیرنده میفرسته مثلا عدد دو رو
اما تو گیرنده وقفه دریافت که اجرا میشه بلافاصله سع عدد دیگه هم دریافت میشند یعنی وقفه دریافت سه بار اجرا میشه در حالی که من برنامه وقفه دریافت رو اینجوری نوشتم
dim daryaft as byte
daryaft= udr
نمی دونم چرا 4بار این وقفه دریافت اجرا میشه و همچنین و معمولا اعداد 13_ 48_ 10_ رو دریافت میکنه
یه جا خوندم تا وقتی که udr خالی نشه وقف دریافت اجرا میشه من متوجه نشدم چطور میشه پس از اینکه محتویات اون. خوند صفرش کرد تا دیگه وقفه دریافت اجرا نشه تا دریافت بعد
ضمنا یه چیزی رو یادم شد بگم اینکه ای سی دریافت اولین عددی رو که دریافت میکنه همون چیزی هست که از فرستنده ارسال میشه اما این سه عدد دیگه رو نمی دونم به چه مناسبتی دریافت میکنه :angry: :angry: :angry: :angry:
خواهشا کمکم کنین عزیزان
بعد از ارسال باید ; رو بزاری و گرنه 13 رو ارسال می کنه
اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن
اقا ممنون از لطفتون که جواب دادین من این تست می کنم و خرش رو بهتون میدم ولی یه سوال دیگه
:biggrin: :biggrin: :biggrin:
udr رو چطور میشه صفر کرد یعنی زمانی که داده دریافتی رو دریافت کردیم این ریجستر udrچه اتفاقی سرش میاد
چون من نوشتم
udr=0اما نشد
چون داخل کتاب مهندس پرتوفر نوشته تا وقتی که ریجستر udr صفر نشود بیت RXCدر UCSRA یک می شود و وقفه دریافت اجاره میشه
من وقتی مقدار UDR رو داخل یه متغیر دیگه میریزم اما هنوز مقدار خودش رو داره UDR .
ضمنا از RS485 استفاده کردم
ممنون دوستان کمک کنین که این مشکل من حل بشه
udr زمانی که داده ای به پورت سریال میاد توی اون ریخته می شه
یه سرچی توی همین انجمن بکن
من خودم یکی 2 تا برنامه که وقفه سریال داشت و درست هم کار می کرد گزاشتم
اگه مردم می دونستن زمان چقدر با ارزشه دیگه هیچ وقت کفش بند دار نمی خریدن البرت انیشتن
اقا سعید ممنون خیلی با حالی .
من اینو تست کردم ; خیلی با حال بود . ممنون از لطفت
الان دوبار اجرا میشه یه بار صفر یه بار هم همون عددی که من می خوام .
جون حسام اگه برنامه ای داری بذار واسم منو حواله این سرچ نکن که چندین بار اینکار رو کردم اما جوابم رو نگرفتم این رو هم محبت کن ممنونت میشم :nice: :nice: :nice: :nice: :nice:
بهترین ها رو برات ارزو دارم
خدانگهدار
من از Mega128 فقط در یک مدار تابلو روان استفاده کردم و در کل چون استفاده از MEGA128 یکم سخته بخاطر SMD بودنش (شاید DIPش هم باشه که من ندیدم) ولی در کل استفاده از دو UART نباید کار سختی باشه.
نکته ای که اهمیت داره استفاده از وقفه ها است که اگر از وقفه استفاده میکنید (که پیشنهاد میکنم حتما استفاده کنید) باید اولویت وقفه هارو مد نظر داشته باشید.
و چون امکان اینکه شما برای وقفه اولویت تعریف کنید نیست باید به این نکته توجه داشته باشید که هر وقفه ای در آدرس پایین تر حافظه نوشته شود دارای اولویت بالاتر است (منبع کتاب AVR مهندس علی کاهه) دیگه مشکلی برای استفاده از دو UART فکر نمیکنم وجود داشته باشه. :nice:
سلام :
من تونستم با 485 ارتباط بر قرار کنم اما به یه مشکلی برخوردم اونم اینکه وقتی اطلاعات رو ارسال میکنم منتظر وقفه اتمام ارسال میمونم usr.txc و پایه فعال کننده ای سی 485 رو غیر فعال کنم و اگه داده جدیدی رو خواستم ارسال کنم از اتمام ارسال مطمئن باشم
تو روال عادی اینکار به خوبی انجام میشه با سرعت خیلی خوب اما در بعضی جاها مجبورم میشم تو زیر برنامه تایمرها اینکا رو انجام بدم یعنی ارسال داده رو و منتظر اتمام ارسال میمونم نمی دونم چرا اطلاعات رو که ارسال میکنه دیگه وقفه اتمام ارسال فعال نمیشه می خوام بدونم وقتی تو زیر برنامه تایمر هستی چه تاثیر روی عملکر و وقفه سریال داره ؟ دوستان و اساتید کمک شما را خواشتار هستیم
پیشاپیش ممنون
شما از چه کامپایلری استفاده میکنید؟
برای usart0 رجیستر های زی رو داریم:
UCSR0A=;
UCSR0B=;
UCSR0C=;
UBRR0H=;
UBRR0L=;
وبرای usar1 داریم:
UCSR1A=;
UCSR1B=;
UCSR1C=;
UBRR1H=;
UBRR1L=;
که توابع getchar putchar با usart0 وتوابع getchar1 ,putchar1 با usart1 کار میکنند در ضمن توابع سطح بالا (( مثل printf ,scanf)) که در آنها از توابع قبلی استفاده می شود با usart0 کار می کنند
مگر اینکه دوباره redifine بشوند که یک مثال خود کدویژن در فولدر example برای کار با دو usart وارسال به lcd توسط printf رو داره
با تشکر از پست مفید شما
من این رو با استفاده از همون مثالی که شما اشاره فرمودین، تکمیل کردم. تست هم شده. گفتم اینجا قرار بدم تا سایر دوستان هم استفاده کنن.
// Specify that a new putchar function will be used instead of the one from stdio.h
#define _ALTERNATE_PUTCHAR_
#define _ALTERNATE_GETCHAR_
// This variable will specify to which peripheral the output of putchar will be directed
unsigned char UART_sel;
// Define the new putchar function
void putchar(char c)
{
switch (UART_sel)
{
case USART0: // the output will be directed to USART0
while ((UCSR0A & DATA_REGISTER_EMPTY)==0);
UDR0=c;
break;
case USART1: // the output will be directed to USART1
while ((UCSR1A & DATA_REGISTER_EMPTY)==0);
UDR1=c;
break;
case USART2: // the output will be directed to USART0
while ((UCSR2A & DATA_REGISTER_EMPTY)==0);
UDR2=c;
break;
case USART3: // the output will be directed to USART0
while ((UCSR3A & DATA_REGISTER_EMPTY)==0);
UDR3=c;
break;
default:;
};
}
char getchar(void)
{
char status,data;
switch (UART_sel)
{
case USART0:
while (((status=UCSR0A) & RX_COMPLETE)==0);
data=UDR0;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
return data;
break;
case USART1:
while (((status=UCSR1A) & RX_COMPLETE)==0);
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
return data;
break;
case USART2:
while (((status=UCSR2A) & RX_COMPLETE)==0);
data=UDR2;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
return data;
break;
case USART3:
while (((status=UCSR3A) & RX_COMPLETE)==0);
data=UDR3;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
return data;
break;
default:;
};
}
برای استفاده فقط کافیه قبل از استفاده از هر فرمان fprintf یا fscanf، بنویسین:
UART_sel=UARTn;
که n شماره UART هست (اینجا از صفر تا 3)
موفق باشین :smile:
If you don't start, it's certain you won't arrive!
شما از چه کامپایلری استفاده میکنید؟
برای usart0 رجیستر های زی رو داریم:
UCSR0A=;
UCSR0B=;
UCSR0C=;
UBRR0H=;
UBRR0L=;
وبرای usar1 داریم:
UCSR1A=;
UCSR1B=;
UCSR1C=;
UBRR1H=;
UBRR1L=;
که توابع getchar putchar با usart0 وتوابع getchar1 ,putchar1 با usart1 کار میکنند در ضمن توابع سطح بالا (( مثل printf ,scanf)) که در آنها از توابع قبلی استفاده می شود با usart0 کار می کنند
مگر اینکه دوباره redifine بشوند که یک مثال خود کدویژن در فولدر example برای کار با دو usart وارسال به lcd توسط printf رو داره
با سلام
این redifine چه جوری انجام میشه میشه یکم توضیح بدهید ؟
من می خوام کارکتر " دونقطه " ( ارسال کنم حالا این کاراکتر با تابع putchar ارسال نمیشه ( دارم از usart1 ای سی mega128 استفاده میکنم) به همین دلیل مجبورم از puts () استفاده کنم اما این دستور فقط برای usart0 جواب میده خواهشمندم کمکم کنید .
با تشکر فراوان
داناترین مردم کسی است که دانش مردم را با دانش خود جمع کند
پیامبر اکرم (ص)
علی ابن ابیطالب : همانا پاداش دانشمند از شخص روزه دار و شب زنده دارکه در راه خدا جهاد می کند بیشتر است
اگر میخواهید دشمنان خود را تنبیه کنید به دوستان خود محبت کنید.(کورش کبیر)
دیدگاه