Thanh ghi UDR

Một phần của tài liệu Giáo trình vi điều khiển (Trang 85)

7.1.3 Đặc tính giao tiếp USART

7.2.1 Thanh ghi UDR

Là thanh ghi đệm dùng để truyền UDR (write) và nhận UDR (read) dữ liệu nó có cùng địa chỉ, việc viết dữ liệu vào thanh ghi đệm chỉ thực hiện được khi cờ UDRE trong thanh ghi UCSRA bằng 1.

Bit 7 6 5 4 3 2 1 0 RXB[7:0]

TXB[7:0]

Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0

Hình 7.2 Thanh ghi UDR 7.2.2 Thanh ghi UCSRA

Bit 7 6 5 4 3 2 1 0 RXC TXC UDRE FE DOR PE U2X MPCM Read/ Write R RW R R R R RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0

Hình 7.3 Thanh ghi UCSRA

Bit 7 – RXC USART (USART Receive Complele) khi RXC = 1 thì dữ liệu trong thanh ghi UDR (read) chưa đọc, và khi RXC = 1 thì dữ liệu trong thanh ghi này đã được đọc, khi đó thanh ghi UDR (read) được xem là thanh ghi trống.

Bit 6 – TXC (USART Transmit Complete) dùng thông báo cho hoạt động truyền dữ liệu đã hoàn tất, khi TXC = 1 thì toàn bộ dữ liệu trong thanh ghi dịch (shift register) đã được dịch chuyển ra ngoài và không còn dữ liệu trong thanh ghi UDR (write). Bit này tự động xóa về 0 khi thực thi hoạt động ngắt, hoặc ghi giá trị 1 vào bit này, bit này có thể kích hoạt hoạt động ngắt.

Bit 5 – UDRE (USART Data Register Empty) bit này dùng để báo cho biết thanh ghi UDR (write) có sẵn sàng nhận dữ liệu mới hay không. Nếu bit này = 1 thì bộ đệm trống, thanh ghi UDR (write) sẵn sàng nhận dữ liệu. Bit này có thể kích hoạt hoạt động ngắt khi thanh ghi đệm trống. Bit này = 1 sau hoạt động reset.

Bit 4 – FE (Frame Error) khi FE = 1 sẽ thông báo lỗi trong hoạt động nhận dữ liệu, bit này phải được viết = 0 khi trong thanh ghi UCSRA.

Bit 3 – DOR (Data OverRun) DOR = 1 nếu xảy ra quá trình tràn dữ liệu, bit này phải được viết = 0 khi trong thanh ghi UCSRA.

Bit 2 – PE (Parity Error) PE = 1 khi có lỗi về Parity xảy ra, bit này phải được viết = 0 khi trong thanh ghi UCSRA.

Bit 1 – U2X (Double the USART Transmittion Speed) bit này chỉ có tác dụng trong hoạt động bất đồng bộ, và bit này được viết = 0 trong hoạt động đồng bộ. Khi bit này bằng 1 sẽ giảm tốc độ baud xuống ½.

Bit 0 – MPCM (Multi-processor Communication Mode) bit này cho phép hoạt động đa vi điều khiển, khi bit này = 1 tất cả các dữ liệu khi nhận không chứa đựng thông tin về địa chỉ sẽ bị bỏ qua (không nhận), xem phần giao tiếp đa vi điều khiển.

7.2.3 Thanh ghi UCSRB

Bit 7 6 5 4 3 2 1 0 RXCIE TXCIE UDRIE RXEN TXEN UCSZ2 RXB8 TXB8 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0

Hình 7.4 Thanh ghi UCSRB

Bit 7 – RXCIE (RX Complete Interrupt Enable) bit này = 1 cho phép ngắt trên cờ ngắt RXC. Khi muốn thực hiện hoạt động ngắt khi nhận dữ liệu thì ta cần phải cài đặt như sau (theo thứ tự ưu tiên): bit I trong thanh ghi SREG, bit RXCIE trong thanh ghi UCSRB. Hoạt động xảy ra khi bit RXC = 1.

Bit 6 – TXCIE (TX Complete Interrupt Enable) bit này = 1 cho phép ngắt trên cờ ngắt TXC. Hoạt động ngắt xảy ra khi bit RXC = 1. Khi muốn thực hiện hoạt động ngắt khi truyền dữ liệu thì ta cần phải cài đặt như sau (theo thứ tự ưu tiên): bit I trong thanh ghi SREG, bit TXCIE trong thanh ghi UCSRB.

Bit 5 – UDRIE (USART Data Register Empty Interrupt Enable) bit này = 1 cho phép ngắt trên cờ UDRE. Hoạt động xảy ra khi bit UDRE = 1. Khi muốn thực hiện hoạt động ngắt khi truyền dữ liệu thì ta cần phải cài đặt như sau (theo thứ tự ưu tiên): bit I trong thanh ghi SREG, bit UDRIE trong thanh ghi UCSRB.

Bit 4 – RXEN (Receiver Enable) bit này = 1 sẽ cho phép nhận dữ liệu. Bit 3 – TXEN (Transmitter Enable) bit này = 1 sẽ cho phép truyền dữ liệu.

Bit 2 – UCSZ2 (Character size) bit này kết hợp với 2 bit UCSZ1.0 để xác độ dài dữ liệu để nhận và truyền dữ liệu.

Bit 1 – RXB8 (Receive Data Bit 8) đây chính là bit thứ 9 trong hoạt động nhận 9 bit dữ liệu, bit này phải đọc được trước khi đọc 8 bit thấp trong thanh ghi UDR (read).

Bit 0 – TXB8 (Transmitte Data Bit 8) đây là bit thứ 9 trong hoạt động truyền dữ liệu, bit này phải được ghi trước ghi ghi 8 bit thấp trong thanh ghi UDR (write).

7.2.4 Thanh ghi UCSRC (USART Control and Status Register C).

Bit 7 6 5 4 3 2 1 0 URSEL UMSEL UPM1 UPM0 USBS UCSZ1 UCSZ0 UCPOL Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 1 0 0 0 0 1 1 0

Hình 7.5 Thanh ghi UCSRC

Bit 7 – URSEL (Register Select) dùng để chọn thanh ghi UBRRH hoặc thanh ghi UCSRC, khi bit này bằng 0 thì thanh ghi UBRRH được chọn, khi bit này bằng 1 thì thanh ghi UCSRC được chọn.

Bit 6 – UMSEL (USART Mode Select) dùng để chọn hoạt động đồng bộ/ không đồng bộ.

UMSEL Chế độ

0 Asynchronous Operation (hoạt động bất đồng bộ) 1 Asynchronous Operation (hoạt động đồng bộ)

Bảng 7.1 Chế độ làm việc giao tiếp nối tiếp

Bit 5.4 – UPM1.0 (Parity Mode) 2 bit này dùng để xác định hoạt động parity trong quá trình nhận và truyền dữ liệu.

UPM1 UPM0 Parity Mode 0 0 (Disabled) Không sử dụng

0 1 (Reserved) Không sử dụng 1 0 Cho phép kiểm tra chẵn (even parity) 1 1 Cho phép kiểm tra lẽ (odd parity)

Bảng 7.2 Cài đặc bit Parity

Bit 3 – USBS (Stop Bit Select) dùng để chọn số stop bit trong hoạt động truyền dữ liệu, trong hoạt động nhận sẽ bỏ qua hoạt động này.

USBS Stop Bit(s) 0 1 bit 1 2 bit

Bảng 7.3 Cài đặc bit USBS

Bit 2.1 – UCSZ1.0 chọn kích thước dữ liệu

Stt UCSZ2 UCSZ1 UCSZ0 Kích thước bit 1 0 0 0 5 bit 2 0 0 1 6 bit 3 0 1 0 7 bit 4 0 1 1 8 bit 5 1 0 0 Không sử dụng 6 1 0 1 Không sử dụng 7 1 1 0 Không sử dụng 8 1 1 1 9 bit

Bảng 7.4 Cài đặc số bit dữ liệu

Bit 0 – UCPOL (Clock Polarity) bit này chỉ được sử dụng trong hoạt động đồng bộ, bit này phải được viết = 0 trong hoạt đồng bất đồng bộ.

UCPOL Truyền dữ liệu (ngõ ra, chân TxD) Nhận dữ liệu mẫu (ngõ vào, chân RxD)

0 Cạnh lên xung XCK Cạnh xuống xung XCK 1 Cạnh xuống xung XCK Cạnh lên xung XCK

Hình 7.6 Dữ liệu sẽ được thay đổi tại cạnh lên và lấy mẫu tại cạnh xuống

Hình 7.7 Dữ liệu sẽ được thay đổi tại cạnh xuống và lấy mẫu tại cạnh lên. 7.2.5 Thanh ghi UBRRL và UBRRH

Hình 7.8 Thanh ghi UBRRL và UBRRH

Thanh ghi UBRRH có cùng địa chỉ với thanh ghi UCSRC

Bit 7 – URSEL (Register Select) dùng để chọn thanh ghi UBRRH hoặc thanh ghi UCSRC, khi bit này bằng 0 thì thanh ghi UBRRH được chọn, khi bit này bằng 1 thì thanh ghi UCSRC được chọn.

Tất cả các bit còn lại được sử dụng để chọn tốc độ baud trong hoạt động truyền/ nhận dữ liệu, việc lựa chọn tốc độ baud phải đồng bộ với nhau và sai số trên 0.5% sẽ cho kết quả truyền không chính xác.

Bảng 7.6 Chọn tốc độ baud ở các tần số từ 1Mhz đến 2Mhz

Bảng 7.8 Chọn tốc độ baud ở các tần số từ 8Mhz đến 14Mhz

Bảng 7.9 Chọn tốc độ baud ở các tần số 16Mhz đến 20Mhz

7.3 CÁC BƯỚC THỰC HIỆN CÀI ĐẶC

Khi truyền/ nhận dữ liệu nối tiếp bất đồng bộ ta phải thực hiện các công việc sau: 1. Cài đặc tốc độ baud

3. Số bit truyền nhận dữ liệu 4. Có kiểm tra chẵn lẻ hay không

5. Xác định vi điều khiền nhận/ truyền hoặc vừa nhận vừa truyền dữ liệu. 6. Xác định xem có ngắt hay không

7.3.1 Quá trình nhận dữ liệu

1. Kiểm tra cờ RX trong thanh ghi UCSRA (mục đích là để nhận biết VĐK đã nhận được dữ liệu hay chưa):

 Nếu = 0 thì dữ liệu trong thanh ghi UDR (read) là trống (đã được đọc hay chưa nhận được dữ liệu kế tiếp), vì thế VĐK sẽ chờ cho đến khi bit này = 1.

 Nếu = 1 thì dữ liệu trong thanh ghi UDR (read) đã có dữ liệu (có nghĩa là VĐK đã hoàn tất thủ tục nhận dữ liệu), lúc này ta có thể đọc dữ liệu từ thanh ghi UDR, sau khi đọc xong, bit này sẽ tự động = 0.

2. Kiểm tra quá trình nhận dữ liệu có lỗi hay không, có 3 vấn đề cần kiểm tra đó là:

 Parity Error (PE bit – 2 trong thanh ghi UCSRA).

 Data OverRun (DOR bit – 3 trong thanh ghi UCSRA).

 Frame Error (FE bit – 4 trong thanh ghi UCSRA).

3. Sau đó, VĐK sẽ nhận dữ liệu từ thanh ghi UDR (read). Kết thúc quá trình nhận dữ liệu.

7.3.2 Quá trình truyền dữ liệu:

