RF 4 KANAL RÖLE KONTROLU BELLİ BİR SÜRE BİLGİ GELMEZ İSE

Başlatan ruzgar78, 15 Ekim 2014, 17:37:58

ruzgar78

İyi günler hocam
sizin uzun zaman önce RF ile 4 adet röle yi uzak dan kontrol eden devreyi yapmıştım. fakat zaman zaman röle açık kalıyor.

programa belli bir süre komut gelmez ise alıcı portlarının hepsini sıfır yapabilirmiyiz. röleleri Sürekli basımda aktif olucak şekilde yapmıştım ama bazan RF in kapsamı alanının dışına çıkınca alıcıdaki röle aktif kalıyor bu durumu önlemek için belli bir süre komut gelmez ise alıcı çıkış portlarını nasıl sıfırlaya bilirim ?


ALICI:

@  __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BODEN_OFF

CMCON=7
DEFINE OSC 4
PORTA=0:TRISA=%00000100
PORTB=0:TRISB=%00000010       
' -------------- haberlesme define
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically


SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
SYMBOL VERIIN=PORTA.0

BILGI var BYTE 56
I     VAR BYTE 57
TEMP  VAR BYTE 58
GELEN VAR BYTE 59
YENI  VAR BIT




   



PORTB=0

RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO KES

 

BASLA:
;gosub kes
   IF BILGI=0 THEN PORTB.3=0
   IF YENI=1 THEN GOSUB TUSBAK
   GOSUB DELAY
   PORTB=0
   GOTO BASLA
   
TUSBAK:
SELECT CASE BILGI

CASE 0
YENI=0:BILGI=0
  GOTO BASLA

   CASE 16 ; OK
   HIGH PORTB.3
  CASE 0
  YENI=0:BILGI=0
  PAUSE 300: LOW PORTB.3
   CASE 32 ; OK
   HIGH PORTB.4
  CASE 0
  YENI=0:BILGI=0
  PAUSE 300: LOW PORTB.4
   CASE 64 ;OK
   HIGH PORTB.5
   case 0
   YENI=0:BILGI=0
  PAUSE 300: low portb.5
   CASE 128
   HIGH PORTB.6
  case 0
  YENI=0:BILGI=0
PAUSE 200:  low portb.6
   END SELECT

PAUSE 300: YENI=0 :BILGI=0
YENI=0:BILGI=0
   RETURN
   RETURN
DELAY:
      FOR I=0 TO 255
      PAUSEUS 1
      NEXT
      RETURN   
           
DISABLE
KES:
    GIE=0
    hSerIn 15,ATLA,[WAIT ("JJJ"),BILGI]
    GIE=0
    GELEN=BILGI
    IF BILGI=0 THEN GOSUB KES
   
    YENI=1   
ATLA:
    TEMP=RCREG
    GIE=1
    Resume
    enable           
             
END

VERİCİ:
@  __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BODEN_OFF
CMCON=7

DEFINE OSC 4
TRISA=%00000000
TRISB=%11111111
OPTION_REG.7=0
BILGI VAR BYTE
KUMANDA_ID VAR BYTE
USER_ID VAR BYTE
KUMANDA_ID=USER_ID
symbol LED=PORTA.1
SYMBOL VERIOUT=PORTA.0

MAIN:

             BILGI=~PORTB
           
            IF BILGI =16 OR BILGI=32 OR BILGI=64 or BILGI=128  THEN
              GOSUB VER
             ; while portb<255:wend
             IF  BILGI=0 THEN GOSUB VER
            ENDIF
           
            pausE 1
            low porta.1
            GOTO MAIN           
       
       
       

VER:
      HIGH portA.1
     IF  BILGI=0 THEN GOSUB VER 
      serout2 VERIOUT,396,[REP$AA\5,REP$00\5,REP$FF\5]
      serout2 VERIOUT,396,["J","J","J",BILGI,KUMANDA_ID]
       serout2 VERIOUT,396,["J","J","J",BILGI,KUMANDA_ID]
        serout2 VERIOUT,396,["J","J","J",BILGI,KUMANDA_ID]
         serout2 VERIOUT,396,["J","J","J",BILGI,KUMANDA_ID]
          serout2 VERIOUT,396,["J","J","J",BILGI,KUMANDA_ID]
   

     IF  BILGI=0 THEN GOSUB VER
      RETURN
     
END
               
                         

ete

Her iki programda da hatalar var nasıl çalışıyorlar anlamadım. Belkide rölelerin kusurları bu hatalara bağlıdır.
Sırası ile açıklayayım;
VERICI;
Main kısmınd;
IF  BILGI=0 THEN GOSUB VER
şeklinde bir satırın var. Bu bilgi=0 ise VER isimli alt programa gönderir programı.
Şimdi VER isimli alt programa Gosub ile geldik diyelim. Orada ne var ona bakalım.
     HIGH portA.1
     IF  BILGI=0 THEN GOSUB VER
zaten Gosub ile geldiğin VER alt programına yine aynı komutu yerleştirmişsin.
     IF  BILGI=0 THEN GOSUB VER
