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


امتیاز موضوع:
  • 1 رأی - میانگین امتیازات: 4
  • 1
  • 2
  • 3
  • 4
  • 5
انتقال اطلاعات بین دو میکرو
#11
درود
دوستان ببخشید که یه دفعه پریدم وسط حرفتون ...
آقای مهدوی عزیز یه سوال دارم :
چه اصراری دارید که ارتباط حتما با سنکرون حل بشه؛ چرا از آسنکرون استفاده نمی کنید؟
در آسنکرون شما به سه سیم نیاز دارید : پایه TXD و پایه RXD و زمین(منفی مدار)

زبان سی رو اگه بلدی شاید بتونم تا حدی کمکت کنم ؛بیسیک رو من بلد نیستم
اون متغیرایی که میخوای از مگا16 بفرستی چه جور متغیری هستش (کاراکتر؟رشته؟عدد صحیح؟ ...) و همچنین متغیرهای ارسالی از مگا32؟
پاسخ
#12
سلام آقا محسن .
هیچ اصراری بر USART ندارم ، چه برسه به اینکه به سنکرون یا آسنکرونش اصراری داشته باشم . تنها اصرار من بر ارسال و دریافت صحیح داده هاست .
بذار برات یکمی توضیح بیشتر بدم . من چند متغییر عددی مختلف در هر دو سمت دارم که باید ارسال و دریافت بشن . اما چون راه ارسال متغییر و نام متغییر رو پیدا نکردم ، اومدم تو برنامم مقادیر مختلفی رو در نظر گرفتم . متغییر های من تقریبا همشون صفر و یا یک هستن . مثلا برای اینکه A=0 رو ارسال کنم ، دستور Printbin 40 رو اجرا می کنم و اون طرف گیرنده ، بعد از دریافت عدد 40 با برنامه به عدد صفر ترجمه شده و تو همون متغییر A میریزمش .
در مورد نحوه ارتباط سخت افزاری هم RX/TX ها بصورت ضربدری متصل شدن و تغذیه دستگاه هم یکیه .
متاسفانه امکان مهاجرت به کدویژن رو در حال حاضر ندارم . چون همونطور که گفتم تا اینجا برنامم حدود 1500 خط شده ، حالا اگه بخوام فقط واسه همین این همه کد رو تغییر بدم ، فکر کنم یه کمی زور باشه . از C  یه چیزایی سر در میارم ، ولی چون روال کاری کدویژن و بسکام متفاوته ، نمیشه خیلی روش حساب کرد . 
سوال من اینه که چرا (مثلا) باید همیشه فرستنده وقتی عدد 5 رو ارسال می کنه ، گیرنده عدد 129 دریافت کنه ؟ که تو تست های مختلف هم همیشه یه عدد مشخص هست .
 
تمام طول هفته را در انتظار جمعه ام 
چه جمعه ها که یک به یک غروب شد نیامدی ...
پاسخ
#13
اصلا اینجوری که شما میگید نیست.
شما عدد خودت رو توی یک متغییر بریز و بعد بده به UDR و اونطرف UDR رو بگیر.
کد php:
a=5;
UDR=a
حالا اونطرف که UDR رو گرفتی اگر نشون بدی همون 5 رو میگیری.
پاسخ
#14
این UDR چیه ؟ از دستورات بسکام که نیست .
تو Help بسکام اسم UDP پروتکل اومده که اون رو نمی دونم چیه ؟ اگه منظورتون استفاده از همون پروتکل هست ، میتونین یه مقداری در مورد مشخصات و ارتباط سخت افزاریش توضیح بدین ؟
متشکر
 
