T: Dapatkah masing-masing pin port yang berbeda dari mikrokontroler dipetakan ke register dan nilainya diubah ketika mengubah nilai register?
Skenario: Saya telah menggunakan beberapa pin dari setiap port (8-bit) dari micro-controller. Sekarang saya ingin menghubungkan perangkat yang membutuhkan bus 8-bit (misalkan D0 ke D7 DALAM URUTAN) artinya saya membutuhkan 8 pin dari pengontrol sehingga saya dapat menghubungkannya dalam mode satu-ke-satu
portx0 -> D0 // x is the name of port followed by bit location on that port
portx1 -> D1
...
portx7 -> D7
tetapi saya tidak memiliki seluruh port 8 pin yang dapat saya hubungkan dengan perangkat ini, tetapi saya memiliki beberapa pin dari portx, beberapa dari porty dan beberapa pin dari portz. Skenario koneksi baru adalah as (masing-masing koneksi dari mikrokontroler ke perangkat)
portx0 -> D0
portx1 -> D1
portx2 -> D2
porty4 -> D3
porty5 -> D4
porty6 -> D5
porty7 -> D6
portz1 -> D7
Dalam kondisi ini jika saya ingin mengirim nilai katakanlah
unsigned char dataReg = 0xFA;
ke perangkat saya dari controller saya harus melakukan operasi sedikit bijak pada nilai yang akan dikirim dan mengatur setiap pin sesuai dengan nilai dalam register secara individual. Sebagai contoh
portx0 = ((dataReg & 0x01) >> 0 ); // Masking and shifting as bit position
portx1 = ((dataReg & 0x02) >> 1 );
portx2 = ((dataReg & 0x04) >> 2 );
porty4 = ((dataReg & 0x08) >> 3 );
porty5 = ((dataReg & 0x10) >> 4 );
porty6 = ((dataReg & 0x20) >> 5 );
porty7 = ((dataReg & 0x40) >> 6 );
portz1 = ((dataReg & 0x80) >> 7 );
Sekarang, sampai pada pertanyaan utama, untuk menghindari kalkulasi individual ini pada setiap bit pada port yang berbeda, bisakah pin individual port yang berbeda dari mikrokontroler dipetakan ke register dan nilainya diubah ketika mengubah nilai register?
Jawaban:
Tampaknya pertanyaan Anda bermuara pada memiliki nilai 8 bit di firmware, dan ingin membaca dan menulis itu dari dan ke koleksi pin port yang sewenang-wenang.
Tidak ada cara perangkat keras langsung untuk melakukan ini. Anda harus menulis dua rutinitas, satu untuk membaca nilai 8 bit dan satu lagi untuk menuliskannya. Yang lain menyebutkan menggunakan serikat pekerja, tapi itu ide yang buruk. Dengan serikat pekerja, Anda harus berurusan dengan setiap bit secara terpisah, dan kode menjadi tergantung pada urutan bit mikro. Ini mungkin cara untuk tetap pergi jika semua 8 bit tersebar sepenuhnya secara independen. Jika demikian, ada sedikit yang dapat Anda lakukan selain membuat kode khusus untuk setiap bit.
Cara yang lebih baik untuk melakukan ini, terutama jika Anda dapat mengelompokkan bit dalam beberapa potongan yang berdekatan pada port fisik adalah dengan menggunakan masking, shifting, dan ORing. Sebagai contoh, jika tiga bit rendah dari byte internal berada pada bit <6-4> dari port, geser kanan nilai port sebesar 4 dan DAN dengan 7 untuk mendapatkan bit-bit itu ke posisi akhir. Shift dan mask (atau mask dan shift) bit dari port lain ke tempatnya dan kumpulkan byte 8 bit terakhir dengan ORing hasilnya ke dalamnya.
Jenis twiddling bit level rendah ini lebih mudah dilakukan di assembler daripada C. Saya mungkin akan menempatkan byte membaca dan menulis rutin dalam modul assembler tunggal dan membuat antarmuka dapat dipanggil dari C.
sumber
Secara umum ini tidak mungkin. Sejauh yang saya tahu, itu tidak mungkin dengan PICs.
Hanya ada satu mikrokontroler yang saya tahu yang bisa melakukan ini, Cypress PSoC . Ini adalah sistem yang sangat dapat dikonfigurasi pada chip. Dari banyak hal yang dapat Anda lakukan adalah mendefinisikan register Anda sendiri (1-8 bit) dan menghubungkannya ke pin yang Anda suka, atau bahkan ke sirkuit internal.
Sebagai contoh, di sini saya telah membuat register kontrol 6-bit. 5 bit langsung ke pin, sedangkan bit ke-6 saya gunakan untuk XOR dengan input dari pin ke-7.
Pada chip, saya dapat memilih untuk mengalokasikan pin ini ke salah satu pin GPIO yang tersedia. (Ini yang abu-abu satu gambar)
sumber
Anda dapat mencoba yang berikut ini. Tulis struktur Anda sendiri yang memetakan ke pin masing-masing dari 2 port (yang akan digunakan) Sekarang memperbarui nilai dalam register ini akan mengatur / mengatur ulang pin dari 2port tersebut. Coba dan beri tahu kami jika itu berhasil !!
Saya yakin ini harus berhasil.
sumber
Jika saya memahami pertanyaan dengan benar, cukup mudah di C:
Deklarasi tipe umum, dapat digunakan kembali untuk register apa pun:
Jadi, untuk menentukan port yang ingin kita atasi:
Dan untuk secara langsung memutar pin di port itu:
Dalam kode:
Seluruh daftar:
Layak dibaca pada struct, serikat pekerja, typedefs dan enum - semua ini membuat hidup jadi lebih baik dalam embedded & secara umum!
sumber