avatar_ete

PIC Basic Ders-14 (RF haberleşme)

Başlatan ete, 28 Ağustos 2011, 16:27:17

ete

Çalıştırdım derken devreyi fiziki olarak yaptınızmı?
Yoksa simulasyonda mı çalıştırdınız?
Simulasyonda ise elbette bir değişiklik olmaz çünki simulasyonda RF alıcısı yok. Olması da pek mümkün değil zaten.
Bu nedenle devreyi gerçek olarak yapıp denemek lazım.

Ete

M.A.A

2 adet devre var birinde RF alıcı var diğerinde yok. RS_485 yazanda RF yok, onu çalıştırmayi denedim, çalıştıramadım.

ete

#17
Türkçe yazıyorum ama yine anlaşılmıyor sanırım. Devreyi fiziki olarak yapıp öylemi çalıştıramadınız yoksa simulasyondamı çalıştırmadınız????????????????????

Çalışmayı anlamak için aşağıdaki linkte verilen çalışmayıda okumanı öneririm.
http://etepic.com/index.php/topic,57.0.html

Ete

M.A.A

Evet RF olmayan devreyi similasyon olarak çalıştırmayı denedim.

ete

#19
Çalıştıramadığın dediğin sistemi daha önce çalıştımış ve başarılı olduktan sonra Ders notlarına dahil etmiştim.
Tabiiki neden çalıştıramadığını buradan kestirmem çok zor. Programın Master ile ilgili olan kısmına bakar isek;
BASLA:
KIME=1:EMIR=10:ALDI=0 'BİRİNCİ SLAVE'e EMIR VERECEĞİZ.
GOSUB YOLLA 'BİRİNCİ SLAVE'E EMRİ YOLLADIK
SAYAC=0
BIR:
SAYAC=SAYAC+1
IF SAYAC=30000 THEN IKI
PAUSEUS 5
IF ALDI=0 THEN BIR 'SLAVE DEN SICAKLIK BİLGİSİ GELİNCEYE KADAR ALDI=0 OLACAK GELİNCE ALDI=1 OLACAK

sistem açıldıktan sonra Master 1 nolu SLAVE ünitesine 10 nolu emri yolluyor ve ALDI isimli değişkeni sıfırlıyor.
Şayet 1 nolu Slave bu emri alır ise yapması gerekeni yapıp Master'e bilgi yollaması gerekiyor. Bu bilgi geldiğinde ALDI=1 olacağı için program bunu sağlayıncaya kadar bekliyor. Tabiiki sonsuza dek değil. Toplam 30000 komut çevrimi kadar bekliyor ve emir gelmemiş ise 2 nolu Slave ünitesine benzer şekilde emir yollamak üzere program IKI yazan etikete atlıyor.
Orada da 2 nolu Slave aynı emri yollayıp bir 30000 çevrim orada bekliyor.
Durum öyle gösteriyorki senin devrende Bilgi alışverişi gerçekleşmiyor. Bunun bir çok sebebi olabilir.
Anlamak için o devrelere ihtiyaç var. Hiç bir değişiklik yapmadan direk dosyadaki programları ve devreleri kullandı isen bir şey yollamana gerek yok. Yeniden bakarım (akşama mümkün olabilir).

Ete

M.A.A

Teşekkür ederim hocam. Benim daha önce kendi yazdığım program ile rs 485 den bir byte yollayıp bir byte alıyordum (fonksiyon kullanmadan). Fonksiyon kullanıp iletişimi hızlandırmak için sizin yazılımı inceledim anlamaya çalıştım. Bir bölümü anlamadım.

YOLLA:
      KONT=1 'RS-485 sistemi verme yönünde açıldı
      HSerOut ["E","T","E",KIME,EMIR]  'YOLLANAN BILGİDE ÖNCE KIME OLDUĞU SONRADA EMIR NUMARASI YOLLANDI
      ALDI=0
      KONT=0  'RS-485 sistemi tekrar alma moduna geçirildi
      Return

Bu kısımda RS-485 verme yönüne açılıyor, bilgi yollama başlatılıyor hemen alma yönüne çekiliyor, bilginin gitmesi için belli bir süre neden beklenmedi. Daha önceki bir yazınızda alma moduna geçmek için TXSTA.1  bitine bakmak gerekir diye yazmıştınız. Burada neden hemen alma yönüne çekilebiliyor.

ete

