Seri veri osiloskoptan nasıl okunur


21

Mikrodenetleyicim (PICAXE 20X2) ve pot sayacım var. Mikro'yu, PC'nin seri portuna pot metre değişikliğini gönderecek şekilde programladım. Açıkçası 8 bitlik bir ADC. Şimdi benim için ilginç olan şey bu seri verileri osiloskopta deşifre edebilmek.

İşte iki resim, birincisi mikro PC'ye "0" gönderirken diğeri "255" gönderdiğinde. Veriler 9600 buad kullanılarak iletiliyor ve bunları PC terminalinden alabiliyorum.

İlk Resim resim açıklamasını buraya girin

İkinci resim resim açıklamasını buraya girin

Benim sorum şu, kapsamımdaki doğru verileri ve ikinci olarak bu darbeleri onaltılık veya ascii formatına nasıl okuyabileceği ve çözebileceği. Yani bu yükselen ve düşen darbeleri nasıl okuyacağım (0/1).

Teşekkürler.


3
seri çizgiler mantıksal '1' durumunda boşta, bu yüzden altta 1 ve üstte 0 olduğunu unutmayın. İnsanların bunu zaten kilitlediğini biliyorum. Benim yorumum, seri verinin gelecekteki kapsam kavrayışlarına rehberlik etmek amacıyla; rölanti durumu yüksek olacak şekilde şeyleri inceleyebilirsiniz.
JustJeff

Yanıtlar:


14

İlk olarak Olin'in de fark ettiği bir şey: seviyeler, bir mikrokontrolörün genellikle çıktısının tersidir:

resim açıklamasını buraya girin

Endişelenecek bir şey yok, onu da bu şekilde okuyabileceğimizi göreceğiz. Sadece kapsamda bir başlangıç ​​bitinin bir 1ve bitiş biti olacağını hatırlamak zorundayız 0.

μμμ1μ0

0x001μ
0xFFμ

guesstimates:

0b11001111 = 0xCF
0b11110010 = 0xF2

0b11001101 = 0xCD
0b11001010 = 0xCA
0b11001010 = 0xCA
0b11110010 = 0xF2

düzenlemek
Olin is right right, this ASCII gibi bir şey. Nitekim ASCII'nin 1'in tamamlayıcısıdır .

0xCF ~ 0x30 = '0'
0xCE ~ 0x31 = '1'
0xCD ~ 0x32 = '2'
0xCC ~ 0x33 = '3'
0xCB ~ 0x34 = '4'
0xCA ~ 0x35 = '5'

0xF2 ~ 0x0D = [CR]

Bu, ekran görüntüleri hakkındaki yorumumun doğru olduğunu onaylar.


edit 2 (popüler istek üzerine verileri nasıl yorumladığım :-))
Uyarı: Bu uzun bir hikaye, çünkü böyle bir şeyi çözmeye çalıştığımda kafamda ne olduğunun bir transkripti. Sadece bununla başa çıkmanın bir yolunu öğrenmek istiyorsanız okuyun.

Örnek: 2 dar darbeden başlayarak 1. ekran görüntüsünde ikinci bayt. İkinci bayt ile bilerek başladım çünkü ilk bayttan daha fazla kenar var, bu yüzden doğru yapmak daha kolay olacak. Dar darbelerin her biri, bir bölümün yaklaşık 1 / 10'u kadardır, bu nedenle, her biri 1 bit yüksek, aralarında düşük bir bit olabilir. Ayrıca bundan daha dar bir şey görmüyorum, bu yüzden sanırım tek bir parça. Bizim referansımız bu.
Sonra, 101düşük seviyede daha uzun bir süre sonra. Öncekilerden iki kat daha geniş görünüyor, öyle olabilir 00. Yüksek takip, yine iki kat daha geniş, öyle olacak 1111. Şimdi 9 bitimiz var: bir başlangıç ​​biti ( 1) artı 8 veri biti. Bir sonraki bit stop biti olacak, çünkü0hemen görünmez. Yani hepsini bir araya getirmek 1010011110, başlangıç ​​ve bitiş biti dahil. Dur biti sıfır olmasaydı, bir yerde kötü bir varsayım yapardım!
Bir UART'ın önce LSB'yi (en az anlamlı bit) gönderdiğini unutmayın, bu nedenle 8 veri bitini tersine çevirmek zorunda kalacağız: 11110010= 0xF2.

