UART üzerindeki gizemli RX darbeleri OS X Arduino Due'ye bağlanır


14

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

Birden fazla istemci kitaplığı (Python, JavaScript ve IDE'de yerleşik Seri Monitör) kullanarak seri bağlantı noktasına bağlandığımda RX hattında sekiz gizemli darbe görüyorum. Mantık Pro 16 ile 1MS / s'de örneklenmiş yaklaşık 78-79us adet.

Gizem bakliyat

57600 baud'da yorumlandığında bu sekiz darbe Firmata ürün yazılımını sıkıştıracaktır. Ve her bağlantıda olurlar.

Bu, Arduino 1.6.8 IDE'nin yeni bir yüklemesini kullanıyor ve birden çok eskizle (normal "Göz Kırpma" çizimi bunu da üretecek).

Makinemdeki adımları tekrarlayın:

  1. Herhangi bir çizim yükleyin
  2. Yakalamak istiyorsanız bir mantık analizörü başlatın
  3. Seri Monitöre gidin. Benimki 57600 baud için yapılandırılmış, Newline satırı bitiyor, ama önemli değil
  4. İsterseniz, 3. adımı kapatın ve tekrarlayın
  5. Seri bağlantı noktasına her bağlayışınızda nabızları not edin

Bunu teşhis etmek için herhangi bir öneriniz var mı? Bir şekilde seri sürücü seviyesi gibi geliyor.


1
Nereden geldiğine bakılmaksızın, çalıştırdığınız bellenimde kritik bir hatayı belirterek size bir iyilik yaptığını düşünün - bu, kurtarılamaz bir duruma getirilmemelidir. Bu bir program mantığı hatası mı, yoksa UART işleme kodu bir hata işaretiyle uygun şekilde çalışmıyor mu?
Chris Stratton

1
Kaynağın izlenmesi açısından, başka bir seri istemci programı, başka bir bilgisayar / işletim sistemi, başka bir USB seri aygıt, vb. Denemek yararlı olacaktır ...
Chris Stratton

1
Diğer seri programları denemeye gelince, Firmata protokolüyle etkileşime giren ve aynı davranışı gösteren farklı temel seri uygulamaları (Python, JavaScript ve yerleşik Arduino IDE Seri Monitörü) kullanan birden fazla kütüphane vardır. Bir sonraki planım bunu bir Linux makinesinde denemek ve aynı davranışı görüp görmediğimi görmek, bu da OS X'e özgü olup olmadığını izole etmek.
Blake Ramsdell

2
Bağlantıyı kestiğinizde de bir tane alırsınız. Bağlantı baud hızının nabzın uzunluğu üzerinde bir etkisi yoktur. Şüphem, ATMega16U2'nin bunu yapan yazılımının (veya hangi sürümde olursa olsun) olmasıdır.
Majenko

1
Seri monitörü başlattığınızda, yazılım arduino modülünü sıfırlar. Arduino modülünde bootloader varsa, bunların STK500 protokol sinyalleri olduğunu düşünüyorum.
Mert Gülsoy

Yanıtlar:


1

Kısa:

ATMEGA16U2 ürün yazılımına bakma ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) Bunu, ayarları yapılandırdığınızda / değiştirdiğinizde USB benzetimli seri bağlantı noktası, USART sıfırlanır. Bu, Arduino Seri Monitörünü açtığınızda bile gerçekleşir (seri hızı yapılandırmalıdır, vb.). Bu ani artışa neden olur.

Uzun:

İşleve bakın:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

Orada bazı satırlardan sonra kayıtlarını sıfırlayarak USART'ı sıfırladığını göreceksiniz:

/* Must turn off USART before reconfiguring it, otherwise incorrect operation may occur */
    UCSR1B = 0;
    UCSR1A = 0;
    UCSR1C = 0;

Geçerli ATMEGA16U2 veri sayfasının 168. sayfasında, UCSR1B'nin bit 3'ünü (TXEN1) ayarlayarak vericiyi etkinleştirerek normal bağlantı noktası çalışmasını geçersiz kıldığını göreceksiniz (yani çıktı olur). Veri sayfasını alıntılama:

Bu bitin bire yazılması USART Vericisini etkinleştirir. Verici, etkinleştirildiğinde TxDn pimi için normal bağlantı noktası çalışmasını geçersiz kılar. Vericinin devre dışı bırakılması (TXENn'i sıfıra yazmak), devam eden ve bekleyen iletiler tamamlanana kadar, yani İletim Kaydırma Kaydı ve İletim Tampon Kaydı iletilecek verileri içermedikçe etkili olmayacaktır. Devre dışı bırakıldığında, Verici artık TxDn bağlantı noktasını geçersiz kılmaz.

Bu nedenle, yazarak UCSR1B = 0;artık giriş görevi görecek olan TXD1 pimini geçersiz kılmazsınız.

ATMEGA16U2 TXD, ATSAM3X8E'nin RX hattına bağlıdır. Normal çalışmada, UART etkinken, veri iletilmezse bu hat yüksek kalır. UART'ı devre dışı bırakırsanız, söz konusu satır 1'e daha fazla sürücü olmaz. Başlatma kodu bu pimdeki çekme işlemini ayarlamadığından (ve çıkış olarak yapılandırılmadığından), pim kayan bir giriş haline gelir ve herhangi bir sızıntı GND veya hatta probunuzun giriş empedansı (pin ve GND arasındadır), mantık seviyesini yavaşça 0'a getirecektir.

Bu sorunu geçersiz kılmak için aşağıdakilerden birini yapmalısınız: 1) Bu PIN kodunu ÇIKIŞ olarak 1 değerine sahip olarak ayarlayarak ATMEGA16U2 sabit yazılımını değiştirin. 2) Bu pim üzerindeki çekmeyi etkinleştirerek ATMEGA16U2 sabit yazılımını değiştirin. 3) (önerilen) ATSAM3X8E üzerindeki RX hattındaki pull-up'ı etkinleştirin.

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.