avatar_anlhlc

PIC16F877A 16 Kanal RF Alıcı - Verici Hakkında

Başlatan anlhlc, 07 Mart 2016, 11:30:01

anlhlc

Hocam merhaba aşağıda kodları olan programda tuşlara basıldığında alıcı modül geç tepki veriyor yani tuşa 1 sn basmak gerekiyor. Bunu nasıl hızlandırabilirim bu konu hakkında bilgisi olan arkadaşlar yardımcı olursa çok sevinirim.

Alıcı Kodlar:
@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_on
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, HS_OSC

DEFINE OSC 20
trisb=%00000000
trisc=%00000000
trisd=%00000000
trisa=255
'----------------------------------------------------------------
ADCON1=7
'----------------------------------------------------------------
PORTA=0
PORTB=0
PORTC=0
PORTD=0

ALICI VAR BYTE
ALICI=0
PAUSE 500

BASLA:

SERIN2 PORTA.0,396,[WAIT("GMFMUH"),ALICI]
IF ALICI=0 THEN
LOW PORTB
LOW PORTC
ENDIF
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=10 THEN HIGH PORTB.0
IF ALICI=15 THEN LOW PORTB.0
'----------------------------------------------------------------
IF ALICI=20 THEN HIGH PORTB.1
IF ALICI=25 THEN LOW PORTB.1
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=30 THEN HIGH PORTB.2
IF ALICI=35 THEN LOW PORTB.2
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=40 THEN HIGH PORTB.3
IF ALICI=45 THEN LOW PORTB.3
'-----------------------------------------------------------------
IF ALICI=50 THEN HIGH PORTB.4
IF ALICI=55 THEN LOW PORTB.4
'-----------------------------------------------------------------
IF ALICI=60 THEN HIGH PORTB.5
IF ALICI=65 THEN LOW PORTB.5
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=70 THEN HIGH PORTB.6
IF ALICI=75 THEN LOW PORTB.6
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=80 THEN HIGH PORTB.7
IF ALICI=85 THEN LOW PORTB.7
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=90 THEN HIGH PORTC.0
IF ALICI=95 THEN LOW PORTC.0
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=100 THEN HIGH PORTC.1
IF ALICI=105 THEN LOW PORTC.1
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=110 THEN HIGH PORTC.2
IF ALICI=115 THEN LOW PORTC.2
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=120 THEN HIGH PORTC.3
IF ALICI=125 THEN LOW PORTC.3
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=130 THEN HIGH PORTC.4
IF ALICI=135 THEN LOW PORTC.4
'----------------------------------------------------------------
'----------------------------------------------------------------
IF ALICI=140 THEN HIGH PORTC.5
IF ALICI=145 THEN LOW PORTC.5
'----------------------------------------------------------------
IF ALICI=150 THEN HIGH PORTC.6
IF ALICI=155 THEN LOW PORTC.6
'----------------------------------------------------------------
IF ALICI=160 THEN HIGH PORTC.7
IF ALICI=165 THEN LOW PORTC.7
'----------------------------------------------------------------
GOTO BASLA
'----------------------------------------------------------------
END
[/b]

Verici Kodlar:


[b]@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_on
@ DEVICE pic16F877A, PWRT_ON
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, HS_OSC

DEFINE OSC 20
trisb=%11111111
trisc=%11111111
trisd=%11111111
trisa=255
'----------------------------------------------------------------
ADCON1=7
'----------------------------------------------------------------
PORTA=0
PORTB=0
'----------------------------------------------------------------
VERICI VAR BYTE
VERICI=0
PAUSE 500
'----------------------------------------------------------------
BASLA:   
    IF PORTB.0=0 THEN
    VERICI=10
GOSUB GONDER
   
    else
    verici=15
    gosub GONDER