Şimdi tek bir bitin, bir çift bitin ve 4 bitlik bir dizinin genişliğini biliyoruz ve ilk bayta bir göz atıyoruz. İlk yüksek periyot (geniş puls) 1111ikinci bayttan biraz daha geniştir , bu yüzden 5 bit genişliğinde olacaktır. Her birini takip eden düşük ve yüksek dönem, diğer bayttaki çift bit kadar geniştir, bu yüzden elde ederiz 111110011. Yine 9 bit, bu yüzden bir sonraki düşük bit, dur biti olmalıdır. Tamam, eğer tahminimiz doğruysa veri bitlerini tekrar tersine çevirebiliriz: 11001111= 0xCF.

Sonra Olin'den bir ipucu aldık. İlk iletişim 2 bayt uzunluğunda, 2 bayt ikinciden daha kısadır. Ve "0" da "255" den 2 bayt daha kısadır. Yani muhtemelen tam olarak olmasa da ASCII gibi bir şey. Ayrıca "255" ün ikinci ve üçüncü baytlarının aynı olduğunu da not ediyorum. Harika, bu çift "5" olacak. Biz iyiyiz! (Zaman zaman kendinizi cesaretlendirmelisiniz.) "0", "2" ve "5" kodlarını çözdükten sonra, ilk ikisinin kodları arasında 2 ve sonuncusu arasında 3 fark olduğunu fark ettim. iki. Ve nihayet ASCII'deki rakamların paterni olan 0xC_tamamlayıcı olduğunu fark ettim 0x3_.


İpuçları için teşekkürler, doğru dalga formunu yakalamaya ve sorumu güncellemeye çalışacağım.
Sean87

Teşekkürler, resmi bu verileri nasıl bulduğunuz gibi işaretler misiniz?
Sean87

1
@ Sean87 - Uzun bir hikaye oldu, cevabımı ekledim. Bunu yapmanın yolunu gösteriyor, diğerleri farklı yollar izleyebilir. Yarısını görmeyeceğinizi düşünüyorsanız endişelenmeyin; çoğu sadece deneyim ve hayal gücüdür. Özel bir istihbarat yok.
stevenvh

Çok güzel cevaplar ve soru, ama osiloskopun gerçekte ne olduğunu tersine çevirdiğini neden söylediğini merak ediyorum. Boştaki hattın neredeyse her zaman yüksek olduğunu biliyorum, ancak osiloskopun gerçek şeyin tam bir görüntüsünü yakalaması gerekmiyor mu? Kullanıcının osiloskop ayarlarının bir parametresini değiştirmesi dışında.
Nikos

7

Bir şey eklenmiyor. Sinyallerinizin zirveye 3,3V olduğu anlaşılıyor, bu da doğrudan mikrodan çıktıklarını gösteriyor. Bununla birlikte, mikrodenetleyici UART seviyeleri (neredeyse) her zaman boşta yüksek ve aktif düşüktür. Sinyalleriniz mantıklı değil, tersine çevrildi.

Sonuçta bu verileri bir PC'ye almak için RS-232 seviyelerine dönüştürülmesi gerekir. Bir PC COM bağlantı noktasının görmeyi beklediği şey budur. RS-232 boşta düşük ve aktif yüksek, ancak düşük -5V'nin altında ve yüksek + 5V'nin üstünde. Neyse ki tipik mikrodenetleyici mantık seviyesi UART sinyalleri ve RS-232 arasında dönüştürmeyi kolaylaştıran yongalar var. Bu yongalar, 3.3V güç kaynağınızdan RS-232 voltajlarını yapmak için şarj pompaları içerir. Bazen bu çipler genel olarak "MAX232" olarak adlandırılır, çünkü bu, bu tipte erken ve popüler bir çip için parça numarasıydı. Görünüşe göre 5V değil, 3.3V güç kullandığınız için farklı bir varyanta ihtiyacınız var. Konektörlü bir kartta temelde bu yongalardan biri olan bir ürün yapıyoruz. Http://www.embedinc.com/products/rslink2 adresine gidin.ve böyle bir çipi nasıl bağlayacağınıza dair bir örnek görmek için şemaya bakın.

Toplamayan bir başka şey de, sadece 0 ve 255 gönderdiğinizi söyleseniz bile, her iki dizinin birden fazla bayt gibi görünmesidir. Bu tür seri veriler bir başlangıç ​​biti, ardından 8 veri biti ile gönderilir, sonra bir bit biraz. Başlangıç ​​biti daima hat rölanti seviyesinden zıt kutuptadır. Çoğu açıklamada, satır boşta seviyesi "boşluk" ve tersi "işaret" olarak ifade edilir. Yani başlangıç ​​biti daima işaretlidir. Başlangıç ​​bitinin amacı, kalan bitler için zaman senkronizasyonu sağlamaktır. Her iki taraf da biraz ne kadar uzun olduğunu bildiğinden, tek soru baytın başlamasıdır. Başlangıç ​​biti bu bilgiyi sağlar. Alıcı esas olarak başlangıç ​​bitinin ön kenarında bir saat başlatır ve bunu veri bitlerinin ne zaman geleceğini bilmek için kullanır.

Veri bitleri en az en önemli sırada gönderilir, işaret 1 ve boşluk 0 olur. Bir sonraki başlangıç ​​bitinin başlangıcı yeni bir kenar olacak ve biraz zaman bırakacak şekilde boşluk düzeyinde bir durdurma biti eklenir. bayt arasında. Bu, gönderen ve alıcı arasında küçük bir hataya izin verir. Alıcı gönderenden biraz daha yavaş olsaydı, bir sonraki başlangıç ​​bitinin başlangıcını kaçırırdı. Alıcı sıfırlanır ve saatini her yeni başlangıç ​​bitinde yeniden başlatır, zamanlama hataları birikmez.

Tüm bunlardan, ilk izlemenin en az iki bayt gönderdiğini ve sonuncunun belki 5'e benzediğini görebilmelisiniz.

İzlerin zaman ölçeğini genişletirseniz yardımcı olacaktır. Bu şekilde, biraz zamanın gerçekte ne olduğunu ölçebilirsiniz. Bu, gerçekten 9600 baud'unuzu (104 µs / bit) doğrulamanızı ve bir yakalamanın ayrı parçalarının kodunu çözmenizi sağlar. Şu an olduğu gibi, bitlerin nerede olduğunu görmek için yeterli çözünürlük yok ve bu nedenle gönderilenlerin kodunu çözüyor.

Katma:

Sisteminizin verileri ikili yerine ASCII'de gönderiyor olabileceği aklıma geldi. Küçük sistemde ASCII'ye dönüştürmenin sınırlı kaynaklardan daha fazlasını alması, bant genişliğini zayıf bir şekilde kullanması ve verileri bir kullanıcıya görüntülemek istiyorsanız PC'de dönüşümü yapmak kolay olduğu için genellikle böyle yapılmaz. Ancak, iletimleriniz sekansların neden birden fazla bayt olduğunu, ikincisinin neden daha uzun olduğunu ("255" "0" dan daha fazla karakterdir) ve her ikisinin de neden aynı baytta bittiğini açıklayan ASCII karakterleri ise. Son bayt muhtemelen bir satır sonu karakteri olup genellikle satır başı veya satır besleme olur.

Her neyse, zaman ölçeğini genişletin ve gönderilen şeyin kodunu tam olarak çözebiliriz.


