Seri port yazma problemi

Başlatan elektromagma, 05 Ekim 2018, 10:59:40

elektromagma

Merhaba arkadaşlar, aşağıdaki şekilde veri gönderdiğimde farklı veri alıyorum.

İşlemcim: 18F46K80
Clock: 32MHZ PLL4/INTOSC
Donanım: UART çıkışında ADM3485 entegresinin çıkışı RS485 ten USB converter ile okumaya çalışıyorum.


Include kısmı:

#include <18F46K80.h>

#FUSES NOWDT                     //No Watch Dog Timer
#FUSES WDT128                    //Watch Dog Timer uses 1:128 Postscale
#FUSES NOXINST                   //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES NOBROWNOUT                //No brownout reset
#fuses NOMCLR                    //MCLR Reset ucu pasif
#fuses NOPROTECT                 //Okuma/yazma koruması pasif
#fuses INTRC_IO                  //Dahili osc aktif
#fuses NODEBUG


#use delay(clock=32MHZ) 
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7,BITS=8,STREAM=COM_A,ERRORS)

Döngüm ise şu şekilde:

while(TRUE)
{
    output_high(CNT);
    int8 i=0;
[color=red]    putc(0x03);[/color] 
    delay_ms(500);
}

Okuduğumda aşağıdaki değerleri alıyorum:

0x01 (0000 0001) gönderdiğimde --> 7F (0111 1111)
0x02 (0000 0010) gönderdiğimde --> 3F (0011 1111)
0x03 (0000 0011) gönderdiğimde --> 7E (0111 1110)


0x58 (0101 1000) gönderdiğimde --> 0A (0000 1010)
0x59 (0101 1001) gönderdiğimde --> 53 (0101 0011)

Notlar:

[1] Düşük ve yüksek hızlarda denemeler yaptığımda stabil şekilde aynı veriyi alıyorum.
[2] Kristal frekansını değiştirdiğimde de aynı farklı değerleri alıyorum.
[3] Char olarak yazdığımdada aynı farklı veriyi alıyorum.


Soru: Nerede hata yapmaktayım. Neden farklı veri alıyorum anlayamadım.



Anadolu MakerSpace http://www.anadolums.com/

kudretuzuner

#1
Merhaba,
"0x01 (0000 0001) gönderdiğimde --> 7F (0111 1111)"
CCS C dilini bilmiyorum ama zannımca şöyle bir algoritma oluşuyor.
0001 yerine terslenmiş 0111(7) 0000 yerine terslenmiş (1111)F okumaktasınız.Okuma modunun yazılımını,yazdığım gibi düşünürseniz aslında baytlar doğru gidiyor ama terslenmiş olarak görüyorsunuz.
Not:  Virtual Terminali özelliklerinden "İNVERT" ederek deneyiniz.
Amatör

elektromagma

Sadece ilki için geçerli bu durum diğerlerinde değilleme olmuyor o zaman.

0x02 de FD (FF-02) (1111 1101) olması lazımdı. Fakat 3F (0011 1111) görüyorum.



Alıntı yapılan: kudretuzuner - 05 Ekim 2018, 15:51:30Merhaba,
"0x01 (0000 0001) gönderdiğimde --> 7F (0111 1111)"
CCS C dilini bilmiyorum ama zannımca şöyle bir algoritma oluşuyor.
0001 yerine terslenmiş 0111(7) 0000 yerine terslenmiş (1111)F okumaktasınız.Okuma modunun yazılımını,yazdığım gibi düşünürseniz aslında baytlar doğru gidiyor ama terslenmiş olarak görüyorsunuz.
Not:  Virtual Terminali özelliklerinden "İNVERT" ederek deneyiniz.
Anadolu MakerSpace http://www.anadolums.com/

RaMu

Büyük ihtimalle Stop biti veya toplam bit sayısı hatalı ayarlanmış,
tersleme olduğuda açıkça ortada:
0x01 için (0xFF - 0x01)  >> 1  = 0xFE >> 1 = 0x7F

0x02 için (0xFF - 0x02)  >> 2  = 0xFD >> 2 = 0x3F

0x03 için (0xFF - 0x03)  >> 1  = 0xFC >> 1 = 0x7E

0x04 için (0xFF - 0x04)  >> 2  = 0xFB >> 2 = 0x3E     tahminim
.
.
.
 
0x58 için (0xFF - 0x58)  >> 4  = 0xA7 >> 4 = 0x0A

0x59 için (0xFF - 0x59)  >> 1  = 0xA6 >> 1 = 0x53

0x5A için (0xFF - 0x5A)  >> 4  = 0xA7 >> 4 = 0x0A   tahminim
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

elektromagma

yardımcı olmaya çalışan herkese teşekkür ederim.Günlerdir bunu çözmeye çalışıyorum.

Sorun rs485-USB çeviriden kaynaklanıyormuş. Değiştirdim ve düzeldi.

Teşekkürler.
Anadolu MakerSpace http://www.anadolums.com/