STM32F407 ADC - UART - SPI ve Kesmeler Hakkında

Başlatan usahin, 29 Ocak 2015, 00:53:49

usahin

Picproje ailesi selamlar,

Kişisel bir projede STM32F4 Discovery kartını kullanacağım. Hem ADC'den hem de SPI'dan veri okuyacağım ve bu verilere bağlı bir PWM sinyali üreteceğim ve açık çevrim dc motor kontrolü yapacağım. Aynı zamanda UART ile de izlediğim verileri bir bilgisayara göndereceğim.   Kesmelere başvurmayı düşündüm ancak bir arada bir kaç kesmeyi hiç kullanmadım. Bu işlem akışını bozar mı ?  PWM sinyali üretimini  ve veri iletimini kesmemek için ne yapmamı önerirsiniz ?

SaveAs

#1
Kesmelere öncelik belirttiğin takdirde sıkıntı yaşamazsın. Discovery 32f4'ü hangi ide ile programlıyorsun? PWM izlemeyi uart'a gerek kalmadan STnin ürettiği bir programla izleyebilirsin.(tam hatırlamıyorum istersen araştırıp söylerim) (ide'yi sormamdaki amaç ıar kulanırsan debug ederken izleyebilirsin, keilde debug olmamasına ragmen program sayesinde izleyeblirsin) Bu sayede veri iletimini kesme gibi bir düşünceye kapılmazsın. SPI 'dan veri okuyacaksan logic analyzer bak derim. Çok tatlı bişey

balance

STM32 ler gelişmiş MCU'lardır, PWM ler için ayrı modül içerir. Bu sayede, PWM sinyal üretimini işlemci sürekli olarak geçekleştirir, sen ise SPI okuma kesmesinde PWM duty cycle ile istediğin şekilde oynayabilirsin.

selimkoc

PWM ve SPI donanımsal modül. Kesme kullandığınızda bir aksama olmaz. Üstelik ARM'da NVIC kesme yöneticisi var. USB'yi kullanman daha iyi olabilir. Çünkü artık RS232 her bilgisayarda bulunmuyor.

Karamel

Hocam bende yeri gelmisken birsey sormak istiyorum. diyelim ki oncelikleri soyle belirledik.

1- adc
2 -spi
3 -uart

uart kesmesi islenirken bir anda spi dan veri gelse ne oluyor? Bu sirayi neye gore belirliyoruz?

SaveAs

Cevap vermek istiyorum ama ne kaadar doğru ne kadar yanlış olur üstadlarımız karar versin.
Dediğin gibi uart gerçekleşirken Spı'dan veri gelse; öncelik Spı'ın olduğundan SPI daki veri gönderilir. Anladığım kadarıyla uşahin arkadaşımız pc'den uart ile izlemek istiyor.Ben olsam uart'a öncelik verir ilk Pc'den izlerdim. Bu sırayı belirlemede de projeye göre değişiklik gösterir. Ayrca şunu da belirtmek istiyorum PicProjede Arm üzerine çalışmalar gittikçe artmalı.

balance

#6
Karamel , eğer standart kütüphane fonksiyonları kullanıyorsan, varsayılan olarak bir kesme rutininde isen, işlemciye gelen herhangi bir kesme algılanmaz. Daha detaylı açıklamak gerekirse, kesme rutini başlangıcında bütün kesme kaynakları devre dışı kalır rutin sonunda main'e dönerken tekrar aktif edilir. Yani kesmedeyken kesme alamazsın. Ancak bunu, Assembly ve işlemci datasheetini kurcalayarak kısmen gerçekleştirebilirsin(Interrupt Chaining) ki bunu önermem.

usahin

#7
Beyler cevaplarınız icin tesekkürler,

Cevapları beklenmeden, düşündüğümden hızlı ilerleyip mikrodenetleyici yazılımının %60'lık bir kısmını yazdım ve çalışır durumda. Biraz daha datasheet kurcalayıp, bağımsız çalıştığı için PWM modülünü aktif ettim. TIM4'te LED Pinlerine bağlı 4 kanal PWM aktif ettim böylece sinyal üretimim de kesintiye uğramadı. Kütüphane, Yazılımsal PWM ve  kesme kullanmadım. Ana fonksiyonda her döngüde manuel olarak 1 ADC çevrimi yapıp değeri okuyorum. SPI için de aynı şeyi  yapmayı düşünüyorum.

UART konusuna gelince de aslında ben, iki potansiyometre ve LM35-CZ sensörü kullanacağım. SPI, ADC ve o anki PWM sinyalini LabVIEW'da izleyip bazı katsayılara müdahale etmek ve verilerin PWM sinyallerinin hangi değerini değiştireceğini bilgisayar arayüzünden kontrol değiştirmek istiyorum.(Şu an kontrol mikrodenetleyicide sadece izliyorum) Bu sebeple SaveAs'in önerdiği STM Studio yazılımını kullanmadım.

Bittiğinde  PWM kanallarını değiştirip motor sürebileceğim pinlere yönlendireceğim. Uygulamayı ve kodları paylasirim forumda buraya da konu linki eklerim. Her türlü öneriye ve eleştiriye açığım, duymaktan memnun olurum. Bu işi içine girdikçe daha çok seviyorum ve daha çok öğrenmek istiyorum.

Karamel

Alıntı yapılan: balance - 01 Şubat 2015, 21:29:17
Karamel , eğer standart kütüphane fonksiyonları kullanıyorsan, varsayılan olarak bir kesme rutininde isen, işlemciye gelen herhangi bir kesme algılanmaz. Daha detaylı açıklamak gerekirse, kesme rutini başlangıcında bütün kesme kaynakları devre dışı kalır rutin sonunda main'e dönerken tekrar aktif edilir. Yani kesmedeyken kesme alamazsın. Ancak bunu, Assembly ve işlemci datasheetini kurcalayarak kısmen gerçekleştirebilirsin(Interrupt Chaining) ki bunu önermem.

hocam biraz birseyler anladim ama anlayamadigim birsey var. durum boyle ise interruptlara oncelik vermenin anlami ne? ilk hangisi int. e girerse o yoluna devam etmiyormu bu mantikta?

balance

#9
Alıntı yapılan: Karamel - 03 Şubat 2015, 02:21:25
hocam biraz birseyler anladim ama anlayamadigim birsey var. durum boyle ise interruptlara oncelik vermenin anlami ne? ilk hangisi int. e girerse o yoluna devam etmiyormu bu mantikta?

Karamel aslında biliyorum saçma gelebilir ama gömülü alanında pek çok guru çok önemli haller dışında kesme rutinlerinin diğer bir kesme tarafından bölünmesini istemez, hatta bunu engellemeye çalışır  :) ISR lar mümkün olduğunca atomic olarak tasarlanır ki zaten az olan işlemci kaynakları daha verimli kullanılabilsin. Asıl sorunun cevabı bir kesmeyi başka bir kesme ile bölmek istiyorsan evet buna NVIC modülü izin veriyor, stack işlemlerini bile kendi yapıyor, Preempt priority'i ayarlayarak kodlayabilirsin. Yönlendiriyor gibi olabilirim ama bence bırak ISR işini yapsın :)

