Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: mr.selim - 02 Mayıs 2017, 14:38:36

Başlık: Arduino da Kesme kullanımı hakkında ???
Gönderen: mr.selim - 02 Mayıs 2017, 14:38:36
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?
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: Kabil ATICI - 02 Mayıs 2017, 14:59:50
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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mr.selim - 02 Mayıs 2017, 15:30:32
@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?
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mg1980 - 02 Mayıs 2017, 15:45:19
@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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: Kabil ATICI - 02 Mayıs 2017, 15:47:08
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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mr.selim - 02 Mayıs 2017, 15:52:39
@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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mr.selim - 02 Mayıs 2017, 16:01:26
@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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mg1980 - 02 Mayıs 2017, 16:02:03
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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mr.selim - 02 Mayıs 2017, 16:05:57
@mg1980 İlginç dikkat etmedim teşekkür ederim hocam.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mehmet - 02 Mayıs 2017, 18:40:20
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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mr.selim - 02 Mayıs 2017, 20:44:32
@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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mg1980 - 02 Mayıs 2017, 21:32:04
@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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mr.selim - 02 Mayıs 2017, 21:49:21
@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?
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mg1980 - 02 Mayıs 2017, 22:08:21
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.
Başlık: Ynt: Arduino da Kesme kullanımı hakkında ???
Gönderen: mr.selim - 02 Mayıs 2017, 22:59:18
@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 :)