ARM'den renkli LCD'de basit metin / grafiklerin verimli görüntülenmesi


12

Renkli bir LCD'de basit grafikler göstermesi gereken ARM tabanlı bir cihaz tasarlarken, tercihen belirli bir ARM veya LCD satıcısına bağlı kalmadan hızlı güncellemelere izin vermek için bir şeyler tasarlamak en iyi nasıl yapılmalıdır? Şu anki projem, bir PIC üzerindeki bir SPI bağlantı noktası (1/60 saniyede karmaşık bir ekranı yeniden çizerek) yıldırım hızında sürülebilen siyah beyaz bir ekran kullanıyor. Ortak renkli LCD ekranların bir SPI portu var gibi görünüyor, ancak 160x120 LCD'yi düz bir renkle doldurmak bile 30ms alacak ve 320x240 en iyi 120ms (10MHz vites saati) alacaktı.

Denetleyici pimlerini yedekleyebilirseniz, paralel mod daha iyi olabilir, ancak her piksel için üç ayrı bellek deposu talimatı gerektirmeden paralel arabirimi bağlamak için aileden bağımsız herhangi bir yöntem bilmiyorum (verileri ayarlamak için bir, biri saat çıkışını yüksek, diğeri ise düşük saat). Bazı ARM yongalarının bellek veri yolu arabirimleri vardır, ancak bunlar genellikle multipleks adres ve veri gibi şeyler yapmak veya alakasız adres bitlerini çıkarmak için çok fazla iğne yapmak isterler (LCD'nin sadece bir adres bitine ihtiyacı vardır).

ILITEK tarafından ILI9320'ye veya Renesas tarafından HD66789'a bakıldığında, ilginç görünen bir yaklaşım, SPI'yı paralel verilere dönüştürmek için bir CPLD kullanmak ve bit başına bir piksel çıkaran bir mod içermektir. Renesas veri sayfasına bakıldığında, piksel hariç her şey için seri modu kullanarak, tüm paralel bağlantı noktası veri bitlerini seri veri pinini izleyerek minimum donanımla (CPLD gerekmez) bit başına piksel yazma elde etmek mümkün olabilir. ve sıfırlama piksellerinin saydam olmasını ve hepsi piksellerin GRAM'de seçilen bitleri ayarlamasını veya hepsi piksellerin saydam olmasını ve tamamen sıfır piksellerin seçili bitleri temizlemesini sağlar. IKITEK veri sayfasının "özellikler" bölümü, benzer bir işleve sahip olduğunu gösterir, ancak kayıt haritaları

Kodun esas olarak düz renkli metin ve grafikler göstereceği varsayıldığında, ideal yaklaşım, ARM'nin SPI bağlantı noktasını ekranın paralel bağlantı noktasına bağlamak ve CPLD'nin ön plan / arka plan renkleri ile yüklenmesine izin vermek için bir CPLD kullanmak gibi görünmektedir. Bu, özellikle "saydam" pikseller yazma yöntemine sahip olsaydı güzel olurdu. İki renkli bitmap olarak bir yazı tipi verildiğinde, yazı tipi verileri doğrudan SPI bağlantı noktasına yüklenebilir; bu, yazı tipi verilerinin her iki ARM saatinde bir piksel oranında gösterilmesini sağlar. Öte yandan, böyle bir ekran kontrol görevini yerine getirmek için yeterli bir CPLD'nin maliyeti yaklaşık 2 $ 'dır.

Amaç, düz renkli metin veya basit (örn. 16 renkli veya 64 renkli) grafikler göstermekse, bir ARM'yi renkli LCD ile arayüzlemenin en iyi yolu nedir?

Düzenle

Karakter modu LCD'ler, kendi sürücü yöntemimi kullanarak özel 3: 1 çok katlı segment tabanlı, yerleşik denetleyicilere sahip siyah beyaz grafik LCD'ler ve siyah beyaz dahil olmak üzere birçok LCD ekran ile birçok LCD ekran projesi yaptım. - kendi CPLD tabanlı kontrol cihazımı mikrodenetleyicinin genel amaçlı DMA'sı ile arabirim oluşturmak üzere tasarladığım beyaz LCD'ler (hatta dört seviyeli gri tonlama sağlar). Ben ekranlar zippy yapmaktan gurur duyuyorum. Grafik denetleyicilerinden biri, sabit veriler yazarken bile tam ekran yenilemesi için yaklaşık 1/10 saniye gerektiren bir köpekti, ancak ekranlarımın çoğu 1/50 saniyenin altında oldukça karmaşık bir görüntü bile oluşturabilir.

Yaptığım projelerin çoğu pille çalışıyor, bu nedenle mevcut çizim bir sorundur. DMA tabanlı ekran denetleyicisi iyi çalıştım, ancak hat destekli bir proje içindi. Grafik LCD'den makul akım çekimi almanın tek yolunun, ekran arabelleğini ve sütun sürücülerini birleştiren bir denetleyici kullanmak olduğuna inanıyorum. Yongalar arasında çok sayıda ekran göndermek, piksel başına tek bir bit ekranda bile çok fazla enerji harcar; piksel başına on altı bitlik renkli bir ekranda çok daha kötü olurdu.

Sadece renkli LCD veri sayfalarına bakmaya başladım; birçok ekran ILITEK ILI9320'ye benzer bir kontrolör kullanıyor gibi gözükse de, bu genel tasarıma dayalı kontrolörler için bulduğum tüm veri sayfaları "ön" olarak işaretlenmiştir. ILITEK gibi bazıları maskeleme ve şeffaflık özelliklerine sahip olduklarını iddia ediyorlar, ancak bunlar için herhangi bir kayıt listelemiyorlar; Gerçek çiplerin böyle özelliklere sahip olup olmadığını bilmiyorum ama "ön" veri sayfaları onları dahil etmeyi ihmal ettiler mi, yoksa özellikleri atlayıp atmadıklarını mı, yoksa bunlardan bahsetmeyi unuttular mı? Pratikte bu tür tüm yongaların şeffaflık özellikleri varsa, onlar için tasarım yapmak makul görünecektir; değilse, değil.

Çoğu proje için tipik bir ekranın, rastgele sayıda düz boyutlu yazı tiplerinde rastgele yerleştirilmiş metinlerden oluşmasını beklerim. Yazı tipleri büyük olasılıkla piksel başına bit verisi olarak depolanır. Bir Cortex-M3 kullanarak, ekranı paralel verilerle yazmak istersem, iki piksel yazmak için kodun "iç döngüsü" muhtemelen şöyle bir şey ortaya çıkarır:

  rol r0, r0, # 2; C'den bir bit, N'de bir bit alın
  ITCS
  strhcs r1, [r3, # DATA_OFS]; Veri yazma
  strhcc r2, [r3, # DATA_OFS]; Veri yazma
  strb r4, [r3, # CLOCK_SET_OFS]; Saati yükseğe ayarla
  strb r4, [r3, # CLOCK_CLR_OFS]; Saati düşük olarak ayarla
  itmi
  strhmi r1, [r3, # DATA_OFS]; Veri yazma
  strhpl r2, [r3, # DATA_OFS]; Veri yazma
  strb r4, [r3, # CLOCK_SET_OFS]; Saati yükseğe ayarla
  strb r4, [r3, # CLOCK_CLR_OFS]; Saati düşük olarak ayarla

Tam olarak dünyadaki en hızlı şey değil. Ayarlanan / temizlenen saat yönergelerindeki yazımların kaldırılması yardımcı olacaktır. Tahminimce, her iki saat yazımını da ortadan kaldırmak için mimariden bağımsız güzel bir yol yoktur, ancak birini ortadan kaldırmaya izin verecek oldukça yaygın bir yol olabilir (örneğin, birçok çipin bir çıkışı atmak için bir sayaç / PWM olabilir. tek bir bellek saklama işlemine yanıt olarak).

SPI bağlantı noktasını kullanmak ve bit başına bir pikseli saatlemek için donanım eklemek ekran erişimini büyük ölçüde hızlandıracaktır. Maskeleme ve saydamlık içermeyen bir ekran kullanılıyorsa, CPLD'nin bir adres sayacı içermesi gerekir ve her piksel için bir piksel verisi kelimesi veya aşağıdaki pikselin konumu için bir set adresi komutu (bunun için bir sayacı olması gerekir) ). Aksine, bir ekranın maskeleme ve şeffaflığı olsaydı, tek yapmam gereken CPLD'nin 16 bitte saatten sonra, her ek bitin ekrana bir veri saati SDI pinini takip eden LSB (bir CPLD kullanmak gerekli olmayabilir - sadece birkaç normal mantık yongaları). Saydamlık rengini yazmak istediğim renge ayarladım, ancak LSB ters çevrilmişti.

Maskeleme ve şeffaflığa dayanan güzel bir tasarım bulmak istemiyorum ve sonra sadece bu tür özelliklere sahip ekranların 30 haftalık teslim süresine sahip olduğunu keşfetmek istiyorum. Öte yandan, bu tür ekranlar pek çok tedarikçiden olmaya ve yaygın olarak mevcut olmaya devam ederse, kullanılabilirlikle ilgili paranoyaların beni daha düşük bir tasarım kullanmaya itmesine izin vermek istemiyorum.


1
Gereksinimleriniz belirli bir ARM satıcısına bağlı olmamayı içerdiğinden LPC LH754xx mikrodenetleyici ailesi entegre bir LCD sürücüsü içerir.
Kevin Vermeer

@reemrevnivek: Küçük LCD sürücülerine sahip bir dizi ARM yongası var; Camda bir çip senaryosu dışında herhangi bir şeyde kullanılabilecek herhangi bir yararlı boyutta grafik ekran için uygun bir sürücüye sahip herhangi bir çip hayal edemiyorum. Bir çipin bir denetleyicisi olabilir, ancak cam üzerindeki bir yonga denetleyicisine sahip bir LCD daha güç tasarruflu ve daha kolay çalışabilir gibi görünebilir. Bahsettiğin çipi kontrol edeceğim - ilginç olabilir.
supercat

@supercat - RGB arabirimi olan LCD'leri düşünüyorum: piksel saat, kare senkronizasyonu ve hat senkronizasyonu kontrol çizgileri, paralel piksel veri yolu. COG kontrollü bir ekran kullanmayı bekliyor musunuz?
Kevin Vermeer

1
@reemrevnivek: Ben de öyle düşünüyordum. Cep telefonları gibi pille çalışan birçok taşınabilir cihazda kullanıldığından oldukça yaygın görünüyorlar. Dahili denetleyiciye sahip bir COG ekranı, sürekli saatli RGB verisi gerektiren bir ekrandan çok daha verimli olacaktır.
supercat

@reemrevnivek: Sorumu daha ayrıntılı olarak güncelledim.
supercat

Yanıtlar:


7

LCD'yi sürmek için mikrodenetleyici kullanmanın sorunu, LCD'nin sürekli dikkat gerektirmesidir. Bu, SPI üzerinden yönlendirilen bir CPLD ile hafifletilebilir (elbette DMA kullanarak), ancak daha sonra başka bir sorunla karşılaşırsınız: Renkli LCD'ler çok şey gerektirirveri. Siyah beyaz 320x240, 9.6KB'de marjinaldir, ancak 24 bit renkte yapın ve aniden saniyenin 1 / 60'ında 230KB veri sağlamanız gerekir. (Ancak, düşük 20 biti bir ayara bağlayarak 4 bit, 16 renk kontrolünü alabileceğinizi unutmayın). 24 bitlik bir çerçeve arabelleği artık çoğu mikro denetleyicideki yerleşik RAM'e sığmaz ve muhtemelen harici bir RAM yongasından okumak, verileri kapatmak ve yine de başka işlemler yapmak için zamanınız yoktur. Bunu bir CPLD (veya bir FPGA) ve bir RAM yongası ile yapmaya çalıştığınızda, sorunuzda tereddüt etmenize neden olan 2 $ 'lık fiyatın üzerine çıkıyorsunuz.

Mikrodenetleyiciyi renkli bir LCD ile arayüzlemek için kullanılan geleneksel çözüm, SSD1963 gibi bir ekran denetleyicisidir. İşte çok basit bir blok şeması:

MCU'dan RAM arabelleğine ve kaydedicilerine ve dolayısıyla LCD arayüzüne

Büyük bir RAM çerçeve arabelleğine paralel giriş (Çeviri: 2 $ 'dan fazla) kayıt yapılandırılabilir paralel LCD arabirimi ile arabirim. Paralel giriş genellikle bir bellek veri yolu arabirimi ile uyumludur.

Renkli LCD pazarının web'de bulunması her zaman kolay değildir, genellikle sadece OEM'lerin alanıdır ve geri kalanını denetleyiciyi ekrana entegre eden şirketlerden satın alma ekranlarıyla birlikte. Bulduğum en iyi kaynak Crystal Fontz, özellikle grafik LCD'lerin seçilmesiyle ilgili bu sayfa oldu . Aşağıdaki seçenekleri içeren denetleyiciler için aşağı doğru kaydırın (not: Hepsi renk denetleyicileri değildir):

  • Epson S1D13521B01 E Mürekkep Geniş Ekran (1 modül)
  • Epson S1D13700 (11 modül)
  • Epson SED1520 Uyumlu (8 modül)
  • Himax HX8345 Uyumlu (1 modül)
  • ILITek ILI9325 Uyumlu (3 modül)
  • KS0107 / KS0108 Uyumlu (26 modül)
  • Novatek NT7534 (14 modül)
  • Orise Technology OTM2201A (1 modül)
  • Orise Technology SPFD5420A (1 modül)
  • RAiO RA8835 (1 modül)
  • Sanyo LC7981 (13 modül)
  • Sino Wealth SH1101A (2 modül)
  • Sitronix ST7920 (29 modül)
  • Solomon SSD1303 (1 modül)
  • Solomon SSD1305 (9 modül)
  • Solomon SSD1325 (2 modül)
  • Solomon SSD1332 (1 modül)
  • Solomon SSD2119 (2 modül)
  • ST STV8105 (1 modül)
  • Toshiba T6963 (23 modül)

@reemrevnivek: Yerleşik denetleyicilere sahip renkli LCD'ler düşünüyordum. Oldukça yaygın görünüyorlar, ancak gördüklerim, ortak bir ekran senaryosu düz renkli metnin görüntülenmesine rağmen, genellikle CPU'nun piksel başına birçok bitte beklemesini bekliyor gibi görünüyor. Bir kez CPLD kullanarak DMA tabanlı 4 seviyeli gri tonlamalı bir LCD denetleyici uyguladım ve çok iyi çalıştı, ancak hatla çalışan bir cihazdı.
supercat

1
@supercat - Çok az sayıda LCD denetleyicisi, bir CPU'nun her kare için piksel başına birçok bit saatini beklemesini bekler . Genellikle özel grafik donanımlarının bunu yapmasını beklerler. Temel olarak, oldukça büyük (yani> 128 * 128) RGB ekranlara ulaştığınızda, ekran için görüntü oluşturmak için gereken işlem gücü, bir tür özel bir GPU'nun (MCU'ya entegre olsa bile) hemen hemen her zaman mevcut.
Connor Wolf

1
@supercat - Ama tarif ettiğiniz gibi, ASCII dönüşümleri raster yapmak için özel bir CPLD temelde (özel) özel grafik donanımdır . Temel olarak, tekerleği yeniden icat etmeyin ve yerleşik bir video arabirimine sahip bir MCU satın almak ve sonra kendiniz tasarlamak için muhtemelen daha kolay ve daha uygun maliyetli.
Connor Wolf

1
Her neyse, eğer gerçekten kendi başınıza dönmek istiyorsanız, birkaç çift bağlantı noktalı SRAM IC kullanın ve LCD'ye çıkış için bir bağlantı noktası, diğeri MCU için kullanın. Bu, MCU'nun bellek içeriğini istediği hızda değiştirmesini sağlar ve LCD'nin yenileme hızında çalışabilir.
Connor Wolf

1
@Fake Name: Raster dönüştürmeye ASCII olmazdı. Temel olarak piksel başına bit-piksel başına çoklubit dönüşümü olacaktır. Sanırım baktığım şeyi yanlış anlıyorsun. Sadece sürücüleri olan ekranları aramıyorum , ancak sürücüleri ve kontrolörleri içerenleri aramıyorum , bu yüzden sadece ekrandaki şeyler değiştiğinde veri beslenmesi gerekiyor.
supercat
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.