ZIOS ile yapilan ornek pojeler

Başlatan z, 25 Ocak 2014, 14:54:50

z

Bir diger baslikta ZIOS kutuphanesi ile STM32F4 Discovery kitimizdeki donanimlara kolay erismeyi saglayan gomulu fonksiyonlari ele aldik.

ZIOS (V1.03) bir yandan gelistirilmeye devam edilirken bir yandan da bu baslik altinda degisik projeler gerceklestirecegiz.

Fitzsimon Bar - Dublin - 11(12)-01-2014

Ilk projeyi muzik konusundan sectim.

Videoda sahnedeki arkadas, gitar calarken iki ayak pedalindan birisiyle davula, diger pedalle de zile vuruyor.

Amacimiz bu vurmali calgi duzeneginin elektronik versiyonunu STM32F407 Discovery kiti ile gerceklestirmek.

Vuru siddetinin ayarlanabilir olmasini pedallere baglayacagimiz potansiyometrelerle saglayacagiz.

Bu projede hiz gerektiren rutinleri ZIOS icine gommek zorunda kalabiliriz.

Projemizde iki adet poyansiyometre dogrudan Discovery kitina baglanacak. Harici "PC Speaker" kablosunun ucundaki jaka, DAC cikisimizi baglayacagiz.

Davul ve zil sesi  elektronik devrelerle değil yazilimla gerceklestirilecek.  Pedal potundan alinan voltajin 0'dan 3v a tirmanma hizi davul yada zil sesinin siddetini belirleyecek.

Belki pedalden gelen voltajin tepe degerinin  ve bu degerde bekleme suresinin davul ve zil sesine etkisini de simule edebiliriz.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

Tigon26

#1
Umarım hata yapıp yanlış yere yazmıyorumdur, ancak kişisel mesaj atmayı bulamadım, bu yüzden hata yaparsam kusuruma bakmayın. Öncelikle şöyle bir sorum olacaktı kesme kullanarak ledlerin durumlarını değiştirmek istiyorum ancak kesme programına gidildiğinde içerisinde kullandığım delay fonksiyonunda takılıp kalıyor. Burada hatam nerededir? Systick kullanıyorum, muhtemelen buton kesmesine gittiğinde işlemci clock kesmesiyle çakışıyor, ve işlemci clock (systick) önceliği olduğu için orada kalıyor. Doğrumudur? ve çözümü nasıl olabilir?

mesaj birleştirme:: 01 Şubat 2014, 14:51:19

Umarım hata yapıp yanlış yere yazmıyorumdur, ancak kişisel mesaj atmayı bulamadım, bu yüzden hata yaparsam kusuruma bakmayın. Öncelikle şöyle bir sorum olacaktı kesme kullanarak ledlerin durumlarını değiştirmek istiyorum ancak kesme programına gidildiğinde içerisinde kullandığım delay fonksiyonunda takılıp kalıyor. Burada hatam nerededir? Systick kullanıyorum, muhtemelen buton kesmesine gittiğinde işlemci clock kesmesiyle çakışıyor, ve işlemci clock (systick) önceliği olduğu için orada kalıyor. Doğrumudur? ve çözümü nasıl olabilir?

                                    

#include "system_stm32f4xx.c"

volatile uint32_t msTicks;                      /* 1ms zaman sayicisi    */
/*----------------------------------------------------------------------------
  SysTick_Handler
*----------------------------------------------------------------------------*/
void SysTick_Handler(void) {
  msTicks++;
}



void Delay (uint32_t dlyTicks) {    
   uint32_t curTicks;
   
   curTicks = msTicks;
   while ((msTicks - curTicks) < dlyTicks);
}

// IRQ_0 function
void EXTI0_IRQHandler (void) {
EXTI->PR = 0x0001;
GPIOD->ODR= 0x0000A000;
Delay(500);

GPIOD->ODR= 0x00000000;   
}

