You are on page 1of 7

Câu hỏi 1: Cho Bộ xử lý với không gian hoạt động 2^16, tổ chức bộ nhớ hệ thống theo

yêu cầu sau:


- Tạo bộ nhớ 8Kx8 với Ram 2Kx8
+ Phân tích:
Bộ xử lý có không gian hoạt động 2^16.
Tạo bộ nhớ 8Kx8, trong trường hợp chỉ có Ram 2Kx8:
Bộ nhớ có kích thước 8Kx8 có nghĩa là có tổng cộng 8K * 8 bits (8K bytes).
Ram 2Kx8 có kích thước là 2K * 8 bits (2K bytes).
Bởi vì chúng ta chỉ có Ram 2Kx8, nên để tạo bộ nhớ 8Kx8, ta có thể sử dụng 4 Ram 2Kx8:
Sử dụng 2 bits địa chỉ để chọn giữa 4 Ram (2^2 = 4).
Sử dụng 11 bits còn lại để chọn địa chỉ trong từng Ram (2^11 = 2K).
+ Sơ đồ chọn giữa các Ram:
|---------|---------|---------|---------|
| Ram 0 | Ram 1 | Ram 2 | Ram 3 |
|---------|---------|---------|---------|
+ Tính toán
Bộ nhớ yêu cầu 8 k × 8
Số lượng ram cần = =4 Ram
Kích thước ram 2 k × 8
Kích thước bộ nhớ 8 k ×8
Mỗi Ram có địa chỉ = =2 K
Số lượng Ram 4
- Tạo bộ nhớ 8Kx8 với Ram 1Kx8
+ Phân tích:
Bộ xử lý có không gian hoạt động 2^16.
Tạo bộ nhớ 8Kx8, trong trường hợp chỉ có Ram 1Kx8:
Bởi vì chúng ta chỉ có Ram 1Kx8, nên để tạo bộ nhớ 8Kx8, ta có thể sử dụng 8 Ram 1Kx8
Sử dụng 3 bit để chọn giữa 2 Ram (2^3 = 8).
Sử dụng 10 bits còn lại để chọn địa chỉ trong từng Ram (2^10 = 1K).
+ Sơ đồ chọn giữa các Ram:
|---------|---------|---------|---------|---------|---------|---------|---------|
| Ram 0 | Ram 1 | Ram 2 | Ram 3 | Ram 4 | Ram 5 | Ram 6 | Ram 7 |
|---------|---------|---------|---------|---------|---------|---------|---------|
+ Tính toán:
Bộ nhớ yêu cầu 8 k × 8
Số lượng ram cần = =8 Ram
Kích thước ram 1 k × 8
Kích thước bộ nhớ 8 k ×8
Mỗi Ram có địa chỉ = =1 K
Số lượng Ram 8
- Tạo bộ nhớ 8Kx8 với Ram 8Kx4
+ Phân tích:
Bộ xử lý có không gian hoạt động 2^16.
Tạo bộ nhớ 8Kx8 trong trường hợp chỉ có Ram 8Kx4:
Bộ nhớ có kích thước 8Kx8, Ram có kích thước 8Kx4.
Sử dụng 1 bits để chọn giữa 4 byte trong mỗi từ (2^1 = 2).
Sử dụng 12 bits còn lại để chọn địa chỉ trong từng Ram (2^12 = 4K).
+ Sơ đồ chọn giữa các byte trong từ:
|---------|---------|---------|---------|
| Byte 0 | Byte 1 | Byte 2 | Byte 3 |
|---------|---------|---------|---------|
+ Tính toán:
Bộ nhớ yêu cầu 8 k ×8
Số lượng ram cần = =2 Ram
Kích thước ram 8 k × 4
Kích thước bộ nhớ 8 k ×8
Mỗi Ram có địa chỉ = =4 K
Số lượng Ram 2
- Tạo bộ nhớ 8Kx8 với Ram 4Kx4
+ Phân tích:
Bộ xử lý có không gian hoạt động 2^16.
Tạo bộ nhớ 8Kx8 trong trường hợp chỉ có Ram 4Kx4:
Sử dụng 1 bits để chọn giữa 4 byte trong mỗi từ (2^1 = 2).
Sử dụng 12 bits còn lại để chọn địa chỉ trong từng Ram (2^12 = 4K).
+ Sơ đồ chọn giữa các byte
|---------|---------|
| Ram 0 | Ram 1 |
|---------|---------|
+ Tính toán:
Bộ nhớ yêu cầu 8 k × 8
Số lượng ram cần = =2 Ram
Kích thước ram 4 k × 4
Kích thước bộ nhớ 8 k ×8
Mỗi Ram có địa chỉ = =4 K
Số lượng Ram 2
Câu hỏi 2: So sánh các giao thức UART và I2C
+ Về cơ bản:
• UART là một chuẩn nối tiếp không đồng bộ, I2C là chuẩn nối tiếp đồng bộ, nên chúng có
đường clock còn UART thì không..
• UART có thể truyền đi với khoảng cách khá ok, I2C chỉ truyền trên bo mạch.
• UART là giao tiếp 1 vs 1, I2C hoạt động theo cơ chế master - slave. I2C có thể có nhiều
master và nhiều slave, do cơ chế định địa chỉ nên nó không cần tốn thêm dây
Lưu ý: Trên lý thuyết, I2C dùng 7 bit địa chỉ có thể giao tiếp 2^7 = 128 thiết bị. Tuy nhiên,
nó có một địa chỉ cuộc gọi chung là 000.0000 nên chỉ còn 127 địa chỉ sử dụng. (Chính xác,
nó còn dùng 15 địa chỉ nữa là 000.xxxx và 111.xxxx cho các nhiệm vụ khác).

