امتیاز موضوع:
  • 0 رأی - میانگین امتیازات: 0
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل با ارتباط سریال در sam7s
نویسنده پیام
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #1
مشکل با ارتباط سریال در sam7s
سلام

با سریال میکرو مشکل دارم.
من میخوام 3 تا بایت از برنامه ای که برای کامپیوتر نوشتم، به میکرو بفرستم.

تک تک بایت ها درست ارسال میشن، اما به ترتیب در میکرو دریافت نمی شن.

مثلا بایت 2 که برنامه فزستاده، در میکرو اولین بایته و بایت 3 کامپیوتر در میکرو دومین بایته ، و به جای بایت 3 هه کامپیوتر، در مکیرو یه چیز دیگه دریافت شده.

یعنی پس و پیش ارسال میشن.

چیکار کنم؟

برای سریال از هدر پیوست شده استفاده میکنم.
برای گرفتن 3بایت از تابع get_key که فقط 1 بایت میگره، 3 بار پشت سر هم استفاده میکنم.





.zip   usart.zip (اندازه: 1.17 KB / تعداد دفعات دریافت: 51)
۲۰-تير-۱۳۹۱, ۱۵:۱۲:۳۸
وب سایت ارسال‌ها
پاسخ
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #2
RE: مشکل با ارتباط سریال در sam7s
سلام.

تابع get_key اش كه درسته.
تنظيمات Uart چي هست ؟
چند بيت داده ؟ بيت توازن ؟ چند بيت توقف ؟
تيكه كد مربوط به اين قسمت رو بذار.
اونجايي هم كه از تابع get_key() استفاده مي كني ،‌ با حلقه و ... اش رو اگر استفاده كردي بذار.
از برنامه ي سمت PC مطمئني ؟

۲۰-تير-۱۳۹۱, ۲۱:۱۶:۱۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #3
RE: مشکل با ارتباط سریال در sam7s
سلام
این تیکه کد کاپیوتر:
کد:
public void send_data(byte dutyCycle_index, byte period_index, byte i_left, byte i_right)// iLR -> 0:iu | 1: id | 2:stop
{
byte e_left=0,e_right=0,left_Drctn=0,right_Drctn=0 ;

//--------------------
if (i_left == 2)
e_left = 0;
else
e_left = 1;
//--------------------
if (i_right == 2)
e_right = 0;
else
e_right = 1;
//=====================
if (i_left == 0)
left_Drctn = 1;//forward
if (i_left == 1)
left_Drctn = 0;//backward
//----------------------
if (i_right == 0)
right_Drctn = 1; //forward
if (i_right == 1)
right_Drctn = 0;//backward
//======================
byte motor_vector = Convert.ToByte(((e_left<<7)|(left_Drctn<<6)) | ((e_right<<3)|(right_Drctn<<2)));

byte[] tmp = new byte[3];
tmp[1] = dutyCycle_index;
tmp[0] = 0xAA;
tmp[2] = motor_vector;
//-----------
s_port_1.Write(tmp, 0, 3);//START CODE : 0xAA == 170 DEC


for (int i = 0; i < 109999; i++) { for (int j = 0; j < 10; j++) { } }

}



این هم کدی هست که sam7s باهاش کار میکنه:
کد:
int main(void)
{

unsigned char status=0,status1=0,status2=0,status3=0,tmPp=0X1c;

unsigned char out_going[1];

char t1,t2,t3;

t1=t2=t3=0;

delay_s(1); //delay for debuging

//############################################################

USART(18432000,115200,0);

usart0_init();

init_SPI(); //init SPI # NPCS0 selected for defult

//############################################################


Buffer[0]=0x11;

Buffer[1]=5;

tmp_array[0]=0xbb;

tmp_array[1]=0xc;


//(0);


nrf24l01_initialize_debug(false, 2,true); //initialize the 24L01 to the debug configuration as TX, 1 data byte, and auto-ack enabled

nrf24l01_irq_clear_all();

nrf24l01_get_all_registers(Buffer);

usart0_init();

do

{


tmp_array[0]=getkey();


if(
tmp_array[0] == 0xAA)


{



delay_ms(5);



tmp_array[1]=getkey();//scanf("%c",out_going);




tmp_array[2]=getkey();



delay_ms(5);



nrf24l01_write_tx_payload(tmp_array, 2, 1);



delay_ms(5);








do



{
















status1= nrf24l01_irq_pin_active() ;




status2= nrf24l01_irq_tx_ds_active() ;




status3= nrf24l01_irq_max_rt_active();



}



while(!(status1 && (status2 || status3)));





nrf24l01_irq_clear_all(); //clear all interrupts in the 24L01



//nrf24l01_get_all_registers(Buffer);


//
status = nrf24l01_get_status();



nrf24l01_flush_tx();


//
printf("status: %x\n",status);


}

}

while(1);


return 0;
}

