4 kanal alıcı verici devrede sorunu bulamıyorum

Başlatan Artemis, 01 Ocak 2016, 20:56:23

Artemis

Herkese merhabalar,hobi amaçlı devreler yapıyorum ve bilgisayardan kontrollü 4 kanal alıcı verici devre yaptım.Verici devre bilgisayarda kendi yaptığım arayüz programından komut alıyor ve buna bağlı olarak alıcı devreye data yolluyor.Alıcı devrede gelen dataya bağlı olarak 4 röleden ilgili olanı açıyor ya da kapatıyor.pc den 1.röle aç butonuna bastığımda verici devre bunu okuyor ama alıcıya bazen iletiyor bazen iletmiyor.Eğer pcden 1.röle aç butonuna birkaç kez basarsam alıcı kesin datayı alıyor ben butona 1 kere bastığımda neden iletişim sağlanmıyor?İlgili devre şemasını ve pic yazılımını ekliyorum.Hatamı bulup bana bildirirseniz sevinirim şimdiden teşekkürler...

Verici devre yazılımı;

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2015 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 30.12.2015                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF

include "modedefs.bas"
TRISA=%0000000
TRISB=%00101010
CMCON=7
DEFINE OSC 4
OPTION_REG.7=0

PC VAR PORTB.1
BILGI VAR BYTE
CIKIS VAR PORTB.0
GIDEN VAR byte
D1 VAR BYTE
D2 VAR BYTE
D3 VAR BYTE
D4 VAR BYTE
L1 VAR PORTA.0
L2 VAR PORTA.1
L3 VAR PORTA.2
L4 VAR PORTA.3

OKU:
READ 0,D1
READ 1,D2
READ 2,D3
READ 3,D4
IF D1=100 THEN
L1=1
ENDIF
IF D2=100 THEN
L2=1
ENDIF
IF D3=100 THEN
L3=1
ENDIF
IF D4=100 THEN
L4=1
ENDIF

BASLA:
SERIN2 PC,84,[DEC BILGI]

IF BILGI = 10 THEN
GIDEN=11
L1=1
D1=100
WRITE 0,D1
GOTO GONDER
ENDIF

IF BILGI = 15 THEN
GIDEN=16
L1=0
D1=200
WRITE 0,D1
GOTO GONDER
ENDIF

IF BILGI = 20 THEN
GIDEN=21
L2=1
D2=100
WRITE 1,D2
GOTO GONDER
ENDIF

IF BILGI = 25 THEN
GIDEN=26
L2=0
D2=200
WRITE 1,D2
GOTO GONDER
ENDIF

IF BILGI = 30 THEN
GIDEN=31
L3=1
D3=100
WRITE 2,D3
GOTO GONDER
ENDIF

IF BILGI = 35 THEN
GIDEN=36
L3=0
D3=200
WRITE 2,D3
GOTO GONDER
ENDIF

IF BILGI = 40 THEN
GIDEN=41
L4=1
D4=100
WRITE 3,D4
GOTO GONDER
ENDIF

IF BILGI = 45 THEN
GIDEN=46
L4=0
D4=200
WRITE 3,D4
GOTO GONDER
ENDIF

GIDEN=111

GONDER:
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]
SEROUT2 CIKIS,396,["E","T","E",GIDEN]

BILGI=0

GOTO BASLA
END





Alıcı devre yazılımı

'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2016 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 01.01.2016                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF
include "modedefs.bas"
TRISA=%11111111
TRISB=%00000000
CMCON=7
DEFINE OSC 4
OPTION_REG.7=0

GIRIS VAR PORTA.0
GELEN VAR byte
D1 VAR BYTE
D2 VAR BYTE
D3 VAR BYTE
D4 VAR BYTE
L1 VAR PORTB.0
L2 VAR PORTB.1
L3 VAR PORTB.2
L4 VAR PORTB.3
PORTB=%00000000

OKU:
READ 0,D1
READ 1,D2
READ 2,D3
READ 3,D4
IF D1=100 THEN
L1=1
ENDIF
IF D2=100 THEN
L2=1
ENDIF
IF D3=100 THEN
L3=1
ENDIF
IF D4=100 THEN
L4=1
ENDIF

BASLA:
SERIN2 GIRIS,396,[WAIT ("ETE"),GELEN]


IF GELEN=11 THEN
L1=1
D1=100
WRITE 0,D1
ENDIF

IF GELEN=21 THEN
L2=1
D2=100
WRITE 1,D2
ENDIF

IF GELEN=31 THEN
L3=1
D3=100
WRITE 2,D3
ENDIF

IF GELEN=41 THEN
L4=1
D4=100
WRITE 3,D4
ENDIF

IF GELEN=16 THEN
L1=0
D1=200
WRITE 0,D1
ENDIF 

IF GELEN=26 THEN
L2=0
D2=200
WRITE 1,D2
ENDIF   

IF GELEN=36 THEN
L3=0
D3=200
WRITE 2,D3
ENDIF   

IF GELEN=46 THEN
L4=0
D4=200
WRITE 3,D4
ENDIF


GOTO BASLA
END



Artemis

Bu arada yazmayı unutmuşum devre isiste sorunsuz çalışıyor(kablolu bağlantı ile),Fakat breadboard üzerinde dediğim gibi alıcıya datayı sağlıklı göndermek için pc deki butona 3-5 kere seri şekilde basmak gerekiyor.

