FOR NEXT DÖNGÜSÜ NASIL DURDURULUR?

Başlatan sozkarabacak, 04 Mart 2009, 19:36:50

sozkarabacak

Alıntı Yap
'********************   TANIMLAR   ******************************  
@ DEVICE pic16F628                                                    
@ DEVICE pic16F628, WDT_OFF              
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT              
@ DEVICE pic16F628, PROTECT_OFF
'***********************  DEĞİŞKEN VE SABİTLER  ******************
     DTT VAR PORTA.1
     CL VAR PORTA.0
     LE VAR PORTA.2    
     REF VAR Word      
     SW VAR Bit      
     NVAL VAR WORD
     AVAL VAR BYTE  
'***********************  AYARLAR  ********************************
     CMCON=7                
     OPTION_REG.7=0
'***********************  GİRİŞ ÇIKIŞ AYARLARI  *******************
     TRISA=%11111000
     TRISB=%11111111
     DEFINE SHIFT_PAUSEUS 1
'*******************  DEĞER ATAMASI  ******************************
     SW=0      
     REF=320
     NVAL=115      
'*******************  PROGRAM ANA BÖLÜM  ***************************
     BASLA:                
     GoSub GONDER
     GoTo BASLA
'*******************  PLL ENTEGRESİNE VERİ GÖNDER (ara program)  ****
     GONDER:
     DTT=0:CL=0:LE=0
     For AVAL = 40 to 70
     PAUSE 3000      
     shiftout DTT,CL,1,[SW\1,REF\13,1\1]
     PulsOut LE,10
     PAUSE 50                      
     shiftout DTT,CL,1,[NVAL\11,AVAL\7,0\1]    
     PulsOut LE,10                      
     PAUSE 50
     DTT=%0:CL=%0:LE=%0
     Next AVAL
     
     Return    
   
End  

Yukarıdaki yazılım pratikte bu haliyle çalışmaktadır. Yazılımda For AVAL = 40 to 70 yazan kısım A değerini 40 ile 70 arasında gezdirmektedir. Yazılıma şunu eklemek istiyorum tarama sırasında pic işlemcisinin herhangi bir ayağına +5 volt geldiğinde tarama nerde ise duracak +5 volt kesildiğinde kaldığı yerden taramaya devam edecek. Bunu nasıl yapabilirim?
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

teknikelektronikci

if portb.0=1 then pause 0
else pause 3000
endif

veya

durum var portb.0

select durum

case 0
delayms=3000
case 1
delayms=0

bunalri kafamdan yazdim yanlis olabilrin ama bence mantik böyle olmali
Ey Türk istikbalinin evlâdı! İşte, bu ahval ve şerâit içinde dahi, vazifen; Türk İstiklâl ve Cumhuriyetini kurtarmaktır! Muhtaç olduğun kudret, damarlarındaki asil kanda mevcuttur!

fractal

uyku modu varya onu kullanabilirsin.ben hiç kullanmadım ama bu iş için sanırım.
Restantum cogniscutur Quantum deligutur

sozkarabacak

Bu programı uyutmayı denedim başka bir düşüncem için bir uyudu birdaha uyanmıyor uyutmayı öğrendim ama uyandırma nasıl olacak sorun orda gerektiğinde uyandıramadım.
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

Tagli

Uykudan uyanma ya kesme ya da WDT ile olur. Ki bu durumda WDT işe yaramaz. RB0 kesmesi bu amaçlanan işlevi yerine getirebilir bence. Ancak RB0 kesmesi açıkken GIE biti kapalı olmalıdır. Böylece program uyanınca kaldığı yerden devam eder. Gerçi ben olayı ASM bilgilerime dayanarak anlattım. PBP'da durum farklı olabilir. Zaten bildiğim kadarıyla PBP gerçek anlamda kesmeye hiç gitmiyor.
Gökçe Tağlıoğlu

Maxim

araya bir tane if li satır eklesek olmazmı ?
denemedim ama şuna benzer
diyelim portb.0 giriş olacak


'******************* PLL ENTEGRESİNE VERİ GÖNDER (ara program) ****
GONDER:
DTT=0:CL=0:LE=0
For AVAL = 40 to 70
*AAA:
*IF PORTB.0 =1 THEN GOTO AAA

PAUSE 3000
shiftout DTT,CL,1,[SW\1,REF\13,1\1]
PulsOut LE,10
PAUSE 50
shiftout DTT,CL,1,[NVAL\11,AVAL\7,0\1]
PulsOut LE,10
PAUSE 50
DTT=%0:CL=%0:LE=%0
Next AVAL

Return

sozkarabacak

Alıntı yapılan: "maxiboost"araya bir tane if li satır eklesek olmazmı ?
denemedim ama şuna benzer
diyelim portb.0 giriş olacak


'******************* PLL ENTEGRESİNE VERİ GÖNDER (ara program) ****
GONDER:
DTT=0:CL=0:LE=0
For AVAL = 40 to 70
*AAA:
*IF PORTB.0 =1 THEN GOTO AAA

PAUSE 3000
shiftout DTT,CL,1,[SW\1,REF\13,1\1]
PulsOut LE,10
PAUSE 50
shiftout DTT,CL,1,[NVAL\11,AVAL\7,0\1]
PulsOut LE,10
PAUSE 50
DTT=%0:CL=%0:LE=%0
Next AVAL

Return

Bu sistem bir alıcı devrenin pll entegresini scan edecek yani nerde yayın olursa orda duracak oysaki yukarıdaki şekilde sabit belirlenen bir yerde durur sanırım. Devrede bir ara frekans entegresi var yayın aldığında bir uçtan +5 volt çıkış veriyor. Bu bilgiyi pice işlemiş olacağız.
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

ibo1973

rb0 kesmesi ile gayet rahat olur kesmeye gidersin yapılıcak işleri yaparsın resume ile kaldığı yerden devam edersin ama sanırım bunu burdaki arkadaşlarında aklına gelmiştir ? yada ben bi şeyimi kaçırdım okumayı yada anlamadınmmı ?

ete

Anladığım kadarı ile Pic in bütün bacaklarının kontrol edilmesini istiyorsun.
Bacaklardan herhangi birinin  önceki konumu 0 iken 1 olmuş ise program döngü içinde beklesin ve pin eski haline dönüncede döngüye devam edilsin istiyorsun.

Bu durumda Önce bütün pinleri kontrol eden ve pinlerin döngü öncesi konumlarını hafızaya alan bir bölümü programa döngü öncesinde eklemek gerek. Kullandığımız pic 16F628 ve PortB ile A portunun son 5 biti giriş olarak kullanılmış .

Döngü başlamadan evvel ,

DURUM_A=PORTA & &11111000
DURUM_B=PORTB  şeklinde iki komut ilave etmemiz gerek. SOnra,

Dongü komutu For x... ile başlar ve next ile biter. Bu iki komut arasında bir yere;

While (Durum_A<>PORTA & %11111000)  OR  (Durum_B<>PortB):wend
satırını ilave edersen portların pinlerinden her hangi birisinde değişiklik olması durumunda program orada bekleyecek ve pinlerin eski haline dönmesi durumunda döngüye kaldığı yerden devam edecektir.

Toparlamak gerekir ise;

Önce Programın değişkenler bölümüne;
DURUM_A VAR BYTE
DURUM_B VAR BYTE
değişkenlerini ilave etmen gerek.
Sonra,
For AVAL = 40 to 70    satırından bir önceki satıra;
DURUM_A=PORTA & %11111000
DURUM_B=PORTB
satırlarını ilave etmen, ve son olarak da ,

For AVAL = 40 to 70
PAUSE 3000
satırlarından hemen sonrasına
While (Durum_A<>PORTA & %11111000)  OR  (Durum_B<>PortB):WEND
satırlarını ilave etmen gerekecektir. Hepsi bu kadar.

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

sozkarabacak

İlginize teşekkür ederim deneyip bilgi vereceğim.
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

Ruzgarbey

anladığım kadarı ile for next döngüsünü bir pin high olduğunda bekletmek istiyorsun yani o pin low oluncaya kadar bekleteceksin.bu iş için 1 satır bir kod yazman yeterli..gerçi ETE hocam detaylı açıklamasını yapmış benim nacizane fikrimi beyan ediyorum..

while portb.0=1 :wend

hepsi bu kadar.portb.0 pini high olduğunda while döngüsü içinde beklemeye gidiliyor.pin low olduğunda beklemeden çıkılıp normal for next döngüsüne devam ediliyor..

For AVAL = 40 to 70
while portb.0=1 :wend  'veya istediğin yere koy..
PAUSE 3000
shiftout DTT,CL,1,[SW\1,REF\13,1\1]
PulsOut LE,10
PAUSE 50
shiftout DTT,CL,1,[NVAL\11,AVAL\7,0\1]
PulsOut LE,10
PAUSE 50
DTT=%0:CL=%0:LE=%0
Next AVAL


saygılarımla..
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

sozkarabacak

Alıntı yapılan: "Ruzgarbey"while portb.0=1 :wend

İlginize teşekkür ederim aradığım bu komutmuş denedim ve sorunsuz çalıştı.

Şimdi son olarak bir sorum daha var. Bu yazılımda A değeri diyelim for 0 to 10 dediğimizde 0 - 2 - 3 - 4... 10 şeklinde bir döngüye giriyor. Bu durumu nasıl istediğimiz sıradaki değerleri tarayacak diyelim 1-4-7-9-10 değerlerini belirledik bir döngü içinde sadece bu değerleri tarayacak otomatik olarak yine portb.0=1 olunca o anda hangi değerde ise duracak 0 olunca kaldığı yerden devam edecek.
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

ete

Bir sıraya yada formüle uymayan artışlar için yalnızca lookup tablosu ile taratma yapılabilir. Örnek vermek gerekir ise kaç adet tarama yapılacak ise ki diyelim 7 adet tarama yapılacak,
For A=0 to 6 '7 adet tarama
GOSUB TARA
Bu satırda Lookup tablosundan taranacak değerler sırası ile alınır ve SAYI değişkeni olarak döner.
Next

...
..
TARA:
LOOKUP A,[1,3,4, 6, 8, 10, 12],SAYI
return

Bu komutlarda sayı değişkeni A değişkenine bağlı olarak;
A=0 iken SAYI=1
A=1 iken SAYI=3
A=2 iken SAYI=4
A=3 iken SAYI=6
..
A=6 iken SAYI=12 olur.

Sanırım istediğin bu idi.

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

sozkarabacak

Alıntı Yap
@ DEVICE pic16F628                                                    
@ DEVICE pic16F628, WDT_OFF              
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT              
@ DEVICE pic16F628, PROTECT_OFF
'***********************  DEĞİŞKEN VE SABİTLER  ******************
     DTT VAR PORTA.1
     CL VAR PORTA.0
     LE VAR PORTA.2    
     REF VAR Word      
     SW VAR Bit      
     NVAL VAR WORD
     AVAL VAR BYTE
     
'***********************  AYARLAR  ********************************
     CMCON=7                
     OPTION_REG.7=1
'***********************  GİRİŞ ÇIKIŞ AYARLARI  *******************
     TRISA=%11111000
     TRISB=%11111111
     DEFINE SHIFT_PAUSEUS 1
'*******************  DEĞER ATAMASI  ******************************
     SW=0      
     REF=320
     NVAL=112      
'*******************  PROGRAM ANA BÖLÜM  ***************************
     BASLA:                
     GoSub GONDER
     GOSUB TARA
     GoTo BASLA
'*******************  PLL ENTEGRESİNE VERİ GÖNDER (ara program)  ***
     GONDER:
     DTT=0:CL=0:LE=0
     PAUSE 50      
     shiftout DTT,CL,1,[SW\1,REF\13,1\1]
     PulsOut LE,10
     PAUSE 50                      
     shiftout DTT,CL,1,[NVAL\11,AVAL\7,0\1]    
     PulsOut LE,10                      
     PAUSE 50
     DTT=%0:CL=%0:LE=%0  
     Return
     
     
       For AVAL=0 to 6
       while portb.0=1 :wend
       GOSUB TARA
       NEXT
     
       TARA:
       LOOKUP AVAL,[8, 13, 14, 16, 18, 100, 121],SAYI
       AVAL=0 THEN SAYI=8
       AVAL=1 THEN SAYI=13
       AVAL=2 THEN SAYI=14
       AVAL=3 THEN SAYI=16
       AVAL=4 THEN SAYI=18
       AVAL=5 THEN SAYI=100
       AVAL=6 THEN SAYI=121
       return        
       End  

Kodu yukarıdaki şekliyle derlemeyi denedim. Fakat LOOKUP komutunda hata verdi yani hex elde edemedim acaba neden olabilir ilgilenirseniz sevinirim.
http://picasaweb.google.com/33elektronik http://www.33elektronik.tr.cx MSN: [email]sukruozkarabacak@hotmail.com[/email]

ete

