Arduino da Kesme kullanımı hakkında ???

Başlatan mr.selim, 02 Mayıs 2017, 14:38:36

mr.selim

Herkese iyi çalışmalar kolay gelsin. Daha pratik çözümler sağlaması açısından projemde arduino kullanıyorum. Şöyle bir sıkıntım oldu. 3 Farklı kesme kullanıcam ancak arduino da sanırsam sadece yükselen düşen ve değişim kesmeleri var VE bunlar sadece tek bir pine uygulanıyor ( yani değişim sadece bi tane pin için ) Halbu ki ben 3 pinden istiyorum. Misal B portunun komple değişimini algılayamıyor muyum ?

Şimdi yapmam gereken şu mu? 3 tane alt alta change attachinterup kullanarak 1. pin interupt A fonksiyonuna, 2. pin interupt A fonksiyonuna, 3. pin A fonksiyonuna yazıcam. Doğru anladım sanırsam. PEKİ BU CHANGE kesmesi DİJİTAL olarak 1 0 mı algılar yoksa 0 dan 2 volt a filan sıçrasa sensörden gelen bilgi, bu değişim kesmesi devreye girecek midir?

Kabil ATICI

Kullandığın arduino üzerinde işlemcinin datasheet bak. PCINT diye bir kesmesi daha vardır. Senin işini görebilir.


Kesme işlemlerinde de aynı normal pin işlemlerindeki gerilim seviyeleri geçerlidir. (lojik seviye ile ilgili bilgileri inceleyebilirsin.
ambar7

mr.selim

@Kabil ATICI Hocam teşekkür ederim sanırım anahtar kelime buymuş. Birde normal pin işlemleri derken o cümlenizi tam anlayamadım. Yani lojik kabul edilen gerilim seviyesini mi dikkate alır? Yani benim anladığım lojik sıfırdan lojik 1 olana kadar (diyelim ki 2 Voltta lojik 1 oluyor) kesme aktif olmaz dimi?

mg1980

@mr.selim ;
Dediğiniz gibi olabilir sanırım. 3 adet const int FAZ1,FAZ2.....tanımlanabilir.attachInterrupt(FAZ1,birinci,RISING)..
void birinci(), void ikinci(),void ucuncu()....
Kitabım diyor ki bu fonksiyon içlerinde kullanacağınız değişkenleri volatile int... şeklinde tanımlayın.Kolay gelsin.

Kabil ATICI

normal pin olarak kastettiğim, lojik seviyelerdir. Nasıl lojik 1 seviyesi alt sınırına ulaştığında daha üst gerilimler olduğu gibi lojik 1 seviyesi kabul ediliyorsa, burada da lojik1 alt sınırından itibaren üst gerilim olduğu gibi lojik 1 olarak kabul edilir.
Aynı şekilde lojik-0 üst sınırının altı olduğu gibi lojik-0 olarak kabul edilir.


Lojik sistemlerde bunun en sıkıntı tarafı sinyallerin bozulması veya tuş sıçraması gibi durumlardır ki bu tür sıkıntılar, schmitt trigger devreleri ile aşılır.
Senin kullanmak istediğin  pin değişimi ise sinyal değiştiği anda kesme aktif olur,  senin kesme işlemlerini bitirip çıkman gerekir ki, ikinci kesme durumu oluştuğunda tekrar kesme işlemine girmesi gerekir.


Aksi durumda lojik seviye sabit kalması kesme aktiflemez.
ambar7

mr.selim

@mg1980 Teşekkürler. Şöyle yapmayı planlıyordum.
attachInterrupt(FAZ1,birinci,CHANGEattachInterrupt(FAZ2,birinci,CHANGEattachInterrupt(FAZ3,birinci,CHANGE)
void birinci()

volatile değişken geçici değişken değil mi ama benim kullanıcağım sensör bilgisi heryerde geçerli olması gereken bişey.

mr.selim

@Kabil ATICI Hocam benim sistem şöyle ben başlangıçta 0 değerleriyle başlıyorum. 1. pin 2 ve 3 0 0 0. Şimdi Gelen ilk sinyal 1 0 1 olursa kesmeler şöyle mi olacak. 1. pin değişti kesime git fonksiyona atla çık ama 3. pinde değişti tekrar onun içinde fonksiyona tekrar git. Benim 1 kere gitmek istediğim yere 2 kere gitmiş olacak bu durumu nasıl aşabilirim.

mg1980

#7
Kitaptaki ifade şöyle:
"volatile olarak tanımlanan değişkenler kayıtçılarda değil RAM bellekte saklanır.Bu da verilerin daha güvenli olmasını sağlar."

Tanımlamayı başlangıçta global değişken olarak yapabilirsiniz.

mr.selim

@mg1980 İlginç dikkat etmedim teşekkür ederim hocam.

mehmet

Kesme fonksiyonlarında kullanılan genel değişkenler
derleyicide dikkate alınmayabilir. Bu durumda kesme
içerisinde bu değişkenle ilgili işlem yapılmayabilir.
"volatile" ile derleyiciye "karışma arkadaşım işne
bak, değişkenimi tanımla!" denilmektedir.

Olay; main() içerisinden ve diğer fonksiyonlar tarafından
hiç çağırılmayan "kesme" fonksiyonudur. Normalde yapılan
optimizasyonda kullanılmayan! değişkenler tanımlanmaz
ve kod içerisinde dikkate alınmaz.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
---------------------------------------------
http://www.mehmetbilgi.net.tr
https://creativecommons.org/licenses/by/4.0/deed.tr "CC BY"

mr.selim

@mehmet Anladım hocam. Şimdi kafamı karıştıran nokta şu oldu. Ben kesme fonksiyonunda pwm vericem motora. Bu kesmelerin algılanıcağı sensörleri mi volatile ( volatile halla, b, c vs.) yapmalıyım yoksa o fonksiyon içindeki bütün değişkenleri mi ( PWM olsun başka ifadeler olsun) volatile yapmalıyım orayı çözemedim.

mg1980

@mr.selim ;

Soruyu @mehmet hocama sormuşsunuz o cevap verebilir de bu arada ben de bir şeyler öğrenmeye çalışıyorum. Durum şöyle mi olacak?
Sizin üç adet hall sensörünüz var. Bunların vereceği konum bilgisine göre üç ayrı pinden farklı zamanlarda kesme algılanacak. Öncelik sırasına göre PWM ile bunlara cevap verilecek..Bu doğru mu? Şayet doğru ise her halde şöyle yaparsınız diye düşünüyorum;

* 3 adet const int FAZ1=3(pin), FAZ2=4, FAZ3=5; şeklinde hall sensörlerin değişikliğini algılayacak harici kesme pini.
* void setup() içinde 3 adet attachInterrupt(FAZ1,birinci,RISING); (diğerleri FAZ2,ikinci,...FAZ3, ucuncu şeklinde) harici kesme tanımlaması.
* setup dışında 3 adet void birinci(),ikinci,ucuncu tanımı. Yani kesme nerede oluşmuşsa o fonksiyona gidecek ve fonksiyonda yazdığınız kodları uygulayacak. Benim düşünceme göre bu fonksiyonlar içinde kullanılacak değişkenler varsa ki olacaktır bunları programın en başında global değişken olarak "volatile int.." şeklinde tanımlamanız gereği. Böyle bir şey çalışabilir diye düşünüyorum.

mr.selim

@mg1980 Estafurullah hocam ben sizi daha fazla meşgul etmemek adına herkesten kısa kısa bilgiler alarak çözmeye çalışmıştım ki gayet güzel cevapla dönüş yaptınız bencede öyle çalışacak gibi. Yalnız bir fark var hocam. Hepsini aynı fonksiyona yollayacam. Herhalde de bunda bir sorun çıkmayacaktır.

Bu arada da fonksiyon içinde hall (sensörlerin pini) ve pwm dışında değişken olmazsa volatile e gerek yok mu diyeceğiz. Hall sensörlerinin pinini const yerine volatile yapmak gerekmicek mi bu durumda ? Çünkü kesme fonksiyonunda bunlar dönecek?

mg1980

Hall sensör pinlerini ve bu değişkenleri her Arduino programında olduğu gibi başta tanımlarsınız. Bence pinler için const ..yeterlidir. Kesme fonksiyonu içinde kullanılacak olanları da volatile yaparsınız. Kafaya o kadar takmayın. Hatta önce hepsini normal yapın çalışmada bir gariplik görüyorsanız volatile olarak değiştirin.

mr.selim

@mg1980 Haklısınız. Genetik olarak takıntılı bir yapım var. Denemeyi led de filan yapıcağım için motor tepkisini anlayamam belki diye didik didik ediyorum her satırı.

Herkese teşekkürler ben hepsini harmanlayıp birşeyler deniyim :)