Tampilan efisien teks / grafik sederhana pada LCD berwarna oleh ARM

12

Saat mendesain perangkat berbasis ARM yang seharusnya menampilkan grafik sederhana pada LCD berwarna, bagaimana sebaiknya orang merancang hal-hal yang memungkinkan pembaruan cepat, lebih disukai tanpa terikat dengan vendor ARM atau LCD tertentu? Proyek saya saat ini menggunakan tampilan hitam-putih yang dapat digerakkan secepat kilat oleh port SPI pada PIC (menggambar ulang tampilan kompleks dalam 1/60 detik). Tampaknya layar LCD berwarna umum memiliki port SPI, tetapi bahkan mengisi LCD 160x120 dengan warna solid akan membutuhkan waktu 30 ms, dan 320x240 akan membutuhkan 120 ms sebagai case terbaik (shift jam 10MHz).

Jika seseorang dapat menyematkan pin pengontrol, mode paralel bisa lebih baik, tapi saya tidak tahu cara bebas keluarga untuk menghubungkan antarmuka paralel tanpa memerlukan tiga instruksi penyimpanan memori terpisah untuk setiap piksel (satu untuk mengatur data, satu untuk mengatur output jam tinggi, dan satu untuk clock rendah). Beberapa chip ARM memiliki antarmuka bus memori, tetapi sering ingin melakukan hal-hal seperti alamat dan data multipleks, atau melakukan banyak pin untuk menghasilkan bit alamat yang tidak relevan (LCD hanya perlu satu bit alamat).

Melihat ILI9320 oleh ILITEK, atau HD66789 oleh Renesas, salah satu pendekatan yang tampaknya menarik adalah menggunakan CPLD untuk mengonversi SPI ke data paralel, dan memasukkan mode yang akan menghasilkan piksel per bit. Melihat lembar data Renesas, dimungkinkan untuk mendapatkan penulisan piksel per bit dengan perangkat keras minimal (tidak diperlukan CPLD) dengan membuat semua bit data port paralel melacak pin data serial, menggunakan mode serial untuk semua hal selain piksel menulis, dan menggunakan fungsi perbandingan / topeng sehingga piksel semua-nol menjadi transparan dan piksel semua-yang akan mengatur bit yang dipilih dalam GRAM, atau piksel semua-yang akan transparan dan piksel semua-nol akan menghapus bit yang dipilih. Bagian "fitur" pada lembar data IKITEK menunjukkan bahwa ia memiliki fungsi yang serupa, tetapi register memetakan tidak

Dengan asumsi kode akan menampilkan teks dan gambar berwarna solid, pendekatan yang ideal tampaknya adalah menggunakan CPLD untuk menghubungkan port SPI ARM ke port paralel layar, dan memungkinkan CPLD dimuat dengan warna latar depan / latar belakang. Ini akan sangat baik jika seseorang memiliki sarana untuk menulis piksel "transparan". Diberi font sebagai bitmap dua warna, orang bisa dengan mudah memuat data font langsung ke port SPI; ini akan memungkinkan data font ditampilkan pada kecepatan satu piksel setiap dua jam ARM. Di sisi lain, CPLD yang cukup untuk menangani tugas kontrol tampilan seperti itu akan menelan biaya sekitar $ 2.

Apa cara terbaik untuk menghubungkan ARM dengan LCD berwarna, jika tujuannya terutama untuk menampilkan teks berwarna solid atau grafik sederhana (misalnya 16-warna atau 64-warna)?

Edit

Saya telah melakukan banyak proyek layar LCD, dengan banyak jenis LCD, termasuk LCD mode-karakter, kustom berbasis segmen multiplexed 3: 1 menggunakan metode drive saya sendiri, LCD grafis hitam dan putih dengan pengontrol bawaan, dan hitam-dan LCD putih dimana saya mendesain pengontrol berbasis CPLD saya sendiri untuk berinteraksi dengan DMA tujuan umum mikrokontroler (menyediakan empat tingkat skala abu-abu). Saya bangga membuat tampilan zippy. Salah satu pengontrol grafis adalah sedikit anjing yang membutuhkan sekitar 1/10 detik untuk refresh layar penuh bahkan ketika menulis data konstan, tetapi sebagian besar layar saya dapat membuat bahkan gambar yang cukup kompleks di bawah 1/50 detik.