تمام طول هفته را در انتظار جمعه ام 
چه جمعه ها که یک به یک غروب شد نیامدی ...
پاسخ
#15
UDR پروتکل نیست.شما فرض کن یک اسمی هست که هر دو میکرو میشناسنش.(یعنی نیاز به مدار سخت افزاری نداره )
شما اگر میخوای ارتباط دو طرفه باشه یعنی ارسال و دریافت در هر دو میکرو اتفاق بی افته باید به این شکل ببندی.
RX(میکرو اول)------->TX (میکرو دوم)
TX(میکرو اول)------->RX (میکرو دوم)
اگر میخوای فقط یک طرفه باشه باید به شکل زیر باشه.
TX(میکرو اول)------->RX (میکرو دوم)
وصل کن .
حالا فرض کن میخوای یک مقداری رو مثلا همون عدد 5 رو که داخل متغییر A است رو بفرستی برای میکروی دوم
برای اینکار شما باید متغییر A رو بزاری توی UDR این UDR خودش میاد این عدد رو میفرسته برای میکروی دوم بدون نوشتن هیچ دستور اضافه ی دیگر.
حالا شما اونطرف(منظور میکروی دوم) میخوای این متغییر A که رسیده رو نشون بدی (مثلا روی LCD یا هر جای دیگر منظور استفاده از متغییری که رسیده به میکروی دومی رو میگم).
اینجا باید; h=UDR (یعنی حالا توی میکروی دوم باید UDR رو بزری توی متغییر دیگر که بتونی ازش استفاده کنی).
حالا این متغییر h رو میتونی برای نشون دادن توی مثلا LCD یا هر کار دیگری که میخوای دیگه با این H میتونی بکنی.
 
پاسخ
#16
اینی که شما گفتی با این کد پایین چه فرقی داره ؟
کد php:
Master :
a=5
printbin a

Slave 
:
b=inkey()
lcd b 
تو این حالت هم همون اتفاق می افته ؟ 
 
تمام طول هفته را در انتظار جمعه ام 
چه جمعه ها که یک به یک غروب شد نیامدی ...
پاسخ
#17
دوست عزیز من پیشنهاد به شما میکنم .اطلاعات میکروی خودتون را با مطالع ه کتابهای آموزش میکروهای AVR بالا ببرید.
اینها خیلی فرق میکنند.اولین فرقش در حالت نوشتن کد هست.
اصلا این کد کارانتقال دیتا رو انجام نمیده و رو چه حسابی شما این دو رو باه م مقایسه میکنید؟
این مستر از کجا بفهمه که دیتای اومده؟که بخواهد کاری روش انجام بده؟
اصلا هم حالت دستور اشتباه هست هم اصلا با این دستور هیچ دیتای به میکرو ها انتقال داده نمیشه.
من اصلا نمیفهم رو چه اساس این کد رو نوشتی؟
این دوتا کد مستقل از هم کار میکنندو ربطی به هم هم ندارند.
پاسخ
#18

تا اونجایی که من متوجه شدم متغیر های ارسالی شما از هر میکرو از جنس bit هستش (همون Boolian) اونم برای فعال کردن و یا غیر فعال کردن یه سری پین از میکروها (یا برای هر کاربرد دیگه ای ...).

وقتی از  یه میکرو 5 ارسال کردین و از طرف دیگه مثلا 147 دریافت کردین در حالیکه دستورات و عملکرد درست بود این به احتمال زیاد در اثر وجود نویز در مدارتون هستش البته اگه مدار رو خودتون در دنیای واقعی ساختین اگرم فقط با پروتوس شبیه سازی کردین باید بگم که پروتوس در این زمینه زیاد جالب کارشو انجام نمیده اگه کدهایی که نوشتین میدونید درسته حتما یه بار روی بردبرد امتحانش کن (برای من که اینجوری بود).

اما نظر من برای ارسال یه سری متغیر بیتی اینه که به هر متغیر دو کاراکتر نسبت بده؛ یکی برای مقدار true یا 1 و دیگری برای false یا 0.
مثلا فرض کن از مگا32 میخوای دستور بدی PORTB.1 از مگا 16 روشن بشه ؛ برای این کار کاراکتر A رو (از طریق UART) مثلا بفرست و در اون طرف هم (مگا16) برنامه ت تشخیص بده اگه کاراکتر A رسیده PORTB.1 رو روشن کنه یا اگه B رسیده پورت رو خاموش کنه - برای متغیرهای دیگه هم به همین روش.
اینجوری دیگه لازم نیست که به هر متغیر یه عدد نسبت بدی،جمع کنی و اونو بفرستی و ...

اگه کاری بود خوشحال میشم کمک کنم
موفق باشی
پاسخ
#19
 خدمت دوست عزیزم آقای sarbaz13 عرض کنم که من فرصت مطالعه کردن از پایه میکرو رو ندارم و تخصص و زمینه اصلی فعالیتم هم میکرو نیست .
