با سلام، من با استفاده از رابط SPI در میکرو ATmega128 تونستم این میکرو رو در Master و برای ارسال اطلاعات به یه آسیس دیگه راه اندازی کنم و هیچ مشکلی نداشتم، بر روی پایه های SCK و SS هم سیگنالهای لازم را داشتم، ولی در ادامه کارم بعد از اتصال FT232r برای ارتباط USB و فعال کردن USART1 ، دیگر روی پایه های SCK و SS سیگنالی ندارم (با اسکوپ بررسی کردم) ..یعنی وقتی ارتباط با USB فعال میشه دیگه سیگنالهایی که یا SPI فعال کردم از بین میروند و احتمالا SPI غیر فعال میشه...کسی میدونه چراا؟ من میخام دو تای این ارتباطها رو داشته باشم هم SPI و هم USART1........چیکار باید بکنم؟
اطلاعیه
Collapse
No announcement yet.
فعال کردن همزمان USART1 و SPI در Atmega128
Collapse
X
-
پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128
تشکر،
نه پایه ها مشکلی نداشتند...
اشکال از دستور getchar1 () بود :surprised:....وقتی از کدم حذفش کردم روی SCK سیگنال داشتم :eek:....ظاهرا وجودش توی کد همراه spi باعث ایجاد مشکل میشه ولی مگه دستور معادلی هم برای اون در کدویژن وجود داره؟!!!به جای getchar1 از چه دستوری استفاده کنم؟
دیدگاه
-
پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128
دستور getchar1 خودش شامل UDR1 می شود:
char getchar1(void)
{
char status,data;
while (1)
{
while (((status=UCSR1A) & RX_COMPLETE)==0);
data=UDR1;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
return data;
}
}
کسی میدونه چرا grtchar1 وقتی spi فعال میشه باعث خراب شدن پالس روی SCK میشه و مقدارشو همیشه یک میکنه؟
دیدگاه
-
پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128
اینجا رو بخونید :
http://www.eca.ir/forum2/index.php?t...6810#msg726810
ببینید توی میکروی AVR چیزی به اسم همزمان نداریم. یعنی دستورات با تاخیری هر چند ناچیز اجرا میشن. شما از دستور getchar استفاده می کنی، این دستور به روش pooling دیتا رو از جای دیگه میگیره. یعنی چی ؟
یعنی اینکه تا دیتایی نیاد، میکرو از این دستور عبور نمی کنه و در نتیجه شما نمی تونی به ارتباط SPI برسی. و در نتیجه چون دیتایی نمی فرستی کلاکی هم نخواهی داشت.
راه حل: از روش وقفه برای دریافت دیتا توی ارتباط سریال استفاده کن.---------
.
.
...........
دیدگاه
-
پاسخ : فعال کردن همزمان USART1 و SPI در Atmega128
نوشته اصلی توسط Soheilasممنون
میشه یه مثال از این وقفه بزنید؟
اما چه زمانی!
زمانی که پرچم RXC رفت بالا
این پرچم یه وقفه داره باید بیتش فعال ساز وقفش رو یک کنی و بعد :
interrupt [USART_RXC] void usart_rx_isr(void)
تابع وقفه رو به صورت بالا بنویسی و درونش UDR رو بخونی و دستورات لازم دیگه ای که نیاز میدونی باید بلا فاصله اجرا بشه رو بنویسی
مثلا این یه مثاله که بعد از اینکه گرفته خطاش رو چک کرده و بعد یه بافر نرم افزاری هم ساخته تا ازش استفاده کنه
------کد:interrupt [USART_RXC] void usart_rx_isr(void) { char status,data; status=UCSRA; data=UDR; if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) { rx_buffer[rx_wr_index]=data; if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0; if (++rx_counter == RX_BUFFER_SIZE) { rx_counter=0; rx_buffer_overflow=1; }; }; }
اخبار فناوری - راز روز
http://razerooz.com
دیدگاه
دیدگاه