12F675 Alıcı 16F628A Verici RF Haberleşme Sorunu

Başlatan hasansabbah, 13 Nisan 2023, 05:13:53

hasansabbah

12f675 alıcı ve 16f628a verici devresi tasarladım, devre proteusta çalışıyor fakat normalde denediğimde sonuç alamıyorum. Devrenin amacı vericide bulunan 10 butonun her birinden farklı bir şifre gönderip eğer bu şifre alıcının eepromundaki şifreyle aynı ise ledi yakmak. Alıcıda kullanılan butona bir buçuk saniye basılı tutulursa eepromundaki veriyi siliyor ve yeni gelen veriyi eeproma kaydediyor. Alıcıda 12f675 in dahili osilatörü verici devremde ise harici 4 mhz kristal kullandım. Kodları ve simülasyon dosyasını paylaşıyorum. Yardımcı olabilir misiniz?


ete

Alıcıdan başlarsak, aşağıdaki iki tanımlama eksik olmuş.
TRISIO=001100
GPIO=001100
doğrusu,
TRISIO=%001100
GPIO=%001100
şeklinde olmalı. Bu tanımlama şekli rakamların binary formatta verilmesi şeklidir. Basic de binar format % işareti ile başlamalıdır.

Her bir programın içinde register ve değişken tanımlamalarından sonra çalıştırmada, bu değerlerin işlemci içinde ayarlanması için bir süre vermeniz gerekir. Bu süre minimum 150 ms dir. Ben genellikle 300 ms veririm. Dolayısıyla Basla etiketinden önce mutlaka 300ms lik bir gecikme koyunuz. Pek çok kişi bu noktada koymasamda çalışıyor diyor. Elbette çalışabilir ama arada bazı değişken adreslerinin yeterince tanımlanmamış olması kuvvetle ihtimaldir ve program bir yerlerde buna bağlı hata yapacaktır illaki.

SERIN ve SEROUT komutlarında bir MOD buna bağlı bir MOD_NO ve bunlara karşılık gelen bir Baud Rate vardır. Komut formatı, SERIN Pin,Mode,{Timeout,Label,}{[Qual...],}{Item...}
şeklindedir. Bu format içinde Mode yerine Mod_No kullanmak isterseniz programın başına INCLUDE "modedefs.bas" eklemeniz gerekir. Bu eklenen dosyada hangi moda karşılık hangi mod_no sunun kullanılacağı belirlenmiştir.
Pek çok kişi saki bir stadartmış gibi programlarıı başına INCLUDE "modedefs.bas" ekliyor. Gereksiz yere eklemeyelim lütfen. Daima ne yaptığınızı bilerek çalışın. Sende bu eklemeyi yapmışsın ama komut formatını standart şekilde kullanmışsın. Üstelik bu standart da eksik kullanılmış.
Komut açıklamasına bakacak olursak MOD=T2400 buna karşılık gelen Mod_No=0 ve bunlara karşılık gelen Baud rate=2400 ve açıklamasıda Driven True şeklinde verildiğini görebilirsiniz.
Şimdi senin kullandığın şekle bakarsak;
SERIN GPIO.3,600,["B","R","K"],GELEN şeklinde hiç de standart olmayan bir baud değeri ile komut kullanılmış ama Mode yerine direk Baud Rate yazılmış ki bu bence yanlış.
600 yerine T2400 (veya N2400 yazarak invert şeklinde yollama yapılabilir) yazılmış olsa komut doğru olacak idi. Komut formatına bakacak olursanız orada Mode diyor Baud_Rate demiyor.
Enteresan şekilde isis de bu hali ile de çalışıyor ama anlaşılan buda bir isis hatası gerçekte çalışmadığına göre.

Verici kısmında kusur olarak açılış gecikmesinin olmayışı ve SEROUT komut formatında yine Mode yerine Baud kullanılmış olduğunu söyleyebilirim.
Basic de komut formatlarını yada açıklamalarını görmek için MCS ekranında komut üzerine kursörü getirip F1 tuşuna basmanız gerekir. Bylece o komut ile ilgli açıklamaya ulaşabilirsiniz.

Ete

hasansabbah

