فراموش کردم
رتبه کلی: 1198


درباره من
رضا.رضازاده (reza-rezazadeh )    

اتصال میکرو به کامپیوتر با پورت سریال

درج شده در تاریخ ۹۲/۰۴/۱۶ ساعت 19:43 بازدید کل: 698 بازدید امروز: 640
 

UART مخفف کلمات Universal Asynchronous Receiver and Transmitter است که برای ارسال و دریافت اطلاعات بین دو وسیله استفاده میشود و غالبا برای ارتباط : 
PC-to-PC 
PC-to-micro controller 
micro controller-to-micro controller 
استفاده میگردد. 
در ارتباط سریال از سطوح ولتاژ TTL صفر و 5 ولت و یا LVTTL بسته به ولتاژ تغذیه میکرو استفاده میشود. 
در تصویر زیر شکل کانکتور و شماتیک اتصال MAX232 به میکرو و تصویر خود آی سی Max232 نشان داده شده است. 

 

کانکتور DB-9 دارای 9 پین است که برای ارتباط سریال فقط به 3 پین آن نیاز داریم.در تصویر بالا نمای روبروی کانکتور نشان داده شده و برای لحیم کاری باید از پایه های سمت دیگر استفاده کنید. 
اگر میکروکنترولر شما فاقد UART است شما از UART نرم افزاری میتوانید استفاده کنید که در زیر توضیح داده شده است. در صورتیکه میکرو دارای یک UART است، پین های TxD و RxD را به TxD و RxD شماتیک بالا وصل کنید. اگر میکروکنترولر بیش از یک UART دارد، پین های TxD0 و RxD0 را به TxD و RxD شماتیک بالا متصل کنید. 
در این مرحله شما نیاز دارید که برنامه را مقدار دهی اولیه کنید. برای این منظور یک فایل جدید bas را باز کنید و کدهای زیر را در ابتدای برنامه اضافه کنید. 

:کد

$regfile = "your micro here def.dat" 
$crystal = 8000000 
$baud = 19200 




حتما میکروکنترولر خود را بعد از عبارت $regfile تعریف کنید، بعنوان مثال اگر میکروی شما ATMega32 است : 

:کد

$regfile = "m32def.dat" 



برخی از میکروهای جدید دارای اسیلاتور داخلی هستند و همچنین برخی بصورت پیش فرض بر روی اسیلاتور داخلی پیکربندی شده اند. استفاده از اسیلاتور داخلی به معنای عدم نیاز به استفاده از اسیلاتور خارجی است. 
این مرحله را در صورتیکه اسیلاتور داخلی وجود دارد انجام دهید 
پروگرمر BASCOM-AVR را مطابق زیر باز کنید : 

 

تب “Lock and Fuse Bits” را انتخاب کنید و پنجره پروگرمر را ماکزیمایز کنید. 
- بررسی کنید در بخش “Fusebit” بصورت زیر باشد : 

:کد

"1:Divide Clock by 8 Disabled" 



و 

:کد

 "Int. RC Osc. 8 MHz; Start-up time: X CK + X ms; [CKSEL=XXXX SUT=XX]" 



 

این تنظیمات در تمامی AVR ها وجود ندارد، در صورتیکه چنین تنظیماتی وجود نداشت، هیچکدام از فیوز بیتها را تغییر ندهید. 
در صورتیکه این تنظیمات وجود داشتند اما در وضعیت درست نبودند. آنها را توسط منو کشوئی با کلیک کردن بروی گزینه دیگر فیوز تغییر دهید. نهایتا بر روی دکمه "Program FS" کلیک کنید. بر روی دکمه "Refresh" کلیک کنید تا مقادیر واقعی این فیوز بیتها را ببینید. 
اکنون یک کابل تخت را بین کانکتورهای DB-9 سمت میکرو و سمت کامپیوتر وصل کنید. 
یک برنامه آزمایشی را در میکرو پروگرم کنید، این برنامه باید مثل برنامه زیر باشد : 

:کد

$regfile = "m32def.dat" "Define your own 
$crystal = 8000000 
$baud = 19200 
Do 
  Print "Hello World" 
  Waitms 25 
Loop 
End 



اکنون برنامه ترمینال BASCOM-AVR را باز کنید و ارتباط را توسط کلیک کردن بر روی : 


:کد

“Terminal” -> “Settings” 



