Seri iletişim kitleniyor :(

Başlatan multimesut, 08 Haziran 2006, 17:57:17

multimesut

Arkadaşlar ilk öncelikle herkese merhaba. ben evime bir alarm devresi yapıyorum. seri iletişimi rf üzernden gerçekleştiriyorum. tabi bu durumda uzaktan kumandamda var. fakat uzaktan kumanda alarım ünitesinin alanı dışına çıktımı alarm ünisi kilitleniyor tam burada kalıyor.

SerIn2 GIRIS,1646,10,Atla2,[WAIT ("ER"),AL]
Atla2:
..
..

Mantiken 10sn bilgi gelmedimi atlaması lazım idi. Fakat olmuyor. Kumanda yanında iken ise oluyor :D Bunu nasıl engelleyebilirim. Yardımlarınız için şimdiden teşekkür ederim.

XX_CİHAN_XX

Picbasic kodlarından fazla anlamam ama veri alamadıgı durumlarda kıtlenmesı dogal bunu onlemek ıcınde wdt kullanabılırsın
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

multimesut

weri alıp almadığınıda anlayamıyorum çok ilginç kitleniyo :D if giris=1 then yok yemiyo if giris=0 then yemiyo ne iş anlamadım acaba if giris=0.5 mi :D

Lütfi AYYILDIZ

Süre 10ms ,10sn yapman için 10000 yazman gerekir.Ayrıca forumda bu konu ile baya bir uygulama var .Alıcılar ve vericiler kısmına bakmanı tavsiye edrim.

Klein

Picbasic kullanmıyorum. Yukarıdaki koddan da pek birşey anlamadım. ama birkaç yorumum olabilir.

Kumanda uzakta iken veri alıyor ama yayın net olmadığı için saçma sapan veriler alıyor olabilir. bu durumda  timeout oluşmuyor olabilir.
Bu saçma veriler yüzünden stack şişmesi vs... gibi sorunlar oluyor olabilir.
Veriler bir tampona alınıyorsa ; saçma veriler yüzünden tampon boyu aşılıyor ve başka adres alanlarına yazılıyor olabilir.

bahsi geçen 10ms sayıcısı timer ile mi?  rutine her girişte mi sayıyor bilemiyorum. Eğer rutine girişte sayıyorsa veri alamadığı için sayma gerçekleşmiyor olabilir.

vs..... vs....

Klein

Alıntı yapılan: "XX_CİHAN_XX"Picbasic kodlarından fazla anlamam ama veri alamadıgı durumlarda kıtlenmesı dogal bunu onlemek ıcınde wdt kullanabılırsın

Bu satırları şöyle değiştirelim isterseniz.  kodda bug varsa veri alınmadığında kilitlenmesi doğaldır.

Yeni başlayan arkadaşlar okuyorsa  onlar için not:
WDT son sığınaktır.  eğer durduk yerde kod kilitlrniyorsa kodda bir bug vardır düzeltilmesi gerekir. WDT ancak parazitik etkiler sebebiyle engellenemeyen kilitlenmeler ( eğer donanım önlemleri yeterli ise bu da çok zor gerçekleşecektir)  sonucu  çalışmanın devamını sağlamak amaçlı olabilir. Zamana bağlı yada ardışıl işlemleri olan , belirli bir sıra takip etmesi gereken  uygulamalarda , bazen sistemin kilitlenmesi WDT aracılığı ile resetlenmesinden daha hayırlı olabilir.

Lütfi AYYILDIZ

WDT ye gerek yok aslında. Parazitler de olsa alıcı tarafı ER  karakterlerini almadığı müddetçe hiçbir işlem yapmaz.Tabiki 10ms içerisinde.Bence yazılımda hata var.
@multimesut kodları açık bir şekilde veririsen yardımcı olamaya çalışırız.

multimesut

Tabi ama karışık onun için hepsini vermedim :D Bi bakın bide durum kumanda gidince kitleniyor gelince ve kumandadan bir tuşa basılınca kendini toparlanıyor. bu durumda bişi bulamazsam hırsız girmeden önce benden kumandayı isteyecek öle girecek yoksa alarm çalmıyo :P Kuamnda yanında iken güzel çalışıyor devre.

Ana Ünite
'****************************************************************
'*  Name    : UNTITLED1.BAS                                     *
'*  Author  : [Mesut ALTÜRK]                                    *
'*  Notice  : Copyright (c) 2005 [WwW.BenimNeitm.CoM]           *
'*          : All Rights Reserved                               *
'*  Date    : 07.05.2006                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
DEFINE LCD_DREG		PORTB	    'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT		4		'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_RSREG	PORTB	'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT	1		'LCD RS bacağı Hangi Bite bağlı ?
DEFINE LCD_RWREG    PORTB
DEFINE LCD_RWBIT    2
DEFINE LCD_EREG		PORTB	    'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT		3		'LCD Enable Bacağı Hangi bite bağlı ?
DEFINE LCD_BITS		4		'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES	2		'LCD Kaç sıra yazabiliyor

TRISA=%11111111:PORTA=0  'A portu giriş olarak ayarlandı.
TRISB=0:PORTB=0  'B portu çıkış olarak ayarlandı.


AL     VAR  BYTE
SAYI   VAR  BYTE
SAYAC  VAR	BYTE
SAYAC2 VAR  BYTE
SAYAC3 VAR  BYTE
GIRIS  VAR  PORTA.0
SENSOR VAR  PORTA.1
LED	   VAR	PORTA.2
ALARM  VAR	PORTB.0


Low PORTB.2     		'RW bacağı ekrana yazmaya imkan vermek için LOW yapıldı.

Pause 200               ' LCD nin kullanıma hazır hale gelebilmesi için gerekli süre

Basla:

AL=0
SAYI=0
SAYAC=0
SAYAC2=0
SAYAC3=0
PORTA=0:PORTB=0

Pause	100


LCDOut $FE,1,"Alarm Beklemede"  'ilk sıra baştan itibaren yazdırıyoruz.

LCDOut $FE,$C4,"TMM A.S."		'ikinci satıra yazdırıldı.


'Seri Haberleşme
KumandaKNT:

       SerIn2 GIRIS,1646,10,Atla,[WAIT ("ER"),AL] ;10ms bekle bişey yoksa atla

Atla:
      
       IF AL=88 Then 
       IF SAYAC2=0 Then
       SAYAC2=SAYAC2+1
       High	LED
		LCDOut $FE,1,"Alarm Kuruluyor"
		LCDOut $FE,$C0,"Hazirlanin..."
		Pause	15000			'dükkandan çıkış süresi
		LCDOut $FE,1,"Alarm Hazir..."
		LCDOut $FE,$C0,"A ",#SAYI," Kere Caldi"
		AL=0
	   Low	LED	
	   EndIF	
       EndIF
           
       IF AL=66 Then
		GoTo Basla
       EndIF 
       
       
      
       
IF	SAYAC2>0 Then       
       

Kurulu:       	
       
;       High	LED
;       Pause	100
;       Low	LED
;       Pause	100

       IF	SENSOR=1 Then   
Oyala:
		SAYAC3=SAYAC3+1
         

       
Dongu: 
		Pause 100    
		IF	GIRIS=0 Then  
       SerIn2 GIRIS,1646,10,Atla2,[WAIT ("ER"),AL] ;10ms bekle bişey yoksa atla
       
Atla2:       
		
		
       IF AL=66 Then
	   GoTo Basla
       EndIF 
       
       EndIF ;giris=0
       
       IF	SAYAC3<50 Then
		GoTo Oyala
	   EndIF
	   
		
	   High	ALARM
       High	LED
       
       SAYAC=SAYAC+1
       IF	SAYAC<100	Then
       GoTo	Dongu
       EndIF
      
       SAYI=SAYI+1
       Low	ALARM
       Low	Led
       SAYAC=0
       SAYAC3=0
       LCDOut $FE,$C0,"A ",#SAYI," Kere Caldi"
       	
       
       EndIF;sensör
       
       
       EndIF;sayac2
       
       
       GoTo KumandaKNT
       

End


Verici
  TRISA=%11111111:PORTA=0
   TRISB=%00000000:PORTB=0         'GPInın 1 ve 2inci biti giriş, diğerleri çıkış yapıldı


'------------------------------------------------------------------------------
SYMBOL CIKIS=PORTB.0
SYMBOL TUSA=PORTA.2
SYMBOL TUSB=PORTA.3
SYMBOL LED=PORTB.3

VER    VAR  BYTE
SAYICI    VAR  BYTE
'------------------------------------------------------------------------------
Pause 200
VER=0
'------------------------------------------------------------------------------
BASLA:  VER=0
		SAYICI=10
       IF TUSA=1 Then
          VER=88
         High	LED
          GoSub gonder
          While TUSA=1 
          Wend
          Low	LED
       EndIF
          
       IF TUSB=1 Then 
           VER=66
          High	LED
           GoSub gonder
           While TUSB=1
           Wend
           Low	LED
        EndIF    
           
       Pause 100
       GoTo BASLA
'-------------------------ALT PROGRAMLAR---------------------------------------
GONDER:
		SAYICI=SAYICI-1
        SerOut2 CIKIS,1646,["ER",ver]
        IF SAYICI=0	Then
        Return
        Else
        GoTo GONDER
        EndIF
        
        
End

XX_CİHAN_XX

Alıntı yapılan: "multimesut"
...... fakat uzaktan kumanda alarım ünitesinin alanı dışına çıktımı alarm ünisi kilitleniyor tam burada kalıyor....

Bu sozler uzerıne wdt yı onerdım.Cunku benım buradan anladıgım alıcı verıcının datalarını alırken bellı bır alanın dısına cıkarken gondermenın saglıklı ıletılemedıgı bır alana gırdıgınden bıt kacırma durumu olusuyor ve dogal olarak kıtlenme olusuyor.Gercı dedıgım gıbı orada kı pbp kodu bunun onlemını kendınce alıyor mu bılmıyoum ama teorık olarak bu boyledır ve bu gıbı durumlarda bence wdt kullanmak cok daha mantıklıdır.
Sonucta bu devre alıcı devresı ve data alıp ıslemekten baska bır fonksıyonu olmadıgını gore wdt zaman asımına ugradıgında resetlenmesının hıc bır mahsuru yok akısıne faydası vardır bu durumda wdt kullanmak en son care olmamalıdır.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

Lütfi AYYILDIZ

Vericinin sürekli yayında kaldığı kanısındayım.Bu sorun buton bağlantılarından kaynaklanabilir.Buna benzer bir projeyle bende bir zamanlar uğraşmıştım ve yayın alanı dışına da çıksan herhangi bir sorun yoktu. WDT ye gelince kullanmanda bir sakınca yok ama gerekte yok.Buton bağlantılarını değiştirmeni tavsiye ederim.Butonların bağlı olduğu portları 10K dirençler ile +beslemeye çek, yani butona basınca port şaseye çekilsin.Programındada bazı değişiklikler yapman gerekli. Aşağıdaki gibi. Ayrıca lcd yi sürekli temizleyip aynı şeyleri yazman gerekmez.LCDOut $FE,$80,"Alarm Beklemede" yazabilirsin

BASLA:  VER=0 
      SAYICI=10 
       IF TUSA=0 Then 
While TUSA=0 
          Wend       
VER=88 
         High   LED 
          GoSub gonder 
           Low   LED 
       EndIF 
          
       IF TUSB=0 Then 
While TUSB= 0
           Wend 
           VER=66 
          High   LED 
           GoSub gonder 
           Low   LED 
        EndIF    
            
       Pause 100 
       GoTo BASLA

okay1980

Usart veya software olarak seri iletişim kuracaksanız, alıcının  almaya başlamadan önce pinin "1" konumuında olması gerekir. Yoksa pic kiktlenir dütlenir ;)

Sorunu çözmek için rx pinine 10k Pull up takmak işe yarayabilir. başka çiplerden gelen seri datayı picle okurken benzer sorunu yaşamıştım.

Hadi kolay gelsin.

uzaylivolkan

SerIn2 GIRIS,1646,10,Atla2,[WAIT ("ER"),AL] ;10ms bekle bişey yoksa  

bu satır  "ER" datasını alanakadar hep bekler. Pic kilitniyor dediğiniz bu olsa gerek. Onun yerin Donanımsal USART kullanarak sadece (usart)kesme oluştuğunda datayı okuyup sorunu halledebilirsiniz.

16f877 usart için ayarlar

b0 var word
SPBRG   = 25
RCSTA   =%10010000
TXSTA   =%00100000

if pir1.5=1 then 'Usart kesme oluştu ise
       b0 = rcreg  'gelen datayı b0 içine at
       txreg=b0   '0 içeriğini seri olarak gönder
endif

vale9

Alıntı Yapbu satır "ER" datasını alanakadar hep bekler. Pic kilitniyor dediğiniz bu olsa gerek.

Bu konuda arkadaş haklı, ben artık "wait" diye bişey kullanmıyorum. Çünkü header'ı almazsa orda takılı kalıyor. O yüzden header olayını kaldırmazsan çok başın ağrır söyliyim.

Koddaki timeout süresinin açıklamasını okursan, bu süre sadece "header geldikten sonra gelecek olan DATAYI beklediği süredir". Yani header gelmezse atla diye bişey diyemiyosun...
Hayat 1'ler ve 0'lardan ibarettir.