Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 8

Chu trình xử lý data thanh ghi của Atmega328P

Atmega328P là một vi điều khiển 8 bit có cấu trúc Harvard, nghĩa là bộ nhớ chương
trình (program memory) và bộ nhớ dữ liệu (data memory) được tách biệt. Bộ nhớ
chương trình được lưu trữ trong ROM, còn bộ nhớ dữ liệu được lưu trữ trong RAM.
Chu trình xử lý data thanh ghi của Atmega328P được thực hiện theo 4 bước sau:

1. Fetch ( Đọc lệnh) : Lệnh được đọc từ ROM và lưu vào thanh ghi PC (Program
Counter). Thanh ghi PC chứa địa chỉ của lệnh tiếp theo sẽ được thực hiện.
2. Decode ( Giải mã lệnh) : CPU sẽ sử dụng mã opcode để giải mã lệnh và xác
định các thao tác cần thực hiện.
3. Get data (Đọc dữ liệu ): Nếu lệnh yêu cầu đọc dữ liệu từ RAM, thì dữ liệu sẽ
được đọc từ RAM và lưu vào thanh ghi AR (Accumulator Register).
4. Execute (Thực thi lệnh ) : CPU sẽ thực hiện các thao tác theo lệnh. Các thao tác
này có thể bao gồm các phép tính số học, logic, chuyển đổi dữ liệu, truy cập bộ
nhớ, điều khiển các thiết bị ngoại vi, v.v..
5. Cập nhật trạng thái: CPU sẽ cập nhật trạng thái của các thanh ghi và cờ. Các
thanh ghi chứa dữ liệu được sử dụng trong lệnh sẽ được cập nhật với kết quả
của lệnh. Các cờ sẽ được set hoặc reset tùy thuộc vào kết quả của lệnh.

Trạng thái cờ bus


Cờ bus là các bit trạng thái được sử dụng để kiểm soát hoạt động của bus dữ liệu.
Chúng đóng vai trò quan trọng trong việc phối hợp và đồng bộ hóa việc truyền dữ liệu
giữa vi điều khiển với các thiết bị ngoại vi.
Các cờ bus chính của Atmega328P bao gồm:

 RD (Read): Bit này được đặt ở mức cao để yêu cầu đọc dữ liệu từ thiết bị
ngoại vi. Cờ RD thường được sử dụng trong các giao tiếp như SPI, I2C, và giao
tiếp với các thiết bị ngoại vi khác.

Sơ đồ hoạt động của chuẩn giao tiếp SPI

Sơ đồ kết nối các cặp dây SDA, SCL của chuẩn giao tiếp I2C với thiết bị ngoại vi

 WR (Write): Bit này được đặt ở mức cao để yêu cầu ghi dữ liệu vào thiết bị
ngoại vi. Tương tự với RD, Cờ WR cũng được sử dụng trong các giao tiếp như
SPI, I2C, và giao tiếp với các thiết bị ngoại vi khác.

 MISO (Master In, Slave Out): Bit này được sử dụng để truyền dữ liệu từ vi điều
khiển sang thiết bị ngoại vi, được sử dụng trong các giao tiếp SPI. Khi vi điều
khiển hoạt động ở chế độ Master, nó sẽ đọc dữ liệu từ thiết bị Slave thông qua
chân MISO. Trạng thái của cờ MISO cho biết dữ liệu đang được truyền từ thiết
bị Slave có hợp lệ hay không.

 MOSI (Master Out, Slave In): Bit này được sử dụng để truyền dữ liệu từ thiết bị
ngoại vi sang vi điều khiển, được sử dụng trong các giao tiếp SPI. Khi vi điều
khiển hoạt động ở chế độ Master, nó sẽ ghi dữ liệu lên chân MOSI để truyền đến
thiết bị Slave. Trạng thái của cờ MOSI cho biết dữ liệu đang được truyền đến
thiết bị Slave có hợp lệ hay không

 SS (Slave Select): Bit này được sử dụng để chọn thiết bị ngoại vi, được sử
trong các giao tiếp SPI và I2C.

Sơ đồ hoạt động của chuẩn giao tiếp SPI

Bên cạnh các cờ bus trên, Atmega328P còn có một số cờ trạng thái khác liên quan đến
hoạt động của bus dữ liệu, chẳng hạn như:
 SPSR (SPI Status Register): Lưu trữ trạng thái của giao tiếp SPI.

Bit 7 : SPIF : SPI Interrupt Flag : bit cờ báo của SPI . Khi có một dữ kiệu được truyền
xong thì bit này được set lên 1
BIT6 : WCOL : Write COLlision Flag Cờ báo va chạm dữ liệu , khi cố tình ghi dữ liệu
vào thanh ghi dữ liệu SPDR mà quá trình truyền nhận chưa kết thúc .
BIT 0 : SPI2X: Double SPI Speed Bit. Bit nhân đôi tốc độ truyền

Link: https://nguyentiensk.wordpress.com/2016/10/29/giao-tiep-spi/
 TWSR (Two-Wire Serial Interface Status Register): Lưu trữ trạng thái của giao
tiếp I2C.

5 bit TWS7..3 là 5 bit code được sinh ra trong mỗi quá trình truyền nhận . cần xem xét đọc các
bit để phản hồi lại đường truyền.

2 bit TWPS1..0 là 2 bit thiết lập bộ chia trước

Lệnh ngắt điều khiển


Lệnh ngắt điều khiển được sử dụng để xử lý các ngắt từ các thiết bị ngoại vi. Các
ngắt được phân loại thành hai loại: ngắt bên ngoài và ngắt bên trong.

 Ngắt bên ngoài: được tạo ra bởi các sự kiện bên ngoài vi điều khiển, chẳng hạn
như sự thay đổi trạng thái của một chân GPIO.
 Ngắt bên trong: được tạo ra bởi các sự kiện bên trong vi điều khiển, chẳng hạn
như kết thúc một phép tính hoặc vượt quá giá trị giới hạn của một thanh ghi.

Để xử lý một ngắt, vi điều khiển sẽ thực hiện các bước sau:


1. Bật cờ ngắt: Cờ ngắt được bật để thông báo cho vi điều khiển rằng đã xảy ra
ngắt.
2. Lưu trạng thái hiện tại: Trạng thái hiện tại của vi điều khiển, bao gồm giá trị của
các thanh ghi và cờ, sẽ được lưu vào ngăn xếp.

3. Truy cập ISR: Vi điều khiển sẽ truy cập ISR (Interrupt Service Routine) tương
ứng với ngắt đã xảy ra. ISR là một đoạn mã được viết bởi người dùng để xử lý
ngắt.

4. Khôi phục trạng thái: Sau khi ISR hoàn thành, trạng thái hiện tại của vi điều
khiển sẽ được khôi phục từ ngăn xếp.

Dưới đây là một số lệnh ngắt cụ thể trong Atmega328P:


 INT0 và INT1: Ngắt bên ngoài từ chân GPIO 2 và 3.
 PCINT0 đến PCINT7: Ngắt bên ngoài từ các chân GPIO 0 đến 7.
 TIMER0_OVF_vect: Ngắt tràn trên bộ đếm thời gian 0.
 TIMER1_OVF_vect: Ngắt tràn trên bộ đếm thời gian 1.
 TIMER2_OVF_vect: Ngắt tràn trên bộ đếm thời gian 2.
 USART_RX_vect: Ngắt nhận dữ liệu trên USART.
 USART_TX_vect: Ngắt truyền dữ liệu trên USART.
 ADC_vect: Ngắt ADC.
 EE_READY_vect: Ngắt sẵn sàng ghi/đọc bộ nhớ EEPROM.
 TWI_vect: Ngắt giao tiếp I2C.
Ví dụ

Dưới đây là một ví dụ về cách sử dụng lệnh ngắt điều khiển để xử lý ngắt từ chân
GPIO:

void setup() {
pinMode(LED_BUILTIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(D2), blinkLed, CHANGE);
}

void loop() {
// ...
}

void blinkLed() {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}

Trong ví dụ này, chân D2 được cấu hình là đầu vào và được gắn với ngắt CHANGE.
ISR blinkLed sẽ bật hoặc tắt LED tích hợp khi trạng thái của chân D2 thay đổi.

You might also like