Banyak proyek yang saya lakukan bertenaga baterai, jadi pengundian saat ini adalah masalah. Pengontrol tampilan berbasis DMA yang saya lakukan bekerja dengan baik, tetapi itu untuk proyek bertenaga garis. Saya percaya satu-satunya cara untuk mendapatkan hasil imbang yang wajar dari LCD grafis adalah dengan menggunakan pengontrol yang menggabungkan buffer layar dan driver kolom. Mengirim banyak tampilan antar chip setiap frame akan menghabiskan banyak energi bahkan pada tampilan bit-per-pixel tunggal; pada layar warna dengan enam belas bit per piksel, itu akan jauh lebih buruk.

Saya baru mulai melihat lembar data LCD berwarna; banyak tampilan tampaknya menggunakan pengontrol yang mirip dengan ILITEK ILI9320, meskipun semua lembar data yang saya temukan untuk pengontrol berdasarkan pada desain umum telah ditandai "pendahuluan". Beberapa seperti ILITEK satu mengklaim memiliki fitur masking dan transparansi tetapi tidak mencantumkan register untuk mereka; Saya tidak tahu apakah chip nyata memiliki fitur seperti itu tetapi lembar data "pendahuluan" lalai untuk memasukkan mereka, atau apakah mereka menghilangkan fitur tetapi lupa untuk menyebutkannya. Jika dalam praktiknya semua chip tersebut memiliki fitur transparansi, tampaknya masuk akal untuk mendesainnya; jika tidak, tidak.