#2
Alıntı yapılan: ete - 13 Nisan 2023, 08:53:36Alıcıdan başlarsak, aşağıdaki iki tanımlama eksik olmuş.
TRISIO=001100
GPIO=001100
doğrusu,
TRISIO=%001100
GPIO=%001100
şeklinde olmalı. Bu tanımlama şekli rakamların binary formatta verilmesi şeklidir. Basic de binar format % işareti ile başlamalıdır.

Her bir programın içinde register ve değişken tanımlamalarından sonra çalıştırmada, bu değerlerin işlemci içinde ayarlanması için bir süre vermeniz gerekir. Bu süre minimum 150 ms dir. Ben genellikle 300 ms veririm. Dolayısıyla Basla etiketinden önce mutlaka 300ms lik bir gecikme koyunuz. Pek çok kişi bu noktada koymasamda çalışıyor diyor. Elbette çalışabilir ama arada bazı değişken adreslerinin yeterince tanımlanmamış olması kuvvetle ihtimaldir ve program bir yerlerde buna bağlı hata yapacaktır illaki.

SERIN ve SEROUT komutlarında bir MOD buna bağlı bir MOD_NO ve bunlara karşılık gelen bir Baud Rate vardır. Komut formatı, SERIN Pin,Mode,{Timeout,Label,}{[Qual...],}{Item...}
şeklindedir. Bu format içinde Mode yerine Mod_No kullanmak isterseniz programın başına INCLUDE "modedefs.bas" eklemeniz gerekir. Bu eklenen dosyada hangi moda karşılık hangi mod_no sunun kullanılacağı belirlenmiştir.
Pek çok kişi saki bir stadartmış gibi programlarıı başına INCLUDE "modedefs.bas" ekliyor. Gereksiz yere eklemeyelim lütfen. Daima ne yaptığınızı bilerek çalışın. Sende bu eklemeyi yapmışsın ama komut formatını standart şekilde kullanmışsın. Üstelik bu standart da eksik kullanılmış.
Komut açıklamasına bakacak olursak MOD=T2400 buna karşılık gelen Mod_No=0 ve bunlara karşılık gelen Baud rate=2400 ve açıklamasıda Driven True şeklinde verildiğini görebilirsiniz.
Şimdi senin kullandığın şekle bakarsak;
SERIN GPIO.3,600,["B","R","K"],GELEN şeklinde hiç de standart olmayan bir baud değeri ile komut kullanılmış ama Mode yerine direk Baud Rate yazılmış ki bu bence yanlış.
600 yerine T2400 (veya N2400 yazarak invert şeklinde yollama yapılabilir) yazılmış olsa komut doğru olacak idi. Komut formatına bakacak olursanız orada Mode diyor Baud_Rate demiyor.
Enteresan şekilde isis de bu hali ile de çalışıyor ama anlaşılan buda bir isis hatası gerçekte çalışmadığına göre.

Verici kısmında kusur olarak açılış gecikmesinin olmayışı ve SEROUT komut formatında yine Mode yerine Baud kullanılmış olduğunu söyleyebilirim.
Basic de komut formatlarını yada açıklamalarını görmek için MCS ekranında komut üzerine kursörü getirip F1 tuşuna basmanız gerekir. Bylece o komut ile ilgli açıklamaya ulaşabilirsiniz.

Ete


Ete hocam ilgilendiğiniz için teşekkür ederim. Söylediklerinize göre kodlarımı aşağıdaki gibi düzenledim fakat yine uygulamada bir sonuç alamıyorum. Kodlarla veya devre ile ilgili uygulayabileceğim bir öneriniz var mı?


hasansabbah

#3
Alıntı yapılan: hasansabbah - 13 Nisan 2023, 18:53:37Ete hocam ilgilendiğiniz için teşekkür ederim. Söylediklerinize göre kodlarımı aşağıdaki gibi düzenledim fakat yine uygulamada bir sonuç alamıyorum. Kodlarla veya devre ile ilgili uygulayabileceğim bir öneriniz var mı?


ete

Modulasyon farklılığı elbette sorun olur. Ancak oraya gelinceye kadar programın mantığınıda biraz düzeltmek gerekir. Anladığım kadarı ile şifre verme işinide alıcı verici ortak çalışması ile yapıyorsun. Ancak programların içinde o kadar fazla büyük Pause ler varki bunlar senkron tutturma işini büyük ölçüde engelleyeceklerdir.
İşlemciyi yeni programladığın zaman Eprom adreslerine 255 değeri yerleşir otomatik olarak.
Bu durumda ilk çalıştırmada şifren 255 olacaktır. Bu rakam değişmediği sürece sistemin çalışmaz.
Rakamın değişmesi içinde iki tuşa aynı anda basman gerekiyor.
Modüllerin sorun yaratıp yaratmadığını anlamanın bir yoluda Alıcı ile vericiyi isisdeki gibi direk bağlamaktır (GND ile birlikte).