#21
Bu bir mater ve birden fazla Slave sistemi. Aslında sistem RF haberleşmesi için düşünüldü.
Ancak RF sistemi simule edemediğim için RS485 kullanarak sistemi denemeye karar vermiştim.
RS485 entegresinin 2 ve 3 nolu pinleri (RE ve DE) birleştirilip bu birleşik uca HIGH verirsen RS485 sistemi Data Yollama moduna girer. Bu birleşik ucu LOW'a çekersen data almak için hazırda bekler. Verdiğin kodlardaki ,
KONT=1 ve sonradan KONT=0 komutları bu işi yapmaktadır.
Prensip olarak master slave ilişkisinde tek yönlü haberleşme mantığını kullandığım için yönetici olan Master sürekli olarak işi kontrol etmektedir. Bu nedenle bir Slave üyesine elindekileri bana yolla diye emir yolladıktan sonra onun yollayacağı bilgileri almak üzere hemen alma pozisyonuna geçmesi gerektiği için alma konumuna geçirilmiştir.

Fonksiyon dediğin şey kesme kullanılması olsa gerek. Alma işlemini Kesme kullanarak yaptığım için hem bilgi kaybı olmaz hemde kesinlikle yollananı alırsın. İşin espirisi buradadır. Kesme kullanmadan da bilgi alınabilir. Ancak senkron yakalama zorluğu (bilgi yollandığı anda alıcınında almak için bekliyor olma zamanlaması) nedeni ile zaman zaman aksaklıklar yaşanabilir.
Kesme kullanan program bilgi geldiğini geri planda anlayıp işi gücü bırakarak kesme etiketine gidip gelen bilgiyi alır, Kesme kullanmayan program normal çalışma döngüsü içinde bir çok iş yaparken arada birde porta bakıp bilgi geliyormu diye kontrol etmesi gerekir. Ancak bilgi geldiği anda program portu kontrol etmiyor ise bilginin bir kısmını kaçırabilir. Buda yanlış bilgi alımına yada hiç alınmamasına sebep olabilir. Nadiren de olsa bunun meydana gelme olasılığı vardır.

Devreye baktım. Çalışıyor aslında ama bazı iyileştirmeler yapıp daha işi garantiye aldım. Bu nedenle dosyaları yeniledim.
Rar dosyasını yeniden yükleyip deneyebilirsin.

Ete


M.A.A

İlginiz için çok teşekkür ederim. Şimdi indirdim çalıştırdım :)

ruzgar78

ETE hocam daha önceki seri haberleşme derslerindeki 433 mhz RF kumanda devrenizi devrsini fiziki olarak çalıştırdım yanlız haberleşme kesilince yani tuşa elinizi basık tutup uzaklaştıgınız zaman mesafe alıcının sınırlarına çıktıgı zaman alıcıdaki port açık kalıyor yani ilgili röle çekik kalıyor bu durumu haberleşme kesildiğinde yapmaması için program üzerinde nasıl bir önlem alabilirim

program sizin çalışmanız bunu örnek alarak uyarladım
@ DEVICE pic16F628A                      'işlemci 16F628                               
@ DEVICE pic16F628A, WDT_ON              'Watch Dog timer açık
@ DEVICE pic16F628A, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628A, PROTECT_OFF         'Kod Protek kapalı
@ DEVICE pic16F628A, MCLR_off            'MCLR pini kullanılMIYOR.
@ DEVICE pic16F628A, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
CMCON=7
DEFINE OSC 4
PORTA=0:TRISA=%00000000
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:
                 
   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 1
   PORTA=(PORTA & %11111111) ^ %00000001
   YENI=0
   CASE 2
   PORTA=(PORTA & %11111111) ^ %00000010 
   YENI=0
   CASE 4
   PORTA=(PORTA & %11111111) ^ %00000100
   YENI=0
   CASE 8
   PORTA=(PORTA & %11111111) ^ %00001000
   YENI=0
   CASE 16
   HIGH PORTB.3
   CASE 32
   HIGH PORTB.4
   CASE 64
   HIGH PORTB.5
   CASE 128
   HIGH PORTB.6
   END SELECT
'   YENI=0 ':BILGI=0
   RETURN

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

ete

Bu sistemde butonların bir kısmı toggle bir kısmı aç/kapa şeklinde çalışmaktadır. PORTA da bağlı çıkışlar TOGGLE, PORTB de çalışan çıkışlar ise RF butonlarına bastıkça açık bırakınca kapalı olarak çalışıyor.
Bu açıkladığın pozisyona her ikiside uyar aslında. Ama sen Basıp açıtığın sonrada algılama mesafesi dışına çıkınca açık kalan çıkışları kast ediyorsunki bunlar PORTB pinleri oluyor.

Açık kalan çıkışların kapatılması yalnızca RF de tuş bırakıldı sinyali alınması sayesinde olduğuna göre kişi tekrardan algılama mesefesi içine girmelidir.

Giremiyor ise yapılacak tek şey , her, bas/bırak çıkışı aktif olduğunda TMR1 'i çalıştırıp belirli bir süre sonunda kesme oluşturmak ve çıkış hala aktif ise çıkışı kapatmak olur. Başkada yol aklıma gelmiyor maalesef. Çünki sistem sürekli haberleşmenin olacağı varsayılarak hazırlanmıştır.

