Mikrodenetleyicimde UART'ım yok, nasıl ekleyebilirim?


13

4 aküyü seri olarak bağlayabildiğimiz ve her seferinde bir tane kullanabileceğimiz hücre dengeleme için bir tesis olan bir ATMEGA32HVB mikrodenetleyici kullanıyorum . Bu güç yönetimi için çok yararlıdır, bu yüzden farklı bir mikrodenetleyici kullanamıyorum. Seri cihazlara kolayca arayüz oluşturabilmem için lütfen bir UART eklemek için bazı yöntemler önerin.


11
User26129 tarafından tarif edildiği gibi UART yazılımına bit vuruşu denir .
Johan.A

4
Sadece çok öznel $ 0.02, ama genellikle ayrı bir özel pil denetleyicisi ve tersi yerine uC entegre UART tercih ederim. Neden uC'ye entegre pil yönetimine ihtiyacınız var?
Mels

Güneş paneli kullanarak şarj edilecek şarj edilebilir piller kullanmalıyım, bu yüzden her seferinde bir tane kullanılacak seri 4 aküye ihtiyacım var
user27475

4
Bir soru, UART'ı ne kadar kullanmak istediğiniz ve hangi yönlerde olduğudur. Sadece ara sıra bir hata ayıklama veya durum mesajı oluşturmak istiyorsanız, işlemcinizin fazladan talep altında olmadığı bir zamanda, bit beceriyor seri çıkış çok çekici görünebilir. Giriş kanalına sahip olmanın ortalama yükünü de azaltabilen pim değiştirme kesintileri kullanma gibi keneler vardır, ancak diğer gerçek zamanlı taahhütleriniz olduğunda bir seferde yüksek bir baud hızında karakterler almayı bekliyorsanız, sorun.
Chris Stratton

Yanıtlar:


17

Diğerlerinin de belirttiği gibi, UART işlevselliğini sağlamak için sisteminize ek donanım ekleyebilir veya bir yazılımda taklit edebilirsiniz. Genel donanım tasarımının kontrolüne sahipseniz ve başka bir IC eklemek bir seçenektir, donanım tabanlı yaklaşımı kesinlikle dikkate alırım. Bir yazılım UART'ı bit beceriyor kullanarak çalıştırabilirsiniz , ancak CPU kaynaklarını gerekli zamanlamayı oluşturmaya adamak istemeyebilirsiniz.