Tail Chaining diye bir şey daha var ki bu NVIC modülünün bize sunduğu bir nimet. Bir ISR işlemi sürerken kesme sinyali geldiğinde sıraya alınır ve ISR bitişinde main'e dönülmeden direkt olarak diğer kesme rutini işletilir ki bunu da donanımsal olarak yapıyor, herhangi bir kodlama gerektirmez.

LukeSkywalker

Aynı anda iki kesme gelirse hangisi daha öncelikli olsunu belirleriz sıralama ile.

Karamel

Alıntı yapılan: LukeSkywalker - 03 Şubat 2015, 13:32:34
Aynı anda iki kesme gelirse hangisi daha öncelikli olsunu belirleriz sıralama ile.

hocam 100 mhz gibi hizkarda calisan mcu nun. ayni anda iki adet kesme almasi nasil olabilir ki? 10 nano sn sasmadan atiyorum spi ve uart nasil ayni anda gelebilir ki? bence birisi daha once yada daha sonra gelir?

Sanki hocam durum balance hocamin dedigi gibi ama kesmeyi bolup. baska kesmeye girmemizi hocamiz pekte hos karsilamiyor. aslinda hocamiz mantikli seyler soyluyor. yani interrupt in da kesilmesini istemeyiz? herhalde bu oncelik meselesi. cok istisna durumlar icin yapilmis birsey?

LukeSkywalker

#12
Alıntı yapılan: Karamel - 03 Şubat 2015, 16:22:27
hocam 100 mhz gibi hizkarda calisan mcu nun. ayni anda iki adet kesme almasi nasil olabilir ki? 10 nano sn sasmadan atiyorum spi ve uart nasil ayni anda gelebilir ki? bence birisi daha once yada daha sonra gelir?

Buna biz karar veremeyiz. Aynı anda gelmemesi için bir sebep yok.

mesaj birleştirme:: 03 Şubat 2015, 16:52:09

Anlatmak istediğim şey şu mesajda daha net anlatılmış:
https://www.picproje.org/index.php/topic,50784.msg382447.html#msg382447

balance

Konuyu fazla dallandırıp budaklandırmak istemem ama ISR bölmek bir anlamda preemptive multi-tasking e göz kırpmak gibi geliyor bana ki bu daha ayrıntılı bir konu sırf bu işi yapabilmek için RTOS adında derya deniz bir kavram var. Meraklıları inceyebilir  :)  ISR bölmek 2-3 kesme için çok fazla sıkıtı yaratmayabilir çok istiyorsan yapabilirsin  :) Ama düşünün ki bir ISR'ın diğer ISR'ın sistem kaynağına anlık erişmeye çalıştığını bu sefer 2 ISR'ında yaptığı iş hatalı sonuçlanır daha da kötüsü main program akışında tahmini güç çalışma zamanı hatalarına sebep olabilir.

Benim görüşüm, ISR'ın mikro saniyeler mertebesinden uzaklaşmadığı sürece orta ölçekli bir sistemde böyle birşeye gerek olmayacağıdır.

okg

Alıntı yapılan: Karamel - 31 Ocak 2015, 22:09:35
Hocam bende yeri gelmisken birsey sormak istiyorum. diyelim ki oncelikleri soyle belirledik.

1- adc
2 -spi
3 -uart

uart kesmesi islenirken bir anda spi dan veri gelse ne oluyor? Bu sirayi neye gore belirliyoruz?

Merhabalar,

ARM tipi işlemcilerde kesme işlemleri şu şekilde çalışır;
Program herhangi bir kesmede koşarken daha öncelikli bir kesme gelirse program  yeni gelen kesmeye geçer ve kesme işlemi bitene kadar orada koşar,daha sonra önceki kesmeye döner ve kaldığı yerden devam eder.

İyi çalışmalar.
KTU Elektronik Haberleşme - YTÜ Haberşelme YL - GTU Haberleşme YL