১৮. 8051 এর সাথে UART ডিভাইস ইন্টারফেস
আমরা আগেই জেনেছি যে UART কমিউনিকেশন প্রোটোকল হল এম্বেডেড সিস্টেমে মোটামোটি খুবই গুরুত্বপূর্ণ একটি প্রোটোকল। 8051 মাইক্রোকন্ট্রোলারে এই পেরিফেরালস্টি আছে এবং এর আগের পোস্টগুলোয় আমরা এর হার্ডওয়্যার ডিটেইলস্ এবং আর্কিটেকচার সম্পর্কেও যথেষ্ট ধারনা পেয়েছি। আজকে আমরা ডিরেক্ট এই প্রোটোকলের ইমপ্লিমেন্ট দেখব এবং সেই সাথে 8051 মাইক্রোকন্ট্রোলারের অটো-রিলোড মোড টাইমারের ও ইমপ্লিমেন্ট দেখব। এই প্রোটোকলটি দিয়ে মাইক্রোকন্ট্রোলারের সাথে ব্লুটুথ মডিউল, জিএসএম মডিউল, ESP ওয়াই-ফাই মডিউলের ইন্টারফেস করা হয়ে থাকে। আমরা আপাতত 8051 মাইক্রোকন্ট্রোলারের সাথে প্রোটিয়াসের ভার্চুয়াল সিরিয়াল মডিউলের ইন্টারফেস করব এবং বাস্তবে কি ধরনের প্রজেক্টে এই কমিউনিকেশন ব্যবহার করা যায় তা দেখব। এই পোস্টটি পড়ার আগে অবশ্যই 8051 মাইক্রোকন্ট্রোলারের সিরিয়াল কমিউনিকেশনের আগের পোস্টগুলো ১০ নম্বর পোস্ট এবং ১১ নম্বর পোস্ট পড়ে আসতে বলা হল। কারন এখানে আমরা শুধু ইমপ্লিমেন্টশনই দেখব।
আমরা যদি 8051 মাইক্রোকন্ট্রোলারের সাথে আমাদের পিসি বা ল্যাপটপের সিরিয়াল কমিউনিকেশন করতে চাই তাহলে কি করতে হবে? পিসিতে তো বিভিন্ন ধরনের পোর্ট আছে। এসব পোর্টের মধ্যে সিরিয়াল পোর্ট বলে কি কোন পোর্টের নাম আমরা শুনেছি?? আমরা যারা ডেক্সটপ ইউজ করি তারা হয়ত শুনেছি এবং দেখেছিও। কিন্তু ল্যাপটপ ইউজারদের না শুনে থাকারই কথা এবং ল্যাপটপে এধরনের কোন পোর্ট থাকেও না সচরাচর। ল্যাপটপে ইউএসবি পোর্টই কমন।
ডেক্সটপের সিরিয়াল পোর্ট দেখতে নিচের মত হয়ে থাকে। ডেক্সটপের এই পোর্টকে বলা হয় RS-232 (Recommended Standard 232).
ডেক্সটপের সিরিয়াল পোর্ট মাইক্রোকন্ট্রোলারের সিরিয়াল পোর্টের মতই বিট বাই বিট আদান-প্রদান করে এবং নির্দিষ্ট বডরেটেই করে। কিন্তু এক্ষেত্রে মূল পার্থক্য দেখা যায় এদের হার্ডওয়্যারে। কেননা পিসির ক্ষেত্রে লজিক হাই বলতে নেগেটিভ -৩ ভোল্ট থেকে -২৫ ভোল্টের মধ্যে যেকোন মানের পালস্কে বোঝায়। আর আমাদের মাইক্রোকন্ট্রোলারের ক্ষেত্রে লজিক হাই বলতে ৩.৩ ভোল্ট থেকে ৫ ভোল্টের যেকোন পালস্কে বোঝায়। অপরদিকে পিসির সিরিয়াল পোর্টে লজিক লো বলতে +৩ ভোল্ট থেকে +২৫ ভোল্টের মধ্যে যেকোন মানের পালস্কে বোঝায় কিন্তু মাইক্রোকন্ট্রোলারের ক্ষেত্রে লজিক লো বলতে ০ ভোল্টের সিগন্যালকে বোঝায়। সুতরাং পিসির সিরিয়াল পোর্টের সাথে যদি আমরা ডিরেক্ট মাইক্রোকন্ট্রোলারের সিরিয়াল পোর্টের কানেকশন দিয়ে দিই তাহলে আমাদের মাইক্রোকন্ট্রোলারটি সেকেন্ডের মধ্যেই নষ্ট হয়ে যাবে। পিসি এবং মাইক্রোকন্ট্রোলারের মাঝে আমাদের লজিক লেভেল কনভার্টার ব্যবহার করে দুইটা ডিভাইসের লজিক লেভেলকে একই করতে হবে। এই কাজটিকে করে দেয়ার জন্যে একটি আইসি চিপই পাওয়া যায় যেটার নাম হল MAX-232 IC. এটি RS-232 টু TTL কনভার্টার নামেও পরিচিত। নিচে জাস্ট এই আইসির একটি ছবি এবং একটি সার্কিট দেয়া হল। কারন আমরা এই আইসি নিয়ে খুব একটা কথা বলব না।
যেহেতু আমাদের আধুনিক পিসিতে এই পোর্ট খুব একটা দেখা জায়না। সেহেতু এই পোর্ট নিয়ে কথা বাড়িয়ে আর লাভ নেই। এখন সব পিসি বা ল্যাপটপেই ইউএসবি পোর্ট দেখা যায়। ইএসবি পোর্টে কিন্তু মূলত ৪টি কানেকশন থাকে। VCC,GND,D+,D- । অর্থাৎ আমাদের 8051 মাইক্রোকন্ট্রোলারের সিরিয়াল পোর্টের সাথে কিন্তু ডিরেক্ট ইউএসবি পোর্টের কানেকশন দিয়ে লাভ হবে না। এক্ষেত্রেও মাইক্রোকন্ট্রোলার এবং ইউএসবি পোর্টের মাঝে আমাদের কোন একটি আইসি লাগাতে হবে। তো সমস্যা হল এই আইসি গুলো সবই smd আকারের কম্পোনেন্ট তাই এগুলো কিনে এনে ব্রেড বোর্ডে লাগানো খুবই ঝামেলার একটি কাজ। তবে এই আইসি গুলো ম্যাক্সিমামই মডিউল আকারে খুব কম খরচেই বাজারে পাওয়া যায়। এই মডিউলগুলোকে বলা হয় ইউএসবি টু টিটিএল কনভার্টার। এরুপ কয়েকটি ইউএসবি টু টিটিএল কনভার্টারের ছবি নিচে দেয়া হল।
এই মডিউলে সাধারণত ৫টি অাউটপুট পিন থাকে। যথা- ৫V, GND, TXD, RXD, 3V3. যেসব মাইক্রোকন্ট্রোলার ৩.৩ ভোল্টে চলে তাদের জন্যে এই 3V3 পিনটি পাওয়ার সাপ্লাই পিন হিসেবে ব্যবহৃত হয়। 8051 যেহেতু ৫ ভোল্ট টলারেট করতে পারে সেহেতু 5V,GND,TXD,RXD এই চারটি পিনের কানেকশন দিলেই হবে। সার্কিট কানেকশন আমরা একটু পরেই দেখতে পারব। তার আগে বডরেটের বিষয়টি ক্লিয়ার করে নেয়া উচিৎ।
UART প্রোটোকলের ক্ষেত্রে বডরেট খুবই গুরুত্বপূর্ণ কেননা এই কমিউনিকেশন প্রোটোকলে কোন ধরনের ক্লক পালস্ ব্যবহৃত হয়না। বডরেট জেনারেট করার কাজ করা হয় সাধারনত টাইমার-১ পেরিফেরালস্ দিয়ে। টাইমার-১ কে সাধারণত অটোরিলোড মোডে ব্যবহার করে বডরেট জেনারেট করা হয়। এবং এক্ষেত্রে খুবই গুরুত্বপূর্ণ একটি বিষয় হল ক্রিস্টাল অসসিলেটর হিসেবে 11.0592 MHz ব্যবহার করা। এই অদ্ভুত মানের ক্রিস্টাল ব্যবহার করার একটি সুবিধা হল এতে স্ট্যান্ডার্ড মানের 9600 bps বডরেট জেনারেট করলে কোন এরর আসেনা। বডরেট জেনারেট করার হিসাব নিচে দেখে নেয়া যাক।
বডরেট বের করার জন্যে সুত্র হল-
F_baud = ( (2^SMOD) / 32) * (F_osc / (12 * (256 - TH1) ) )
এখানে SMOD হল PCON রেজিস্টারের মোস্ট-সিগনিফিক্যান্ট-বিট, এর মান 1 অথবা 0 হতে পারে।
F_osc হল ক্রিস্টাল অসসিলেটরের ফ্রিকুয়েন্সি। এক্ষেত্রে 11.0592 MHz.
TH1 হল টাইমার-১ এর আপ ৮ বিটের রেজিস্টার।
আচ্ছা এখন ধরা যাক, আমাদের বডরেট লাগবে 9600 bps. তাহলে TH1 এর মান কত হবে তা উপরক্ত সুত্র দিয়ে খুব সহজেই বের করা যাবে।
F_baud = ( (2^SMOD) / 32) * (F_osc / (12 * (256 - TH1) ) )
9600 = ( (2 ^ 0) / 32) * (11.0592*1,000,000 / (12 * (256 - TH1) ) )
9600 = (1 / 32) * (11059200 / (12 * (256 - TH1) )
256 - TH1 = (1 / 32) * (921600 /9600)
256 - TH1 = 96 / 32 = 3
TH1 = 256 - 3 = 253 (in hexadecimal => 0xFD)
যদি PCON রেজিস্টারের SMOD বিট হাই করা থাকে তাহলে বডরেট জাস্ট ৯৬০০ এর দ্বিগুণ হয়ে ১৯২০০ হয়ে যাবে।
এর আগের সিরিয়াল কমিউনিকেশন রিলেটেড পোস্টগুলো পড়া থাকলে খুব সহজেই বিষয় গুলো ক্লিয়ার হয়ে যাওয়ার কথা। এর আগের পোস্টগুলোতে খুঁটিনাটি সব কিছুই বিস্তারিতভাবে আলোচনা করা আছে। এই পোস্টে আমরা শুধু উদাহরনের মাধ্যমে এর ইমপ্লিমেন্টেশন দেখব।
ধরা যাক আমরা এমন কিছু একটা করতে চাই যেখানে বসে বসে কম্পিউটারের কিবোর্ডে ১ চাপলে একটি লেড অন হয়ে যাবে আবার ০ চাপলে লেড অফ হয়ে যাবে। এর জন্যে আমাদের মাইক্রোকন্ট্রোলারের সাথে সাথে একটি USB-TTL কনভার্টার লাগবে। যেহেতু আমরা সবই আপাতত প্রোটিয়াসে করব সেহেতু এগুলোর কিছু না থাকলেও চল্বে। জাস্ট সিমুলেশন করে উক্ত কাজটি করা গেলেই হবে। তাহলে কথা না বাড়িয়ে কোডের দিকে যাওয়া যাক।
#include<reg52.h> //header file for at89c52 or at89s52 microcontroller
sbit led = P2^0; //declare P2.0 pin as led pin
void uart_init()
{
SCON = 0x50; //uart on mode 1 (16 bit mode) and receive enable bit set
TMOD = 0x20; //timer1 on auto reload mode
TH1 = 0xFD; //load 253 value in TH1
TR1 = 1; //start the Timer1
}
unsigned char serial_read()
{
while(!RI); //wait for RI bit in SCON register to be set, set means character is received
RI = 0; //make RI bit clear
return SBUF; //return the value of SBUF (read-only) register. here character is received
}
void serial_send(unsigned char ch) //pass what character you want to send
{
SBUF = ch; //put the character to the SBUF (write-only) rejister
while(!TI); //wait for TI bit in SCON register to be set, set means character transmissiom is complete
TI = 0; //make TI bit clear
}
void send_string(const char *s) //this function takes string as argument and use serial_send(ch) function
{
while(*s)
serial_send(*s++);
}
void main()
{
char a = '0'; //declare a char type variable named a
led = 1; //at first make the led turn off
uart_init(); //uart setup is done very begining of the code
while(1)
{
a = serial_read(); //read the serial buffer register with a variable
serial_send('\r'); //send carriage retun to show something in new line
if(a == '1') //check the value of varible a to glow the led
{
led = 0; //make the led glow
send_string("LED is on\n\r"); //see the operation printed on computer screen
}
else if(a == '0') //check the value of variable a to turn off the led
{
led = 1; //turn off the led
send_string("LED is off\n\r"); //see the operation printed on computer screen
}
}
}
উপরের কোডের কাজটি হল আমরা কীবোর্ডের ১ চাপলে একটি লেড অন করে এবং ০ চাপলে লেড অফ করে কম্পিউটারের স্ক্রিনে মেসেজ শো করে সেটা জানান দিয়ে দিবে। এটার সার্কিট হবে নিচের মত।
কোড এবং সার্কিট সিমুলেশন ফাইলটি নিচে দেয়া হল।
এখানে উল্লেখ্য যে ব্লুটুথ মডিউল, জিএসএম মডিউলে AT Command নামে বিশেষ ধরনের কিছু কম্যান্ড মাইক্রোকন্ট্রোলার থেকে সিরিয়াল কমিউনিকেশনের মাধ্যমে আদান-প্রদান করে কাজ করানো হয়। পরের কোন পোস্টে উদাহরনসহ দেখানো হবে।
মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন