Professional Documents
Culture Documents
Slide cuối kì
Slide cuối kì
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.
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ơ đồ 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.
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.
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.
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 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.