12F675 ile serin ve tmr0 tek picte nasil kullanirim

Başlatan SERCE, 21 Mayıs 2011, 10:35:51

SERCE

elimde bir zamanlayici devresi var bunu uzaktan butona bastigimda sabit zamanin
devreye girmesini istiyorum.Fakat program isiste calisiyor ama prtikte devre
calismamaktadir.Acaba serin ve tmr0 ayni 12f675 te kullandigimdan mi kaynaklidir.

Ruzgarbey

merhaba. uzaktan kastınız RF sistemmidir acaba? bunu belirtirseniz daha çok yardımcı olabiliriz.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

SERCE

uzaktan kastim alici verici modul kullanark yapilan yonlendirmedir.

SERCE

Konunun daha iyi anlasilmasi icin programin kendisini gonderiyorum.
ayrica kesme icine led ekledim kesme bir iki defa  gerceklesiyor yani
sureklilik kazanmiyor.
@ DEVICE pic12F675'islemci 16F675 
@ DEVICE pic12F675, WDT_OFF 'Watch Dog timer kapali 
@ DEVICE pic12F675, PWRT_ON 'Power on timer acik 
@ DEVICE pic12F675, PROTECT_OFF 'Kod Protek kapali
@ DEVICE pic12F675, MCLR_OFF 'MCLR pini kullaniliyor. 
@ DEVICE pic12F675, INTRC_OSC_NOCLKOUT 'Dahili osilatör kullanilacak            
@ DEVICE pic12F675, BOD_OFF

DEFINE OSC 4
define osccal_1k 1               
TRISIO =%000001
ANSEL=0
IOC=0 
ON INTERRUPT GoTo KESME   'kesme olu?ursa KESME adl? etikete git.
OPTION_REG=%10000101   	 'Pull up dirençleri ?PTAL- Bölme oran? 1/64.
INTCON=%10000000  		 'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
CMCON=7     	 '
SYMBOL LED2 =GPIO.4
SYMBOL LED =GPIO.2
GPIO=0
'----------------------------------------------------------------------------
AL1     VAR   BYTE
AL2     VAR   BYTE
SART    VAR   BYTE
SAYAC   VAR   BYTE
SN      VAR   BYTE
DAK     VAR   BYTE
I       VAR   BYTE
K       VAR   WORD
SAYAC=0
SN=0
DAK=0 
I=0    	 '
GPIO=0
CLEAR
BASLA:
SerIn2 GPIO.0,396,2,GIT,[WAIT("DEM"), AL1]
GIT:
IF AL1=94 THEN'Ac bilgisi
LED=1:SART=1 'LEDI YAK VE SART OLUMLUDUR
PAUSE 500
LED=0:AL1=0
ENDIF
IF SART=1 AND AL1=22  THEN 'SART TAMAM VE LED YANSIN
LED=1:PAUSE 500:LED=0:PAUSE 200
 INTCON.5=1:AL1=0:TMR0=0
 ENDIF
IF AL1=39  THEN ' KAPAT KOMUTU GELMISTIR
LED=1:INTCON.5=0
PAUSE 500
LED=0:AL1=0
SART=0
ENDIF
FOR K=0 TO 1000
PAUSEUS 5
NEXT K
GOTO BASLA
DISABLE
KESME: INTCON.7=0:LED2=0
LED=1:PAUSE 100:LED=0:PAUSE 10
SAYAC=SAYAC+1  	    'kesme sayac?  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bolme)
      IF SAYAC=61 then  	    '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0       	     'sayaç sifirlaniyor
         SN=SN+1       	    'saniye degeri bir artiriliyor
            IF SN=60 THEN  	   'saniye 60 olmus ise 1 dakika süre geçti o halde
               SN=0        	   ' saniye sifirlaniyor
               DAK=DAK+1   	   ' dakika degeri bir artiriliyor
                  IF DAK>0 AND DAK=1 THEN   'dakika 1 olmus  
                  LED2=1:LED=1
                   FOR I=0 TO 200
                    PAUSE 100
                    NEXT I
                   LED2=0:LED=0    
                     DAK=0:sn=0:sayac=0         	   ' dakika sifirlaniyor
                ENDIF     
            ENDIF
         ENDIF
  INTCON.2=0:INTCON.7=1
  ENABLE
  RESUME
END

toprak

buna benzer bir calisma yapiyorum ayni sorun yasaniyor.bunlar ayri ayri ypilinca (serin komutu ve tmr0 kesmesi) sorun olmzken berber oldugu durumda tikaniyor.ayrica ben bunu yaparken devremde kristal kullanmiyorum.buda bir neden olbilirmi? buna iliskin yrdimci olunursa cok makbule gecer.

ete

Serce,

programın içinde o kadar çok Pause komutu varki bu komutlarla içinde kesme olan bir programın çalışması neredeyse imkansızdır.
Kesme kullanılan programlar içinde PAUSE komutu direk kullanılmamalıdır. Sebebi ise program normal şekilde çalışırken bir kesme emri gelir ise Basic o anda sürdürdüğü basic komutunu bitirdikten sonra Kesme etiketine gider.
Bu durumda; PAUSE 500 şeklinde verdiğin bu komut nedeni ile bekleme anında kesme emri gelir ise kesme etiketine ancak 500 ms lik bekleme tamamlandıktan sonra gidilecektir.
Bu ise programın akışı açısından sorun teşkil eder. Her şey gecikmeli çalışır. Hatta bazı kesmeler atlanabilirde.
Üstelik senin Serin komutunda bu kadar gecikmenin arkasında doğru çalışmayabilir.
Bu sorunu ortadan kaldırmanın bir yolu pause komutunu mümkün olduğunca küçültmektir.
Nasıl dersen , programın son satırlarına (kesme den evvel) bir döngü yerleştirmişsin. Bu döngü tamamen benim söylediğim amaca yöenlik düzenlenmiş. Kısaca kesme kullanılan programlarda pause süresi döngü kullanılarak ve döngü içine pause yerine pauseus 1-2-3-4-5 gibi süreler verilerek kullanılmalıdır. Diyelimki Pauseus 5 kullandınız. Bu durumda kesme oluştuktan sonra en fazla 5us sonra kesme etiketine dallanabileceksiniz demektir.

Farklı bekleme süreleriniz var ise farklı alt programlar yaparak bu gecikmeleri sağlayabilirsiniz. Gecikmelerde komut gecikmelerinide ihmal etmeyin.
Hiç bir pause komutu içermeyen;
For I= 0 to 1000
Next
şeklinde verilen bir komut dizisinin belirli bir gecikmeye sebep olduğunu unutmayın.
Mesela
Pause 500 için
BEKLE_500:
FOR I= 0 to 10000
pauseus 5
next
return

şeklinde bir alt program kullanabilirsiniz. Süre az gelir ise 10000 yerine daha büyük bir rakam yazabilirsiniz. Tabiiki I değişkeni word tipinde olmalıdır.

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

toprak

ete hoca,
program icerisindeki sure gecikmelerine iliskin belirttiginiz noktalari duzelttim .
Ama yinede degisen bir durum cikmadi.Sanki kesme gelip serin2 de takili kaliyor
cunku kesme icerisine yerlestirdigim lede kesme kisa sureligine oldugunu gos-
termektedir.Acaba diyorum serin'nin kendisinden mi kaynaklaniyor.

Ruzgarbey

arkadaşlar merhaba.
bu konu daha öncede birçok kez yazıldı diye biliyorum hatta bir kaçına bende cevap yazmıştım. timer veya herhangi bir kesme kullanacaksanız PBP de pause,pauseus komutlarını kullanmaktan kaçınınız. sebebi ise PBP software intertrup kullanmaktadır. yani pause 100 dediğinizde işlemci 100 ms boyunca bekleme yapıp, bekleme komutunu bitirdiğinde kesme bayrağını kontrol edecektir bu birinci husus.
gelelim serin komutundaki sıkıntıya.
serin veya serin2 komutunu bir alıcı verici transparent olmayan rf modülde kullanıyorsanız diğer komutlarınızın sağlıklı çalışmaması normaldir.
şöyleki  serin2 pin,5,CIK,[wait"bekle",veri]
komutumuzu açıklayalım.
ilgili pinden 5 ms boyunca "bekle" datası gelmez ise CIK adlı etikete dallanmasını istiyoruz.bu programlama mantığında doğrudur ama reelde maalesef çalışmaz :)
nedeni ise transparent olmayan bir modül kullandığınızda modülün dataout çıkışında sürekli olarak veri görülmesidir.buna RF kirlilik deniliyor.yani modülün Dataout pininde sürekli olarak bizim istemediğimiz veri olduğundan Serin2 komutu zaman aşımı süresini devamlı olarak resetleyip başka komutların icrasına geçememektedir. bu sorunu aşmak için ya ikinci bir işlemci kullanaksanız yada transparent bir modül kullanacaksınız.maalesefki başka çaresi yok.ben çok uğraştım ama başaramadım.kolay gelsin
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK