با سلام و تشکر
من همیشه از ارتباط سریال بین میکرو و کامپیوتر استفاده می کردم و هیچ مشکلی ندارم ، و لی در avr احتیاج به ارتباط سریال بین دو میکروکنترلر دارم ولی جواب نمی دهد یعنی مثلا به جای 63 یک بار عدد 52 ، یک بار 50 و یک بار 10 را می فرستد .( در ضمن همین برنامه را با کامپیوتر چک می کنم هم درست می فرستد و هم درست می گیرد.) بین دو میکرو دو تا ای سی max232 هم گذاشتیم باز هم جواب نداد.لطفا راهنمایی کنید.
این که کار نمی کنه شاید مال این باشه که باد ریت ها دقیقا برابر نیست توی کامپیوتر خطای بیشتری رو برای بادریت قبول می کنه ولی توی میکرو باید تو هردو از یه کریستال استفاده کنی و یه تنظیمات رو هم برای هر دو بزاری
ببین برای هر یه کارکتری که می فرستی اون طرف هم یه کارکتر می گیری یا بیشتر
مشکل در این بود که عدد 63 را می فرستادیم ، سه تا عدد دریافت می کردیم
اشتباه در اینجا بود که از دستور print که مربوط به کامپیوتر استفاده می کردیم به جای آن از برنامه asm استفاده کردیم و یا chr و asc استفاده کردیم .
همه چیز درست بودفقط نحوه دریافت و ارسال با هم فرق داشت
اقا هادي سلام.....همونطور كه گفتين اومدم اينجا مشكلم رو بگم...
راستشو بخاين ميدونم مشكل دوستمون حل شده ولي من هم همين مشكل رو دارم...
ميخوام يه كار خيلي ساده بكنم...2 تا ميكرو رو به صورت سريال بهم وصل كردم....با usart...به يه port ها كد دادم ميخوام همين كد رو از يه port ميكرو دوم بگيرم...فكر ميكردم كار ساده ايه...اما مشكلات تو عمل بوجود مياد...از مثالهاي كتاب علي سليميان استفاده كردم....فرستنده ميفرسه ولي گيرنده نميگيره...نميدونم چكار كنم..
مثال هم كه نداره....اگه يه لطفي بكنين براي من كدشو بفرستين...خيلي ممنونم...
به خدا تنبل نبودم...نميشه...
پس فقط تو گیرنده مشکل داری؟ مطمئنی مشکل سخت افزاری نیست؟
روی خودش از مثلا های کمپایلرت استفاده کن و فرستنده گیرنده رو بهم وصل کن ببین همون که می فرستی می گیری یا نه اگه نیست مشکل سخت افزاریه
کد:
#include <90s8515.h>
#include <stdio.h>
/* quartz crystal frequency [Hz] */
#define xtal 4000000L
/* Baud rate */
#define baud 9600
void main(void) {
char k;
/* initialize the UART's baud rate */
UBRR=xtal/16/baud-1;
/* initialize the UART control register
RX & TX enabled, no interrupts, 8 data bits */
UCR=0x18;
while (1) {
/* receive the character */
k=getchar();
/* and echo it back */
putchar(k);
};
}
این echo می کنه هر چی بگیره
مرسي...
من براي فرستنده بعداز تعريف کردن usart کد زير رو نوشتم...
کد:
while (!(UCSRA & 0x20));
{
UDR=PORTB;
};
و براي گيرنده کد زير را:
کد:
while (UCSRA & 0x80)
{
PORTC=UDR;
};
به port b فرستنده ورودي ميدم....0 و 1
و از port c گيرنده خروجي به led دادم...
اول اينکه فرستنده 2 بار فقط ارسال ميگنه...
دوم اينکه چيزي در گيرنده مشخص نيست..
فعلا با کارکتر کاري ندارم..
به نظر شما مشکل چيه...
چرا از دستورات آماده استفاده نمی کنی؟ برای این کار تابع داره
برای گیرنده
کد:
while (1) {
/* receive the character */
PORTC=getchar();
};
وبرای فرستنده
کد:
while (1) {
putchar(PINB);
};
به اون روش آدم بعضی وقتها اشتباه می کنه به نظر من فرستنده و گیرنده رو با کامپیوتر جدا تست کن بعد که هر دو درست بودن با هم چک کن البته یادت نره ورودی خروجی ها رو تعریف کنی پول آپ ها رو هم فراموش نکن مثلا برای خوندن باید از pin استفاده کنی که از port استفاده کزده بودی
بسيار ممنون....مشكلم حل شد....دقيقا شما مشكل من رو فهميدين...الان داره مدار خوب كار ميكنه...اين چند روز كاراي زيادي روش كردم..از جمله اينكه به صورت بي سيم اين اطلاعات رو ميفرستم و سيم ديگه حذف شده....الان با مشكلي كه بر خوردم اينه كه
چون ميخوام از كدينگ استفاده كنم...بايد اطلاعات getchar شده توسط گيرنده رو بگيرم و روش پردازش كنم....ميدوني چيه طبق كد شما
درسته اطلاعات رو تونستيم بريزيم روي پرت C ولي اگه خواستيم مثلا بريزيم روي R1 و بعد روش كاري انجام بديم نميشه...به نظرشما چيكار كنم..
R1 که مال اسمبلی بود هر متغیری دوست داشتی تعریف کن و اینو بریز توش
کد:
char mycode;
mycode = getchar();
مرسي.....نه مشکل من R1 و اينا نبود.....مشکل اين بود در يکي از شرط ها == نگذاشته بودم...و يه شرط برنام ام رو چک نميکرد....الان مشکلي ندارم..بازم از راهنمايي هاتون تشکر ميکنم..