برنامه ی میکرو اون قسمت که چک میکنه که ببینه بایت اول 0xAA هست رو فقط برای جلوگیری از این مشکل گذاشتم، که بدتر شد، یعنی برای اینکه بایت اول کامپیوتر، بایت اول میکرو باشه، باید 2 بار اون اطلاعات رو از کامپیوتر بفرستم.

توی visual studio، پکیج serial_port یه property داره به اسم bufferSize/

مشکل میتونه به اون ربط داشته باشه؟

-----------
این پروژه همون پروژه ی روبات مسیریاب با پردازش تصویر هستش که ادامه میدمش!!!
۲۰-تير-۱۳۹۱, ۲۱:۵۴:۲۵
وب سایت ارسال‌ها
پاسخ
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #4
RE: مشکل با ارتباط سریال در sam7s
نقل قول: توی visual studio، پکیج serial_port یه property داره به اسم bufferSize/

مشکل میتونه به اون ربط داشته باشه؟

منظورت WRITE BUFFER SIZE و READ BUFFER SIZE هست ?
مقدارشون چنده ؟ ( نه بعيد مي دونم )

من يه سري تست هاي اوليه زدم. ( تا الان با ترمينال امولاتور بودهه و مشكلي نداشته، فردا با c# تست مي زنم )
تست هاي اصلي مونده ، به جايي رسيدم خبرت مي كنم.

شما هم اگر زودتر ايراد رو پيدا كردي خبر بده ...

موفق باشي.

(آخرین ویرایش در این ارسال: ۲۱-تير-۱۳۹۱, ۰۳:۵۸:۵۸، توسط sharin.)
۲۱-تير-۱۳۹۱, ۰۳:۵۷:۴۰
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #5
RE: مشکل با ارتباط سریال در sam7s
یه چیزی الان فهمیدم

این 3 تا بایت که میگم، مربوط به کنترل جهت حرکت و سرعت موتور هاست که از کامپیوتر به میکرو ارسال میشه، و از طریق nrf24l01 به روبات.

1. وقتی اطلاعات رو پشت سر هم میفرستم، مشکل جابه جایی بایت ها پیش میاد.

2. اما وقتی اطلاعات رو با تاخیر زمانی میفرستم همه چی درسته.


شکل 1.
3bytes | 3bytes | 3bytes | 3bytes


شکل 2.
3bytes |delay| 3bytes |delay| 3bytes

الان دارم یکی یکی بیت ها رجیستر وضعیت مربوط رو چک مکنم.

هر وقت که مشکل پس و پیش شدن بایت ها پیش میاد، بیت over run یک میشه.

فک کنم کم کم پیداش می کنیم.

نقل قول:
There are two kind of overrun errors. The intuitive one is overrunning the receive buffer in the serial port driver. The less obvious one is overrunning the buffer in the serial port chip. .NET distinguishes them with SerialError.RXOver and SerialError.Overrun. If you get RXOver, you are doing something wrong. You're not emptying the receive buffer quick enough. Overrun is a hardware problem, the serial port driver is not emptying the chip buffer fast enough. You can fix the first one, you can't fix the second one. Unless you use better hardware (larger chip buffer) or a smarter driver.

Judging from your post, it is #2. Put that MFC app on a pedestal if it can fix that.

قسمتی از http://social.msdn.microsoft.com/Forums/...ae3392ca5/
(آخرین ویرایش در این ارسال: ۲۱-تير-۱۳۹۱, ۱۱:۳۸:۴۷، توسط salehjg.)
۲۱-تير-۱۳۹۱, ۱۱:۰۰:۴۵
وب سایت ارسال‌ها
پاسخ
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #6
RE: مشکل با ارتباط سریال در sam7s
من به چند شكل چك كردم و به مشكلي نخوردم !
روش خودم اينه كه ديتا ها رو به صورت string در مي يارم و با تابع زير مي فرستم.

کد:
serialPort1.Write("7");

روشي كه شما استفاده مي كنيد رو تست كردم. مشكل جابه جايي نداشت.
اما بايد چند بار بفرستيمش !
از تاخير استفاده نكن كه نياز نيست ...
كدهاي مربوط به اين قسمت رو به اين شكل بزن ببين درست مي شه. ( براي من كه شد )

کد php:
byte[] tmp = new byte[8];
 
tmp[0] = 0x37;
 
tmp[1] = 170;
 
tmp[2] = 150;
 
tmp[3] = 12;
 
tmp[4] = 0;
 
tmp[5] = 0;
 
tmp[6] = 0;
 
tmp[7] = 0;

 
serialPort1.Write(tmp08); 

راستي در سمت ميكرو ، اطلاعاتت رو اول كامل بگير و بعد تجزيه و تحليلشون كن.
مقدار 0x37 هم شرطي هست كه براي نوشتن سمت ميكرو گذاشتم.

كد ميكرو :
کد php:
while(1)

        {
            
NUM[0]=getkey();



            if (
NUM[0]==55)
            {
                  
NUM[0]=getkey();
                  
NUM[1]=getkey();
NUM[2]=getkey();
.
.
.
}


خبرش رو بدهه ...
موفق باشي.

(آخرین ویرایش در این ارسال: ۲۱-تير-۱۳۹۱, ۱۳:۱۰:۴۷، توسط sharin.)
۲۱-تير-۱۳۹۱, ۱۳:۰۳:۳۳
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #7
RE: مشکل با ارتباط سریال در sam7s
یا این هدر مشکل داره یا من نمی فهمم.

در تابع init_usart0 مقدار کریستال رو بر حسب هرتز مقدار دهی میکنیم..
اما وقتی فرکانس کاری میکرو که از pll گرفته میشه، رو تغییر میدم، همه چی میریزه به هم.

انگار خودش فرکانس رو مقدار دهی کرده.

تنها وقتی که div و mul پی ال ال ، به ترتیب 5و25 هست و prescaler برابر clock/2 هست و کریستال بورد 18.432، پرتکول سریال درست کار میکنه.


نظر دوستان چیه؟
۲۲-تير-۱۳۹۱, ۱۱:۳۹:۲۶
وب سایت ارسال‌ها
پاسخ
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #8
RE: مشکل با ارتباط سریال در sam7s
جواب سوالتون در فايل هدر هست ديگه ...
همينطورهه كه گفتيد. اين هدر براي فركانس 48MHz جواب مي دهه.
اگر تابع UART() رو در هدر فايل نگاه كنيد ، مي بينيد كه MUL برابر 72 و Div برابر 14 در نظر گرفته شده كه نتيجش تفاوت زيادي با 25 براي MUL و 5 براي Div ندارهه ( prescale = 2 )، هر دو تقريبا 48MHz مي شن.

اين تابع كل شاخ و برگ ها رو زدهه و راحت مي شه باهاش يه ارتباط برقرار كرد. ضرائب هم بنظرم خوبه براي چي مي خوايد تغيير بديد ؟!

اگر خواستي مي توني تابع اش رو كامل تر كني كه به ضرائب هم انعطاف پذير بشه ...

-------------------------
حالا مشكل از چي بود؟
با delay راش انداختي؟ يا هموني كه گفتم ؟

موفق باشي.

۲۲-تير-۱۳۹۱, ۱۶:۵۷:۱۴
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #9
RE: مشکل با ارتباط سریال در sam7s
(۲۲-تير-۱۳۹۱, ۱۶:۵۷:۱۴)sharin نوشته است: جواب سوالتون در فايل هدر هست ديگه ...
همينطورهه كه گفتيد. اين هدر براي فركانس 48MHz جواب مي دهه.
اگر تابع UART() رو در هدر فايل نگاه كنيد ، مي بينيد كه MUL برابر 72 و Div برابر 14 در نظر گرفته شده كه نتيجش تفاوت زيادي با 25 براي MUL و 5 براي Div ندارهه ( prescale = 2 )، هر دو تقريبا 48MHz مي شن.

اين تابع كل شاخ و برگ ها رو زدهه و راحت مي شه باهاش يه ارتباط برقرار كرد. ضرائب هم بنظرم خوبه براي چي مي خوايد تغيير بديد ؟!

اگر خواستي مي توني تابع اش رو كامل تر كني كه به ضرائب هم انعطاف پذير بشه ...

-------------------------
حالا مشكل از چي بود؟
با delay راش انداختي؟ يا هموني كه گفتم ؟

موفق باشي.
نشد .
باز باید 2 بار بفرستم تا پس و پیش نشه.
پکیدم.
البته این بار mulوdiv رو مثل هدر تنظیم کردم.

لاین های cts و rts رو شما وصل کرده بودین موقع تست؟
(آخرین ویرایش در این ارسال: ۲۲-تير-۱۳۹۱, ۲۱:۵۶:۲۸، توسط salehjg.)
۲۲-تير-۱۳۹۱, ۱۹:۴۱:۳۸
وب سایت ارسال‌ها
پاسخ
sharin آفلاین
مدیر بازنشسته
*****

ارسال‌ها: 2,053
موضوع‌ها: 28
تاریخ عضویت: مرداد ۱۳۸۹

تشکرها : 3714
( 8171 تشکر در 2772 ارسال )
ارسال: #10
RE: مشکل با ارتباط سریال در sam7s
نقل قول: در فایل sam7.s ، در قسمت pll، مقدار mul و div شما 72 و 14 هست؟
با اون مقدار ها ، کد هاتون رو تست کردید؟

الان تست كردم و جواب داد.

1.با 25و5 و 18432000 و pre=2 محاسبات اينجوريه :
MCK=((18432000*(25+1))/5)/2)=47923200

2.براي 72 و 14 هم مي شه ( باقي مشابه قبل )
MCK=((18432000*(72+1))/14)/2)=48054857.14

‍‍مطابق هدر فايل :
selected CLK = MCK=48054857.14
CD = BARD_RATE

-----------------------------

براي 2
CD = slected CLK/(16 * 19200)=156.4285714
ما مي گيريم CD = 156
Buad = slected CLK/(16 * 156)=19252.74725

error = 1-(19200/19252.74725)*100 = 0.27%
خطا زياد نيست و مشكلي براي ارتباط وجود ندارهه.
-------------------
براي 1.
CD = slected CLK/(16 * 19200)=156.4285714
ما مي گيريم CD = 156
اما در اين حالت select CLK واقعي 48054857.14 نيست ( براي محاسبه ي CD بود )
اما براي Baud واقعي چون ضرائب رو تغيير داديم و فرمول رو تغيير نداديم ، فركانس فعليمون 47923200 هست.
گر چه فرقي هم نمي كنه ، در يك حالت دقيقا CD = 156 مي شه و در ديگري روند مي شه و باز 156 هست.
Buad = slected CLK/(16 * 156)=19200
دقيقا 19200 شد ، با 25 و 5.

---------------

نقل قول: نتونستم از کدهای شما نتیجه بگیرم. هنوز درست نشده.
به نظرم nrf24l01 رو كنار بذار و مستقيم به 9 پينه وصل بشو ، بعد تست هاي ساده بزن كه مطمئن شي.
اگر جواب نگرفتي شايد nrf24l01 يه كارايي اين وسط مي كنه ! البته شايد.
فعلا كد اصلي رو بيخيال بشو و كدهاي ساده رو تست كن.
من تست زدم و 100% مطمئنم كه مشكلي ندارهه ...
---------------
نقل قول: sharin جان شما با keil کار میکنید؟
در حال حاضر بله ، گرچه فرقي نمي كنه ...

۲۲-تير-۱۳۹۱, ۲۳:۰۰:۱۵
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : salehjg
salehjg آفلاین
مدیر بخش
*****

ارسال‌ها: 1,281
موضوع‌ها: 133
تاریخ عضویت: آذر ۱۳۸۸

تشکرها : 9560
( 8557 تشکر در 2603 ارسال )
ارسال: #11
RE: مشکل با ارتباط سریال در sam7s
sharin دارم دیوونه میشم.
کاملا میدونم که به طور بدی وقتتون رو میگیرم...
فقط می تونم تشکر کنم کار دیگه ای ازم بر نمیاد!!


یه پروژه جدید زدم.
همه چیزایی که گفتین رو موبه مو انجام دادم.
اولین باری که تست میکنم(ارسال 8 تا بایت) همه چی درسته.

در دومین بار باز هم بایت ها جابه جا میشن.

این پروژه منه(کیل)
http://uppp.ir/new_v/do.php?filename=13421217071.zip

اگر این کد ها با میکرو و کامپیوتر شما درست کار کردن ، پس حتما مشکل با پورت سریال کامپیوتر منه.(از این مبدل usb به serial ها هستش)

یه جور دیگه تست کردم درست کار کرد.
این وسط یه چیز ناقصه.
چیزی که مربوط به کنترل شرایط غیرعادی مثل شرایطی هست که من درش گیر افتادم، ولی شما این مشکل رو ندازید.

