Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

ALICI VERİCİ YANLIŞ NEDİR

Başlatan Mr.Thinking, 11 Ekim 2009, 20:56:35

Mr.Thinking

'****************************************************************
'*  Name    : 30 KANAL ALICI                                                              *
'*  Author  :                                                                                       *
'*  Notice  :                                                   *
'*          :                                                   *
'*  Date    : 9/15/2009                                         *
'*   1.0                                               *
'*  Notes   :PİC16F877A İŞLEMCİ                                 *
'*          :                                                   *
'****************************************************************
         ALICI
  TRISA=%00000000
  TRISB=%00000001
  TRISC=%00000000
  TRISD=%00000000
  TRISE=%00000000
  PORTA=0
  PORTB=0
  PORTC=0
  PORTD=0
  PORTE=0
'-----------------------------------------------------------------
AL     VAR  BYTE
GIRIS  VAR  PORTB.0
LEDA   VAR  PORTB.1
LEDB   VAR  PORTC.0
LEDC   VAR  PORTC.4
LEDD   VAR  PORTD.0
LEDE   VAR  PORTA.0
AL=0
'-----------------------------------------------------------------
BASLA:                
      SerIn2 GIRIS,396,[WAIT ("ETE"),AL]
     
     
      IF AL=22 THEN
      TOGGLE LEDA
      ENDIF
 
      IF AL=33 THEN
      TOGGLE LEDB
      ENDIF
     
      IF AL=44 THEN
      TOGGLE LEDC
      ENDIF
     
      IF AL=55 THEN
      TOGGLE LEDD
      ENDIF
     
      IF AL=66 THEN
      TOGGLE LEDE
      ENDIF
     
      PAUSE 10
GOTO BASLA      
END





     VERİCİ
TRISA=%00000001
  TRISB=%00000010
  TRISC=%00010001
  TRISD=%00000001
  TRISE=%00000000
  PORTA=0
  PORTB=0
  PORTC=0
  PORTD=0
  PORTE=0
'----------------------------------------------------------------                                                  
  SYMBOL CIKIS=PORTB.0
  SYMBOL TUSA=PORTB.1
  SYMBOL TUSB=PORTC.0
  SYMBOL TUSC=PORTC.4
  SYMBOL TUSD=PORTD.0
  SYMBOL TUSE=PORTA.0  
'----------------------------------------------------------------
 
  VER VAR byte
  VER=0
 
'----------------------------------------------------------------
BASLA:
   IF TUSA=0 THEN
      VER=22
      GOSUB GONDER
      WHILE TUSA=0
      WEND
   ENDIF
 
       
   IF TUSB=0 THEN
      VER=33
      GOSUB GONDER
      WHILE TUSB=0
      WEND
   ENDIF
   
   IF TUSC=0 THEN
      VER=44
      GOSUB GONDER
   ENDIF
   
   IF TUSD=0 THEN
      VER=55
      GOSUB GONDER
   ENDIF
   
   IF TUSE=0 THEN
      VER=66
      GOSUB GONDER
   ENDIF
   
   
   PAUSE 10
     
GOTO BASLA
'--------------------ALT PROGRAMLAR-----------------------------------
  GONDER:
       SEROUT2 CIKIS,396,["E","T","E",ver]
       SEROUT2 CIKIS,396,["E","T","E",ver]
       RETURN
END

SAYIN ÜSTATLARIM.
ETE Hocamın derslerinden derlediğim bu kodlarla 30 kanal alıcı verici yapmak istiyorum.amacım 15 adet motoru sağ ve sola çevirmek.
fakat toggle olarak kullandığım komutun yerine başka bir komut kullanıp sadece tusları basık tuttuğum sürece yanık kalmasını sağlayamıyorum.
örn:      IF   AL=22  THEN
                HIGH LEDA
           ELSE
                LOW LEDA        KODLARIYLA DENEDİM OLMADI
ÖRN:    IF AL=22 THEN
               HIGH LEDA
           IF AL=0 THEN
               LOW LEDA          BUDA OLMADI.
BU KONUDA LÜTFEN BANA YARDIM EDEBİLİRMİSİNİZ. Tusa bastığım sürece high leda olması için hangi kodları kullanmalıyım.Malumunuz yeni başlıyorum.
birde 16f877 de seri haberleşmeyi ve tuşları PORTA da kullandığım zaman çalıştıramıyorum.
http://i0910.hizliresim.com/2009/10/11/5701.bmp
[img]
ego=1/Knowledge

cetinkaya


ete

İşe düşünmekle başlamak gerek. İstenen nedir?
Bir Tuşa basılınca Led yanacak ama tuşu bırakınca sönecek.
O halde tuşla ilgili komut gelince yalnızca Led'i yakmak bırakınca komut gelmeyeceği içinde ledi söndürmek yeterli olacaktır.

İşin ALıcı kısmında şöyle yapmak yeterli olur sanırım;

BASLA:
SerIn2 GIRIS,396,[WAIT ("ETE"),AL]


IF AL=22 THEN
  LEDA=1
  goto basla
ENDIF

IF AL=33 THEN
 LEDB=1
Goto basla
ENDIF

IF AL=44 THEN
 LEDC=1
Goto basla
ENDIF

IF AL=55 THEN
 LEDD=1
Goto basla
ENDIF

IF AL=66 THEN
 LEDE=1
 Goto basla
ENDIF

LedA=0      'tuş bırakılınca program buraya atlayacaktır
LedB=0
LedC=0
LedD=0
LedE=0
PAUSE 10
GOTO BASLA
END


Alıcıda ise tuşa basıldığı müddetçe aynı veri yollanmalıki tuşun sürekli basıldığı belli olsun. Ohalde verici kısmı şöyle olmalı;
BASLA:
IF TUSA=0 THEN
VER=22
WHILE TUSA=0
GOSUB GONDER
WEND
ENDIF


IF TUSB=0 THEN
VER=33
WHILE TUSB=0
GOSUB GONDER
WEND
ENDIF

IF TUSC=0 THEN
VER=44
While Tusc=0
GOSUB GONDER
Wend
ENDIF

IF TUSD=0 THEN
VER=55
while Tusd=0
GOSUB GONDER
Wend
ENDIF

IF TUSE=0 THEN
VER=66
While TusE=0
GOSUB GONDER
wend
ENDIF


PAUSE 10
tus=0
Gosub gönder  'tus bırakılınca bir boş bilgisi yollamak gerek

GOTO BASLA
'--------------------ALT PROGRAMLAR-----------------------------------
GONDER:
SEROUT2 CIKIS,396,["E","T","E",ver]
SEROUT2 CIKIS,396,["E","T","E",ver]
RETURN
END


Umarım Çalışır.
Kolay Gelsin

E T E
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

sir_hawk

Aklıma hep şu takılıyor;

- Ram'de yer sıkıntımız yoksa hem kolaylık hemde düzen ve görünüm açısından neden

select case


komutunu kullanmıyoruz. Aklımıza mı gelmiyor,farklı bir nedeni mi var ?

ete

Bazı basic komutları yerine kullandığın düz mantık tan daha fazla kod üretiyorlar. Bu o komutun işlenmesi için daha fazla zaman harcanması anlamınada geliyor. Bu nedenle çok zorda kalamz isem bazı komutları kullanmam.

Mesela Toogle A yerine A=1-A kullanırım . Daha az kod üretir.
Basit bir örnek idi.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mr.Thinking

ETE Hocam çok teşekkür ederim. Derslerinizi yakından takip ediyorum.Diğer arkadaşlar gibi bilgilerinizi paylaşmaya kormuyor ve üşenmiyorsunuz. Gerçekten bir eğitimci gibi davranıyorsunuz.Dersleriniz okadar anlaşılır bir dille yazılmışki, bu güne kadar bişeyleri gerçekten öğrenebildiğim tek insansınız.
bişey daha sormak isterim affınıza sığınarak:
Pic 16f877A nın derlemedeki ayarlarını nasıl yapmalıyım ve hangi ayarlarla tüm portları aynı şekilde kullanabilirim. Yani tüm portlara birtuş veya led nasıl bağlayabilirim. Cevap verdiğiniz alıcı ve vericide porta yı kullanamıyorum.
Saygılarımla.
Bana bir harf öğretenin kırk yıl kölesi olurum.
ego=1/Knowledge

ete

877A nın sigorta ayarları aşağıdaki gibi olmalı ve ayrıca comparatör iptal edilip pinler digital yapılmalıdır. Tabiiki ADC de iptal edilmeli.
Gerekli komutları aşağıda yazdım.

ETE


@ DEVICE pic16F877A
@ DEVICE pic16F877A, WDT_on
@ DEVICE pic16F877A, PWRT_off
@ DEVICE pic16F877A, PROTECT_OFF
@ DEVICE pic16F877A, XT_OSC

CMCON=7  'komparatörleri iptal eder bu yalnızca 877A da vardır 877 de yok.
ADCON1=7 'ADC leri iptal pinlerin hepsi digital
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

Mr.Thinking

HOCAM YAZILIM ÇALIŞMADI. LEDLER HİÇ YANMIYOR. lÜTFEN TEKRAR İNCELEYEBİLİRMİSİNİZ.
Ete hocam sigorta ayarlarından sonra ledler yandı ama tusu bırakınca sönmüyor.hep yanık kalıyor.

