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.
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.
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.
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
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.