تنظیم کنید و پورت COM کامپیوتر را انتخاب کنید و موارد زیر را انتخاب کنید : 

:کد

baud 19200, Parity none, Data bits 8, Stop bits 1, Handshake none, emulation none 



  

در صورتیکه در پنجره ترمینال امولاتور BASCOM-AVR عبارت Hello World را مشاهده کردید تنظیمات را بدرستی انجام داده اید. 

مثال : 

شما میتوانید مثال زیر را نیز اجرا کنید توسط این چگونگی ارسال و دریافت را توسط دستورات مختلف نشان میدهد : 

:کد

$regfile = "m88def.dat" 
$crystal = 8000000 
$baud = 19200 
  
Dim Akey As Byte  "Here we declare a byte variable 
  
Print 
Print "Hello, hit any alphanumerical key..." 
Akey = Waitkey()  "Waitkey waits untill a char is received from the UART 
Print Akey 

Wait 1 
Print 
Print "Thanks!, as you could see the controller prints a number" 
Print "but not the key you pressed." 
  
Wait 1 
Print 
Print "Now try the enter key..." 
Akey = Waitkey() 
Akey = Waitkey() 
Print Akey 
  
Print 
Print "The number you see is the ASCII value of the key you pressed." 
Print "We need to convert the number back to the key..." 
Print     "Notice what this line does 
Print "Please try an alphanumerical key again..." 
Akey = Waitkey() 
Print Chr(akey) "Notice what this does 
Print "That"s fine!" 
  
Wait 1 
Print 
Print "For a lot of functions, just one key is not enough..." 
Print "Now type your name and hit enter to confirm" 

Dim Inputstring As String * 12          "Declare a string variable here 
  
Do 
Akey = Waitkey() 
If Akey = 13 Then Goto Thanks           "On enter key goto thanks 
   Inputstring = Inputstring + Chr(akey) "Assign the string 
Loop 

Thanks: 
Print "Thank you " ; Inputstring ; " !"             "Notice what ; does 

Wait 1 
Print 
Print "Take a look at the program code and try to understand" 
Print "how this program works. Also press F1 at the statements" 
Print 
Print "If you understand everything continue to the next experiment" 
End 



اسکی : 
همانطور که در مثال بالا دیده شد ما از دستور PRINT برای ارسال هر چیزی به UART استفاده کردیم. در واقع ما چیزی جز متن ارسال نکردیم. ما کاراکترهای ASCII را ارسال نمودیم. ASCII مخفف American Standard Code for Information Interchange به معنای کد استاندارد آمریکائی برای تبادل اطلاعات است. اساسا ASCII یک لیست از 127 کاراکتر است. 
شما میتوانید جدول کامل ASCII را در اینجا مشاهده کنید. 

کدهای CR و LF : 
در مثال قبلی شما مشاهده کردید که دومین عبارت PRINT متن را در خط بعدی چاپ میکند. در حقیقت دستور PRINT همیشه کدهای CR و LF را اضافه میکند. 
بصورت ابتدایی ما با عبارت : 

:کد

Print “ABC” 



ما کدهای زیر را به UART ارسال میکنیم : 

:کد

65 66 67 13 10 



کد 13 مکان نما را به ابتدای خط جاری برمیگرداند و کد 10 آنرا به خط بعدی میبرد. 

:کد

Print “ABC” ; 



زمانیکه ما سمیکالن ";" را در انتهای دستور تایپ میکنیم ... 
بسکام کدهای 13 و 10 را ارسال نمیکند. پس شما میتوانید متن دیگر را بعد از ABC و در همان خط چاپ میکند. 

:کد

Print “ABC” ; Chr(13) ; 


در کد بالا کد 13 ارسال میشود و عبارت print بعدی بروی ABC باز نوشته خواهد شد. 

نمای کلی : 
در اینجا برخی دیگر از دستورات که میتوان برای ارتباط UART استفاده نمود آورده شده است : 


:کد

Waitkey() 


Waitkey تا کاراکتری بافر سریال دریافت کند تاخیر ایجاد میکند. 

:کد

Ischarwaiting() 


مقدار 1 را در صورتیکه در بافر سخت افزاری UART کاراکتری در انتظار باشد را برمیگرداند. 

:کد

Inkey() 


Inkey نخستین کاراکتر اسکی موجود در بافر سریال را برمیگرداند. 

:کد

Print 


Print یک رشته را به UART ارسال میکند. 