چون وقتی پس از هربار دریافت کردن 3 بایت، یه بار از طریق رجیستر us0_cr ، uart قسمت RX رو reset میکنم، همه چیز درست کار میکنه.
کد:
USART(18432000,19200,19200);

usart0_init();



do

{


var[0] = getkey();


var[1] = getkey();


var[2] = getkey();


printf("var1= %u var2= %u var3= %u", var[0],var[1],var[2]);


*AT91C_US0_CR=4;
*AT91C_US0_CR=0X50;                //SET UART

}while(1);


در ضمن نمی دونم با چه برنامه ای با پورت سریال کار میکنید، اما یه پیشنهاد براتون دارم: termite 2.6 (by compuPhase) خیلی جمع و جور و راحته.

آقا من مشکلم overRun هست.
محتوای رجیستر وضعیت یا همون us0_csr رو وقتی که مشکلی نداشتم و زمانی که مشکل پیش میامد رو برداشتم. این بود:
کد:
123
var1= 49    var2= 50    var3= 51
REG US0_CSR_BIT-0 = 1
REG US0_CSR_BIT-1 = 0
REG US0_CSR_BIT-2 = 0
REG US0_CSR_BIT-3 = 1
REG US0_CSR_BIT-4 = 1
REG US0_CSR_BIT-5 = 0
REG US0_CSR_BIT-6 = 0
REG US0_CSR_BIT-7 = 0
REG US0_CSR_BIT-8 = 0
REG US0_CSR_BIT-9 = 0
REG US0_CSR_BIT-10 = 0
REG US0_CSR_BIT-11 = 0
REG US0_CSR_BIT-12 = 0
REG US0_CSR_BIT-13 = 0
REG US0_CSR_BIT-14 = 0
REG US0_CSR_BIT-15 = 0
REG US0_CSR_BIT-16 = 0
REG US0_CSR_BIT-17 = 0
REG US0_CSR_BIT-18 = 0
REG US0_CSR_BIT-19 = 0
REG US0_CSR_BIT-20 = 0
REG US0_CSR_BIT-21 = 0
REG US0_CSR_BIT-22 = 0





var1= 10    var2= 49    var3= 50
REG US0_CSR_BIT-0 = 1
REG US0_CSR_BIT-1 = 0
REG US0_CSR_BIT-2 = 0
REG US0_CSR_BIT-3 = 1
REG US0_CSR_BIT-4 = 1
REG US0_CSR_BIT-5 = 1  _over run occurred
REG US0_CSR_BIT-6 = 0
REG US0_CSR_BIT-7 = 0
REG US0_CSR_BIT-8 = 0
REG US0_CSR_BIT-9 = 0
REG US0_CSR_BIT-10 = 0
REG US0_CSR_BIT-11 = 0
REG US0_CSR_BIT-12 = 0
REG US0_CSR_BIT-13 = 0
REG US0_CSR_BIT-14 = 0
REG US0_CSR_BIT-15 = 0
REG US0_CSR_BIT-16 = 0
REG US0_CSR_BIT-17 = 0
REG US0_CSR_BIT-18 = 0
REG US0_CSR_BIT-19 = 0
REG US0_CSR_BIT-20 = 0
REG US0_CSR_BIT-21 = 0
REG US0_CSR_BIT-22 = 0
(آخرین ویرایش در این ارسال: ۲۳-تير-۱۳۹۱, ۰۱:۰۷:۲۵، توسط salehjg.)
۲۳-تير-۱۳۹۱, ۰۰:۰۵:۵۳
وب سایت ارسال‌ها
پاسخ
تشکر شده توسط : sharin


موضوعات مرتبط با این موضوع...
موضوع نویسنده پاسخ بازدید آخرین ارسال
  arm و ارتباط تاچینگ و سنسور chroo 1 2,350 ۰۲-اردیبهشت-۱۳۹۱, ۱۸:۴۷:۳۷
آخرین ارسال: sharin
  HMI و ارتباط آن با arm leopard07 3 3,331 ۱۸-آذر-۱۳۹۰, ۱۲:۳۲:۳۵
آخرین ارسال: ha_60

پرش به انجمن:


کاربرانِ درحال بازدید از این موضوع: 2 مهمان

صفحه‌ی تماس | IranVig | بازگشت به بالا | | بایگانی | پیوند سایتی RSS