kesme sırasında delayms veremiyorum

Başlatan uardal, 07 Ocak 2011, 11:29:19

CLR

Alıntı yapılan: kahraman10 - 16 Ocak 2011, 00:11:11
biraz açarmısınız konuyu ?
rutinde delay verdim diyelim, intrrupt altında delay veremez miyim yani ?
veya tam tersi, hadi veremezsin dedin ikinci bir delay komutu varmı ? yok e nolacak ?
Alıntı yapılan: eemkutay - 12 Ocak 2011, 18:05:35
Alıntı yapılan: kahraman10 - 12 Ocak 2011, 17:02:02
Alıntı yapılan: eemkutay - 11 Ocak 2011, 16:44:39
Zamanlama önemli ama burada daha başka yapılan bir hata daha var, aynı delay altprogramı, ana program ve interrupt içinde kullanılmamalıdır.
Interrupt için ayrı delay altprogramı yazılmalı. Aksi halde main içindeki delay işletilirken interrupt gelirse, interrupt içindeki aynı delay altprogramı çalışacağı için kitlenme veya daha başka sorunlarınız olabilir.

Hocam Yazılımı proton ile yapıyoruz assamlber değil . dediğin işlem proton da yapılabiliyorsa ben bilmiyorum öğrenmek içinse sabırsızlanıyorum.

Bu olayda dil farkı yok, Derleyici normalde main içinde kullanılan fonksiyonu, interrupt içinde kullanmana izin vermemesi gerekir. Veriyorsa programı yazan kişi dikkat edecek.
 

interrupt içinde delay verirsin ama aynı fonksiyonu vermezsen daha doğru olur, interrupt için daha başka delay altprogramı kullan mesele main içinde DlyMs() adında delay kullanıyorsan int. içinde IntDlyMs() adında bir altprogram oluştur onu kullan bu durumda veriler farklı registerlerde tutulmuş olacaktır. Bu sadece delay için diğer fonksiyonlar içinde durum aynı. Ama ben herşeyi hesapladım kullansamda programın akışını değiştirmez diyorsan kullanabilirsin.
Knowledge and Experience are Power

CLR

Alıntı yapılan: gerbay - 16 Ocak 2011, 23:40:14
"... bu durumda veriler farklı registerlerde tutulmuş olacaktır."

Ben buna katılmıyorum, eğer assembly ile yazmıyorsanız ve registerları siz vermiyorsanız çok çok büyük ihtimal ile aynı registerlar kullanılır..  bence yazdıktan sonra üretilen assembly koduna bakın her iki fonksiyon için de.. hangi registerların kullanıldığına dikkat edin.. çok büyük ihtimal aynı registerlar

bu biraz işlemci ve compiler a da bağlı bir durum aslında. Bazı compiler lar fonksiyon içerisinde kullanılan register ların değerlerini fonksiyona girerken saklar, çıkarken tekrar eski değerleri yerine yazar. Proton+ ne şekilde davranıyor acaba bu konuda bilen var mı?

İlla çözüm yerine sorun bulacaksınız ama ben sizin mantığınızla gitmeyeceğim. Verdiğin "ihtimali" de ortadan kaldırayım. Asm içinde kendim atayacağım için sorun olmaz dediğin gibi, her iki fonksiyon için C içinde değişkenleri global veya global static tanımlarım hadi derleyici aynı registeri atsın bakalım.  Herşeyin bir çözümü var. Proton içinde benzer bir uygulama vardır sanırım.
Knowledge and Experience are Power

kahraman10

Alıntı yapılan: eemkutay - 17 Ocak 2011, 11:18:47
Alıntı yapılan: gerbay - 16 Ocak 2011, 23:40:14
"... bu durumda veriler farklı registerlerde tutulmuş olacaktır."

Ben buna katılmıyorum, eğer assembly ile yazmıyorsanız ve registerları siz vermiyorsanız çok çok büyük ihtimal ile aynı registerlar kullanılır..  bence yazdıktan sonra üretilen assembly koduna bakın her iki fonksiyon için de.. hangi registerların kullanıldığına dikkat edin.. çok büyük ihtimal aynı registerlar

bu biraz işlemci ve compiler a da bağlı bir durum aslında. Bazı compiler lar fonksiyon içerisinde kullanılan register ların değerlerini fonksiyona girerken saklar, çıkarken tekrar eski değerleri yerine yazar. Proton+ ne şekilde davranıyor acaba bu konuda bilen var mı?

