HSerial ve Even Parity problemi

Başlatan dyonizos, 01 Mayıs 2015, 17:15:13

dyonizos

Selam arkadaşlar,

Logic Analyzer ile aşağıdaki datayı alıyorum ve bu datayı tekrardan oluşturmak isitoyorum.
Bu datayı şu özelliklerle düzgün şekilde alıyorum.
Baudrate 9600
1 Stop Bit
8 Bit Transfer
Even Parity
Non Inverted



Aşağıdaki kod ile gönderdiğim datada bu görüntü var ancak NON Parity Bit ayarlarında bunu alabiliyorum.
Declare Hserial_Parity = Even
kullandığım zaman data aynı şekilde gelmiyor.
Bu datayı nasıl oluşturabilirim Even Parity ile

Device = 16F628A

Config  INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, CP_ON, MCLRE_OFF, DATA_CP_ON  ' configuramos fusibles microcontrolador 

Xtal = 4
Declare Hserial_Baud = 9600  
Declare Hserial_RCSTA = $90  
Declare Hserial_TXSTA = $24
Declare Hserial_SPBRG = 26
Declare Hserial_Clear = On 
'Declare HSERIAL_PARITY = Even


HSerOut [35,55,49,48,48,42]

Maxim

hangi versiyon proton kullanıyorsunuz?

dyonizos

Proton ide 2.0.1.0
Loader 3.5.2.7
Compiler 3.5.3.5

Maxim

eski bayaa
acaba bug vardı düzelttilermi diye düşündüm
isterseninz seri çıkış test kodunu buraya ekleyin ben 3.5.7.1 ile derleyeyim?

dyonizos

Yukarida ekledigim kod ile deniyorum. Sonunda yukaridaki gibi bir logic sinyal almaya calisiyorum.
Nasil bir kod vermem lazim bundan baska.

Maxim

denedim değişmedi proteusta
yani normalde #7100* veriyor
even satırını ekleyince karakterler bozuluyor

bu arada Declare Hserial_SPBRG = 25 olması lazım
fark etmedi.

birde help dosyasında even-odd kullanınca data bitin 7 olacağı yazıyor
onunla ne kadar ilgisi var bilemiyorum
data bitini 7 yaptım , parity even yaptım gene olmadı proteus virtual terminalde.

Declare Hserial_Parity Odd or Even 
Enables/Disables parity on the serial port. For both Hserout and Hserin The default serial data 
format is 8N1, 8 data bits, no parity bit and 1 stop bit. 7E1 (7 data bits, even parity, 1 stop bit) or 
7O1 (7data bits, odd parity, 1 stop bit) may be enabled using the Hserial_Parity declare. 

    Declare Hserial_Parity = Even                   ' Use if even parity desired 
    Declare Hserial_Parity = Odd                    ' Use if odd parity desired


RaMu

Emin değilim ama
16f628A desteklemiyor olabilir,
datasheet ten kontrol etmekte fayda var.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

dyonizos

Orjinal datayi okudugum pic 12f509
12f509 da software uart kullanilmis muhtemelen. Cozemedim bir turlu nasil bu data bu sekilde gelebiliyor. 8 bit ve even parity olarak.

RaMu

16f628a için
Parity için 9 bit kullanılabiliyor ama
Donanımsal olarak hesaplanıp desteklenmiyor,
yazılımsal olarak hesaplanması gerekiyor diyor datasheet,
proton hesaplamıyor olabilir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

dyonizos

Bu bilgiye istinaden bu şekilde çalışması gerekmez mi?
TXSTA.0=0 Even parity için
ve
TXSTA.6=1 9bit enabled için
Ama yine olmadı yada ben yapamadım.

Device = 16F628A

Config  INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, BODEN_OFF, LVP_OFF, CP_ON, MCLRE_OFF, DATA_CP_ON  ' configuramos fusibles microcontrolador 

Xtal = 4
Declare Hserial_Baud = 8607  
Declare Hserial_RCSTA = $90  
Declare Hserial_TXSTA = $24  
Declare Hserial_SPBRG = 25
Declare Hserial_Clear = On 
TXSTA.6=1
TXSTA.0=0
'Declare HSERIAL_PARITY = Even


HSerOut [35,55,49,48,48,42]

RaMu

O bilgiye göre
parity i  kendin hesaplayıp TXSTA.TX9D ye yazman gerekiyor.
(Eğer proton bunu yapmıyorsa.)
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html

dyonizos

Parity biti datadaki 1 lerin saysının çift veya tek olmasına göre 0 yada 1 değeri alıyor diye biliyorum.
Ben programda hem 0 hemde 1 verdim ama ikisinde de sonuç problemli. Yani Logic analyzer da Even Parity seçildiğinde hata gösteriyor datada.

RaMu

Aşağıdakileri yazarken çok dikkatli davranamadım
hatalar olabilir,
ben böyle bir problemle karşılaşsam aklımdan bunlar geçerdi
sesli düşündüm diyelim.

Eğer ilk mesajında belirttiğin
Baudrate 9600
1 Stop Bit
8 Bit Transfer
Even Parity
Non Inverted

Kısmı kesinse,
ve aynı bu özellikde veriyi oluşturup göndermek istiyorsan,
doğal olarak logic analizer da ne okuduysan birebir aynısını
9600,8bit,no parity,stop bit
şeklinde aynen oluşturman göndermen gerek,
nedeni;
zaten parity olayında gizli,
halihazırda okuduğun ve aynısını oluşturmak istediğin elindeki 8 bit data nın
1 biti (0 nolu bit herhalde) parity olarak gönderilmektedir,
birde logic analizer da görülmeyen stop biti vardır.

En fazla yapabileceğin okuduğun datayı göndermeden önce
parity kontrolünden geçirip
doğrumu gelmiş yanlışmı gelmiş diye bakmak olabilir.

Yani başa dönersek,
eğer elindeki okunan data
even parity ile okundu ve
misal decimal 48 ise =0x30  =0b 0011 0000
1lerin sayısı çift olduğundan doğru data gelmiş,

dec 49 ise =0x31 = 0b 0011 0001
1lerin sayısı tek olduğundan hatalı gelmiştir.
Sorularınıza hızlı cevap alın: http://www.picproje.org/index.php/topic,57135.0.html