STM32F407 Cortex M4 şamataları

Başlatan bunalmis, 16 Ekim 2011, 17:14:50

z

Anladim, o satir kaldirilsa da sorun yok, 5ns lik pay birakmak gerekiyor. 168Mhz de calisirken bu kodu kaldirirsak limite yakin kaliyoruz bu yuzden fantazi olsun istedim.

Bir registeri okuyacak fakat okunan degeri kullanmayacaksak, degisken icine okuma yapmadan bu isin yakisikli bir cozumu varmi?

O delay satirinda RxDat gibi bir degisken ismi bana da gicik geliyor. Sirf anlamli olsun diye de ikinci bir degisken tanimlamak istemedim.
Yada RxDat yerine Yazboz kullansam daha hos olurdu.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

ErsinErce

nasılsa dallanırken girişe ayrı bir register olarak ayrılıyor diye giren değişkenin işi bitince üzerine yazıyorum boş işler için,
ama bu durum için __NOP(); yakışıklı durabilir hocam

çalışan durumun keyfini çıkartmak bu olsa gerek =))

muhittin_kaplan

Hocam Hatanın sebebi ve Çözümünde neler yapıldığını yazabilirmisiniz ?

z

#678
Programdaki kurguya göre;

MEMS çipine veri yollamak için, SPI modülünün CS pinini low yapıyor daha sonra SPI data registerine verimizi yazıyor ve ardından transferin tamamlanmasını bekliyoruz en sonunda da CS pinini tekrardan high yapıyoruz.

Hatalı programda transferin tamamlamadan CS pinini high yapıyordum. (Daha doğrusu transferin tamamlanıp tamamlanmadığını sadece TXE flağına bakarak yapıyordum.) Bu hatalı programı daha önceki mesajları geriye doğru tarayarak ulaşabilirsin.

Sözkonusu hata, kodlar debug menüde F11 ile adım adım koşturulurken oluşmuyor. (Çünkü klavyeyi parmaklama süremiz SPI ın data yolla süresinden çok uzun. CS pinini high yaptığımızda datamız çokdan MEMS çipine gidiyordu)

Sorun ortaya çıkınca transferin tamamlandığından emin olmak için REHBER de SPI status register bitleri ilgili açıklamalar okundu. Zaten SPI bölümünü baştan itibaren okumaya başlarsan nelere dikkat edilmesi gerektiği anlatılıyor.

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

memo333

/**
  * @brief  Sends a Byte through the SPI interface and return the Byte received 
  *         from the SPI bus.
  * @param  Byte : Byte send.
  * @retval The received byte value
  */
static uint8_t LIS302DL_SendByte(uint8_t byte)
{
  /* Loop while DR register in not emplty */
  LIS302DLTimeout = LIS302DL_FLAG_TIMEOUT;
  while (SPI_I2S_GetFlagStatus(LIS302DL_SPI, SPI_I2S_FLAG_TXE) == RESET)
  {
    if((LIS302DLTimeout--) == 0) return LIS302DL_TIMEOUT_UserCallback();
  }
  
  /* Send a Byte through the SPI peripheral */
  SPI_I2S_SendData(LIS302DL_SPI, byte);
  
  /* Wait to receive a Byte */
  LIS302DLTimeout = LIS302DL_FLAG_TIMEOUT;
  while (SPI_I2S_GetFlagStatus(LIS302DL_SPI, SPI_I2S_FLAG_RXNE) == RESET)
  {
    if((LIS302DLTimeout--) == 0) return LIS302DL_TIMEOUT_UserCallback();
  }
  
  /* Return the Byte read from the SPI bus */
  return (uint8_t)SPI_I2S_ReceiveData(LIS302DL_SPI);
}


STnin örnek kodunda öncelikle TXE'nin boşalması beklenmiş, sonra veri gönderilmiş, daha sonra rxne'nin set olması beklenmiş. belki bir ipucu verebilir...
Gömülü Linux Notları --> http://linuxedu.xyz/

muhittin_kaplan

DAC ları çalıştıramıyorum.
yaptığım ara kablo ile pc nn mic ine giriş yaptım.

z

Ben line girisine bagliyorum.  Ornek kodlari deneyeceksen sinyali PA4 pininden alacaksin.

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

muhittin_kaplan


z

Hayir. Bahsettigin jak kulaklik sesle ilgili ozel cipimize bagli. Audio DAC diye geciyor. Bu asamada o cipi register bazinda cozmek zaman alici. Ornek program bolumundeki kodlar bu DAC'i degil ARM cipin icindeki DAC'i kullaniyor. PA4 pinine 1uf kapasitor bagla ve buradan sinyali al.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