son durum bu hocam.
BASLA:
   IF TUSA=0 THEN
      VER=22
      WHILE TUSA=0
      GOSUB GONDER
      WEND
       
       
   ENDIF

       
   IF TUSB=0 THEN
      VER=33
      WHILE TUSB=0
      GOSUB GONDER
      WEND
   ENDIF
   
   IF TUSC=0 THEN
      VER=44
      WHILE TUSC=0
      GOSUB GONDER
      WEND
   ENDIF
   
   IF TUSD=0 THEN
      VER=55
      WHILE TUSD=0
      GOSUB GONDER
      WEND
   ENDIF
   
   IF TUSE=0 THEN
      VER=66
      WHILE TUSE=0
      GOSUB GONDER
      WEND
   ENDIF
   
   PAUSE 10
   tusA=0
   gosub gonder
   TUSB=0
   TUSC=0      
   TUSD=0
   TUSE=0
   GOsub gOnder  'tus bırakılınca bir boş bilgisi yollamak gerek
   
   GOTO BASLA
'--------------------ALT PROGRAMLAR-----------------------------------
  GONDER:
       SEROUT2 CIKIS,396,["E","T","E",ver]
       SEROUT2 CIKIS,396,["E","T","E",ver]
       RETURN
END


Alıcısı:

BASLA:                
      SerIn2 GIRIS,396,[WAIT ("ETE"),AL]
     
      IF AL=22 THEN
      LEDA=1
      goto basla
      ENDIF

 
      IF AL=33 THEN
      LEDB=1
      GOTO BASLA
      ENDIF
     
      IF AL=44 THEN
      LEDC=1
      GOTO BASLA
      ENDIF
     
      IF AL=55 THEN
      LEDD=1
      GOTO BASLA
      ENDIF
     
      IF AL=66 THEN
      LEDE=1
      GOTO BASLA
      ENDIF
     
      LedA=0
      goto basla      'tuş bırakılınca program buraya atlayacaktır
      LEDB=0
      LedC=0
      LedD=0
      LedE=0
      PAUSE 10
      GOTO BASLA
      END
ego=1/Knowledge

ete

Çalışmaması normal çünki hatalar var.

Birinci hatayı size akıl verirken ben yapmışım. Neyse aşağıda düzeltiyorum onu bir deneyin bakalım.

Bu arada daha iyi çalışan bir sistem yapabilmek için alıcı kısmında USART kesmesi kullanmak gerekir. Dikkat ederseniz sizin alıcı kısmında programınbaşında bir SERIN komutu bulunuyor. Ama bilgi yollandığı anda sizin serin komutu işleniyor ise bir şey alırsınız. Değilse verici bilgi yolladığında sizin alıcı programın aşağılarına inmiş ise yeni bilgi ile programın karşılaşma olasılığı azalmış olacaktır. Buna senkron tutturmak deniliyor. Senkronu tutturabilirseniz veri alırsınız değilse sürekli beklemede kalır program. O nedenle verici kısmında veri yollama sıklığını artırıyoruz.

Ama Usart kesmesi kullanırsanız pic geri planda usart portuna (RX girişi) bir veri gelmiş mi diye sizin programdan bağımsız olarak sürekli bakar ve ve gelmiş ise hemen bir kesme oluşturulup otomatikman program veri almaya geçer. Bu nedenle senkron tutturma derdiniz olmaz.
Öncelikle bu programı şimdi verdiğim şekilde çalıştırın sonra USart kullanımına geçeriz.


Ete

BASLA:
IF TUSA=0 THEN
VER=22
WHILE TUSA=0
GOSUB GONDER
WEND
ENDIF


IF TUSB=0 THEN
VER=33
WHILE TUSB=0
GOSUB GONDER
WEND
ENDIF

IF TUSC=0 THEN
VER=44
WHILE TUSC=0
GOSUB GONDER
WEND
ENDIF

IF TUSD=0 THEN
VER=55
WHILE TUSD=0
GOSUB GONDER
WEND
ENDIF

IF TUSE=0 THEN
VER=66
WHILE TUSE=0
GOSUB GONDER
WEND
ENDIF

PAUSE 10
Ver=0
Gosub Gonder
 'tus bırakılınca bir boş bilgisi yollamak gerek

GOTO BASLA
'--------------------ALT PROGRAMLAR-----------------------------------
GONDER:
SEROUT2 CIKIS,396[REP$AA\5,REP$00\5,REP$FF\5]
SEROUT2 CIKIS,396,["E","T","E",ver]
Pauseus 100
RETURN
END


Alıcısı:

BASLA:
SerIn2 GIRIS,396,[WAIT ("ETE"),AL]

IF AL=22 THEN
LEDA=1
goto basla
ENDIF


IF AL=33 THEN
LEDB=1
GOTO BASLA
ENDIF

IF AL=44 THEN
LEDC=1
GOTO BASLA
ENDIF

IF AL=55 THEN
LEDD=1
GOTO BASLA
ENDIF

IF AL=66 THEN
LEDE=1
GOTO BASLA
ENDIF
'tuş bırakılınca program buraya atlayacaktır
LedA=0
LEDB=0
LedC=0
LedD=0
LedE=0
PAUSEUS 100
GOTO BASLA
END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com