Câu hỏi 3: Thiết kế một hệ thống nhúng (đơn giản, UART)
Thiết kế hệ thống nhúng đơn giản:
Viết chương trình cho vi điều khiển PIC16F877A để giải phương trình bậc một ax + b = 0.
Trong đó a và b nhập từ port A và B. Kết quả hiển thị trên serial LCD.
Để thiết kế hệ thống nhúng đơn giản cho việc giải phương trình bậc một ax + b = 0 trên vi
điều khiển PIC16F877A và hiển thị kết quả lên serial LCD, bạn có thể thực hiện theo các
bước sau:

1. Khởi tạo các cổng và cấu hình cho vi điều khiển:


 Sử dụng ngôn ngữ lập trình C hoặc ASM để viết mã cho PIC16F877A.
 Cấu hình cổng A và B làm cổng nhập để nhập giá trị của a và b.
 Sử dụng cổng serial để kết nối với LCD.
2. Đọc giá trị a và b từ cổng A và B:
 Sử dụng hàm đọc giá trị từ cổng A và B để lấy giá trị của a và b.
3. Giải phương trình bậc một:
 Sử dụng công thức x = -b/a để tính giá trị x.
 Nếu a bằng 0, thông báo lỗi vì phương trình không có nghiệm.
4. Hiển thị kết quả lên serial LCD:
 Sử dụng các hàm để gửi dữ liệu đến serial LCD.
 Gửi giá trị x và các thông báo liên quan đến kết quả lên LCD.

Code
#include <xc.h>
#include <lcd.h>

// Định nghĩa tốc độ baud cho giao tiếp serial


#define FREQ 12000000
#define baud 9600
#define spbrg_value (((FREQ/64)/baud)-1)

// Khai báo biến a và b


int a, b;

// Hàm init_serial để cấu hình giao tiếp serial


void init_serial() {
TRISC6 = 0; // TX pin là đầu ra
TRISC7 = 1; // RX pin là đầu vào
SPBRG = spbrg_value; // Thiết lập tốc độ baud
TXEN = 1; // Cho phép truyền
CREN = 1; // Cho phép nhận
}

// Hàm giải phương trình bậc một và hiển thị kết quả
void solve_equation() {
float x;
char buffer[16];

// Giải phương trình


x = -b / (float)a;

// Chuyển đổi kết quả sang chuỗi ký tự


sprintf(buffer, "x=%.2f", x);

// Hiển thị kết quả trên LCD


lcd_clear();
lcd_puts(buffer);
}

void main() {
init_serial();
lcd_init();

while (1) {
// Đọc giá trị a và b từ port A và B
a = PORTA;
b = PORTB;
// Gọi hàm giải phương trình và hiển thị kết quả
solve_equation();

// Chờ 1 giây để đọc lại giá trị


__delay_ms(1000);
}
}

You might also like