1. Kiểm tra bit UDRE xem thanh ghi UDR (write) đã sẵn sàng nhận dữ liệu hay chưa.

 Nếu UDRE = 1 thì thanh ghi UDR (write) đang trống (đã truyền dữ liệu) và sẵn sàng nhận dữ liệu để truyền đi.

 Nếu UDRE = 0 thì thanh ghi UDR (write) đang bận truyền dữ liệu và không nhận dữ liệu mới.

7.3.3 Các thời điểm xảy ra ngắt trong hoạt động USART

 Khi hoạt động nhận hoàn thành bit cho phép ngắt RXCIE

 Khi hoạt động truyền hoàn thành, bit cho phép ngắt TXCIE

 Khi thanh ghi dữ liệu UDR trống, bit cho phép ngắt UDRIE

7.4 BÀI TẬP VÍ DỤ

1. Bit nào, trong thanh ghi nào qui định việc cài đặt hoạt động đồng bộ và bất đồng bộ. 2. Hãy cho biết thời điểm xảy ra hoạt động ngắt.

3. Bit nào cho biết trạng thái truyền/ nhận dữ liệu đã hoàn thành.

4. Tốc độ baud có ảnh hưởng tới quá trình đồng bộ, bất đồng bộ hay ảnh hưởng cả hai. 5. Thanh ghi nào nhận dữ liệu và thanh ghi nào truyền dữ liệu

6. Khi cài đặc giao tiếp nối tiếp không đồng bộ giữa 2 thiết bị phải cùng các thông số nào?

7. Khi truyền dữ liệu đồng bộ với IC 74HC74 thì ta phải chọn bit UCPOL bằng bao nhiêu, tại sao?

Giao tiếp giữa 2 vi điều khiển theo nghi thức giao tiếp nối tiếp CHƯƠNG TRÌNH TRUYỀN DỮ LIỆU

/*****************************************************

This program was produced by the CodeWizardAVR V2.05.0 Professional Date : 11/25/2011

Author : LÂM QUANG CHUYÊN

Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 1.000000 MHz

*****************************************************/ #include <mega16.h> #ifndef RXB8 #define RXB8 1 #endif #ifndef TXB8 #define TXB8 0 #endif #ifndef UPE #define UPE 2

#endif #ifndef DOR #define DOR 3 #endif #ifndef FE #define FE 4 #endif #ifndef UDRE #define UDRE 5 #endif #ifndef RXC #define RXC 7 #endif

#define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR)

#define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)

// Write a character to the USART Transmitter

#ifndef _DEBUG_TERMINAL_IO_

#define _ALTERNATE_PUTCHAR_

#pragma used+

void putchar(char c) {

while ((UCSRA & DATA_REGISTER_EMPTY)==0);

UDR=c; }

#pragma used-

#endif

#include <stdio.h>

// Declare your global variables here

void main(void) { PORTA=0x00; DDRA=0x00; PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; MCUCR=0x00; MCUCSR=0x00;

TIMSK=0x00;

// USART initialization

// Communication Parameters: 8 Data, 2 Stop, No Parity // USART Receiver: Off

// USART Transmitter: On // USART Mode: Asynchronous // USART Baud Rate: 19200

UCSRA=0x00; UCSRB=0x08; UCSRC=0x8E; UBRRH=0x00; UBRRL=0x02; ACSR=0x80; SFIOR=0x00; ADCSRA=0x00; SPCR=0x00; TWCR=0x00; while (1) {

// Place your code here

while(PINB.7); putchar(PINA); }

}

CHƯƠNG TRÌNH TRUYỀN DỮ LIỆU

/*****************************************************

This program was produced by the CodeWizardAVR V2.05.0 Professional Date : 11/25/2011

Author : NeVaDa

Chip type : ATmega16 Program type : Application AVR Core Clock frequency: 1.000000 MHz

*****************************************************/ #include <mega16.h> #ifndef RXB8 #define RXB8 1 #endif #ifndef TXB8 #define TXB8 0 #endif #ifndef UPE #define UPE 2 #endif