Veri sayfasına bir bakışta, mikro denetleyicinizin hem SPI hem de I2C (Atmel'in İki Telli Arabirim (TWI) olarak adlandırdığı) olduğu anlaşılıyor. Bunlar muhtemelen harici bir UART eklemek için kullanılacak en iyi arayüzler olacaktır. Bahsedilen cihazlar birkaç üreticiden temin edilebilir. Bazı örnekler:

  • Exar'da ( http://www.exar.com/connectivity/uart-and-bridging-solutions/i2c-spi-uarts ) bir dizi SPI / I2C 1- ve 2 kanallı UART cihazı vardır ve bunlar ~ 1.6- 3.3V çalışma aralığı. Bu parçalardan herhangi birini özel olarak kullanmadım, ancak geçmişte Exar cihazlarını kullandım (paralel bellek veri yolu arayüzleri ile) ve iyi çalıştılar.

  • NXP ( http://ics.nxp.com/products/bridges/i2c.spi.slave.uart.irda.gpio/ ), 1- ve 2'de de bulunan bir dizi SPI / I2C UART / IrDA / GPIO cihazına sahiptir - birkaç voltaj aralığında kanal çeşitleri. Geçmişte bu parçaları (özellikle SC16IS762) büyük bir başarıyla kullandım.

  • Maxim ( http://www.maximintegrated.com/datasheet/index.mvp/id/2052 ), SPI bağlantılı UART'lar olan MAX3110E ve MAX3111E cihazlarına sahiptir. Bu cihazların benzersiz bir özelliği, entegre bir RS-232 hat sürücüsüne sahip olmalarıdır. Bu nedenle, UART'ınızın mantık seviyeleri (örneğin bir PC) yerine RS-232 hat voltajları kullanan bir cihaza arayüz oluşturması gerekiyorsa, bu, kartınıza başka bir hat sürücüsü IC'si eklemekten kurtaracağından faydalı olabilir.


Vay canına, Maxim'in bu eşyalara sahip olduğunu bilmiyordum, yapabilseydim +2 olurdu.
Tevo D


8

Bir yazılım UART sürücüsü kullanmanız gerekecektir. Bu UART'tan tam olarak ne beklediğinize bağlı olarak, AVR305 (son derece kompakt, ancak yarı çift yönlü gönderme / alma engellemenin ötesinde hiçbir özellik yok), AVR274 (kesinti tahrikli, oldukça özellikli tamamlandı) kullanabilirsiniz, kendi yazılım UART sürücünüzü yazabilir veya internette bulduğunuz birini kullanabilirsiniz, örneğin 'avr software uart'


3

Yazılım "UART" tasarımı hakkında kısa bir not: gereksinimlere bağlı olarak en azından niteliksel olarak farklı yaklaşımlar uygulanabilir:

  • Bir "her şeyi ele geçir" bit-bang sürücüsü tüm kesmeleri devre dışı bırakır ve her biti saatlemek için döngü sayımı kodunu kullanır. "Her şeyi ele geçir" sürücüsü ile veri almak, veri geldiğinde denetleyicinin beklemekten başka bir şey yapmamasını gerektirir.

  • Bir "ana döngü devralma" bit-bang sürücüsü, döngü sayımı yerine bit zamanlamaları için bir zamanlayıcı kaynağı kullanması dışında yukarıdakine çok benzer şekilde davranacaktır. Servise çok uzun sürmeyen kesintiler etkin bırakılabilir. Seri iletim için, sabit hızlı zamanlayıcı kaynağı başka amaçlarla paylaşılabilir; Bununla birlikte, seri alım için, bit-bang sürücüsünün, başlangıç ​​biti geldiğinde zamanlayıcıyı her gelen bit süresinin ortasında dolacak şekilde yeniden yükleyebilmesi gerekir.

  • Tam olarak kesilen bir bit-bang sürücüsü, tercihen veri hızının bazı katlarında çalışan sabit oranlı bir zamanlayıcı kullanır (3x ve 5x'in her ikisi de 4x'ten daha iyidir) ve bu zamanlayıcı aracılığıyla her şeyi yapar. Böyle bir sürücü diğer her şeyle aynı anda çalışabilir, ancak eski sürücü türlerinin gerektirdiğinden daha hızlı bir CPU gerektirir.

İlk iki denetleyici stilinin asla gelmeyecek verileri sonsuza kadar beklemesini önlemek için, okuma rutinlerinin bir zaman aşımı değeri içermesi yaygındır. Bir denetleyicinin döngüsü örneğin "100 ms'ye kadar beklerken bir bayt al, hiçbiri gelmediyse başka şeyler yapın, ardından bir sonraki baytı alın, vb." ve bir bayt "get" rutininin zaman aşımına uğradığı zaman ve kontrolör tekrar beklemeye başladığı zaman, bayt kaybolacaktır; iletişim kurduğu cihazın bu olasılığı beklemesi gerekecektir.

Yalnızca üçüncü sürücü stili, bir veri baytı iletilirken veri baytının gelme olasılığını kaldırabilecektir. Bununla birlikte, ilk iki stil, denetleyicinin yalnızca konuşulduğunda konuşması gerekiyorsa, bazı tam hızlı tam çift yönlü iletişim protokolleri için kullanılabilir. İşin püf noktası, gelen bir başlangıç ​​bitini bekleyecek bir "veri okuma ve yazma" rutininin olması ve bir algılamanın üst üste gelmesi bir okuma ve yazma ile çakıştığında, denetleyici her biti tıpkı gelen verileri incelemek üzere olduğu gibi gönderecek şekilde göndermektir. Denetleyici gelen başlangıç ​​bitini algıladığında, sonraki 8 veri bitini ve durdurma bitini ne zaman arayacağını tam olarak bilecek ve böylece kendi verilerini çıkarmak için zamanını güvenli bir şekilde kullanabileceğini bilecektir.

Bir ayrılık notu: veri almak için bit-bang uart'ın ilk iki stilinden birini kullanan bir denetleyici, veri kaybını önlemek için bir sonraki baytın başlangıç ​​bitinin düşen kenarından önce her veri baytını işlemelidir. Denetleyici işlemenin en az yarım zaman alacağını bilirse, durdurma bitini beklemek yerine son veri bitini yakaladığı anda her bir baytı kabul ederek işleme için gereken süreyi en üst düzeye çıkarabilir. Bununla birlikte, kontrol cihazına daha fazla zaman vermenin başka bir yolu olarak, veriyi veren cihazın bir yerine iki durdurma biti ile iletim yapmasına yardımcı olabilir. "Parite işareti" yapılandırılabilirse, bu ek bir bit süresi ekleyecektir. Örneğin 115200-8-M-2'deki iletim, verileri 1.6 kat daha hızlı beslese bile 57600-8-N-1'den daha fazla işlem süresi sağlayacaktır.


1

Sadece uC'nin I / O pinini kullanabilirsiniz. Sadece bu pimlerdeki verileri değiştirirken veya aktarırken pimlerin frekansını baud hızına iki katına çıkarmanız gerekir. UART normalde böyle çalışır, ortadaki bit sinyalini örnekleyecektir.

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.