Saya berharap bahwa untuk sebagian besar proyek layar tipikal akan terdiri dari teks yang ditempatkan secara sewenang-wenang dalam jumlah moderat dari font warna solid berukuran sewenang-wenang. Font kemungkinan besar akan disimpan sebagai data bit per piksel. Menggunakan Cortex-M3, jika saya ingin menulis tampilan dengan data paralel, "lingkaran dalam" kode untuk menulis dua piksel mungkin akan berakhir seperti:

  rol r0, r0, # 2; Dapatkan satu bit di C, yang lain di N
  itcs
  strhcs r1, [r3, # DATA_OFS]; Tulis data
  strhcc r2, [r3, # DATA_OFS]; Tulis data
  strb r4, [r3, # CLOCK_SET_OFS]; Atur jam tinggi
  strb r4, [r3, # CLOCK_CLR_OFS]; Atur jam rendah
  itmi
  strhmi r1, [r3, # DATA_OFS]; Tulis data
  strhpl r2, [r3, # DATA_OFS]; Tulis data
  strb r4, [r3, # CLOCK_SET_OFS]; Atur jam tinggi
  strb r4, [r3, # CLOCK_CLR_OFS]; Atur jam rendah

Bukan hal tercepat di dunia. Menghilangkan penulisan ke instruksi set / clear clock akan membantu. Dugaan saya adalah bahwa tidak ada cara arsitektur-independen yang bagus untuk menghilangkan kedua penulisan jam, tetapi mungkin ada cara yang cukup umum yang memungkinkan untuk menghilangkan satu jam (misalnya banyak chip mungkin memiliki penghitung / PWM yang dapat dibuat untuk mengirim output) singkat sebagai tanggapan terhadap operasi penyimpanan memori tunggal).

Menggunakan port SPI dan menambahkan perangkat keras ke clock satu pixel per bit akan sangat mempercepat akses tampilan. Jika menggunakan tampilan tanpa masking dan transparansi, CPLD harus menyertakan penghitung alamat, dan untuk setiap piksel mencatat kata data piksel atau perintah set-address untuk posisi piksel berikut (untuk itu diperlukan penghitung ). Sebaliknya, jika sebuah tampilan memiliki masking dan transparansi, yang perlu saya lakukan hanyalah agar CPLD mendukung mode di mana setelah itu clocked dalam 16 bit, masing-masing bit tambahan akan mencatat sebuah kata data keluar ke tampilan dengan layar. LSB melacak pin SDI (bahkan mungkin tidak perlu menggunakan CPLD - hanya beberapa chip logika normal). Saya akan mengatur warna transparansi menjadi warna yang ingin saya tulis tetapi dengan membalik LSB.

Saya tidak ingin menghasilkan desain yang indah yang mengandalkan masking dan transparansi dan kemudian menemukan bahwa satu-satunya tampilan dengan fitur seperti itu memiliki waktu tunggu 30 minggu. Di sisi lain, jika tampilan seperti itu cocok dan tetap tersedia secara luas dari banyak vendor, saya tidak ingin membiarkan paranoia tentang ketersediaan membuat saya menggunakan desain yang lebih rendah.

supercat
sumber
1
Bukan jawaban karena persyaratan Anda termasuk tidak terikat pada vendor ARM tertentu, tetapi keluarga mikrokontroler LPC LH754xx termasuk driver LCD terintegrasi.
Kevin Vermeer
@reemrevnivek: Ada sejumlah chip ARM dengan driver LCD kecil; Saya tidak bisa membayangkan setiap chip memiliki driver yang cocok untuk tampilan grafik ukuran berguna yang muncul dalam sebuah paket yang dapat digunakan dalam apa pun selain skenario chip-on-glass. Sebuah chip mungkin memiliki pengontrol, tetapi LCD dengan pengontrol chip-on-kaca akan tampak lebih hemat daya dan lebih mudah untuk dikerjakan. Saya akan memeriksa chip yang Anda sebutkan, meskipun - mungkin menarik.
supercat
@supercat - Saya sedang memikirkan LCD yang memiliki antarmuka RGB: jam pixel, sinkronisasi bingkai, dan garis kontrol sinkronisasi saluran, dengan bus data piksel paralel. Apakah Anda mengharapkan untuk menggunakan tampilan yang dikendalikan COG?
Kevin Vermeer
1
@reemrevnivek: Itulah yang saya pikirkan. Mereka tampaknya cukup umum, karena mereka digunakan di banyak perangkat bertenaga baterai portabel seperti ponsel. Tampilan COG dengan pengontrol bawaan akan jauh lebih hemat daya daripada yang membutuhkan data RGB yang terus-menerus berputar.
supercat
@reemrevnivek: Saya baru saja memperbarui pertanyaan saya dengan lebih detail.
supercat

Jawaban:

7

Masalah dengan menggunakan mikrokontroler untuk menggerakkan LCD adalah LCD membutuhkan perhatian yang konstan. Ini dapat dikurangi dengan CPLD didorong melalui SPI (tentu saja menggunakan DMA), tetapi kemudian Anda mengalami masalah lain: LCD berwarna membutuhkan banyakdata. 320x240 dalam warna hitam dan putih adalah marjinal pada 9.6KB, namun jadikan warna 24 bit dan tiba-tiba Anda harus mengirimkan data 230KB dalam 1/60 detik. (Namun, jangan lupa bahwa Anda bisa mendapatkan 4-bit, kontrol 16-warna hanya dengan mengikat rendah 20 bit ke satu pengaturan). Frame buffer 24-bit tidak lagi sesuai dengan RAM onboard pada kebanyakan mikrokontroler, dan Anda mungkin tidak punya waktu untuk membaca dari chip RAM eksternal, mengeluarkan data, dan masih melakukan pemrosesan lainnya. Mencoba melakukan ini dengan CPLD (atau FPGA) dan chip RAM memberi Anda lebih dari harga $ 2 yang menyebabkan Anda menolak keras dalam pertanyaan Anda.

Solusi tradisional untuk menghubungkan mikrokontroler dengan LCD berwarna adalah pengontrol tampilan seperti SSD1963. Berikut diagram blok yang sangat sederhana:

MCU ke buffer dan register RAM, dan dari sana ke antarmuka LCD

Input paralel ke buffer bingkai RAM besar (Terjemahan: Lebih dari $ 2) dihubungkan dengan antarmuka LCD paralel yang dapat dikonfigurasi register. Input paralel biasanya kompatibel dengan antarmuka bus memori.

Pasar LCD berwarna tidak selalu mudah ditemukan di web, biasanya hanya menjadi domain OEM saja, dengan sisanya membeli display dari perusahaan yang mengintegrasikan controller dengan display. Sumber daya terbaik yang saya temukan adalah Crystal Fontz, khususnya halaman ini tentang memilih LCD grafis . Gulir ke bawah untuk pengontrol, yang mencakup opsi berikut (catatan: Tidak semua adalah pengontrol warna):

  • Epson S1D13521B01 E Ink Broadsheet (1 modul)
  • Epson S1D13700 (11 modul)
  • Kompatibel dengan Epson SED1520 (8 modul)
  • Kompatibel dengan Himax HX8345 (1 modul)
  • Kompatibel ILITek ILI9325 (3 modul)
  • Kompatibel dengan KS0107 / KS0108 (26 modul)
  • Novatek NT7534 (14 modul)
  • Teknologi Orise OTM2201A (1 modul)
  • Teknologi Orise SPFD5420A (1 modul)
  • RAiO RA8835 (1 modul)
  • Sanyo LC7981 (13 modul)
  • Sino Wealth SH1101A (2 modul)
  • Sitronix ST7920 (29 modul)
  • Solomon SSD1303 (1 modul)
  • Solomon SSD1305 (9 modul)
  • Solomon SSD1325 (2 modul)
  • Solomon SSD1332 (1 modul)
  • Solomon SSD2119 (2 modul)
  • ST STV8105 (1 modul)
  • Toshiba T6963 (23 modul)
Kevin Vermeer
sumber
@reemrevnivek: Saya sudah memikirkan LCD berwarna dengan pengontrol bawaan. Mereka tampak cukup umum, tetapi yang saya lihat umumnya mengharapkan CPU untuk clock dalam banyak bit per pixel meskipun skenario tampilan yang umum adalah tampilan teks warna solid. Saya menerapkan pengontrol LCD grayscale 4-level berbasis DMA sekali menggunakan CPLD, dan itu bekerja dengan sangat baik, tapi itu adalah perangkat bertenaga garis.
supercat
1
@supercat - Sangat sedikit pengontrol LCD yang mengharapkan CPU untuk mencatat banyak bit per piksel untuk setiap frame. Mereka umumnya mengharapkan perangkat keras grafis khusus melakukan hal ini. Pada dasarnya, setelah Anda mendapatkan tampilan RGB yang cukup besar (yaitu> 128 * 128), daya pemrosesan yang diperlukan untuk menghasilkan gambar untuk layar cukup besar sehingga GPU jenis tertentu (bahkan jika terintegrasi ke dalam MCU) adalah cukup banyak selalu hadir.
Connor Wolf
1
@supercat - Tapi apa yang Anda gambarkan, CPLD khusus yang melakukan ASCII ke konversi raster, pada dasarnya adalah perangkat keras grafis khusus (khusus) . Saya pada dasarnya mengatakan jangan menciptakan kembali roda, dan mungkin lebih mudah dan lebih hemat biaya untuk hanya membeli MCU dengan antarmuka video built-in lalu desain sendiri.
Connor Wolf
1
Bagaimanapun, Jika Anda benar-benar ingin roll-Anda-sendiri, saya akan mengatakan menggunakan beberapa IC SRAM dual-port, dan menggunakan satu port untuk keluaran ke LCD, dan yang lainnya untuk MCU. Ini memungkinkan MCU mengubah isi memori pada kecepatan apa pun yang diinginkannya, dan LCD dapat berjalan pada kecepatan refreshnya.
Connor Wolf
1
@Fake Name: Bukan ASCII untuk konversi raster. Ini pada dasarnya akan menjadi konversi bit-per-pixel ke multibit per-pixel. Saya pikir Anda salah memahami apa yang saya lihat. Saya tidak mencari display yang hanya memiliki driver , tetapi yang termasuk driver dan controller , jadi mereka hanya perlu diberi makan data ketika hal-hal di layar berubah.
supercat