komut satırı programı yeniden VER etiketine yönlendirecek ama stack da iki ayrı adres yer alacak. Her biri için bir RETURN gerekir.
Bu yetmiyormuş gibi gönderme komutlarından sonra bir tane daha yerleştirmişsin bu da programın bir müddet sonra ya kilitlenmesine yada stack hatasından dolayı ratsgele bir yere gitmesine sebep olur.
Ver etiketi altın da yer alan      IF  BILGI=0 THEN GOSUB VER satırlarını silmen gerekiyor. Bi rişine yaramadığı gibi işinide bozuyor.

ALICI;
USART kesmesi olan programa bir sürü Pause doldurmuşsun. Bunları silmen ve yerlerine Döngüsel gecikme ayarlaman gerekiyor.

Ayrıca kesme içinde gosub ile yine kesme etiketine gidemezsin.  Buda stack hatası doğurur.
IF BILGI=0 THEN GOSUB KES  komut satırını oradan sil bence. Sen gelen bir şey yoksa yeniden bakılsın diye KES etiketine yollamışsın ama zaten kesmenin amacı bir şey gelmiş ise otomatikman programı kes etiketine yönlendirmek olduğuna göre o satıra hiç ihtiyaç yok orada.

Bence bu hataları düzelt sonra yeniden çalıştır sistemi ve o zaman gerekiyorsa söylediğin şeyle ilgileniriz.

Ete

ruzgar78

Teşekkür ederim hocam ilgili satırları sildim tekrar deneyeceğim

ruzgar78

Hocam dediğiniz gibi alıcı ve verici kısmındaki gereksiz kodları sildim. Sonuç olarak sistem yine çalışıyor fakat çok nadir de olsa uzak mesafede tuştan elimi çektiğim anda sanki kesme den çıkamıyormuş gibi davranıp röle aktif kalıyor yeniden bas çek yapınca röle bırakıyor ve sistem duruyor. Bu durumu önlemek ve güvenlik amaçlı belli bir süre tuşa basılmaz ise portb 'i "0" yap diye bir kod yazabilir miyim ?

Kodların son durumu :
Alıcı:
@  __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BODEN_OFF

CMCON=7
DEFINE OSC 4
PORTA=0:TRISA=%00000100
PORTB=0:TRISB=%00000010       
' -------------- haberlesme define
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 20h ' Enable transmit, BRGH = 0
DEFINE HSER_SPBRG 25  ' 2400 Baud @ 4MHz, 0,17%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

SYMBOL GIE  =INTCON.7   'genel interruptları açıyor
SYMBOL PEIE =INTCON.6   'peripheralinterruptları açıyor
SYMBOL RCIE =PIE1.5     'USART Recive interrupt enable bit
SYMBOL RCIF =PIR1.5     'USART Receive interrupt flag bit
SYMBOL VERIIN=PORTA.0

BILGI var BYTE 56
I     VAR BYTE 57
TEMP  VAR BYTE 58
GELEN VAR BYTE 59
YENI  VAR BIT

PORTB=0

RCIE=1
PEIE=1
GIE=1
ON INTERRUPT GOTO KES

BASLA:
;gosub kes
   ;IF BILGI=0 THEN PORTB.3=0
   IF YENI=1 THEN GOSUB TUSBAK
   GOSUB DELAY
   PORTB=0
   GOTO BASLA
   
TUSBAK:
SELECT CASE BILGI

CASE 0
YENI=0:BILGI=0
  GOTO BASLA

   CASE 16 ; OK
   HIGH PORTB.3
  CASE 0
  YENI=0:BILGI=0
LOW PORTB.3
   CASE 32 ; OK
   HIGH PORTB.4
  CASE 0
  YENI=0:BILGI=0
   LOW PORTB.4
   CASE 64 ;OK
   HIGH PORTB.5
   case 0
   YENI=0:BILGI=0
low portb.5
   CASE 128
   HIGH PORTB.6
  case 0
  YENI=0:BILGI=0
low portb.6
   END SELECT

YENI=0 :BILGI=0

   RETURN
   RETURN
DELAY:
      FOR I=0 TO 255
      PAUSEUS 1
      NEXT
      RETURN   
           
DISABLE
KES:
    GIE=0
    hSerIn 15,ATLA,[WAIT ("JJJ"),BILGI]
    GELEN=BILGI
    YENI=1   
ATLA:
    TEMP=RCREG
    GIE=1
    Resume
    enable           
             
END


         
Verici:

@  __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BODEN_OFF
CMCON=7

DEFINE OSC 4
TRISA=%00000000
TRISB=%11111111
OPTION_REG.7=0
BILGI VAR BYTE
KUMANDA_ID VAR BYTE
USER_ID VAR BYTE
KUMANDA_ID=USER_ID
symbol LED=PORTA.1
SYMBOL VERIOUT=PORTA.0

MAIN:

             BILGI=~PORTB
           
            IF BILGI =16 OR BILGI=32 OR BILGI=64 or BILGI=128  THEN
              GOSUB VER
            ;  while portb<16:wend
           ;  IF  BILGI=0 THEN GOSUB VER
            ENDIF
           
            pausE 1
            low porta.1
            GOTO MAIN           
       
