ايران ويج

نسخه‌ی کامل: خطا در انتقال اطلاعات با USART
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
من یک برد با atmega64 ساختم و تمام اجزاء را از قطعات SMD استفاده کرده ام. من می خواستم که از Usart0 بخونم و نتایج را در Usart1 تکرار کنم ولی داده هائی که تکرار میشد صحیح نبود لذا برنامه را تغییر دادم به این صورت که در یک حلقه اعداد 0-255 را به پورت سریال 1 بفرستد ولی نتایج اعداد تصادفی و عجیب غریب بود.
تنظیمات پورت سریال و باد ریت را مطمئنم که درست انجام دادم ولی سر از این عیب سخت افزاری در نیاوردم.
برنامتون رو می ذارین ؟؟
#include <mega64.h>
#include <stdio.h>
#include <delay.h>
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
void main(void)
{
// USART1 initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART1 Receiver: On
// USART1 Transmitter: On
// USART1 Mode: Asynchronous
// USART1 Baud Rate: 2400
UCSR1A=0x00;
UCSR1B=0x98;
UCSR1C=0x06;
UBRR1H=0x01;
UBRR1L=0x7F;
while (1)
{
while (!(UCSR1A & DATA_REGISTER_EMPTY));
UDR1=100;
}
}
برنامه فوق ساده ترین برنامه ای است که بطور پیوسته کاراکتر d را باید روی پورت سریال 1 ایجاد کند که هر وقت من کابل این پورت را قطع و وصل می کردم نتایج تغییر میکرد یا هر وقت من کابل سریال دیکری را همزمان به پورت سریال 0 وصل میکردم کاارکترهای متفاوتی روی چورت سریال 1 بجای کاراکتر d ایجاد میشد
مهندس قطع و وصل کردن خوب باعث می شه اطلاعات ناقص ارسال شه .

خوب یه کابل دیگه هم باعث می شه اطلاعات قاطی بشن و نامفهموم در میان .

ولی در حالت معمول باید کد اسکی 100 ( همون حرف دی ) رو مدام بفرسته !!

نمی دونم ایرادتون کجاست .
البته من فکر میکنم که هنگام قطع و وصل سیم حداقل یکی دو بایت از اطلاعات را از دست بدهم ولی در این برد تا زمانیکه کابل راقطع و وصل نمیکردم همه کاراکترها مثل هم بود ولی کد 100 نبود
کابل دوم را هم من به USART صفر متصل میکردم که در برنامه برای آن دستور العملی ننوشته بودم.
آیا ممکن است یک ایسی تمام بخشهایش به خوبی کارکند و در یک بخش بطور ذاتی مشکل داشته باشد
ایا استفاده از قطعات SMD باعث میشود که نویز یا عامل دیگری نتیجه کار را خراب کند
سلام
دوست عزیز تا حالا هر کسی توی ارتباط سریال مشکل داشته یکی از موارد زیر رو رعایت نکرده :
1- جای پایه های txd و rxd رو اشتباه زده (پایه rxd ( گیرنده داده سریال ) به پایه txd (فرستنده داده سریال )متصل میشه
2- فرکانس کاری میکرو که توی برنامه نوشته میشه با فرکانس کریستالی که میکرو به اون متصل هست یکی نیست ، همه میگن ما یه کریستال به همون اندازه به میکرو متصل کردیم ، در حالی که باید فیوز بیت کریستال رو هم برنامه ریزی کنن ، در این حالت اگه کریستال رو از میکرو جدا کنید ، میکرو خاموش میشه
3- با استفاده از کریستال های 1.8432-3.6864-7.3728-11.0592-14.7456 مگا هرتز انتقال داده بدون هیچ خطایی انجام میشه ، بقیه کریستال ها .16 درصد خطا داره و این مقدار در هنگام استفاده از کریستال داخلی به 1 تا 20 درصد میرسه ، پس بهتر که از کریستال خارجی استفاده بشه و کریستال یکی از موارد یاد شده باشه
4-در صورتی که برنامه داده رو به پورت سریال میفرسته بهترین مقدار برای خازن 2.2 میکرو فاراد هست .
5-در ارتباط سیم گراند حتما باید وجود داشته باشه
6-
و در نهایت یه نکته مشکوک توی برنامه شما (البته من به c زیاد وارد نیستم)
شما برای دریافت سریال باید از تابعgetchar( ) و برای ارسال از تابع () putchar استفاده کنید که من این دو تا تابع رو توی برنامه شما نمیبینم
و شما توی اولین پست گفتید که اطلاعات را از یک پورت به پورت دیگه میدید ، در حالی توی برنامه فقط USART1 راه اندازی شده
و در ضمن من جایی ندیم که کاکتری به نام d معرفی شده باشه و ارسال بشه

و در اخر شما توابع رو برای چی میفرستید ؟

و پاسخ سوال ها :
نقل قول: البته من فکر میکنم که هنگام قطع و وصل سیم حداقل یکی دو بایت از اطلاعات را از دست بدهم ولی در این برد تا زمانیکه کابل راقطع و وصل نمیکردم همه کاراکترها مثل هم بود ولی کد 100 نبود
هنگامی که شما کابل رو قطع میکنید کلیه اطلاعات از بین میره ، توی n کیلو بایت اطلاعات ، اگه بیت هم از بین بره کل اطلاعات از دست رفته ، برای ارتباط سریال خطای کم تر از .2 درصد مورد قبول هست ، در صورتی که خطا از این حد بیشتر بشه ، هیچ داده ای نمایش داده نمیشه .
نقل قول: آیا ممکن است یک ایسی تمام بخشهایش به خوبی کارکند و در یک بخش بطور ذاتی مشکل داشته باشد
این احتمال بسیار کم هست ، معمولا توی یه سری از میکرو های جدید ، فقط سیستم ریست و کریستال (بالای 15 مگا هرتز )کار نمیکرد
نقل قول: ایا استفاده از قطعات SMD باعث میشود که نویز یا عامل دیگری نتیجه کار را خراب کند
ایا شما در کنار منبع نویز هستید ؟
معمولا این قطعات در صورتی که نویز زیاد باشد درست کار نمیکنند (همه قسمت ها از کار میافتد ) در صورتی که کابل شما بلند باشد (بیشتر از 5 متر ) و فاقد شیلد باشد (روکشی از جنس الومنیم یا مس که دور سیم میپیچند و شما باید ان را به زمین مدار متصل کنید ، معمولا کلیه کابل های که برای این منظور ساخته میشن دارای شیلد هستند ) و سیم زمین درست ممتصل نشده باشد ، ممکن است دتسگاه ها به خوبی کار نکنند
با سلام و تشكر فراوان بخاطر توضيحات مبسوط جنابعالي
من از كريستال 14.7456 استفاده كردم و هنگام پروگرام ار پروگرامر STK400 استفاده ميكنم كه از طريق منو نرمافزار ان را روي high external frequency قرار دادم ساير موارد را نيز رعايت كرده ام.
سلام
اگه میشه کل برنامه رو بذارید