Senkron olayına bir kez daha değinmek isterim. Vericinin SEROUT komutu ile yolladığı bilgiyi alıcının SERIN komutu ile alabilmesi için alıcının veriyi bekliyor olması gerekir. Şayet alıcı veri geldiğinde PAUSE ler ile beklemede veya başka bir komut icrası ile meşgul ise yollanan bilgi kesinlikle alınamaz. Buna senkron tutmuyor diyoruz. Ama alıcı veri beklemesinde ise gelen bilgi anında alınır bunada senkron tutuyor deniliyor. Büyük ihtimal ile sende senkron sorunu var diye düşünüyorum.

Elbette bu işin çaresi var. Senkron tutturmanın en iyisi USART kesmesi kullanmaktır. Böylece işlemci başka işlede meşgul olsa bir veri geldiği zaman USART modülü onu geri planda çalışarak alır. Böylece illaki veri bekleme zorunda kalmazsın. Verici tarafında illaki USART kullanman gerekmiyor.
Şifre verme işlemini daha basite indirgemen gerekir. Örnek vermek gerekirse şayet Şifre=255 ise vericiden gelen ilk bilgi şifre bilgisi olmalıdır şeklinde bir ön şart koyarsan işin kolaylaşır. Böylece her iki tarafı ilk çalıştrıdığında alıcı şifre=255 ise gelen veriyi şifre olarak kabul eder. Benzer şekilde başka fikirler bulabilirsin.

Veri CON 1 şeklindeki tanımlama programın açılırken dikkate aldığı tanımlamalardandır. Bu nedenle BASLA satırından evvel değişken tanımlamaları içine yazılmalıdır.

Şifre alma işini aşağıdaki şekilde yaparsan bir nebze işin kolaylaşacak sanırım.

IF BUTON=1 THEN
   X=0
   WHILE BUTON=1
     X=X+1
       HIGH LED
       X=0
       SERIN GPIO.3,T2400,["B","R","K"],GELEN
       WRITE 0,GELEN
       LOW LED
   WEND
ENDIF                 
Bu kod ile yanlızca butona basılı tutarken gelen bilgi şifre olarak kabul edilip kayda alınır.

Düşündümde, veri güvenliğini daha doğrusu senkron güvenliğini ön plana almak için alıcı tarafında geçerli bir şifre kaydı var ise program koşulsuz alma işini yapmalıdır. Sifre kaydı yok ise butona basılıp direk gelen veriyi sifre olarak kayıt etmek en doğrusu olacaktır.
aşağıdaki program bu işleri yapmaktadır. Verici tarafında bir değişiklik gerekmiyor.

@ __CONFIG _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _WDT_ON & _PWRTE_ON & _CP_OFF  

DEFINE OSCCAL_1K 1              
DEFINE OSC 4
INCLUDE "modedefs.bas"

CMCON=7    
ANSEL=0
TRISIO=%001100
GPIO=%001100

LED VAR GPIO.1
BUTON VAR GPIO.2
SAYAC VAR BYTE
X VAR BYTE
GELEN VAR BYTE
SIFRE VAR BYTE
VERI CON 1

'Data@0,255

READ 0,SIFRE
 pause 300
 
BASLA:
GELEN=255
IF BUTON=1 and SIFRE=255 THEN
    WHILE GELEN=255
      HIGH LED
      SERIN GPIO.3,T2400,["B","R","K"],GELEN
      IF GELEN=>0 AND GELEN<10 THEN
        WRITE 0,GELEN:PAUSE 10
        LOW LED:SIFRE=GELEN
        goto CIK
      ENDIF  
   WEND
ENDIF                       

CIK:
SERIN GPIO.3,600,["B","R","K"],GELEN   'bu komut koşulsuz veri alımı yapıyor

IF GELEN=SIFRE THEN
   HIGH LED
   PAUSE 500
   LOW LED
ENDIF   

GOTO BASLA

END

Ete

Powered by EzPortal