Output data multiplexing ke tampilan port paralel

Tampilan bus data multiplexing dengan output paralel dan port serial Arduino.

Artikel ini menjelaskan metode multiplexing penggunaan port D dari mikroprosesor ATMEL 328P (Arduino NANO) untuk memberikan output byte alternatif untuk tampilan dan pertukaran melalui saluran serial.

Saya entah bagaimana memasang perangkat untuk memantau tingkat karbon monoksida (CO) dari elemen yang tidak perlu - tampilan dari Nokia N95, Arduino NANO dengan port yang buruk (D3 dan D11, rusak karena korsleting yang tidak berhasil hingga +400 volt ketika men-debug generator tegangan tinggi), papan memainkan gigitan suara dan sensor karbon monoksida MQ7. Semua detail ini sampai tingkat tertentu salah (kecuali untuk sensor) dan tidak dapat ditemukan di proyek lain. Anehnya, ternyata perangkat ini sangat berguna saat menggunakan kompor di Tanah Air. Musim panas tahun 2019 ternyata tidak panas dan saya memanaskan tungku hampir setiap hari selama beberapa minggu di bulan Juli, menggabungkan kesenangan (meditasi dengan api) dengan yang berguna (mendaur ulang pohon sampah gergaji). Ternyata sangat mudah untuk mengontrol rezim pembakaran, semua manipulasi dengan flap segera tercermin dalam pembacaan perangkat, yang memungkinkan untuk mengontrol kompor dengan cerdas. Perangkat ini tidak dijelaskan dalam artikel ini, ada banyak perangkat seperti itu di Internet untuk setiap selera. Ciri khas perangkat saya adalah fungsi pemantauan kesehatan sensor CO terus menerus berdasarkan perbandingan kurva referensi yang disimpan dan diperoleh secara waktu nyata, serta laju reaksi tinggi terhadap perubahan tingkat CO yang dicapai dengan membandingkan data yang disimpan dalam siklus sebelumnya dengan yang sekarang.

Fokus artikel ini adalah pada peningkatan kecepatan prosesor dan tampilan dengan pertukaran data byte paralel.

Layar memiliki pertukaran byte paralel dan, meskipun menggunakan semua metode yang saya tahu untuk meningkatkan nilai tukar, output untuk itu ternyata agak lambat. Alasan utama adalah perlunya bit-bijaksana output byte data ke bit yang berbeda dari port yang berbeda, karena Arduino Nano tidak memiliki port full-fledged tunggal dengan lebar satu byte. Mode keluaran ini membutuhkan sekitar 8 kali lebih banyak waktu daripada menulis byte ke register. NANO memiliki port D penuh tunggal, tetapi bit paling signifikan digunakan untuk port serial perangkat keras, di mana sketsa dimuat ke dalam prosesor dan sketsa tersebut ditukar dengan mesin host.

Saya menemukan cara yang relatif sederhana untuk menggunakan output display byte-by-line. Metode ini terdiri dari penggunaan alternatif port D untuk menghasilkan data ke tampilan dan dalam pertukaran data melalui saluran serial.

Metode yang diusulkan dapat secara signifikan meningkatkan kecepatan pertukaran integral dengan tampilan (sekitar 3 kali menurut pengukuran saya). Kata "integral" berarti bahwa total waktu pelaksanaan operasi rendering layar pada tingkat makro diukur. Sangat mungkin bahwa mengukur waktu pada tingkat I / O atom akan memberikan keuntungan yang jauh lebih besar (di wilayah orde yang sama).

Pengukuran dilakukan pada model yang dirakit khusus (lihat Gambar 1) dengan cara berikut:

  1. Dalam program pengujian, cap waktu ditempatkan dengan output ke mesin host.
  2. Layar terhubung ke pin D2 - D9, sebuah program uji dimuat, di mana byte di-output dengan mendistribusikan byte demi bit.
  3. Layar terhubung ke terminal D0 - D7, program uji dimuat, di mana byte di-output menggunakan perintah data PORTD =.

gambar

gambar
Gambar 1. Foto tata letak untuk menguji multiplexing output

Program-programnya persis sama, mengganti metode keluaran dilakukan dengan mengubah nama rutinitas SendDat dan SendCom menjadi SendDat1 dan SendCom1.
Output program ke monitor seri built-in direkam dalam OneNote dan dianalisis.

gambar
Gambar 2. Mengukur waktu yang diperlukan untuk menampilkan dalam mode byte-output

gambar
Gambar 3. Pengukuran waktu layar dalam mode keluaran bit

Hasil pengukuran dirangkum dalam tabel 1.

gambar
Tabel 1. Keuntungan terintegrasi dalam nilai tukar

Kerugian dari metode yang diusulkan adalah kebutuhan untuk menggunakan perintah tambahan untuk berganti mode tampilan dan bertukar melalui port serial.
Anda juga dapat mengharapkan beberapa kesulitan saat menerima data dari mesin host, penerimaan hanya dimungkinkan dengan penyertaan eksplisit dari mode saluran serial, yang memerlukan pengaturan proses berdasarkan waktu yang jelas dalam sketsa.

Studi tentang manual prosesor memberikan informasi berikut: dimasukkannya mode port serial memotong kontrol kaki D0 dan D1 pada tingkat perangkat keras. Ini berarti bahwa upaya untuk mengendalikan kaki dari sketsa tidak akan memberikan hasil yang diinginkan.