Ufak tefek kusurlar varmış. Birincisi SAYI isimli değişkeni  değişkenler bölümünde tanımlamamışsın. Onu tanımladım.
Sonra lookup komutundan sonra gelenleri yazmaman gerekiyor idi. Onlar açıklama olup AVAL değişkeninin değerine karşılık SAYI değişkeninin alacağı değerleri gösteriyor. Onlarıda silince işlem tamam oldu. Program aşağıdadır.
Ancak hala eksikler var. Birincisi, TARA alt programını hazırlamışsın bu güzel peki ne zaman veya nerede kullanıyorsun burasını?, yalnızca ;
For AVAL=0 to 6
while portb.0=1 :wend
GOSUB TARA
NEXT
komut dizisi içinde kullanıyorsun ama bu komut dizisini öyle bir yere yerleştirmişsinki oraya hiç bir şekilde ulaşılmıyor yada ulaşılmayacak.
Hadi ulaşıldığını düşünelim. Burada yer alan nex komutundan sonra program TARA isimli alt programa atlayacak ki normal şartlarda bu alt programa gosub ile gelmesi gerekir idi. Çünki dönüşü Return ile olması gerekiyor. Anlayacağın bazı olumsuzluklar var ve bu hali ile program çalışmaz.
Tam olarak ne yapmak istediğini söylersen daha fazla yardımcı olabilirim.
Ama ne yapmak istediğini bilmediğimden başka bir önerim olamıyor maalesef.
Muhtemelen tara isimli alt programdaki değerleri kullanarak Gönder alt programını çalıştıracaksın. Şayet amacın bu ise bazı değişiklikler yapmak gerekecek.
Amacını açıklarsan sonuca ulaşabiliriz. En başta Lookup komutunda Sayı ile AVAL'ın yerlerini değiştir bence. Döngüyü SAYI ile kur böylece Shiftout komutunda değişiklik yapmadan direk kullanman mümkün olacak.
Muhtelemelen istediğin program ikinci sıradaki şekilde olmalı diye düşünüyorum.

Ete


@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_OFF
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
@ DEVICE pic16F628, PROTECT_OFF
'*********************** DEĞİŞKEN VE SABİTLER ******************
DTT VAR PORTA.1
CL VAR PORTA.0
LE VAR PORTA.2
REF VAR Word
SW VAR Bit
NVAL VAR WORD
AVAL VAR BYTE
SAYI var BYTE

'*********************** AYARLAR ********************************
CMCON=7
OPTION_REG.7=1
'*********************** GİRİŞ ÇIKIŞ AYARLARI *******************
TRISA=%11111000
TRISB=%11111111
DEFINE SHIFT_PAUSEUS 1
'******************* DEĞER ATAMASI ******************************
SW=0
REF=320
NVAL=112
'******************* PROGRAM ANA BÖLÜM ***************************
BASLA:
GoSub GONDER
GOSUB TARA
GoTo BASLA
'******************* PLL ENTEGRESİNE VERİ GÖNDER (ara program) ***
GONDER:
DTT=0:CL=0:LE=0
PAUSE 50
shiftout DTT,CL,1,[SW\1,REF\13,1\1]
PulsOut LE,10
PAUSE 50
shiftout DTT,CL,1,[NVAL\11,AVAL\7,0\1]
PulsOut LE,10
PAUSE 50
DTT=%0:CL=%0:LE=%0
Return


For AVAL=0 to 6
while portb.0=1 :wend
GOSUB TARA
NEXT

TARA:
LOOKUP AVAL,[8, 13, 14, 16, 18, 100, 121],SAYI
return
End


İkinci ve olması gereken program
@ DEVICE pic16F628
@ DEVICE pic16F628, WDT_OFF
@ DEVICE pic16F628, PWRT_ON
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT
@ DEVICE pic16F628, PROTECT_OFF
'*********************** DEĞİŞKEN VE SABİTLER ******************
DTT VAR PORTA.1
CL VAR PORTA.0
LE VAR PORTA.2
REF VAR Word
SW VAR Bit
NVAL VAR WORD
AVAL VAR BYTE
SAYI var BYTE

'*********************** AYARLAR ********************************
CMCON=7
OPTION_REG.7=1
'*********************** GİRİŞ ÇIKIŞ AYARLARI *******************
TRISA=%11111000
TRISB=%11111111
DEFINE SHIFT_PAUSEUS 1
'******************* DEĞER ATAMASI ******************************
SW=0
REF=320
NVAL=112
'******************* PROGRAM ANA BÖLÜM ***************************
BASLA:
GoSub GONDER
GoTo BASLA
'******************* PLL ENTEGRESİNE VERİ GÖNDER (ara program) ***
GONDER:

DTT=0:CL=0:LE=0
    For SAYI = 0 to 6
       GOSUB TARA
       PAUSE 3000
       shiftout DTT,CL,1,[SW\1,REF\13,1\1]
       PulsOut LE,10
       PAUSE 50
       shiftout DTT,CL,1,[NVAL\11,AVAL\7,0\1]
       PulsOut LE,10
       PAUSE 50
       DTT=%0:CL=%0:LE=%0
    Next 
    Return

TARA:
LOOKUP SAYI,[8, 13, 14, 16, 18, 100, 121], AVAL
return
End
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com