ete

Haberleşme de senkron denilen bir husus vardır. buu anlatabilmek için bir örnek vermek doğru olacak sanırım.
Bir evin içinde hemen dış kapının önünde duruyor iken kapı çalsa ne kadar sürede kapıyı açıp gelen ile muhatap olabilirsiniz?. Anında demek lazım çünki zaten kapının arkasında duruyorsun. Peki sen içeride odanın birinde iken kapı çaldı diyelim bu durumda yerinden kalkacaksın dış kapıya kadar gideceksin ve kapıyı açacaksın. Bir önceki durum ile aynı sürede olmayacak bu açılış. Birde evin içinde en dip odada iken aynı kapnın çaldığını düşünürseniz siz dış kapıya gidinceye kadar çalan beklemekten sıkılıp çekip gidecektir belkide.
İşte sürekli kapı arkasında kapı çalacak bende açacağım diye beklersen senkron yakalamış olursun. Ama bu arada başka işle meşgul olman çok zor özellikle işlerin içerideki odalarda ise. Pic haberleşmeside benzer özellikler taşır. Verici verisini yollamış ise ve alıcıda o veriyi beklyor durumda ise anında gelen veri alınıp işleme konulabilir. Ama alıcı o anda başka işlerle meşgul ise elbette gelen veri beklemeyecek ve veri kaçırılacaktır. Ancak bir sonrakine yetişebilme mümkün olacaktır muhtemelen.
Haberleşmede senkron tutturmanın iki yolu var. Ya alıcı sürekli veriyi bekleyecek ancak aldıktan sonra bir iş yapacak ve o işide kısa sürede halledip hemen bekleme moduna girecek yada gelen veri kesmesi kullanarak kesmeyi bekçi gibi kullanıp veri geldiğinde haber ver diyecektir.En tutarlısı ve doğrusu bu ikinci metoddur ve ne hikmet ise hemen herkes bu hususu atlayıp birinciyi yarım yamalak uyguluyor. Sende öyle yapmışsın.
Bir defa PC haberleşmesi denilmiş ama ortada iki pic haberleşmes var gibi gözüküyor. PC seri haberleşmede RS232 lojik seviyeleri kullanır. Yani LOW=+10V , HIGH=-10V dur. Bunun birde sıfır (GND) noktası olduğu düşünülürseHIGH ile LOW arasında 20V luk bir seviye farkı vardır.
PIC ise TTL seviyeleri kullanır. Yani LOW=0V (GND) , HIGH=+5V dur. Bu ki sistemin bir birini anlayabilmesi için arada bir seviye tercümanına ihtiyaç duyarlar. Pic HIGH yoolladığı zaman (+5V) bunu alıp -10V ta bu tercüman çevirmelidir. Aynı şekilde PC bir HIGH yolladığı zaman bunu alıp +5V ta bu tercüman çevirir. Tercümanın entegre adı MAX232 dir. Bu entegre TTL ialıp RS232 ye veya RS232 yialıp TTL e çevirir.
BU açıklamayı devrende bu tür bir çevirici olması gerektiğini anlatmak için verdim. Şemanda böyle bir şey gözükmüyor çünki.
Gelelim programdaki kusurlara;
Verici bir şey yollayabilmesi için bir şey alması gerekiyor.  Aldığını değerlendirip önce eproma yazıp sonra göndermeye geçiyor.  Epromun bu kadar sınırsız kullanımıda bana göre sakıncalı ama şimdilik buraya takılmayalım. Bu durumda vericide çok fazla yapılacak birşey yok demektir.
Burada USART kullanılsa sistem şöyle çalışacak idi. Veri alınmış ise (ALDIM=1 olunca) alınan veri test edilecek ve ona uygun bir değer hesaplanıp gerekli veri yine USART üzerinden yollanacak idi. Ne farkı var diyebilirsin. Senin modelinde program SERIN komutunda veri gelinceye kadar bekler. Ancak bir veri gelmiş ise aşağıdaki satırları değerlendirir. O esnada başka bir veri gelrse onları alamaz. Çünki başka işlerle meşguldür.
Kesme sisteminde ise veri gelir gelmez değerlendirme başlar ve veri gelsede gelmesede program bu değerlendirme kısmında işini bitirinceye kadar çalışır. Bu esnada ikinci bir veri gelirse işine ara verip gider o gelen veriyide alır. Hiç bir zaman senkron kaybolmaz.

Alıcı kısma gelince; bu programda br şey almak için bekleyecek. Peki her iki programda almak için bekliyor ise ilk yollamayı kim nasıl yapacak?
SERIN komutu mutlaka 65535 ms (yaklaşık 66 sn) yerinde veri gelmesni bekler ve hemen ardından yeniden beklemeye geçer. Bu durumda bu işte bir terslik var demektir. Her iki programda veri bekliyor ise nasıl haberleşecekler. Birisinden biri işe veri yollamakla başlamalı ki döngü başlayabilsin. Sorunun burada bence.

Alıcı kısımda bir tedbir alınmaz ise program sürekliilke gelen veriye uygun olarak eproma veri yazar. Bu işin yalnızca bir kere yapılmasını sağlaman gerekir. Aksi halde 1 saat dolmadan bu program epromun yazma ömrünü tüketebilir.

Ete



Powered by EzPortal