Mengapa saya pertama-tama harus menetapkan nilai dan kemudian arah GPIO dalam prosesor tertanam?

16

Saya memiliki pekerjaan penuh waktu sebagai insinyur firmware. Saya baru-baru ini diberi tugas untuk meninjau konfigurasi GPIO dan mengubah pengaturan sesuai kebutuhan. Saya menemukan beberapa pin yang salah dikonfigurasi sehingga secara alami saya mengkonfigurasi ulang mereka, namun saya diberitahu saya melakukannya dengan urutan yang salah. Inilah yang saya bicarakan:

Sebelum:
GPIO1.direction = INPUT;

Setelah:
GPIO1.direction = OUTPUT;
GPIO1.value = 0;

Namun selama ulasan kode saya telah diberitahu bahwa saya perlu mengubah urutan inisialisasi menjadi sebagai berikut:

GPIO1.value = 0;
GPIO1.direction = OUTPUT;

Dengan kata lain atur nilainya terlebih dahulu lalu tetapkan arah pin. Saya juga telah diberitahu bahwa ini adalah bagaimana harus pada prosesor modern karena mereka menggunakan dua register, satu untuk input dan satu untuk output, namun prosesor lama hanya menggunakan satu register, sehingga urutan operasi tidak masalah.
(Catatan: Modern = ARM Cortex M3 dan di atasnya, Old = Intel 8051)

Saya meminta penjelasan yang lebih baik di tempat kerja, tetapi saya tidak bisa mendapatkan jawaban yang baik. Itu sebabnya saya memutuskan untuk bertanya di sini.

Jadi inilah pertanyaanku:

  1. Mengapa urutan inisialisasi penting pada prosesor baru?
  2. Mengapa urutan inisialisasi tidak masalah pada prosesor lama?
  3. Dua register apa yang mereka bicarakan dalam prosesor modern?
  4. Apa register tunggal yang mereka bicarakan pada prosesor lama?

Jika seseorang bisa memberikan semacam diagram, itu akan lebih baik.

flashburn
sumber
1
Prosesor "modern" dan "Lama" terlalu kabur untuk memberikan jawaban yang bermanfaat. Arsitektur yang berbeda memiliki pengaturan register yang berbeda; tanpa mengetahui mana yang Anda bicarakan tidak ada cara untuk mengomentari mereka dengan cerdas.
Nick Johnson
@ IgnacioVazquez-Abrams Tidak, tidak juga. Ada insinyur yang sangat berpengalaman di ruangan itu yang mengatakan bahwa Anda akan memiliki gangguan pada saluran jika dilakukan dengan cara saya.
Flashburn
@NickJohnson Modern = ARM Cortex M4 dan di atasnya, Old = Intel 8051.
flashburn
@BrianDrummond LOL. Penjelasan yang sangat bagus. Tapi bagaimana dengan prosesor lama, 8.051 misalnya. Mengapa ini tidak masalah bagi mereka?
Flashburn
2
Q4 akan lebih mudah untuk menjawab dengan tautan lembar data.
pjc50

Jawaban:

22

8051 asli menggunakan apa yang disebut port output pseudo-bidirectional (drain terbuka dengan pullup), jadi sebenarnya tidak ada pengaturan arah port.

Tentu saja untuk port keluaran dua arah benar modern, lebih baik memiliki nilai yang ditetapkan sebelum mengaktifkan pin port untuk output, karena jika tidak, Anda dapat memiliki transien pada output yang dapat melakukan sesuatu yang tidak diinginkan.

Lihat jawaban saya di sini , misalnya.

Sunting: Berikut adalah struktur pin I / O untuk mikrokontroler CMOS modern (relatif) :

masukkan deskripsi gambar di sini

TRIS (TRIState) disebut DDR (Data Direction Register) di banyak micros lainnya. Dalam hal ini, jika output kait TRIS tinggi maka kedua transistor 'mati', tetapi port masih dapat dibaca.

