Tôi đang sử dụng Atmega32 để đọc các cảm biến khác nhau bằng cách sử dụng ADC của nó.
Sử dụng logic kỹ thuật số và một vài bộ ghép kênh, tôi đã ghép toàn bộ PORTA, sử dụng PA0: 6 cho địa chỉ và PA7 làm đầu vào. Do đó, tôi có thể có tối đa 128 đầu vào chỉ từ một PORT.
Bây giờ, vì người dùng sẽ vận hành hệ thống thông qua máy tính (sử dụng RS232), nên có thể thêm hoặc xóa cảm biến, vì vậy hệ thống phải theo dõi địa chỉ nào miễn phí để thêm cảm biến và địa chỉ nào cần đọc.
Tôi đã nghĩ đến việc sử dụng một mảng boolean 128 bit làm cờ để cho biết nếu có một cảm biến tại một địa chỉ nhất định.
Mặc dù C không có hỗ trợ riêng cho các biến bit đơn, nhưng có thể sử dụng bitfield để đóng gói tối đa 8 "biến bool" vào một char không dấu.
Vì vậy, tôi đã tạo cấu trúc sau:
typedef struct bool_s{
uint8_t bit1:1;
}bool_t;
Sau đó, tôi đã tạo ra một mảng loại bool_t với kích thước 128, hy vọng rằng mọi thứ sẽ được đóng gói độc đáo với nhau, nhưng sizeof()
cho tôi biết rằng kích thước mảng là 128 byte thay vì 16 byte tôi mong đợi.
Về mặt kỹ thuật, tôi có thể tạo một cấu trúc đơn với 128 biến 1 bit:
typedef struct Flag_s{
uint8_t F1:1;
uint8_t F2:1;
uint8_t F3:1;
[...]
uint8_t F128:1;
}Flag_t;
Vấn đề với cách tiếp cận này là trong khi nó làm giảm việc sử dụng bộ nhớ, nó không thực tế để sử dụng và nó chiếm quá nhiều bất động sản trong mã.
Có cách nào dễ dàng để tạo ra một số lượng lớn cờ hoặc tôi yêu cầu quá nhiều không? Ý tôi là, không giống như việc tiết kiệm 112 byte sẽ tạo ra sự khác biệt lớn khi bạn có sẵn 2K, nhưng nếu tôi cần nhiều cờ hơn thì sao?