Studi lebih lanjut tentang masalah ini menunjukkan bahwa jika Anda tidak menyertakan port serial dalam sketsa dengan perintah Serial.open (), maka seluruh port D tetap berada di tangan pengguna. Anda dapat menempatkan port ke mode keluaran di semua kaki dengan perintah DDRD = 0xFF dan output seluruh byte dengan perintah PORTD = data pada saat yang sama, di mana variabel data berisi data output.

Menempatkan port D dalam mode keluaran sudah cukup satu kali (dalam Pengaturan). Mode komunikasi serial on-off berikutnya tidak mempengaruhi mode port D - tetap dalam mode output paralel 8-bit. Ketika mode pertukaran serial dihidupkan, terminal D0 dan D1 akan masuk ke mode terima dan kirim, masing-masing. "1" akan muncul pada pin D1, terlepas dari keadaan bit D1 sebelumnya, dan "1" ini akan berada di pin ini setiap saat ketika mode transmisi serial aktif, kecuali untuk saat-saat transmisi simbol. Ketika mode transmisi serial dimatikan, output D0 dan D1 akan masuk ke status output dan sinyal dari register output akan muncul pada mereka. Jika dalam register keluaran di tempat D1 ada "0", maka tepi negatif akan dihasilkan pada output, yang akan mengarah pada transmisi karakter palsu ke saluran serial.

Sekarang mari kita pertimbangkan pertanyaan - tetapi apakah penggunaan port D akan mencegah mengunduh program? Saat program dimuat, prosesor diatur ulang oleh pulsa yang dihasilkan oleh pengontrol port USB FT232RL (atau analog CH340) ketika sinyal DTR diatur. Sinyal DTR beralih dari 1 ke 0 dan penurunan negatif melalui kapasitor me-reset prosesor. Setelah reset, prosesor menyalakan port serial, memulai bootloader, dan menerima kode program. Jadi - mengubah mode operasi port D tidak mengganggu pemuatan normal sketsa.
Jika sketsa membutuhkan output ke port serial, maka perintah Serial.open () sudah cukup sebelum perintah output.

Namun, ada kehalusan. Terdiri dari fakta bahwa input RxD dari chip FT232RL tetap terhubung ke output TxD dan data yang masuk ke layar diterima dan dikirim lebih jauh ke mesin host. Data-data ini terlihat seperti noise, meskipun pada kenyataannya tidak demikian (Gambar 4).

gambar
Gambar 4. Tampilan layar dalam mode keluaran byte tanpa pemblokiran

Ada dua cara untuk menangani sinyal yang tidak perlu ini.

Cara pertama adalah perangkat lunak. Terdiri dari fakta bahwa sketsa sebelum output menggunakan perintah Serial.println () untuk membuat baris baru sebelum output dari informasi yang berguna. Ini akan memudahkan mesin host untuk menganalisis jalur yang masuk dan menyoroti informasi yang berguna dari sketsa.

Cara kedua adalah perangkat keras. Input RxD dari FT232RL terhubung ke output TxD melalui resistor 1 kΞ©. Untuk memblokir transfer informasi, cukup sambungkan input RxD FT232RL ke "1". Untuk membuat ini cara termudah adalah salah satu kesimpulan gratis Arduino. Saya menggunakan output D8. Untuk melakukan tindakan ini, saya menyolder ke terminal 7 dari resistor RP1B dengan nilai nominal 1 kOhm kabel dengan konektor di ujungnya, melewati lubang di papan untuk fiksasi mekanis. Pada Gambar 5, koneksi ini ditunjukkan oleh garis merah, Gambar 6 menunjukkan foto titik solder.

gambar
Gambar 5. Bagian dari rangkaian Arduino Nano

gambar
Gambar 6. Tempat menyolder kawat tambahan di Arduino NANO

Mekanisme ini bekerja seperti ini: setelah reset, leg D8 berada dalam mode input impedansi tinggi dan papan Arduino tidak mengganggu operasi normal mekanisme pemuatan program ke board.

Ketika perlu untuk mulai mengontrol tampilan dalam sketsa, pin D8 beralih ke mode pin aktif, itu diatur ke "1" (ini memblokir transfer data dari pin TxD Atmel328P ke pin RxD FT232RL) dan setelah itu perintah Serial.end () dijalankan; Prosedur ini penting, karena setelah mematikan mode transmisi serial, bit D1 muncul pada pin TxD, yang disimpan dalam register keluaran port D dari catatan byte sebelumnya di port ini. Jika bit D1 adalah "0", maka ketika mode transmisi serial dimatikan, kaki prosesor akan beralih dari "1" ke "0" dan ini akan menghasilkan transmisi karakter parasit pada saluran serial.

Dalam proses debugging, ternyata kami juga harus menunggu akhir transfer seluruh buffer ke mesin host sebelum memblokir saluran serial, jika tidak beberapa data yang dikirimkan akan hilang.

Ketika sebuah sketsa perlu mengaktifkan transfer data melalui port serial, perlu untuk mengaktifkan mode transfer serial dan mematikan pemblokiran transmisi data serial dengan mengatur mode baca pada pin D8.

Untuk melakukan tugas-tugas ini, dua rutin ditambahkan ke sketsa:

void s_begin() { Serial.begin(115200); //    TxD   USART.  TxD   "1",  RxD   pinMode(8, INPUT); //    RxD FT232RL  "1",       RxD FT232RL } 

 void s_end() { Serial.flush(); //   pinMode(8, OUTPUT); //  FT232RL  "1"       .   D8_High; //    Serial.end(); //   .      TxD  RxD    D0(RxD)  D1(TxD)  D } 

Program pengujian lengkap dapat diambil di sini .

Source: https://habr.com/ru/post/id476986/


All Articles