ENDIF
'----------------------------------------------------------------   
    IF PORTB.1=0 THEN
    VERICI=20
    GOSUB GONDER

    ELSE
    VERICI=25
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.2=0 THEN
    VERICI=30
    GOSUB GONDER

    ELSE
    VERICI=35
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.3=0 THEN
    VERICI=40
    GOSUB GONDER

    ELSE
    VERICI=45
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.4=0 THEN
    VERICI=50
    GOSUB GONDER

    ELSE
    VERICI=55
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.5=0 THEN
    VERICI=60
    GOSUB GONDER

    ELSE
    VERICI=65
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.6=0 THEN
    VERICI=70
    GOSUB GONDER

    ELSE
    VERICI=75
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.7=0 THEN
    VERICI=80
    GOSUB GONDER

    ELSE
    VERICI=85
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.0=0 THEN
    VERICI=90
    GOSUB GONDER

    ELSE
    VERICI=95
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.1=0 THEN
    VERICI=100
    GOSUB GONDER

    ELSE
    VERICI=105
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.2=0 THEN
    VERICI=110
    GOSUB GONDER

    ELSE
    VERICI=115
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.3=0 THEN
    VERICI=120
    GOSUB GONDER

    ELSE
    VERICI=125
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.4=0 THEN
    VERICI=130
    GOSUB GONDER

    ELSE
    VERICI=135
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.5=0 THEN
    VERICI=140
    GOSUB GONDER

    ELSE
    VERICI=145
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
IF PORTC.6=0 THEN
    VERICI=150
    GOSUB GONDER

    ELSE
    VERICI=155
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
IF PORTC.7=0 THEN
    VERICI=160
    GOSUB GONDER

    ELSE
    VERICI=165
    GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
GOTO BASLA
'----------------------------------------------------------------
GONDER:
   PAUSE 10
SEROUT2 PORTA.0,396,["G","M","F","M","U","H",VERICI]
RETURN
END



Şimdiden herkese teşekkürler...

ete

16F877A da komparatör vardır ve A portu bu özellikle ile açılır. Sen programda komparatör kullanmadığına göre bu özelliği iptal etmen gerekir. Gecikme bundan olabilir.
Her iki programda da baş tarafa CMCON=7 komutunu ilave et ve öyle dene.

Ete

anlhlc

Hocam komutu ilave ettim fakat bi değişiklik olmadı tuşa 1 sn falan basılı tutmam gerekiyor tuştan elimi çektikten sonra da 1 sn röle röle çekili kalıyor

ete

O zaman muhtemelen sorun verici programından kaynaklanıyordur.
    IF PORTB.0=0 THEN
    VERICI=10
GOSUB GONDER
   
    else
    verici=15
    gosub GONDER
ENDIF

Bu kodlara bir bak;
PORTB.0 da bağlı olan butona basarsan Verici=10 yapılıp gönder etiketine gidiyor program.
Şayet bu butona basmamış isen bu seferde VERICI=15 yapılıp yine Gönder etiketine gidiyor program.
Programın geri tarafına bakınca hep aynı mantık kullanılmış. Bir tuşa basarsan VERI=X basmaz isen Veri=X+5 yapılıp yine gönder etiketine yollanıyor program.
Bu durumda ben daha tuşlara basmak için elimi götürürken program;
- VERI=15 yapıp bunu yollayacak
-VERI=25 yapıp bunuda yollyacak
-VERI=35 yapıp bunuda yollayacak
...
-Verı=165 yapıp bunuda yollayacak
Böylece sen daha tuşa basamadan toplamda 16 adet veriyi peşi sıra yollayacak. Sence bu doğru bir algoritmamıdır?
Bence yanlış. Alıcı-vericiyi boşuna 16 adet veri yollama yaparak meşgul ediyorsun.
Ne yapılabilir onu düşünelim. Şayet ben PORTB.0 butonuna basmış isem önce VERI=10 yapıp butona bastığımı karşıya bildirmeli ama butonu bırakıncaya kadar bekleyip bıraktığım zaman karşıya VERI=15 bilgisini yollamalı. Yoksa butonlara hiç basmadığım halde sürekli bu lüzumsuz verileri yollamamalıdır.
Bunu sağlamanın yolu şöyle olabilir. Ben 2 tanesini yazacağım sen bunlara bakarak diğerlerini yapacaksın.
    IF PORTB.0=0 THEN
      VERICI=10
  GOSUB GONDER
      while PORTB.0=0:WEND
      verici=15
      gosub GONDER
ENDIF
'----------------------------------------------------------------   
    IF PORTB.1=0 THEN
      VERICI=20
      GOSUB GONDER
      WHILE PORTB.1=0:WEND
      VERICI=25
      GOSUB GONDER
    ENDIF
'----------------------------------------------------------------


Diğer bir kusurda işaretçi olarak kullandığın karekter dizisinin çok uzun olmasıdır.
"G","M","F","M","U","H" yerine sadece GMF kullanman işini hem kolaylaştıracak hemde süreyi epeyce kısaltacaktır.

ETE

anlhlc

Hocam dediğiniz gibi yaptım şimdi de bikaç kez tuşa basmadan yakalayamıyor yakalasa da röle çekilmiş şekilde kalıyor.

ete

TRISA ya, her iki programdada 255 vermişsin. Bu değer Alıcı için doğru ama verici için yanlış olur.. Verici verecek yani çıkış yapacak ama sen o pini giriş yapmış oluyorsun bu yanlış.
LOW PORTB şeklinde komut olmaz. LOW bit bazında bir komuttur byte için kullanılmaz. PORTB=0 demen gerekir.
Aynısı PORTC içinde geçerlidir.
Programları düzelttim. Bir iki eklemem oldu ve birde denemek için simulasyon hazırladım.
Sorunsuz çalışıyor gözüküyor. Çalışmasıda gerekirdi zaten. Dene bakalım ne olacak.

ETE

anlhlc

Hocam teşekkürler dediğiniz gibi hatalardan dolayı sıkıntı çıkarıyormuş şuan gayet karalı çalışıyor. Hocam belki çok oluyorum ama kusura bakmayın bi konu hakkında daha yardımınızı isteyeceğim şuan verici yani 16 kanal kumandam 15mA güç tüketiyor bunu düşürmek adına ne yapabilirim yardımcı olursanız çok sevinirim.
İyi çalışmalar...

ete

15 ma akımı azaltmak zor. Az akım ancak işlemcileri uyku moduna sokmakla mümkün olur. Ama bu seferde uykudan uyandırmak sorun olur. Zira uykudan ancak bir kesme oluşturursan uyandırabilirsin. Sende 16 tane buton var. Bunların hepsi ile kesme yaratmak mümkün değil. Çokkarmaşık bir sistem ile belki mümkün olur. Mesela PORTB.0 pinini kesme girişi olarak kullanırsın. Bütün butonlardan birer diyot ile 16 buton girişini birleştirip PORTB.0 pinine verirsin. Böylece herhangi bir butona basınca kesme oluşur ve işlemci uykudan uyanarak buton konumunu arşıya yollar. Karşı tarafın girişini yine PORTB.0 pinine verirsin ve baştan verdiğimiz uyandirma bitleri pici uyandırır ve arkasından alış yaparak kesmeden çıkar. Ama orada yakılacak olan ledler yine akım çekecek ve pek faydası olmayacaktır. Zaten akım kontrolü bence vericide olmalı. Alıcı en azından şebeke voltajı ile çalışacağı için sorun olmaz ve bence alıcı kısmında uyku modu kullanılmamalıdır.

Ete

anlhlc

#8
Kesme ile sleep uygulaması hiç yapmadım hocam. Komutu @SLEEP ti galiba ama hatırlayamıyorum okuldan kalan bilgilerle bişeyler yapmaya çalışıyorum program üzerindenbir örnek ile yardımcı olabilir misiniz?

ete

Örneğe gerek yok.
@SLEEP işlemciyi hemen uykuya sokar. Uyandırmak için kesme oluşması gerekir. Dediğim kesme işinide yaparsan yada denemek için yalnızca PORTB.0 kesmesini açıp orada bağlı olan butona basarsan işlemci uyanır ve butonla ilgili işi yapar. Program satırları takip eder ve yeniden SLEEP komutuna gelince uykuya dalar. Buton pine GND veriyor ise düşen kenarda kesme oluşturman gerekecek. OPTION_REG.6 biti 1 ise Yükselen kenarda , 0 ise düşen kenarda kesme oluşur.

Hepsi bu.

Ete

anlhlc

#10
Hocam böyle bişey mi olacak doğru mudur ?


DEFINE OSC 4
ON INTERRUPT GoTo KESME                     
 
INTCON=%10010000

trisb=%11111111
trisc=%11111111
trisd=%11111111
trisa=%00000000
'----------------------------------------------------------------
ADCON1=7 
cmcon=7
OPTION_REG.6=0
OPTION_REG.7=0
'----------------------------------------------------------------
PORTA=0
PORTB=0
'----------------------------------------------------------------
VERICI VAR BYTE
VERICI=0
PAUSE 300
VERICI=0:GOSUB GONDER
'----------------------------------------------------------------
BASLA:   
    IF PORTB.0=0 THEN
       VERICI=10
   GOSUB GONDER
       while portb.0=0:wend
       pause 50
       verici=15
       gosub GONDER
ENDIF
'----------------------------------------------------------------   
    IF PORTB.1=0 THEN
       VERICI=20
       GOSUB GONDER
       while portb.1=0:wend
       pause 50
       VERICI=25
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.2=0 THEN
       VERICI=30
       GOSUB GONDER
       while portb.2=0:wend
       pause 50       
       VERICI=35
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.3=0 THEN
       VERICI=40
       GOSUB GONDER
       while portb.3=0:wend
       pause 50       
       VERICI=45
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.4=0 THEN
       VERICI=50
       GOSUB GONDER
       while portb.4=0:wend
       pause 50
       VERICI=55
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.5=0 THEN
       VERICI=60
       GOSUB GONDER
       while portb.5=0:wend
       pause 50
       VERICI=65
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.6=0 THEN
       VERICI=70
       GOSUB GONDER
       while portb.6=0:wend
       pause 50
       VERICI=75
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTB.7=0 THEN
       VERICI=80
       GOSUB GONDER
       while portb.7=0:wend
       pause 50
       VERICI=85
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.0=0 THEN
       VERICI=90
       GOSUB GONDER
       while portc.0=0:wend
       pause 50
       VERICI=95
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.1=0 THEN
       VERICI=100
       GOSUB GONDER
       while portC.1=0:wend
       pause 50
       VERICI=105
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.2=0 THEN
       VERICI=110
       GOSUB GONDER
       while portC.2=0:wend
       pause 50
       VERICI=115
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.3=0 THEN
       VERICI=120
       GOSUB GONDER
       while portC.3=0:wend
       pause 50
       VERICI=125
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.4=0 THEN
       VERICI=130
       GOSUB GONDER
       while portC.4=0:wend
       pause 50
       VERICI=135
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.5=0 THEN
       VERICI=140
       GOSUB GONDER
       while portC.5=0:wend
       pause 50
       VERICI=145
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.6=0 THEN
       VERICI=150
       GOSUB GONDER
       while portC.6=0:wend
       pause 50
       VERICI=155
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
    IF PORTC.7=0 THEN
       VERICI=160
       GOSUB GONDER
       while portC.7=0:wend
       pause 50
       VERICI=165
       GOSUB GONDER
    ENDIF
'----------------------------------------------------------------
@ SLEEP

GOTO BASLA

'----------------------------------------------------------------
GONDER:
serout2 PORTA.0,396,[REP$AA\5,REP$00\5,REP$FF\5]
SEROUT2 PORTA.0,396,["G","M","F",VERICI]
RETURN
'----------------------------------------------------------------
   DISABLE
KESME:
'buraya bir şey yazmaya gerek yok sadece uyandırma yapılıp kaldığı yere dönmesini sağlayacağız.
INTCON.1=0                                             'RB0/INT Bayrağı (flag) silindi.
       Resume                                                      'geldiğin yere dön
       Enable

END

MB_77

#11
bu mesaj tarafımdan silinmiştir.

ete

#12
Anlhlc,
yazdıklarına baktım. Kesme , işlemciyi uykudan uyandırmaya ve ardından yapılacak işlere bakmasını sağlamaya yaramalı. Sen ise kesme içinde uykuya sokmuşsun. Terslik burada.
Yazdıklarını düzelttim oraya bak istersen.
Sistemin çalışıp çalışmadığını şöyle test edebilirsin.
Program çalışır çalışmaz satır takip eden program sleep komutuna gelerek sistemi uykuya sokacaktır.
Bu durumda bütün butonlar pasif olacak yalnızca PORTB.0 da bağlı olan buton çalışacaktır. O butona basınca karşıda karşılık gelen çıkışın yandığını görürsen sistem çalışıyor demektir. Bu arada simulasyonda çalışıyor haberin olsun. Bütün butonları aktif edebilmek için birer diyot ile PORTB.0 pinine bağlaman gerekir.
Bir başka şekilde PORTB.4-7 değişiklik kesmesi kullanılabilir. Böylece elinde 5 adet uykudan uyandırma butonu olur. Diğer butonları bu butonlara paylaştırarak birer diyotla bağlarsın olur biter. Tabiiki değişiklik kesmesinide aktif etmek gerekir.
Ama bana kalırsa sistemin bu haline bir bak bakalım ne kadar akım çekiyor sonra değerse bu dediklerimi yaparsın değilse MB_77 nin önerisine kulak vermen işine yarayacaktır.

Ete

anlhlc

#13
Hocam dediğiniz gibi düzenledim fakat aynı sabit 15mA çekiyor.:( Similasyon da da denedim sistem ilk çalıştığında diğer tuşlardan herhangi birine basınca o tuşun bilgisini gönderiyor

ete

Demekki sistemi doğru çalıştıramıyorsun. Ben deneyince yalnızca B.0 butonu çalışıyor diğerleri çalışmıyor maalesef.
Bir yerde hata yapıyorsun ama nerde bilemem.

Bütün sistemin kesmeye bağlanmış halini ilişikte veriyorum. Şemayada bakarsan dediklerimi daha iyi anlarsın.

birde bu hex'i dene istersen bakalım akım değişecekmi.

Ete

Powered by EzPortal