Ete

ruzgar78

hocam TMR1 kenme blogunun içindemi aktif etmeliyim  küçük bir örnek e ihtiyacım var  if TMR1= 10 THEN PORTB=0 gibi mi

ete

Programın select case kısmında;
Case 16 ya ve Case 32 ve Case 64 ve Case 128'e aşağıdaki işlemleri ilave etmen gerek.
Ben Case 16 ya ilave edilişi göstereyim aynısını diğerlerine sen ekle
Case 16
  HIGH PORTB.3  'burada yanılma diğer case lerde farklı pin set ediliyor.
  PIR1.0=0  'kesme bayrağı sıfırlandı
  PIE1.0=1  'TMR1 kesmesi açıldı
  TMR1L=0:TMR1H=0 'timer sıfırlandı
  T1CON=%00000001  'timer aktif edildi. 'bu hali ile 65 ms sonra kesme oluşur.
'T1CON=%00010001  'bu hali ile 130 ms sonra kesme oluşur
' T1CON=%00100001  'bu hali ile 260 ms sonra kesme oluşur
' T1CON=%00110001  'bu hali ile 520 ms sonra kesme oluşur hangisini istiyorsan o satırı açarsın

Kesme Kısmınıda aşağıdaki şekilde değiştir ;

   DISABLE
KES:
    GIE=0
    IF PIR1.0=1 THEN
        PORTB=0  'açık olan pini kapattık
        PIE1.0=0   'TMR1 kesmesini iptal ettik
        PIR1.0=0   'klesme bayrağını sıfırladık
        Goto ATLABIR
    ENDIF
    hSerIn 15,ATLA,[WAIT ("ETE"),BILGI]
    GELEN=BILGI
    YENI=1
ATLA:
    TEMP=RCREG

ATLABIR: 
    GIE=1
  Resume
    enable           
             
END


Hepsi bu kadar
Ete

ruzgar78

HOCAM SADECE CASE 16 İÇİN DENEDIGIMDE "DEVRE SUAN MASADA " SUREKLI BASTIGIMDA HIZLI HIZLI ACIP ACIP KAPATIYOR

ben basınca röle çekik bırakınca role bıraksın modunda kullanıyorum ve program bu şekilde sizin verdiğinizi uyarladıgımda sürekli basış da sürekli açıp açıp kapatıyor elim tuşa basılı vaziyette iken bir yerde yanlışmı yapıyorum acaba program söyle

'****************************************************************
'*  Name    : A.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 9/16/2013                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
@  __config _INTRC_OSC_NOCLKOUT & _WDT_ON & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BODEN_OFF


CMCON=7
;OPTION_REG.7=0
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
KUMANDA_ID VAR BYTE 60
USER_ID VAR BYTE 61

ON INTERRUPT GOTO KES


PORTB=0

RCIE=1
PEIE=1
GIE=1


 

BASLA:
  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
   PIR1.0=0  'kesme bayrağı sıfırlandı
   PIE1.0=1  'TMR1 kesmesi açıldı
  TMR1L=0:TMR1H=0 'timer sıfırlandı
  T1CON=%00000001  'timer aktif edildi. 'bu hali ile 65 ms sonra kesme oluşur.
   END SELECT
PAUSE 300: YENI=0 :BILGI=0
YENI=0:BILGI=0
   RETURN
; ETE HOCANIN DEĞİŞİKLİGİ ROLE TAKILMA İÇİN
DELAY:
      FOR I=0 TO 255
      PAUSEUS 1
      NEXT
      RETURN
       
      DISABLE
KES:
   GIE=0
    IF PIR1.0=1 THEN
        PORTB=0  'açık olan pini kapattık
       PIE1.0=0   'TMR1 kesmesini iptal ettik
        PIR1.0=0   'klesme bayrağını sıfırladık
        Goto ATLABIR
    ENDIF
    hSerIn 15,ATLA,[WAIT ("ETE"),BILGI]
    GELEN=BILGI
    YENI=1
ATLA:
    TEMP=RCREG

ATLABIR: 
    GIE=1
  Resume
    enable           
           
END

               
                 
; önceki halini kapattım           
;DISABLE
;KES:
   ; GIE=0
   ; hSerIn 15,ATLA,[WAIT ("ETE"),BILGI, KUMANDA_ID]
   ; GIE=0
   ; GELEN=BILGI
    ;USER_ID=KUMANDA_ID
    ;YENI=1
   
   
;ATLA:
   ; TEMP=RCREG
   ; GIE=1
   
   ; Resume
   ; enable           
             
;END
       

ruzgar78

suan deniyorum bir kere bassam bile takılı kalıyor

ete

peki nasıl çalışmasını isterdin?
Ete

Powered by EzPortal