Apakah register dan port AVR perlu diinisialisasi ke nol?


9

Selama rutin inisialisasi kode saya saya gunakan untuk melakukan hal-hal seperti:

clr    r0  ; will always stay zero

dan:

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

Apakah ini sebenarnya perlu? Atau dapatkah saya yakin ini dilakukan secara otomatis setelah reset? Terutama, dapatkah saya mengandalkan semua port untuk ditetapkan sebagai input secara default sehingga tidak ada masalah dengan pemilihan eksternal ketika tidak ada kode yang dieksekusi?

Jawaban:


6

Port I / O dari AVR diatur ke INPUT / Tri-State / Hi-Z (DDRx = 0x00) setelah reset. Sebagian besar mikrokontroler (jika tidak semua?) Memiliki perilaku ini. Ini adalah kondisi teraman untuk masuknya pin. Jadi ya, Anda bisa mengandalkan port yang akan diatur secara otomatis sebagai input.

Beberapa kutipan acara ATmega16 persis seperti itu:

masukkan deskripsi gambar di sini

Pin Port C adalah tri-dinyatakan ketika kondisi reset menjadi aktif, bahkan jika jam tidak berjalan.


1
Ini persis seperti yang saya cari :)
Stefan Paul Noack

sejauh yang saya ingat, jika Anda membiarkan input mengambang, Anda mendapatkan suara acak di atasnya, jadi keadaan awal bisa nol, itu ok, tapi mungkin menjadi nol setelah siklus clock pertama.
miceuz

@ miceuz Intinya adalah untuk tidak memiliki output dalam keadaan tidak dikenal . Mereka mungkin memiliki efek yang tidak diinginkan pada sirkuit eksternal yang terhubung ke mikrokontroler
m .lin

1
@ miceuz Anda merujuk ke register input port, kan? ini memiliki N / A sebagai keadaan awal mereka (yang masuk akal, karena mereka hanya mencerminkan apa pun yang diterapkan pada pin). Tapi saya merujuk ke register arah data. Saya hanya ingin memastikan saya tidak sengaja mengatur port sebagai output, mungkin bertentangan dengan voltase yang diterapkan pada pin.
Stefan Paul Noack

oh ya, sungguh, maaf untuk kebisingannya ..
miceuz

4
  • Inisialisasi port SELALU adalah ide yang baik, terlepas dari apa yang dikatakan lembar data.

  • Jika datasheet tidak mengatakan apa-apa maka itu adalah ide yang sangat vital.


Anda hanya perlu menentukan konten data port jika Anda peduli tentang apa yang akan terjadi ketika program Anda berjalan.

Jika Anda tidak peduli dengan hasilnya, Anda tidak perlu mengatur bit data port :-).

Jika pabrikan mengatakan secara eksplisit di lembar data bahwa bit data port diatur atau dihapus maka mereka mungkin TETAPI itu MASIH merupakan ide yang sangat bagus untuk menginisialisasinya sendiri. "Batas kondisi" adalah di mana sebagian besar kesalahan - misalnya mulai dari satu lingkaran, akhir dari satu lingkaran, penyangga melingkar membungkus titik bulat, .... Startup prosesor adalah perangkat keras yang setara. Dalam dunia nyata dengan kebisingan dan gangguan dan orang-orang di dalamnya, bertanggung jawab atas program Anda sebanyak yang Anda bisa adalah ide yang sangat bagus. Inisialisasi port adalah bagian yang mudah untuk ini.


Sepenuhnya disetujui. Saya baru saja membayangkan, bahwa alih-alih pengaturan ulang perangkat keras, mungkin ada lompatan ke awal program atau - apa yang baru-baru ini terjadi pada saya ketika lompatan tidak langsung salah - Program Counter hanya meluap dan mencapai 0x0000 lagi. Siapa yang tahu seperti apa port setelahnya ...
Stefan Paul Noack

1

Baik register maupun SRAM diinisialisasi setelah reset, hanya beberapa register periferal. Anda harus menginisialisasi hal-hal yang Anda gunakan.


Apakah Anda tahu atau memiliki tautan ke register periferal yang hilang ini? Saya menemukan 'nilai awal' untuk beberapa seperti UCSRCdi lembar data. Bagaimana dengan port I / O, terutama arah data?
Stefan Paul Noack

2
Port I / O diatur ke input. Semuanya ada di lembar data.
Leon Heller

@LeonHeller oh terima kasih, sekarang saya melihatnya. Di sana, di deskripsi register. Saya entah bagaimana melewatkannya ...
Stefan Paul Noack

@ noah1989, Leon benar, nilai awal untuk register periferal selalu ditentukan di bawah visualisasi register (atau apa pun gambar itu dengan nama bit individual disebut :)).
avakar
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.