مثال دیگر : 
این مثال نشان میدهد که چگونه به استفاده از Ischarwaiting برای تست زده شدن کلید است. در صورتیکه کلیذی زده شد آنرا میخواند. 

:کد

"Print "Press B key to start" 
Dim Serialcharwaiting As Byte, Serialchar As Byte 
  
Serialcharwaiting = Ischarwaiting()   "Check if B or b pressed then goto 
If Serialcharwaiting = 1 Then 
  Serialchar = Inkey() 
  If Serialchar = 66 Or Serialchar = 98 Then 
    Goto MyRoutine 
  End If 
End If 
  
Goto Main 
  
Myroutine: 
"Statements 
  
Main: 
"Statements 
End 



بافر نمودن اطلاعات سریال : 
در صورتیکه ارتباط سریال سرعت بالا داشته باشیم حتما باید از بافر ورودی و خروجی سریال استفاده کنیم. این بافر کردن توسط بسکام انجام شده و فقط برای UART سخت افزاری استفاده میشود. 
برای پیکربندی بافر جهت استفاده در UART ، شما نیاز به استفاده از عبارت Config دارید. 


:کد

Config Serialout = Buffered , Size = 20 



و یا 

:کد

Config Serialin = Buffered , Size = 20 



اطلاعات بیشتر را میتوانید در HELP بسکام عبارت "config serialin" را جستجو کنید. 
و نیز برنامه نمونه “RS232BUFFER.BAS” را در فولدر مثالهای بسکام میتوانید مشاهده کنید. 

UART نرم افزاری : 
در مثال قبلی ما از UART سخت افزاری استفاده کردیم. و این به معنای این است که کمپایلر از رجیسترهای داخلی UART و سخت افزار داخلی RxD , TxD استفاده میکند.اگر شما UART سخت افزاری نداشته باشید میتوانید از UART نرم افزاری استفاده کنید. 
کمپایلر بسکام بسادگی UART اضافه را ایجاد میکند. کمپایلر بسکام بصورت مجازی UART نرم افزاری را بر روی هر پینی از پورتها ایجاد میکند. 

بخاطر داشته باشید که UART نرم افزاری به اندازه UART سخت افزاری مطمئن نیست. بدین صورت که در هنگامی که شما از وقفه ها استفاده میکنید ممکن است که با مشکلات زمانبندی مواجه شوید. 

در این مثال ما پین های portc.1 و portc.2 از میکروکنترولر را. 
portc.1 به TxD و portc.2 به RxD در شماتیک بالا متصل کنید. 

:کد

$regfile = "m88def.dat" 
$crystal = 8000000 
$baud = 19200 
  
Dim B As Byte 
Waitms 100 
  
"Open a TRANSMIT channel for output 
Open "comc.1:19200,8,n,1" For Output As #1 
Print #1 , "serial output" 
  
"Now open a RECEIVE channel for input 
Open "comc.2:19200,8,n,1" For Input As #2 
"Since there is no relation between the input and output pin 
"there is NO ECHO while keys are typed 
  
Print #1 , "Press any alpha numerical key" 
  
"With INKEY() we can check if there is data available 
"To use it with the software UART you must provide the channel 
Do 
   "Store in byte 
   B = Inkey(#2) 
   "When the value > 0 we got something 
   If B > 0 Then 
      Print #1 , Chr(b)                         "Print the character 
   End If 
Loop 
Close #2                                         "Close the channels 
Close #1 
  
End 



بعد از پروگرم کردن میکرو و اتصال به کابل سریال، ترمینال امولاتور را توسط کلیک کردن بر روی  در بسکام را اجرا کنید. 
درخواستهای برنامه را در محیط متنی مشاهده خواهید نمود و از طریق این برنامه به آن پاسخ دهید. 



این متن توسط سایت www.HLachini.com و از روی راهنمای نرم افزار بسکام ترجمه شده است.

این مطلب توسط رضا رضازاده بررسی شده است.
اشتراک گذاری: تلگرام فیسبوک تویتر
برچسب ها:



لوگین شوید تا بتوانید نظر درج کنید. اگر ثبت نام نکرده اید. ثبت نام کنید تا بتوانید لوگین شوید و علاوه بر آن شما نیز بتوانید مطالب خودتان را در سایت قرار دهید.
فراموش کردم
تبلیغات
کاربران آنلاین (1)