Chapter 18:USART | পর্ব ১৮ঃ ইউজার্ট (পর্ব-১)
ইউজার্ট কী?:
ইউজার্ট (USART) এর পূর্নরুপ হল Universal synchronous Asynchronous receiver Transmitter. সিরিয়াল ডেটা কমিউনিকেশন দুই রকম হতে পারে। Synchronous এবং asynchronous. সিঙ্ক্রোনাস মোডে একসাথে গোটা একটি ক্যারেক্টার ট্রান্সমিটার থেকে রিসিভারে পাঠানো হয়। ট্রান্সমিটার এবং রিসিভারকে একটি ক্লক সিগন্যাল দ্বারা সিঙ্ক্রোনাইজ করা হয়।
অ্যাসিঙ্ক্রোনাস কমিউনিশন মোডে ক্যারেকটারগুলোকে বাইট হিসেবে বিভক্ত করা হয় এবং একেকবার একেকটা বাইট ট্রান্সমিটার থেকে রিসিভারে পাঠানো হয়। এই মোডে কোনো আলাদা সিঙ্ক্রোনাইজিং ক্লক সিগন্যালের প্রয়োজন নেই। কিন্তু ডেটার ফ্রেমের সিঙ্ক্রোনাইজেশনের জন্য ডেটার সাথে কিছু অতিরিক্ত বিট যোগ করা প্রয়োজন হয়। যাতে বোঝা যায় ডেটার শুরু কোথায় আর শেষ কোথায়।
নিচের চিত্রটি এমনই একটি ফ্রেমের।
এখানে,
St=start byte, সবসময়ই লো।
0-8=ডেটা বাইট।
P=প্যারিটি বাইট। জোড় অথবা বিজোড়, যেকোনোটিই হতে পারে।
Sp=Stop byte. সবসময়ই হাই।
Idle- কোনো ডেটা আদান প্রদান হবে না। এটি সবসময়ই লো।
সিরিয়াল কমিউনিকেশন তিনভাবে হতে পারে।
১)সিমপ্লেক্সঃ ডেটা ট্রান্সমিশন একদিকেই হবে।
২)হাফ ডুপ্লেক্সঃ ্ডেটা ট্রান্সমিশন দুইদিকেই হতে পারে তবে এক-এক করে।
৩)ফুল ডুপ্লেক্সঃ ডেটা ট্রান্সমিশন একইসাথেই দুইদিকে হতে পারে।
সিরিয়াল ইউজার্ট ট্রান্সমিটার ও রিসিভারের মধ্যে ফুল ডুপ্লেক্স কমিউনিকেশন স্থাপন করে। ইউজার্ট কমিউনিকেশনের জন্য ATmega16 এর নিজস্ব হার্ডওয়্যার আছে। এই মাইক্রোকন্ট্রোলারের দুইটি পিন TxD ও RxD দিয়ে মাইক্রোকন্ট্রোলারের রিসিভার এবং ট্রান্সমিটার ইন্টারফেস প্রদান করা হয়।
বড রেইট (Baud rate): বিট/সেকেন্ডকে বড(Baud rate) দ্বারা প্রকাশ করা হয়। সোজা বাংলার ডাটা ট্রান্সফারের হারকে বাউড রেট বলে ।কয়েকটি স্ট্যান্ডার্ড বাউড রেট হলঃ
১২০০,২৪০০,৪৮০০,৯৬০০,১৯২০০,৩৮৪০০,৫৭৬০০,১১৫২০০,ইত্যাদি। আমাদের উদাহরনগুলোতে আমরা ৯৬০০ ব্যবহার করব।
বড রেট রেজিস্টারঃ UBRR রেজিস্টারটি বড রেট জেনারেটর হিসেবে কাজ করে। একে দুই ভাগে বিভক্ত করা যায়। UBRRL এবং UBRRH.
Bit 15: URSEL,রেজিস্টার সিলেক্ট।
এই বিটটি UBRRH অথবা UCSRC রেজিস্টার সিলেক্ট করে। রাইট অপারেশনের সময় URSEL=0 হলে UBRRH এর ভ্যালু আপডেট হবে। URSEL=1 হলে UCSRC আপডেট হবে।
USART Control and status register B:
• Bit 7 – RXCIE: RX Complete Interrupt Enable
• Bit 6 – TXCIE: TX Complete Interrupt Enable
• Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable
• Bit 4 – RXEN: Receiver Enable
• Bit 3 – TXEN: Transmitter Enable
• Bit 2 – UCSZ2: Character Size
• Bit 1 – RXB8: Receive Data Bit 8
• Bit 0 – TXB8: Transmit Data Bit 8
USART Control and status register C:
Bit 2:1 – UCSZ1:0: Character Size নির্ধারন করে।
UMSEL বিট নির্ধারন করে ইউজার্ট সিনক্রোনাস মোডে চলবে নাকি অ্যাসিঙ্ক্রোনাস মোডে।
UPM1এবং UPM0 হচ্ছে প্যারিটি চেকার বিট।
USBS বিট নির্ধারন করে ডেটার সাথে কয়টি স্টপ বিট যুক্ত হবে।
UPCOL বিট শুধু সিঙ্ক্রোনাস মোডে ব্যবহার করা হয়। অ্যাসিঙ্ক্রোনাস মোডে এই বিটে ০ দিতে হবে। ডেটা আউটপুট চেঞ্জ,ডেটা ইনপুট স্যম্পল এবং সিঙ্ক্রোনাস ক্লকের ভেতর এই বিটটি সম্পর্ক স্থাপন করে।
USART control and status register A: UCSRA
• Bit 7 – RXC: USART Receive Complete
• Bit 6 – TXC: USART Transmit Complete
• Bit 5 – UDRE: USART Data Register Empty
• Bit 4 – FE: Frame Error
• Bit 3 – DOR: Data OverRun
• Bit 2 – PE: Parity Error
মাইক্রো সি ফাংশনঃ
মাইক্রো সি তে ইউজার্টের জন্য বিল্ট ইন লাইব্রেরি আছে। এই লাইব্রেরির ফাংশনগুলো নিম্নরুপ।-
১) UART1_Init(baud rate)ঃ এই ফাংশনটির কাজ ইউজার্ট ইনিশিয়ালাইজ করা। যদি আমরা
UART1_Init(9600); লিখি তাহলে ৯৬০০ বড রেইটে ইউজার্ট সক্রিয় হবে।
২)UART1_Data_Ready()ঃ এই ফাংশনটি কল করলে মাইক্রোকন্ট্রোলার চেক করবে সিরিয়াল পোর্টে কোনো ডেটা এসেছে কি না।
৩) UART1_Read()ঃ সিরিয়াল পোর্টে আসা ডেটা এই ফাংশনটি দিয়ে পড়া যাবে।
৪)(UART_Read_Text(char *Output, char *Delimiter, char Attempts): এই ফাংশনটি দিয়ে একটি নির্দিষ্ট সীমা পর্যন্ত সিরিয়াল পোর্টে প্রাপ্ত ডেটা পড়া যাবে।
এখানে,
Output=সিরিয়াল পোর্টে প্রাপ্ত ডেটা
*Delimiter= ক্যারেক্টারের একটি সিকোয়েন্স যা প্রাপ্ত ডেটার সমাপ্তি নির্দেশ করে।
Attempts= প্রাপ্ত ডেটার কত তম ক্যারেক্টারের মধ্যে ডিলিমিটার থাকার কথা তা নির্দেশ করে।
যেমনঃ UART_Read_Text(output, “OK”, 10); ফাংশনটি নির্দেশ করে সিরিয়াল পোর্টে প্রাপ্ত ডেটার দশ নম্বর ক্যারেক্টারের ভেতর ‘OK’ শব্দটি থাকার কথা। এই ‘OK’ পর্যন্ত ফাংশনটি সিরিয়াল পোর্টে প্রাপ্ত ডেটা রিড করবে।
৫)UART_Write(char data_)ঃ এই ফাংশনটি সিরিয়াল পোর্টে ক্যারেকটার টাইপ ডেটা পাঠায়।
৬)UART_Write_Text(output)ঃ এই ফাংশনটি সিরিয়াল পোর্টে ক্যারেক্টার স্ট্রিং প্রেরণ করে।
যেমনঃ UART_Write_Text(“Happy birthday”); লিখলে সিরিয়াল মনিটরে Happy birthday লেখাটি প্রিন্ট হবে।
পরবর্তী পর্বে আমরা প্রোগ্রামিং দেখব।