โปรแกรมส่งข้อมูลออกทางพอร์ทอนุกรม USART
1. สร้างโปรเจคใหม่ และเพิ่มคำสั่งลงในโมเด็ลของ MICRO เพื่อให้จำลองการทำงานของ CPU ด้วยสัญญาณนาฬิกาจากภายนอก ด้วยการ
เปลี่ยนจาก .MICRO "ATmega168"
ให้เป็น .MICRO "ATmega168" "CKSEL=0000 CKDIV8=1"
เปลี่ยนความถี่สัญญาณนาฬิกาเป็น 16 MHz
.CLOCK 16Meg
สุดท้ายจำลองการทำงานของ Terminal
X1 TTY(9600 8 0 0 1 1) PD0 PD1
ซึ่งหมายถึง X[inst_name] TTY(baud_rate [n_bits] [parity] [odd_parity] [n_stop_bits] [rx_display_as]) node_tx node_rx
2. เขียนโปรแกรมส่งข้อมูลตั้งแต่อักขระ ABCD จนถึง Z แล้ววนกลับไป A ใหม่
#include <avr\io.h> // Most basic include files
#include <util/delay.h>
void serial_init(void)
{
UBRR0H = 0;
UBRR0L = 103;
UCSR0A = 0;
UCSR0B = 0b10011000;
UCSR0C = 0b00000110;
return;
}
void serial_write(char c)
{
while ( !(UCSR0A & (1 << UDRE0)) );
UDR0 = c;
}
// ***********************************************************
// Main program
//
int main (void)
{
char i = 0x41;
serial_init();
while (1)
{
serial_write(i++);
if (i >=91 )
{
i = 0x41;
_delay_ms(300);
}
}
}
โปรแกรมรับและส่งข้อมูลออกทางพอร์ทอนุกรม USART
แก้ไขโปรแกรมเป็น
#include <avr\io.h> // Most basic include files
#include <util/delay.h>
void serial_init(void)
{
UBRR0H = 0;
UBRR0L = 103;
UCSR0A = 0;
UCSR0B = 0b10011000;
UCSR0C = 0b00000110;
return;
}
void serial_write(char c)
{
while ( !(UCSR0A & (1 << UDRE0)) );
UDR0 = c;
}
int main (void)
{
char i = 0x41;
serial_init();
while (1)
{
if ((UCSR0A & (1 << RXC0)))
{
i = UDR0;
serial_write(i);
}
}
}
เมื่อ RUN โปรแกรมแล้ว
ให้พิมพ์ข้อความลงในช่อง TX ของ TTY จะปรากฏ ข้อความเดียวกันทางช่อง RX