1
Durdurma biti (ve başlangıç ​​bitinin tersidir) ayrıca yeni bir iletimin başlangıcında bir kenarı zorlar.
stevenvh

@steven: Evet, cevabımı yeniden okuduktan sonra bunu bıraktığımı fark ettim ve muhtemelen yorumunuzu yazarken aynı zamanda bir düzenlemeye ekledim.
Olin Lathrop

4
ASCII göndermek "verimsiz" olsa da yine de çok iyi bir seçim olabilir. Gömülü sistemlerimin çoğu sadece ASCII göndermekle kalmaz, aynı zamanda bir terminal programından kendileriyle "konuşarak" manüel olarak deney yapmayı da mümkün kılar. SCPI standardı (GPIB'de diğer elektrik arayüzlerine genişletilen bir tür iyileştirme), bu hatlar boyunca çalışan çok resmi bir yöntemdir.
Chris Stratton

4
Gidiş şiddetle katılmıyorum. Ascii çok küçük bir kod alır, hatta 8-acı biraz çıplak metal bile çalıştırır. Elbette, özel bir program yazabilirsiniz, ancak bundan 10 yıl sonra kaybolduğunda ne olur ve bulunsa bile çalıştırmak için sanal bir makine gerekir mi? Ve kesinlikle, tuzuna değer herhangi bir programcı bir şeyi tersine çevirmek için ikili bir terminali hackleyebilir. Ancak insan tarafından okunabilen arayüzler, çoğu için küçük ek yüke değer, ancak en ciddi bellek sınırlı ve performans açısından kritik sistemlerdir. Ayrıca, belleğiniz varsa, hata ayıklama çıktısını bir açma / kapama ile gömebilirsiniz.
Chris Stratton

2
ASCII arayüzlerine bir müşterinin gereksinimi olduğu için başladığımı belirtmeliyim ... ama ne kadar yararlı oldukları için onları sakladım. Ürün yazılımında bir komut olarak bir fikir ekleyebilir ve daha sonra tesisin herhangi bir yerinde test edebilirim. Olmadan yapılandırma müşteriye her zaman bir güncelleme dağıtmak zorunda ben sorun birisi karmaşık öyleydi hangi sistemin ama bir modülde başlamıştı içine bakarak için ekstralar ile deneysel bir yazılımı sürümünü yayınladı. Bir müşteriyle telefonda, bir terminali ateşletebilir ve yayınlanmamış fabrika test işlevlerini kullanarak onları yürütebilirim.
Chris Stratton

1

Tüm ayrıntıları bilmeniz gerekir: hız, bir başlangıç ​​biti varsa, veri bitlerinin sayısı, bir durdurma biti varsa ve bir eşlik biti varsa. Bu, mikro denetleyicideki UART'ın nasıl yapılandırıldığının bir işlevi olmalıdır.

Rigol kapsamının bir seri kod çözme seçeneği yoksa (birçok DSO vardır) kod çözmeye yardımcı olması için X imleçlerini kullanabilirsiniz. İlk imleci verinin ön kenarına yerleştirin ve ikinci imleci bit akışında hareket ettirin. İmleçler arasındaki delta, şu anda hangi 'bit'i üzerinde basit aritmetik üzerinde gezindiğini belirlemek için kullanılabilir. Açıkçası, start / stop / parite bitlerini dikkate almayın.


Her zaman bir başlangıç ​​biti ve her zaman en az bir durdurma biti vardır. Ekstra durdurma bitleri olabilir, ancak bunlar baytlar arasındaki ölü zamandan ayırt edilemez. Eski mekanik kod çözücüler bazen mekanizmanın sıfırlanması için zaman tanımak için iki durdurma bitine ihtiyaç duyuyordu. Günümüzde neredeyse her zaman 8 veri biti vardır ve eşlik biti yoktur, ancak dediğiniz gibi bu değişebilir.
Olin Lathrop
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.