okylmz

a=x[0];
b=Read(0x29)-xo;
for(i=15;i>0;i--){ x[i]=x[i-1]; a+=(signed short)x[i];}
x[0]=b; a=a>>2;

arkadaşlar bu kısmı açıklayabilir misiniz (kartın eğim programının).

benim ilk aklıma gelen; a=read(0x29) deyip a nın eksi veya artı oluşuna göre PWM[0] ve PWM[2] yi atamak olurdu?
yukardaki kodu yorumlayamadım.
teşekürler...

muhittin_kaplan

Bülent Hocam PWM okumam Gerek. Bir yol haritası Çizermisiniz benim İçin ?

muhittin_kaplan

Alıntı YapPWM input mode
This mode is a particular case of input capture mode. The procedure is the same except:
● Two ICx signals are mapped on the same TIx input.
● These 2 ICx signals are active on edges with opposite polarity.
● One of the two TIxFP signals is selected as trigger input and the slave mode controller
is configured in reset mode.
For example, you can measure the period (in TIMx_CCR1 register) and the duty cycle (in
TIMx_CCR2 register) of the PWM applied on TI1 using the following procedure (depending
on CK_INT frequency and prescaler value):
● Select the active input for TIMx_CCR1: write the CC1S bits to 01 in the TIMx_CCMR1
register (TI1 selected).
● Select the active polarity for TI1FP1 (used both for capture in TIMx_CCR1 and counter
clear): write the CC1P and CC1NP bits to '0' (active on rising edge).
● Select the active input for TIMx_CCR2: write the CC2S bits to 10 in the TIMx_CCMR1
register (TI1 selected).
● Select the active polarity for TI1FP2 (used for capture in TIMx_CCR2): write the CC2P
and CC2NP bits to '1' (active on falling edge).
● Select the valid trigger input: write the TS bits to 101 in the TIMx_SMCR register
(TI1FP1 selected).
● Configure the slave mode controller in reset mode: write the SMS bits to 100 in the
TIMx_SMCR register.
● Enable the captures: write the CC1E and CC2E bits to '1' in the TIMx_CCER register.

Ne Demek İstiyor Yardım Edermisiniz ?
Rehber Sayfa 312

fryrmnd

hocam tam çözemedim.  TI1 e girilen bir PWM nin hem periyodunu hem de darbe genişliğini ölçüyor. biri için PWM nin düşen kenarında counter ı reset ediyor diğeri için yükselen kenarda sanırım. bu şekilde her resette counter içeriğini alıp hesaplama yapmak gerekiyor sanırım. şimdilik anladığım bu. bana karışık geliyor. tam anlasam bile hesaplamaları koda dökmem sıkıntı. hocam acilse birde PWM ölçüm örneği var st nin .

muhittin_kaplan

Reg. lere Bakıyorum Şimdi.
Acil Değil. Öğreneyim Sonra Deneyeceğim

Klein

Örnek bir PWM input konfigürasyonu vermiş.
Eğer sen hem periyot hem duty-cycle ölçeceksen TI1 için aşağıda açıklanan adımları uygula. Ama saati , bölücüyü vs.. ayarladıktan sonra.

1-Önce CC1S Bitlerine 01 yazarak aktif giriş olaratk TI1 seç.
2-CC1P ve CC1NP bitlrine 0 yazarak hem IC1 in yakalayacağı hem de sayıcının resetedileceği kenarı yükselen yap.
3-CC2S bitlerini 10 yaparak IC2 için  kaynak olarak TI1'i seç
4-CC2P ve CC2NP bitlerini 1 yap ki IC2 yakalayacağı kenar düşen kenar olsun.
5-TS bitlerini 101 yap ki Timer tetiklemesi için TI1'i kullanacağımız belli olsun.
6-SMS bitlerini 100 yap. sayıcı yükselen kenarda sıfırlansın.
7-CC1E ve CC2E bitlerini açarak yakalamayı başlat.

yakalama
TI1 yükselirken hem IC1 sayıcı değerini yakaladı ce CCR1'e attı hem de sayıcı sıfırlandı.
darbe bir süre HI devam etti sonra düştü. Tam bu anda IC2 değeri yakaladı ve CCR2'ye attı. darbe biraz daha LO devam etti tekrar yükseldi. Bu anda IC1 değeri yakaladı ve CCR1'e attı. periyodu CCR1'den  Duty'i  de CCR2'den okudun.