/*----------------------------------------------------------------------------
  MAIN fonksiyonu
*----------------------------------------------------------------------------*/
int main (void) {
   

      RCC->APB2ENR = 0x00004000;         // Çevresel birimlerin izin kayitçisi(buton yada led gibi)
      RCC->AHB1ENR |= 0x00000009;       // Sadece GPIO A,D clock aktif edildi a=1,d=8 (b=2,c=4)
    GPIOD->MODER = 0x55000000;        // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin)
    GPIOD->OSPEEDR= 0xFFFFFFFF;       // D portunun maksimum frekansta calismasini belirtiyoruz.
   

      NVIC->ISER[0]=0x40;
//      NVIC_EnableIRQ(EXTI0_IRQn);         // Portlarin 0inci girislerin kesme olarak kullanilmasini aktiflestiriyor.
      SYSCFG->EXTICR[0] =0x0000;         // Burada yalnizca port A nin 0 inci girisini kullanacagimizi acikliyoruz.
      EXTI->RTSR |= 0x00000001;            // Kesmenin yükselen kenar tetiklemeli olacigini bildiriyoruz.
      EXTI->IMR |= 0x00000001;            // IMR(Interrupt Mask Registerin gerekli bitini 1 yapiyoruz)
   
   SystemCoreClockUpdate();                     /* Çekirdek saat frekansini al   */
  if (SysTick_Config(SystemCoreClock / 1000)) { /* 1 milisaniyelik Systick sistem kesmesini olustur.*/
    while (1);                                  /* Hatayi yakala           */
  }

   
  while(1) {                                    /* Sürekli döngü,kontrol.              */
         GPIOD->ODR= 0x00005000;
         Delay(500);
         GPIOD->ODR= 0x00000000;
         Delay(500);      
      
   }
   
         
      
}


Ramiz

Alıntı yapılan: z - 25 Ocak 2014, 14:54:50
Bir diger baslikta ZIOS kutuphanesi ile STM32F4 Discovery kitimizdeki donanimlara kolay erismeyi saglayan gomulu fonksiyonlari ele aldik.

ZIOS (V1.03) bir yandan gelistirilmeye devam edilirken bir yandan da bu baslik altinda degisik projeler gerceklestirecegiz.

Fitzsimon Bar - Dublin - 11(12)-01-2014

Ilk projeyi muzik konusundan sectim.

Videoda sahnedeki arkadas, gitar calarken iki ayak pedalindan birisiyle davula, diger pedalle de zile vuruyor.

Amacimiz bu vurmali calgi duzeneginin elektronik versiyonunu STM32F407 Discovery kiti ile gerceklestirmek.

Vuru siddetinin ayarlanabilir olmasini pedallere baglayacagimiz potansiyometrelerle saglayacagiz.

Bu projede hiz gerektiren rutinleri ZIOS icine gommek zorunda kalabiliriz.

Projemizde iki adet poyansiyometre dogrudan Discovery kitina baglanacak. Harici "PC Speaker" kablosunun ucundaki jaka, DAC cikisimizi baglayacagiz.

Davul ve zil sesi  elektronik devrelerle değil yazilimla gerceklestirilecek.  Pedal potundan alinan voltajin 0'dan 3v a tirmanma hizi davul yada zil sesinin siddetini belirleyecek.

Belki pedalden gelen voltajin tepe degerinin  ve bu degerde bekleme suresinin davul ve zil sesine etkisini de simule edebiliriz.

O padlerden hazır satılıyordu sanırım. Pot ile iyi sonuçlar edebileceğinizi düşünmüyorum. (bu aleti çalan kişi açısından konuşuyorum)

Birde davul ile zile aynı anda vurulursa, yazılımsal olarak iki sesi de mixlemek gerekir.
Electrical & Electronics Engineering -> Step one

F493

Merhaba ,

  Konu ile alakalı değil fakat yazmak istedim. Örneklerde genelde bekleme sürelerinin hep while dögüsü ile çakılı bir şekilde yapıldıgını görüyorum. Şu şekilde yapsak nasıl olur acaba. Sadece bir öneri. Bir ledi toggle yapan bir rutin. LedTask() ana döngüde çağrılıyor eğer zamanı gelmişse ledi toggle yapıyor eger zamanı gelmemiş ise oradan çıkıp ana döngüye geri dönüp diğer işlere bakıyor.