VER:
      HIGH portA.1
   
      serout2 VERIOUT,396,[REP$AA\5,REP$00\5,REP$FF\5]
      serout2 VERIOUT,396,["J","J","J",BILGI,KUMANDA_ID]
       serout2 VERIOUT,396,["J","J","J",BILGI,KUMANDA_ID]
        serout2 VERIOUT,396,["J","J","J",BILGI,KUMANDA_ID]
         serout2 VERIOUT,396,["J","J","J",BILGI,KUMANDA_ID]
       
      RETURN
     
END                                       

ete

Bu dediğin ALıcı da mı yoksa vericide mi yapılacak. Birde süre nedir. Ne kadarlık sürede basılmaz ise PortB=0 olacak?

Ete

İlyas KAYA

RF modülün DATA çıkışına bir tane 10K pull down veya pull up direnci atın.
Bazen parazitler kesmeye sebebiyet verebiliyor.

Direnci attığınızda verinin gelmediğini daha hızlı anlayıp program daha hızlı tepkiler veriyor.

Mesefade herhangi bir değişiklikte olmuyor.
Şuan 5 nci kattan veri alabilen bodrum katındaki otomatik kepengim bu şekilde çalışıyor.

Normalde PT 2272 kullanıyorum ama kepenkte kumandayı da kendim yaptığım için bende sıkıntı yaşamıştım.

10K direnci atınca herşey düzeliyor. Yalnız p.up mı yoksa p.down mı attım sökmeden kesin bişey diyemem sen denersin :)
Göz odur ki dağ ardını görsün,
Akıl odur ki başa geleceği bilsin.!

ruzgar78

İlyas bey önerinizi deneyeceğim.

Bellirlenen süre aralığı 2sn olabilir.

Ete hocam alıcı kısmına yazacağım. alıcı kısmına nümerik ve alfanümerik bilgi gelmedi durumda portb=0 yapmak istiyorum.

yada vericiden belirlediğimiz bilgi geldiği sürece kesme aktif olup ilgili satırı işleyecek eğer bilgi gelmez ise portb i sıfır yapsınki röle istem dışı aktif kalmasın istiyorum hocam. yada nasıl bir öneriniz olur. daha profesyonel RF moduller varsa tavsiye edebilirmisiniz.

ete

Programda hala hata var. Şimdi dikkatimi çekti.
TUSBAK kısmında;
CASE 16 ; OK
  HIGH PORTB.3
  CASE 0
  BILGI=0
  LOW PORTB.3
şeklinde satırlar var. CASE 16 olduğu için (BILGI=16) buraya geliyor program.
Peki orada CASE 0 satırı ne geziyor? ne anlama geliyor acaba. Zira diğer CASE lerde de aynı şeyi yapmışsın. Bu tamamen hata.
CASE içinde CASE yazılmaz. Yazılsada bir anlamı olmaz zira orada CASE 0 olma ihtimali hiç yokki.

İşin bu kısımlarınıda düzelt.

Diğer meseleye gelince,
SAYAC VAR WORD şeklinde bir sayac tanımla

BASLA satırları altında yer alan PORTB=0 satırını silmen gerekecek zira ilave bu işi yaptırmak için koyulacak.
O satırı silip yerine;
SAYAC=SAYAC+1
IF SAYAC=4000 THEN
  PORTB=0
  SAYAC=0
ENDIF
şeklinde satır ilave edeceksin.
Burada Delay döngüsü ne kadarlık bir gecikme yaratıyor bilmek lazım. Zira 4000 rakamını rastgee yazdım. Zira
programda , BASLA ise GOTO BASLA arasında sadece komut gecikmeleri ve birde GOSUB DELAY dan doğan gecikme mevcut. Bunların toplamı 1 ms tutuyor ise 4.000 yerine 2000 yazmak gerekir. Bunu deneme yanılma ile öğrenebilirsin. Zaten çok da kritik olmasa gerek. Bence 4000 yeterli bir değer olur.

Tabiiki bilgi gelirse YENI=1 olacağı için program TUSBAK etiketine gelecek. Orayada SAYAC=0 yazarsan her yeni bilgi geldiğinde de sayac sıfırlanmış olur ve bilgi geldikçe 4000 değerine kolaylıkla ulaşamaz. Anak bilgi kesilirse sayac 4000 değerine ulaşır ve portb yi sıfırlar.

Ete


ruzgar78

hocam verici kısmınında aynı zamanda röleyi kapatması için "0" bilgisi gönderiyordum sonra vericiden onu sildim alıcı kısmında case "0"  silmeyi unutmuşum size gönderirken o kısmı düzeltirim sorun değil sistem şu haliyle çalışıyor zatende esas sorun bazı zamanlarda uzaktan rölenin takılı kalması. Şimdi dediğiniz sayacı kurup deneyeceğim. Ayrıca ilyas bey in dediği gibi röle takılı kaldığında data portuna her hangi bir iletkenle dokunduğumda röle pasife düşüyor bir de 10k ile pull down yapıp deneyeceğim

Powered by EzPortal