#ifndef DOR #define DOR 3 #endif #ifndef FE #define FE 4 #endif #ifndef UDRE #define UDRE 5 #endif #ifndef RXC #define RXC 7 #endif

#define FRAMING_ERROR (1<<FE) #define PARITY_ERROR (1<<UPE) #define DATA_OVERRUN (1<<DOR)

#define DATA_REGISTER_EMPTY (1<<UDRE) #define RX_COMPLETE (1<<RXC)

// Get a character from the USART Receiver

#ifndef _DEBUG_TERMINAL_IO_ #define _ALTERNATE_GETCHAR_ #pragma used+

char getchar(void) {

char status,data;

while (1) {

while (((status=UCSRA) & RX_COMPLETE)==0); data=UDR;

if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) return data; } } #pragma used- #endif

// Standard Input/Output functions

#include <stdio.h>

// Declare your global variables here void main(void)

{

// Declare your local variables here

PORTA=0x00; DDRA=0xff; PORTB=0x00; DDRB=0x00;

PORTC=0x00; DDRC=0x00; PORTD=0x00; DDRD=0x00; ASSR=0x00; TCCR2=0x00; TCNT2=0x00; OCR2=0x00; MCUCR=0x00; MCUCSR=0x00; TIMSK=0x00; // USART initialization

// Communication Parameters: 8 Data, 2 Stop, No Parity // USART Receiver: On

// USART Transmitter: Off // USART Mode: Asynchronous // USART Baud Rate: 19200

UCSRA=0x00; UCSRB=0x10; UCSRC=0x8E; UBRRH=0x00; UBRRL=0x02; ACSR=0x80; SFIOR=0x00; ADCSRA=0x00; SPCR=0x00; TWCR=0x00; while (1) {

// Place your code here

PORTA = getchar(); }

7.5 CÂU HỎI ÔN TẬP HẾT CHƯƠNG

1. Hãy cài đặc tốc độ baud là 9600, 8bit, no parity, 2 stop bit, fosc = 1Mhz.

2. Hãy cài đặc tốc độ baud là 19200, 5bit, parity chẵn, 1 stop bit, fosc = 3.6864 Mhz. 3. Tốc độ baud 250k, 9 bit, parity lẻ, 1 stop bit, fosc = 4 Mhz.

4. Hãy cho biết chức năng của từng thanh ghi liên quan trong hoạt động USART. 5. Viết chương trình truyền dữ liệu từ PORTB của VĐK1 sang PORTA của VĐK2, với nghi thức truyền như sau: tốc độ baud 4800, 8 bit, 2 stop bit, parity chẵn, fosc = 1 Mhz. 6. Hãy cho so sánh giữa 2 bit TXC và UDRE.

7. Hãy cho biết tốc độ truyền chậm nhất và nhanh nhất của VĐK.

8. Vẽ dạng sóng ngõ ra trên 2 chân RxD và TxD trong chế độ đồng bộ, khi truyền dữ liệu có nội dung sau: 101100011

9. Viết chương trình truyền và nhận dữ liệu từ 2 VĐK như sau:

Hình 7.10 Bài tập ví dụ giao tiếp nối tiếp

Khi nhấn nút SW1 thì VĐK1 sẽ truyền dữ liệu từ PORTB sang PORTC của VDK2. Khi nhấn nút SW2 thì VĐK2 sẽ truyền dữ liệu từ PORTB sang PORTC của VDK1.

Chương 8

GIAO TIẾP THIẾT BỊ NGOẠI VI THEO NGHI

THỨC SPI

8.1 GIỚI THIỆU 8.1.1 Giới thiệu chung

Hoạt động SPI dùng để trao đổi dữ liệu đồng bộ theo dạng nối tiếp giữa AVR với thiết bị ngoại vi hoặc giữa các AVR với nhau. Một số đặc tính của việc truyền nối tiếp như sau:

 Truyền đồng bộ song công 4 dây (SCK, MOSI, MISO, SS)

 Hoạt động theo dạng Master và Slaver

 Truyền dữ liệu bit thấp (LSB) trước, hoặc bit cao (MSB) trước

 7 tốc độ truyền dữ liệu khác nhau

 Phát sinh ngắt khi quá trình truyền dữ liệu hoàn tất

 Tăng gấp đôi tốc độ truyền dữ liệu

 Master và Slaver có thể hoán đổi chức năng với nhau

Hình 8.1 Sơ đồ giao tiếp giữa Master và Sl ave 8.1.2 Chức năng các chân trong hoạt động SPI

8.1.2.1 Chân SCK

Chân này tạo xung clock để tạo xung nhịp truyền dữ liệu giữa Master và Slaver, xung nhịp được tạo ra bởi Master.

MOSI MISO SCK SS1 SS2 SS3 SS3 MOSI MISO SCK SS2 MOSI MISO SCK SS1 MOSI MISO SCK MASTER SLAVER 3 SLAVER 2 SLAVER 1

8.1.2.2 Chân SS (Slaver select)

Khi sử dụng SPI ở vị trí Slave thì chân SS phải được khai báo là ngõ vào, khi chân SS ở mức thấp thì thiết bị ở trạng thái hoạt động (sẵn sàng nhận dữ liệu), khi chân SS ở mức cao thì tất cả các thiết bị ngưng hoạt động, khi chân SS ở mức thấp thì các chân SPI sẽ bị reset ngay lập tức.

Khi sử dụng SPI ở vị trí là Master thì người sử dụng có thể điều khiển hướng của chân SS, khi chân này được khai báo là ngõ ra và sẽ điều khiển chân SS của Slave.

Khi chân này được khai báo là ngõ vào nó phải được kéo lên mức cao để đảm bảo hoạt động cho Master, nếu chân này bị kéo xuống mức thấp bởi tác nhân bên ngoài trong khi chân SS được khai báo là ngõ vào thì nó sẽ hiểu là đã bị Master khác đã chiếm đường truyền trên bus, để tránh điều này hệ thống SPI phải thực hiện một số thủ tục sau:

1. Bit MSTR trong thanh ghi SPCR phải được xóa và nó trở thành Slave lúc này chân MOSI và SCK phải là ngõ vào.

2. Cờ trong thanh ghi SPIR trong thanh ghi SPSR được bật lên 1, và nếu hoạt động ngắt được cho phép

8.1.2.3 Chân MOSI (Master Input / Slave Output) nếu là Master thì đây là đường Input còn nếu là chip Slave thì MISO lại là Output. MISO của Master và các Slaves Input còn nếu là chip Slave thì MISO lại là Output. MISO của Master và các Slaves được nối trực tiếp với nhau.

8.1.2.4 Chân MISO (MOSI – Master Output / Slave Input)nếu là Master thì đây là đường Output còn nếu là chip Slave thì MOSI là Input. MOSI của Master và các Slaves đường Output còn nếu là chip Slave thì MOSI là Input. MOSI của Master và các Slaves được nối trực tiếp với nhau.

8.2 CÁC THANH GHI LIÊN QUAN: SPCR, SPSR, SPDR 8.2.1 Thanh ghi SPCR 8.2.1 Thanh ghi SPCR

Bit 7 6 5 4 3 2 1 0 SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0 Read/ Write RW RW RW RW RW RW RW RW Giá trị ban đầu 0 0 0 0 0 0 0 0

Hình 8.2 Thanh ghi SPCR

Bit 7 – SPIE (SPI Interrupt Enable): Cho phép ngắt nếu bit SPIF trong thanh ghi SPSR

Một phần của tài liệu Giáo trình vi điều khiển (Trang 85)

Tải bản đầy đủ (PDF)

(126 trang)