UART üzerindeki Gizemli RX darbeleri, OS X Arduino Due'ya bağlanıyor

Arduino IDE 1.6.8, Arduino Due, Mac OS 10.11.3

Çoklu istemci kütüphaneleri (Python, JavaScript ve IDE'de yerleşik Seri Monitör) kullanarak seri bağlantı noktasına bağlandığımda RX satırında sekiz gizemli sinyal görüyorum. Bir Logic Pro 16 ile 1ms/s'de örneklenen yaklaşık 78-79us bir parça.

Mystery pulses

57600 baudda yorumlandığında bu sekiz atım, 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 kurulumunu kullanıyor ve çoklu skeçlerle (normal "Blink" çizimi de bunu yeniden üretecek) kullanıyor.

Makinemdeki adımları tekrarla:

  1. Herhangi bir çizim yükleyin
  2. Bunu yakalamak istiyorsanız bir mantık analizörü başlatın
  3. Seri Monitör'e gidin. 57600 baud, Newline hattının bittiği için yapılandırdım, ama farketmez
  4. İsterseniz, 3. adımı kapatın ve tekrarlayın
  5. Seri bağlantı noktasına her bağlandığınızda pals notları

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

14
Nereden geldiğine bakılmaksızın, çalıştırdığınız yazılımdaki kritik bir hatayı göstererek size bir iyilik yaptığını düşünün. Bu, onu kurtarılamayacak bir duruma getirmemelidir. Bir program mantığı hatası mı, yoksa UART işlem kodu bir hata bayrağına uygun şekilde uymuyor mu?
katma yazar rossp, kaynak
Kaynak aşağı izleme açısından, başka bir seri istemci programı, başka bir bilgisayar/işletim sistemi, başka bir USB-seri cihaz, vb denemek yararlı olacaktır ...
katma yazar rossp, kaynak
Linux'ta, 57600'de 0xF0 olarak yorumlanan tek bir nabız olsun
katma yazar Majenko, kaynak
Ayrıca, bağlantıyı keserken de bir tane alırsınız. Bağlantı baud hızının nabız uzunluğu üzerinde bir etkisi yoktur. Şüphem, bu, bunu yapan ATMega16U2'nin yazılımıdır (veya hangi sürümde olursa olsun çiptir).
katma yazar Majenko, kaynak
Giriş için teşekkürler, Chris. Firmata ürün yazılımı bir 0xF0 START_SYSEX gördüğü zaman Bu, bir 0xF7 görene kadar baytları işleyecektir ve zaman aşımı için bir hüküm yoktur. Bence, bu darbelerin bir 0xF0 ürettikleri (bunu kod çözmemden görebiliyorsunuz), bu da 0xF7 sonlandırması olmadığı için daha fazla komuta işlemeyi etkin bir şekilde kapatıyor. Firmata için yapabileceğim en iyi şeyin, en uzun yasal veri paketi için yeterince uzun bir süre geçtikten sonra zaman aşımına bir yama göndermek olduğunu düşünüyorum.
katma yazar user19292, kaynak
Diğer seri programları denemek için, Firmata protokolü ile etkileşime giren ve aynı davranışı sergileyen farklı altta yatan seri uygulamaları (Python, JavaScript ve Arduino IDE Seri Monitörde yerleşik) kullanan çoklu kütüphaneler vardır. Bir sonraki planım bunu bir Linux makinesinde denemek ve aynı davranışı görüp görmediğimi görmek, ki bu OS X'e özgü ise, umarız ki izole eder.
katma yazar user19292, kaynak
Seri monitörü başlattığınızda, yazılım arduino modülünü sıfırlar. Eğer arduino modülünde bootloader varsa, bunların STK500 protokolü sinyalleri olduğunu düşünüyorum.
katma yazar Aleksandar Ivanisevic, kaynak
Arduino'nuz USB'den güç alıyor mu?
katma yazar U. Laxmeshwar, kaynak

1 cevap

Kısa:

ATMEGA16U2 ürün yazılımına bakın ( https://github.com/arduino/ArduinoCore-sam/blob/master/firmwares/atmega16u2/arduino-usbserial/Arduino-usbserial.c ) Taklit edilen USB'nin ayarlarını değiştirdiğinizde/değiştirdiğinizde seri port, USART yeniden yerleştirildi. Bu, Arduino Seri Monitörünü açtığınızda bile (seri hızı, vb. Yapılandırmalı) gerçekleşir. Bu başınıza neden olur.

Uzun:

Fonksiyon bakmak:

void EVENT_CDC_Device_LineEncodingChanged(USB_ClassInfo_CDC_Device_t* const CDCInterfaceInfo)

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;

Mevcut ATMEGA16U2 veri sayfasının 168. sayfasında, UCSR1B'nin bit 3'ünü (TXEN1) ayarlayarak, normal bağlantı noktası işlemini geçersiz kılarak vericiyi etkinleştirdiğinizi (yani, çıkışa dönüştüğünü) göreceksiniz. Veri sayfası alıntılanıyor:

Bu bitin bire yazılması USART Vericiyi etkinleştirir. Verici   Etkinleştirildiğinde TxDn pin için normal port işlemini geçersiz kılar.   Vericinin devre dışı bırakılması (TXENn’in sıfıra yazılması)   devam eden ve bekletilen yayınlar tamamlanana kadar etkili, yani,   İletim Kaydırmalı Kayıt ve Aktarım Tampon Kayıt Olmadığında   iletilecek veriyi içerir. Devre dışı bırakıldığında, Verici   TxDn bağlantı noktasını daha uzun devre dışı bırak.

Bu nedenle UCSR1B = 0 yazarak , artık TXD1 pinini geçersiz kılacaksınız, bu da giriş olarak işlev görecektir.

ATMEGA16U2 TXD, ATSAM3X8E'nin RX hattına bağlanmıştır. Normal çalışmada, UART etkinleştirildiğinde, hiçbir veri iletilmezse bu hat yüksek kalır. UART'ı devre dışı bırakırsanız, o özel hat 1'e daha fazla sürücü değildir. Başlatma kodu bu pimdeki çekmeyi (ve çıkış olarak yapılandırılmamış) ayarlamayacağından, pim yüzer bir girişe ve herhangi bir sızıntıya dönüşür. Probunuzun GND'si veya hatta giriş empedansı (pim ile GND arasında), mantık seviyesini yavaşça 0'a getirecektir.

Bunu geçersiz kılmak için sorun: 1) PINEGA16U2 ürün yazılımını, PIN değerini OUTPUT olarak ayarlayarak 1 değerini değiştirin. 2) ATMEGA16U2 ürün yazılımını, bu pimde çekmeyi etkinleştirerek değiştirin. 3) (önerilen) ATSAM3X8E'deki RX hattındaki çekmeyi etkinleştirin.

1
katma