#include "LPC17xx.h"
#include "core_cm3.h"
#include "leds.h"
#include <cr_section_macros.h>
#include <NXP/crp.h>

__CRP const unsigned int CRP_WORD = CRP_NO_CRP ;

// Global degişken
volatile uint32_t msTicks; // counter for 1ms SysTicks

// Fonksiyon prototip bildirimi.
void LedTask(unsigned int _msTimeVal);


// Sabit tanımlamalar.
#define	_500ms				500


// SysTick_Handler
// 1ms hassasiyette counter arttiriyor. Yani her 1ms de buraya giriyor..
void SysTick_Handler(void)
{
  msTicks++;
}

int main(void)
{

	leds_init();		
	leds_all_on();	

	if (SysTick_Config(SystemCoreClock / 1000))
	{
	    while (1);  // Capture error
	}

	while(1)
	{
		LedTask(_500ms);
		// fonksiyon1();
		// fonksiyon2();
	}
	return 0 ;
}

void LedTask(unsigned int delayTicks)
{
         // Sabit tanımlamalar.
         #define LED_INVERT 			0
         #define SET_WAIT_TIME 		1
         #define CONTROL_LED_TIME   	2


	static unsigned int LedTask = 0;
	static unsigned long currentTicks = 0;

	switch (LedTask)
	{
		case LED_INVERT :
			leds_invert();	// Toggle state of user leds
			++LedTask;
			break;
		case SET_WAIT_TIME :
			 currentTicks = msTicks;	// read current tick counter
			 ++LedTask;
			 break;
		case CONTROL_LED_TIME :
			if ((msTicks - currentTicks) > delayTicks)
			{
				LedTask = 0;
			}
			break;
		default :
			LedTask = 0;
			break;
	}
}


Esen kalın..

z

Bir hafta daha ortalikta yokum. Evime varinca ilgllenecegim.

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

cetinkaya

Z hocam yatirim yapmaya mi gittin :D

yılmaz

Benim merak ettiğim bir kısım var Keil da Target Options ile ayarlamalar yaparken C/C++ sekmesinde USE_STDPERIPH_DRIVER eklentisini koymamızın sebebi nedir.Bazı örneklerde gördüğüm kadarıyla yanına bir de STM32F40xx şeklinde tanıtma yapılıyor.Buna illa da gerek var mı sadece USE_STDPERIPH_DRIVER  yazsak yetmez mi? Bunun nasıl önişlemci sembolü olduğunu anlayamadım.Bu konuda fikri olan var mı acaba

LukeSkywalker

ST kütüphanesini kullanacaksan bunu belirtmelisin.

engineerbaker

Merhaba.NXP 1114 üzerinde çalişiyorum.Hex dosyasını karta yükleyemiyorum.Sebebi ne olabilir sizce?


Asof544

Merhaba arkadaşlar ARM da asm yazan varmı varsa kaynak döküman tecrübe vb paylaşırlarsa çok sevinirim herkese kolay gelsin.

MC_Skywalker

Önce şunu alıp ARm çekirdeğini kavramöaya başlaya bilirsin.
The Definitive Guide to ARM Cortex-M3 and Cortex-M4 Processors  ---> http://www.amazon.co.uk/Definitive-Guide-Cortex-M3-Cortex-M4-Processors/dp/0124080820 ~£36(sterlin). Bende Cortex-M3 için olan versionu var £28(sterlin) +kargoya satabilirim.

tabi bu sadece Core anlatıyor yanına mutlaka şunu alamanlazım
ARM Assembly Language: Fundamentals and Techniques ---> http://www.crcpress.com/product/isbn/9781439806104   z hoca sanırım $100 satıyordu kendisne danışa bilirsin.

Asof544

Pek ingilizcem yok maalesef gelişitrme kartı olarak ne tavsiye edersiniz?

skara1214

Herkes ölür ama herkes gerçekten yaşamaz