در مورد دستوری که فرمودین ، تو HELP بسکام چیز جالبی پیدا نکردم .
در مورد اینکه این دستور برای انتقال دیتا نیست ، با مراجعه به help بسکام کارهایی رو که انجام می دن رو متوجه می شین . هر زمان که دستور printbin var اجرا بشه ، مقدار var از طریق tx ارسال می شه . و وقتی که دستور ()var=inkey اجرا بشه ، هر مقداری که روی rx باشه رو می خونه و تو متغییر می ریزه . که البته تو این حالت برای تشخیص غیر صفر بودن ، باید از If استفاده کرد .
حالت دستور ها هم درسته ( فقط یه Do Loop میخواد ).
این که گفتین از هم مستقل عمل می کنن ، درسته ، خوب یکی تو Master  هست و اون یکی هم تو Slave  .
اون UDR  رو هم تو پروئوس که امتحان کردم ، سمت Master  پشت سر هم ارور میداد (که مربوط به همون UDR بود)

آقا محسن عزیز ، خدمتتون عارضم که : این دستور واسه بولین نیست و همونطور که تو پست قبلی گفتم واسه ارسال متغییر باینری روی پورت سریال هست .
من هم دارم تو پروتئوس تست میگیرم و هم رو بردبرد .تو هر دو تا خطا دارم . 
احتمال نویز فکر کنم حدود زیر صفر باشه . چون محیطی که کار می کنم نویز چندانی نداره و ( که البته این اصلا مهم نیست ، چون ) همونطور که گفتم ، چندین مرتبه مدار رو خاموش وروشن کردم و سر یه سری اعداد (مثلاً وقتی 5 ارسال می شه ، 129 دریافت می شه ) به مشکل بر می خوره که البته تعدادشون هم کم نیست .
من هم تو برنامم تقریبا از همینی که گفتین استفاده کردم . اینطوری که مثلا اگه عدد 40 به Slave برسه ، به PORTB.1=0 ترجمه می کنه و اگه 41 برسه ، به PORTB.1=1  ترجمه می کنه .
شما نمیدونی واسه اینکه ارتباط بصورت سنکرون بشه باید چه کار کنم ؟
بازم ممنون هستم از شما و دوستان دیگه ای که وقت گذاشتن و جواب دادن .
تمام طول هفته را در انتظار جمعه ام 
چه جمعه ها که یک به یک غروب شد نیامدی ...
پاسخ
#20
سلام مجدد به دوستان .
امروز یه تیکه کد نوشتم وتا الان که داره درست جواب می ده .
تو این کد درواقع دارم چک می کنم که دیتا درست شده یا نه . که البته با درصد نسبتا بالایی دیتای نهایی درسته ( خودم نخواستم بیشتر از این چک کنه )
کد سمت فرستنده :
کد php:
For Send1 1 To 255
         Call Send_val
Next 
For

Sub Send_val

    H
:
    
Locate 1 Lcd Send1
    Printbin Send1

    Send2 
Waitkey()
    
Locate 1 Lcd "act:--" Send2
    
If Send2 Send1 Then
       Printbin 255
    End 
If
    If 
Send2 <> Send1 Then
       
Goto " OR Call send_val"
    
End If

End Sub 
و کد سمت گیرنده :
کد php:
Do
  
Call Recive_val
Loop

Sub Recive_val

     Rcv1 
Inkey()
     
Waitms 100
     Printbin Rcv1
     Rcv2 
Waitkey()
     If 
Rcv2 255 Then
        Rcv 
Rcv1
     
Else
      
Rcv 0
     End 
If

End Sub 
گفتم تا اینجا نتیجه کارم رو بذارم رو سایت .


تمام طول هفته را در انتظار جمعه ام 
چه جمعه ها که یک به یک غروب شد نیامدی ...
پاسخ
مشترک شدن در این موضوع


پرش به انجمن:

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

انتخاب پوسته :

دسترسی سریع
درباره ما
انجمن سرزمین الکترونیک در 20 شهریور 91 تاسیس شده ، که همیشه سعی کرده با ظاهری متفاوت و سرعتی خوب رضایت کاربران را جلب کند ، امیدواریم توانسته باشیم گامی کوچک در پیشرفت فناوری در ایران برداشته باشیم...
نیرو گرفته از MyBB 1.8.6 با فارسی سازی مای بی بی ایران - طراحی شده در : ملت دیزاین
© تمامی حقوق برای انجمن سرزمین الکترونیک محفوظ می باشد .

پوسته‌ی انجمن: