Serin2 ve Serout2 komutları kullanımı

Başlatan transistor, 30 Mayıs 2018, 23:47:15

transistor

İletişim kablo ile olacak. Kodlar aşağıda ki gibi, ancak ara sıra gönderilen ısı değeri tutarsız olabiliyor. Lcd'den farklı değerler okunabiliyor.

Acaba komutları doğru mu kullandım?
Aldığım değeri beklemediğimden mi kaynaklanıyor bu tutarsızlık?
Sıkıntı nedir anlamadım, birde iki pic arasında veri yolu uzunluğu ne kadar olabilir. Veri yolu üzerine pull-up yada pull-down kullanmam gerekir mi?


SERIN2 PORTA.0,N2400,[ISI,FLOAT]
LCDOUT $FE,$80,"ISI:",DEC2 ISI,".",DEC1 FLOAT
PAUSE 250



SEROUT2 PORTA.0,N2400,[ISI,FLOAT]
PAUSE 10



ete

Serin2 yada Serout2 komutlarında kullanılacak Baud Rate hesabı şu şekilde yapılır.(1.000.000/Baud)-20KOmuta bakılırsa 2400 baud rate kullanacaksın. O halde hesap (1.000.000/2400)-20=396 şeklinde olacaktır.Bu durumda doğru komut,
SERIN2 PORTA.0,396,[ISI,FLOAT]veSEROUT2 PORTA.0,396,[ISI,FLOAT]Bu şekilde dene bakalım sonuç ne olacak.
Serout2 komutunun çalıştığı işlemcide PORTA.0 pini çıkış olmalıdır.Bunların dışında başka bir şey gerekmez.Kablolu bir bağlantı kullanıyorsan tavsiye edilen uzunluk en fazla 3m olabilir. Ideali 1,5-2m dir.   
Bu konuda çok çelişkili açıklamalar vardır. Kimisi 5m ye kadar sorunsuz haberleşiyorum der kimisi 1m kablo ile  haberleşemez. Ama RS232 standardı 3m dir diye biliyorum. Fazlasında kablo dirençleri ve çevresel parazit faktörleri etkisi nedeni ile data kablo üzerinde bozulmaya uğrar. Mümkün olduğunca çok telli kablo kullanımından kaçınmalısın. Bükümlü (twisted) tek kablo idealdir. Eski network kabloları bu iş için uygundur.
Daha uzun bir kablo kullanman gerekiyor ise hemen RS485 sistemine dönmen gerekir.
Ete



transistor

#2
Öncelikle baudrate değeri formulunü verdiniz ancak bunu haberleşmede neyi esas alarak hesaplayacağız? Gönderdiğimiz veri mi yoksa kablo uzunluğu falan mı? Bunu tam olarak anlayamadım.

İkinci olarak, dediğiniz gibi kodları değiştirdim. Ara sıra yapsa da biraz daha düzeldi gibi ancak, sorun ds18b20'nin randımansız okumasından da kaynaklanabilir diye de düşünmedim değil. Birde nedendir program aşırı kasma yapıyor. (%80-90 gibi) 'Stop' dediğim zaman aşağıdaki mesajı alıyorum. Daha çok bekledikçe bu mesajlarda zamanla artıyor.

     

LCD'ye yazdırırken ilk satıra t1, ikinci sattıra t2, üçüncü satıra t3, dördüncü satıra t4'ü, t5'i de 1. satırın $8a adresine yazdırıyorum. Aynı lcd'de okunduğu gibi. Anlamadığım bir diğer konu ise, t1=10.1, t2=11.2, t3=12.3, t4=13.4, t5=14.5 derece değerini göstermesi gerekirlen gelen ısı verileri sürekli olarak yer değiştiriyor. Mesela, t1 değerini 1. satır t1'in karşısında okumam gerekirken o değeri t2, t3,t4 veya t5 de okuyorum.

LCDOUT $FE,$80,"T1:",DEC2 T1,".",DEC1 O1,D,"C"


t1 yazılacağı yere, t2,t3,t4,t5 değerleri, doğal olarakta hepsi farklı yerlerde yazabiliyorlar. Ama doğru rakam okunan değerler yazılıyor. Acaba t1 ile o1 değerini gönderirken şifreli olarak mı göndermeli, alıcıdan da kontrol ederek alınmalı yada tüm değerler sırası ile bir hamlede gönderilip eeprom'a kaydedilip oradan mı okunmalı diye aklıma geldi birde.

Bunu anlayamadım?


Yeni şema aşağıda ki gibi, hatta bağladığım pull-up direncinin sizce faydası olur mu? Gerçekte gerekli mi sizce?



ALICI:

'***********Seri İletişim Dosyası***********
@ DEVICE pic16F628A   
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, XT_OSC

DEFINE OSC 4

Include "MODEDEFS.BAS"

CMCON=7
TRISA=%1
TRISB=%00000000 : PORTB=0
D CON 223
'*******************************************************************************
DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 4 'LCD 2 sıra olarak çalışıyor.
'*******************************************************************************
T1 VAR WORD : T2 VAR WORD : T3 VAR WORD : T4 VAR WORD : T5 VAR WORD
O1 VAR WORD : O2 VAR WORD : O3 VAR WORD : O4 VAR WORD : O5 VAR WORD
CLEAR
T1=0 : O1=0 : T2=0 : O2=0
T3=0 : O3=0 : T4=0 : O4=0
T5=0 : O5=0
PAUSE 250
'*******************************************************************************
BASLA:

GOSUB EKRAN

SERIN2 PORTA.0,396,[T1,O1] : PAUSE 2
SERIN2 PORTA.0,396,[T2,O2] : PAUSE 2
SERIN2 PORTA.0,396,[T3,O3] : PAUSE 2
SERIN2 PORTA.0,396,[T4,O4] : PAUSE 2
SERIN2 PORTA.0,396,[T5,O5] : PAUSE 2

PAUSE 200

GOTO BASLA

EKRAN:
LCDOUT $FE,$80,"T1:",DEC2 T1,".",DEC1 O1,D,"C"
LCDOUT $FE,$C0,"T2:",DEC2 T2,".",DEC1 O2,D,"C"
LCDOUT $FE,$94,"T3:",DEC2 T3,".",DEC1 O3,D,"C"
LCDOUT $FE,$D4,"T4:",DEC2 T4,".",DEC1 O4,D,"C"
LCDOUT $FE,$8A,"T5:",DEC2 T5,".",DEC1 O5,D,"C"
RETURN
'*******************************************************************************
END


VERİCİ:

'***********Seri İletişim Dosyası***********
@ DEVICE pic16F628A   
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, XT_OSC

Include "MODEDEFS.BAS"

CMCON=7

'***********LCD Tanımlamaları***********

DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor.

'***********Port Ayarları***********

TRISA=$00 : PORTA=0
TRISB=%11111

;EKSI_ISI   CON 1           ' Sıfır altında isaret biti=1  oluyor kontrol için
;DERECE     CON 223         ' ° işareti
;ISARET     VAR BYTE        '  ISI değeri için  +/-  işaret 
'*******************************************************************************
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD        ' Sensör HAM okuma değeri
T1         VAR WORD        ' Hesaplanmış ISI değeri
O1       VAR WORD        ' Holds remainder for + temp C display

Busy1       VAR BIT         ' Busy Status-Bit
HAM1        VAR WORD        ' Sensör HAM okuma değeri
T2        VAR WORD        ' Hesaplanmış ISI değeri
O2      VAR WORD        ' Holds remainder for + temp C display

Busy2       VAR BIT         ' Busy Status-Bit
HAM2        VAR WORD        ' Sensör HAM okuma değeri
T3        VAR WORD        ' Hesaplanmış ISI değeri
O3      VAR WORD        ' Holds remainder for + temp C display

Busy3       VAR BIT         ' Busy Status-Bit
HAM3        VAR WORD        ' Sensör HAM okuma değeri
T4        VAR WORD        ' Hesaplanmış ISI değeri
O4      VAR WORD        ' Holds remainder for + temp C display

Busy4       VAR BIT         ' Busy Status-Bit
HAM4        VAR WORD        ' Sensör HAM okuma değeri
T5        VAR WORD        ' Hesaplanmış ISI değeri
O5      VAR WORD        ' Holds remainder for + temp C display

SYMBOL DQ1=PORTB.0    ' One-wire Data-Pin "DQ" PortB.0 da
SYMBOL DQ2=PORTB.1    ' One-wire Data-Pin "DQ" PortB.1 da
SYMBOL DQ3=PORTB.2    ' One-wire Data-Pin "DQ" PortB.1 da
SYMBOL DQ4=PORTB.3    ' One-wire Data-Pin "DQ" PortB.1 da
SYMBOL DQ5=PORTB.4    ' One-wire Data-Pin "DQ" PortB.1 da


CLEAR
'*******************************************************************************
BASLA:

OWOUT   DQ1, 1, [$CC, $44]
Bekle:
OWIN    DQ1, 4, [Busy]   
IF      Busy = 0 THEN Bekle   
OWOUT   DQ1, 1, [$CC, $BE]
OWIN    DQ1, 2, [HAM.Lowbyte, HAM.Highbyte]

T1=HAM*10/16
O1 = T1//10
T1=T1/10

SEROUT2 PORTA.0,396,[T1,O1] : PAUSE 10

'*******************************************************************************

OWOUT   DQ2, 1, [$CC, $44]
Bekle1:
OWIN    DQ2, 4, [Busy1]   
IF      Busy1 = 0 THEN Bekle1   
OWOUT   DQ2, 1, [$CC, $BE]
OWIN    DQ2, 2, [HAM1.Lowbyte, HAM1.Highbyte]

T2=HAM1*10/16
O2 = T2//10
T2=T2/10

SEROUT2 PORTA.0,396,[T2,O2] : PAUSE 10

'*******************************************************************************

OWOUT   DQ3, 1, [$CC, $44]
Bekle2:
OWIN    DQ3, 4, [Busy2]   
IF      Busy2 = 0 THEN Bekle2   
OWOUT   DQ3, 1, [$CC, $BE]
OWIN    DQ3, 2, [HAM2.Lowbyte, HAM2.Highbyte]

T3=HAM2*10/16
O3 = T3//10
T3=T3/10

SEROUT2 PORTA.0,396,[T3,O3] : PAUSE 10

'*******************************************************************************

OWOUT   DQ4, 1, [$CC, $44]
Bekle3:
OWIN    DQ4, 4, [Busy3]   
IF      Busy3 = 0 THEN Bekle3   
OWOUT   DQ4, 1, [$CC, $BE]
OWIN    DQ4, 2, [HAM3.Lowbyte, HAM3.Highbyte]

T4=HAM3*10/16
O4 = T4//10
T4=T4/10

SEROUT2 PORTA.0,396,[T4,O4] : PAUSE 10

'*******************************************************************************

OWOUT   DQ5, 1, [$CC, $44]
Bekle4:
OWIN    DQ5, 4, [Busy4]   
IF      Busy4 = 0 THEN Bekle4   
OWOUT   DQ5, 1, [$CC, $BE]
OWIN    DQ5, 2, [HAM4.Lowbyte, HAM4.Highbyte]

T5=HAM4*10/16
O5 = T5//10
T5=T5/10

SEROUT2 PORTA.0,396,[T5,O5] : PAUSE 10

Goto Basla
'*******************************************************************************

End


transistor

Galiba yaptım.


'***********Seri İletişim Dosyası***********
@ DEVICE pic16F628A   
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, XT_OSC

DEFINE OSC 4

Include "MODEDEFS.BAS"