Berikut adalah struktur pin I / O yang sedikit lebih rumit untuk Microchip micro yang lebih baru .

masukkan deskripsi gambar di sini

Sekali lagi, kait TRIS menonaktifkan output. Yang ini termasuk kait LAT yang membantu menghindari masalah baca-modifikasi-tulis . Pada seri PIC Anda harus menulis ke register LAT saja (dan membaca dari register PORT).

Berikut adalah sirkuit internal I / O pin port 8051 dan CMOS 8051 klasik yang asli (dari sumber ini ):

masukkan deskripsi gambar di sini

Ada sedikit kerumitan ekstra dalam hal ada transistor percepatan paralel dengan pull-up yang secara singkat dihidupkan untuk mengatasi kapasitansi eksternal. Seperti yang Anda lihat, tidak ada kontrol TRIS / DDR sama sekali. MOSFET pull-up yang digunakan dalam operasi normal adalah 'lemah' - mereka cukup kecil (Id rendah) sehingga output eksternal yang terhubung ke pin dapat menarik garis port pseudo-bidirectional rendah.

Spehro Pefhany
sumber
Terima kasih untuk penjelasannya. Saya belum pernah bekerja dengan perangkat keras sehingga saya sulit memahami penjelasan dari deskripsi. Maukah Anda memberikan gambar? Katakanlah bagaimana perangkat keras konfigurasi pin akan terlihat pada prosesor modern vs bagaimana tampilannya pada 8.051? Aku akan sangat menghargainya.
Flashburn
Apa yang Anda maksud dengan perangkat keras? Sirkuit GPIO internal chip?
Spehro Pefhany
Itu benar. Semacam diagram akan sangat membantu.
Flashburn
16

Jika Anda menetapkan arah terlebih dahulu, pin akan secara singkat dikonfigurasikan ke output apa pun nilai outputnya saat ini. Jika Anda menetapkan nilai terlebih dahulu, ini tidak akan terjadi.

Jadi, melakukannya dengan cara yang Anda anjurkan untuk menghindari gangguan pada output, yang bisa berkisar dari tidak berbahaya hingga bencana, tergantung pada apa yang terhubung dengan pin.

Nick Johnson
sumber
Terima kasih. Jadi bagaimana dengan prosesor lama, mengapa ini tidak masalah bagi mereka? Lama = Intel 8051
flashburn
Saya tidak terbiasa dengan 8051. Berdasarkan apa yang dikatakan kolega Anda, jika register yang sama mengkonfigurasi arah dan nilai, itu tidak masalah karena kompiler akan mengoptimalkan dua tulisan menjadi satu.
Nick Johnson
2
mungkin masih akan menjadi kebiasaan yang baik untuk melakukannya dengan cara "baru" ini untuk prosesor lama juga karena alasan di atas. Orocessor yang berbeda mungkin memiliki persyaratan yang berbeda, vendor yang berbeda mungkin memberikan saran yang lebih baik daripada yang lain, dan perusahaan / pengusaha / tim yang berbeda mungkin memiliki kebijakan yang berbeda tentang perincian tersebut.
billt
2
memang ... selalu menganggap DIO terhubung ke laser malapetaka;)
Michael
4

Dengan asumsi arah default adalah input (yaitu High-Z, yang masuk akal karena kami tidak ingin MCU memaksakan nilai pada jalur yang terhubung), urutan pengaturan port ini lebih disukai tetapi tidak perlu. Sebenarnya diperlukan ketika aplikasi Anda mengharuskan pada saat startup nilai port tidak akan, katakanlah 1. Kemudian Anda akan mengatur nilainya ke 0dan kemudian mengubah arah. Dalam hal ini Anda menghindari kemungkinan "kesalahan" sesaat antara pengaturan arah dan nilai, yang mungkin menghasilkan lonjakan pada pin itu. Dan memang benar untuk semua prosesor yang memiliki logika seperti itu, tidak hanya yang baru.

Eugene Sh.
sumber