Các thanh ghi và cổng AVR có cần được khởi tạo về 0 không?


9

Trong quá trình khởi tạo mã của tôi, tôi sử dụng để làm những việc như:

clr    r0  ; will always stay zero

và:

out    PORTA, r0; initialize ports
out    DDRA, r0
out    PORTB, r0
...

Đây có thực sự cần thiết? Hoặc tôi có thể chắc chắn điều này được thực hiện tự động khi thiết lập lại? Đặc biệt, tôi có thể dựa vào tất cả các cổng được đặt làm đầu vào theo mặc định để không có vấn đề gì với các biểu quyết bên ngoài khi không có mã nào được thực thi không?

Câu trả lời:


6

Các cổng I / O của một AVR được đặt thành INPUT / Tri-State / Hi-Z (DDRx = 0x00) khi được đặt lại. Hầu hết các vi điều khiển (nếu không phải tất cả?) Có hành vi này. Đây là trạng thái an toàn nhất để ghim vào. Vì vậy, bạn có thể dựa vào các cổng để được đặt tự động làm đầu vào.

Một số trích đoạn một ATmega16 hiển thị chính xác rằng:

nhập mô tả hình ảnh ở đây

Các chân của Cổng C được xác định ba lần khi điều kiện đặt lại bắt đầu hoạt động, ngay cả khi đồng hồ không chạy.


1
Đây chính xác là những gì tôi đang tìm kiếm :)
Stefan Paul Noack

theo như tôi nhớ, nếu bạn để một đầu vào nổi, bạn sẽ có nhiễu ngẫu nhiên trên nó, vì vậy trạng thái ban đầu có thể bằng 0, không sao, nhưng nó có thể trở thành số không sau chu kỳ xung nhịp đầu tiên.
mouseuz

@miceuz Điểm không phải là có đầu ra ở trạng thái không xác định . Chúng có thể có tác dụng không mong muốn đối với mạch ngoài được kết nối với vi điều khiển
m.Alin

1
@miceuz bạn đang tham khảo các thanh ghi đầu vào cổng, phải không? chúng có N / A là trạng thái ban đầu của chúng (điều này có ý nghĩa, vì chúng chỉ phản ánh bất cứ điều gì được áp dụng cho pin). Nhưng tôi đã tham khảo các thanh ghi hướng dữ liệu. Tôi chỉ muốn chắc chắn rằng tôi vô tình có cổng được đặt làm đầu ra, có thể xung đột với điện áp được áp dụng cho pin.
Stefan Paul Noack

oh yeah, thực sự, xin lỗi vì tiếng ồn ..
mouseuz

4
  • Khởi tạo cổng LUÔN LUÔN là một ý tưởng tốt, bất kể bảng dữ liệu nói gì.

  • Nếu bảng dữ liệu không nói gì thì đó là một ý tưởng cực kỳ quan trọng.


Bạn chỉ cần xác định nội dung dữ liệu cổng nếu bạn quan tâm đến những gì sẽ xảy ra khi chương trình của bạn chạy.

Nếu bạn không quan tâm đến kết quả, bạn không phải thiết lập các bit dữ liệu cổng :-).

Nếu các nhà sản xuất nói rõ ràng trong các bảng dữ liệu rằng các bit dữ liệu cổng được thiết lập hoặc bị xóa thì họ có thể NHƯNG đó là một ý tưởng thực sự tốt để tự khởi tạo chúng. "Điều kiện biên" là nơi hầu hết mọi thứ đều sai - ví dụ: bắt đầu một vòng lặp, kết thúc một vòng lặp, vòng đệm bao quanh điểm tròn, .... Khởi động bộ xử lý là một phần cứng tương đương. Trong một thế giới thực với tiếng ồn và sự cố và những người trong đó, chịu trách nhiệm về số phận chương trình của bạn nhiều nhất có thể là một ý tưởng thực sự tốt. Khởi tạo cổng là một phần dễ dàng của việc này.


Hoàn toàn đồng ý. Tôi chỉ hình dung rằng thay vì thiết lập lại phần cứng, có thể có một bước nhảy để bắt đầu chương trình hoặc - điều gần đây đã xảy ra với tôi khi nhảy gián tiếp gặp trục trặc - Bộ đếm chương trình chỉ tràn và đạt 0x0000 một lần nữa. Ai biết được các cảng sẽ ở trạng thái nào sau đó ...
Stefan Paul Noack

1

Cả thanh ghi và SRAM đều không được khởi tạo khi thiết lập lại, chỉ một số thanh ghi ngoại vi. Bạn nên khởi tạo những thứ bạn sử dụng.


Bạn có biết hoặc có một liên kết đến việc mất các thanh ghi ngoại vi này áp dụng cho? Tôi đã tìm thấy 'giá trị ban đầu' cho một số, chẳng hạn như UCSRCtrong biểu dữ liệu. Còn các cổng I / O, đặc biệt là hướng dữ liệu thì sao?
Stefan Paul Noack

2
Cổng I / O được đặt thành đầu vào. Đó là tất cả trong bảng dữ liệu.
Leon Heller

@LeonHeller oh cảm ơn, bây giờ tôi thấy nó. Ngay trong mô tả đăng ký. Tôi bằng cách nào đó đã bỏ lỡ điều đó ...
Stefan Paul Noack

@ noah1989, Leon là chính xác, các giá trị ban đầu cho các thanh ghi ngoại vi luôn được chỉ định bên dưới trực quan hóa của thanh ghi (hoặc bất cứ hình ảnh nào có tên của các bit riêng lẻ được gọi :)).
avakar
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.