İlla çözüm yerine sorun bulacaksınız ama ben sizin mantığınızla gitmeyeceğim. Verdiğin "ihtimali" de ortadan kaldırayım. Asm içinde kendim atayacağım için sorun olmaz dediğin gibi, her iki fonksiyon için C içinde değişkenleri global veya global static tanımlarım hadi derleyici aynı registeri atsın bakalım.  Herşeyin bir çözümü var. Proton içinde benzer bir uygulama vardır sanırım.

proton da bu işe çözüm yok.

CLR

Alıntı yapılan: kahraman10 - 23 Ocak 2011, 12:52:21
Alıntı yapılan: eemkutay - 17 Ocak 2011, 11:18:47
Alıntı yapılan: gerbay - 16 Ocak 2011, 23:40:14
"... bu durumda veriler farklı registerlerde tutulmuş olacaktır."

Ben buna katılmıyorum, eğer assembly ile yazmıyorsanız ve registerları siz vermiyorsanız çok çok büyük ihtimal ile aynı registerlar kullanılır..  bence yazdıktan sonra üretilen assembly koduna bakın her iki fonksiyon için de.. hangi registerların kullanıldığına dikkat edin.. çok büyük ihtimal aynı registerlar

bu biraz işlemci ve compiler a da bağlı bir durum aslında. Bazı compiler lar fonksiyon içerisinde kullanılan register ların değerlerini fonksiyona girerken saklar, çıkarken tekrar eski değerleri yerine yazar. Proton+ ne şekilde davranıyor acaba bu konuda bilen var mı?

İlla çözüm yerine sorun bulacaksınız ama ben sizin mantığınızla gitmeyeceğim. Verdiğin "ihtimali" de ortadan kaldırayım. Asm içinde kendim atayacağım için sorun olmaz dediğin gibi, her iki fonksiyon için C içinde değişkenleri global veya global static tanımlarım hadi derleyici aynı registeri atsın bakalım.  Herşeyin bir çözümü var. Proton içinde benzer bir uygulama vardır sanırım.

proton da bu işe çözüm yok.

O zaman kullandığınız dili değiştirin, çözüm bu.
Knowledge and Experience are Power

muhittin_kaplan

O dil Bu dil fark etmez. Genel Kullanım Kesme den olabildiğince hızlı çıkılır.

CLR



Aslında programlama dili fark eder ama ihtiyacın yoksa değiştirmeye gerek yok. En iyi yol, bildiğin yoldur.
Knowledge and Experience are Power

Ruzgarbey

genel kullanımda kesmelerden hızlı çıkılması programın yürümesi gereğinden olduğunu düşünüyorum.birden fazla kesme kullanılmamış ise,ana programda başka konroller yapılmıyor ise,sadece kesme üzerine bir program yazılmış ise kesmede istenildiği kadar kalınmasında bir sakınca göremiyorum.arkadaşlar yaklaşık 3 yıldır basic kullandım.pice ilk başladığımda asm öğrendim.asm ile uzun program yazmanın bir işkence olduğunu görünce vede visual basic alt yapım olduğu için picbasic e geçtim.bir çok projemi bu dil ile yaptım.daha sonra kesmelerdeki kod şişmesinden dolayı protona geçtim.protonda bazı uygulamalar yaptım.syntax açısından neredeyse aynılar.gecikme kullanımlarında oluşan kesmelerde bu dillerin yetersizliği forumumuzda çokça tartışıldı.ben çok araştırmama rağmen maalesfki çözüm bulamadım.delay ve pause komutları işlenirken oluşan kesmeye pic cevap veremiyor maalesef.
Bende yaklaşık 10 gün kadar önce CCS C ile pic programlama kitabı sipariş ettim.kitap geldi.kitabı açıp biraz okudum. C dilinde komut sayısı çok fazla olduğunu gördüm ama okumaktan sıkılmadım.çünkü okurken hem basic hemde proton ile karşılaştırdım.basic te bildiğimiz gibi for next döngüsünden şart gerçekleşmeden çıkamıyorduk ama C dilinde bir Break komutu ile şart gerçekleşmeden çıkalabiliyor.bunun gibi bir çok örnek varkarşılaştırmalarımdan çıkan.her neyse C dilinde benim için önemli olan kesmeleri inceledim ve küçük bir program yazdım.timer0 kesmesi kullanım.ana programda sonsuz döngü oluşturup budöngünün içinde 1000 ms delay kullandım.ve proteusta simule ettim.pic hiç problemsiz bekleme yaparken bile kesmeye gitti ve sayacı artırdı.görünen oki kullandığımız dilde problem varmış.
Kimseye kullanmış olduğu değiştirmesini söylemiyorum ama kendimizi geliştirmek adına başka dilleride incelememiz gerekiyor.
saygılarımla.
Hayatta En Hakiki Mürşid İlimdir. M.K. ATATÜRK