CMCON=7
TRISA=%1
TRISB=%00000000 : PORTB=0
D CON 223
'*******************************************************************************
DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 4 'LCD 2 sıra olarak çalışıyor.
'*******************************************************************************
T1 VAR WORD : T2 VAR WORD : T3 VAR WORD : T4 VAR WORD : T5 VAR WORD
O1 VAR WORD : O2 VAR WORD : O3 VAR WORD : O4 VAR WORD : O5 VAR WORD
CLEAR
T1=0 : O1=0 : T2=0 : O2=0 : T3=0 : O3=0 : T4=0 : O4=0 : T5=0 : O5=0
PAUSE 300
'*******************************************************************************
BASLA:

SERIN2 PORTA.0,396,[T1,O1,T2,O2,T3,O3,T4,O4,T5,O5]
GOSUB EKRAN
PAUSE 500

GOTO BASLA

EKRAN:
LCDOUT $FE,$80,"T1:",DEC2 T1,".",DEC1 O1,D,"C"
LCDOUT $FE,$C0,"T2:",DEC2 T2,".",DEC1 O2,D,"C"
LCDOUT $FE,$94,"T3:",DEC2 T3,".",DEC1 O3,D,"C"
LCDOUT $FE,$D4,"T4:",DEC2 T4,".",DEC1 O4,D,"C"
LCDOUT $FE,$8A,"T5:",DEC2 T5,".",DEC1 O5,D,"C"
RETURN
'*******************************************************************************
END


*************


'***********Seri İletişim Dosyası***********
@ DEVICE pic16F628A   
@ DEVICE pic16F628A, WDT_OFF
@ DEVICE pic16F628A, PWRT_ON
@ DEVICE pic16F628A, XT_OSC

Include "MODEDEFS.BAS"

CMCON=7

'***********LCD Tanımlamaları***********

DEFINE LCD_DREG PORTB 'LCD data bacakları PortB de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTB 'LCD Enable Bacağı PortB de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTB 'LCD RW Bacağı PortB de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTB 'LCD RS Bacağı PortB de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 2 'LCD 2 sıra olarak çalışıyor.

'***********Port Ayarları***********

TRISA=$00 : PORTA=0
TRISB=%00011111 : PORTB=0

;EKSI_ISI   CON 1           ' Sıfır altında isaret biti=1  oluyor kontrol için
;DERECE     CON 223         ' ° işareti
;ISARET     VAR BYTE        '  ISI değeri için  +/-  işaret 
'*******************************************************************************
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD        ' Sensör HAM okuma değeri
T1         VAR WORD        ' Hesaplanmış ISI değeri
O1       VAR WORD        ' Holds remainder for + temp C display

Busy1       VAR BIT         ' Busy Status-Bit
HAM1        VAR WORD        ' Sensör HAM okuma değeri
T2        VAR WORD        ' Hesaplanmış ISI değeri
O2      VAR WORD        ' Holds remainder for + temp C display

Busy2       VAR BIT         ' Busy Status-Bit
HAM2        VAR WORD        ' Sensör HAM okuma değeri
T3        VAR WORD        ' Hesaplanmış ISI değeri
O3      VAR WORD        ' Holds remainder for + temp C display

Busy3       VAR BIT         ' Busy Status-Bit
HAM3        VAR WORD        ' Sensör HAM okuma değeri
T4        VAR WORD        ' Hesaplanmış ISI değeri
O4      VAR WORD        ' Holds remainder for + temp C display

Busy4       VAR BIT         ' Busy Status-Bit
HAM4        VAR WORD        ' Sensör HAM okuma değeri
T5        VAR WORD        ' Hesaplanmış ISI değeri
O5      VAR WORD        ' Holds remainder for + temp C display

SYMBOL DQ1=PORTB.0    ' One-wire Data-Pin "DQ" PortB.0 da
SYMBOL DQ2=PORTB.1    ' One-wire Data-Pin "DQ" PortB.1 da
SYMBOL DQ3=PORTB.2    ' One-wire Data-Pin "DQ" PortB.1 da
SYMBOL DQ4=PORTB.3    ' One-wire Data-Pin "DQ" PortB.1 da
SYMBOL DQ5=PORTB.4    ' One-wire Data-Pin "DQ" PortB.1 da


CLEAR

'*******************************************************************************
BASLA:

GOSUB OKU
SEROUT2 PORTA.0,396,[T1,O1,T2,O2,T3,O3,T4,O4,T5,O5] : PAUSE 2

GOTO BASLA
'*******************************************************************************
OKU:

OWOUT   DQ1, 1, [$CC, $44]
DURUM0:
OWIN    DQ1, 4, [Busy]   
IF      Busy = 0 THEN DURUM0   
OWOUT   DQ1, 1, [$CC, $BE]
OWIN    DQ1, 2, [HAM.Lowbyte, HAM.Highbyte]
T1=(HAM*10)/16
O1 = T1//10
T1=T1/10
PAUSEUS 10
'*******************************************************************************
OWOUT   DQ2, 1, [$CC, $44]
DURUM1:
OWIN    DQ2, 4, [Busy1]   
IF      Busy1 = 0 THEN DURUM1   
OWOUT   DQ2, 1, [$CC, $BE]
OWIN    DQ2, 2, [HAM1.Lowbyte, HAM1.Highbyte]
T2=(HAM1*10)/16
O2 = T2//10
T2=T2/10
PAUSEUS 10
'*******************************************************************************
OWOUT   DQ3, 1, [$CC, $44]
DURUM2:
OWIN    DQ3, 4, [Busy2]   
IF      Busy2 = 0 THEN DURUM2   
OWOUT   DQ3, 1, [$CC, $BE]
OWIN    DQ3, 2, [HAM2.Lowbyte, HAM2.Highbyte]
T3=(HAM2*10)/16
O3 = T3//10
T3=T3/10
PAUSEUS 10
'*******************************************************************************
OWOUT   DQ4, 1, [$CC, $44]
DURUM3:
OWIN    DQ4, 4, [Busy3]   
IF      Busy3 = 0 THEN DURUM3   
OWOUT   DQ4, 1, [$CC, $BE]
OWIN    DQ4, 2, [HAM3.Lowbyte, HAM3.Highbyte]
T4=(HAM3*10)/16
O4 = T4//10
T4=T4/10
PAUSEUS 10
'*******************************************************************************
OWOUT   DQ5, 1, [$CC, $44]
DURUM4:
OWIN    DQ5, 4, [Busy4]   
IF      Busy4 = 0 THEN DURUM4   
OWOUT   DQ5, 1, [$CC, $BE]
OWIN    DQ5, 2, [HAM4.Lowbyte, HAM4.Highbyte]
T5=(HAM4*10)/16
O5 = T5//10
T5=T5/10
PAUSEUS 10

RETURN
'*******************************************************************************

End

Dtmf

Iyi aksamlar ete hocam serout ve serin komutlarini kullanarak 16f628 verici 4mhz,16f877 4 mhz rf modul ile haberlesme saglayabiliyorum sorun su Ben rf degilde tek tel kablo ile kontrol etmek istedigimde veri iletilemiyor Taki bordlarin (-) uclarini birbirine ekleyene kadar. Eksi uclari birlestirince veri gayet hizli ve kayipsiz iletiliyor. Sorun nedir sayin ete hocam. Yardimci olursaniz sevinirim saygilarimla

ete

Seri haberleşme bir onewire (tek kablo) haberleşme sistemi değidir. Data ucu GND ile birlikte kullanılmalıdır.
RF ile kablolu haberleşmeyi karıştırma. RF de sistem kendi GND si ile bir sinyal şekli oluşturup bunu havaya veriyor. Alıcı da kendi GND sini kullanarak bu sinyali yeniden oluşturup değerlendirir. Yani her ikisinde gnd ortak kullanılıyor gibi düşünebilirsin.
Yalnızca onewire sistemler tek kablo üzerinden haberleşir ve protoklleri tamamen farklıdır.

Ete

Dtmf

Ete hocam harbiden buyuk yanlislikla yapip yanlis sularda yuzuyormusim☺️ tesekkur ederim hocam one wire ile simdi hallettik jeton yeni dustu sagolsun hocam saglicakla kalin

Powered by EzPortal