X-Fi

DelayMs(); içerisinde CLRWDT(); yerleşik olması lazım c de böyle oluyor kesme içerisinde kullanılacak beklemede clrwdt(); olamamalı bu yüzden DelayMs_interrupt(); var kullanırken buna dikkat ediniz.

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

muhittin_kaplan

kesmeden hızlı çıkılmasının ana sebebi şudur;
kesme geldiği anda kesmeler kapatılırki başka kesme gelmesin. eğer siz bu süreyi uzun tutar ve oralarda debelenirseniz kaçırmamanız gereken başka bir kesmeyi kaçırırsınız.

@Ruzgarbey
proton da da break var.

Maxim

açık söyleyeyim ben bu başlıkta ne konuşuluyor anlayamadım
sorun nedir ? ben birşeyler kaçırdım ama ne  ;D

kesme sırasında delayms olayı değilmi ?
kesme rutini içerisinde delayms olmaz, bitti.

ama dışarıda kullan, istersen delayms 3500 yaz, çalışır, kesmede çalışır, program kesmeye gider işini yapar çıkar,
bu sırada program delayms 3500 satırındadır hala, arkada kesmeler aktif olur, protonda .
bu değilmi sorulan şey ?


@muhittin_kaplan
şu break olayı nasıl? for next içinde ?

t2

ben muhittin_kaplan değilim ama musadenle cevap vereyim.

for next içinde  bir yere break yazarsan  döngü hemen biter. saymaz. i= 1 to 1000 dedin fakat ortada bir yerde  if qwerty ise break yazdın  i=  1000 olmadan döngü biter.

muhittin_kaplan

for a=0 to 15
      if porta.0=1 then break
      kodlar
next

eğer giriş 1 olursa döngüden çıkar

Maxim

hiç kullanmamıştım, gerek olmamıştı

proton helpinden bir alıntı:


BREAK


Overview
Exit a for...next, while...wend or repeat...until loop prematurely.

Example 1

 ' Break out of a FOR NEXT loop when the count reaches 10
 INCLUDE "PROTON_4.INC"       ' Demo using PROTON Dev board
 DIM VAR1 as BYTE
 
 DELAYMS 200                  ' Wait for PICmicro to stabilise
 CLS                          ' Clear the LCD  
 FOR VAR1 = 0 TO 39           ' Create a loop of 40 revolutions
 PRINT AT 1,1,DEC VAR1        ' Print the revolutions on the first line of the LCD
 IF VAR1 = 10 THEN BREAK      ' Break out of the loop when VAR1 = 10
 DELAYMS 200                  ' Delay so we can see what's happening
 NEXT                         ' Close the FOR-NEXT loop
 PRINT AT 2,1,"EXITED AT " , DEC VAR1  ' Display the value when the loop was broken
 STOP

Example 2

 ' Break out of a REPEAT-UNTIL loop when the count reaches 10
 INCLUDE "PROTON_4.INC"       ' Demo using PROTON Dev board
 DIM VAR1 as BYTE
 
 DELAYMS 200                  ' Wait for PICmicro to stabilise
 CLS                          ' Clear the LCD  
 VAR1 = 0     
 REPEAT                       ' Create a loop
 PRINT AT 1,1,DEC VAR1        ' Print the revolutions on the first line of the LCD
 IF VAR1 = 10 THEN BREAK      ' Break out of the loop when VAR1 = 10
 DELAYMS 200                  ' Delay so we can see what's happening
 INC VAR1
 UNTIL VAR1 > 39              ' Close the loop after 40 revolutions
 PRINT AT 2,1,"EXITED AT " , DEC VAR1  ' Display the value when the loop was broken
 STOP

Example 3

 ' Break out of a WHILE-WEND loop when the count reaches 10
 INCLUDE "PROTON_4.INC"       ' Demo using PROTON Dev board
 DIM VAR1 as BYTE
 
 DELAYMS 200                  ' Wait for PICmicro to stabilise
 CLS                          ' Clear the LCD  
 VAR1 = 0     
 WHILE VAR1 < 40              ' Create a loop of 40 revolutions
 PRINT AT 1,1,DEC VAR1        ' Print the revolutions on the first line of the LCD
 IF VAR1 = 10 THEN BREAK      ' Break out of the loop when VAR1 = 10
 DELAYMS 200                  ' Delay so we can see what's happening
 INC VAR1
 WEND                         ' Close the loop
 PRINT AT 2,1,"EXITED AT " , DEC VAR1  ' Display the value when the loop was broken
 STOP

Notes

The Break command is similar to a GoTo, but operates internally. When the Break command is encountered, the compiler will force a jump to the loop's internal exit label.