STM32F407 Cortex M4 şamataları

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

z

Aşağıdaki siteye bir bak. Bir diyodun bozulmasından bahsediyordu.

http://www.mcu-turkey.com/?p=23302
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

mozkan87

D1 diyotunu ölçtüğümde 300mV çıktı bede hocam. Sizde durum nedir USB ile çalışıp harici 5V ile mi çalışmıyor. Eğer durum bu ise diyot sağlam olabilir.

muhittin_kaplan

evet usb ile çalışıyor. 5v harici ile çalışmıyor..

muhittin_kaplan

Akşam Bakayım tekrar deneyeceğim. Diyodu da kontrol edey,m

adem89

Audio_playback_and_record adli örnek programı inceleyen oldu mu veya direk olarak bu mikrofon yardımıyla ses kaydı yapan

Bu şekilde yapılan kayıtlar winamp yardımıyla çalınabiliyor fakat örnekleme hızı 8 khz olarak gözüküyör. 16khz olması gerekmiyormu PDM_Filter_Init fonksiyonu kullanılırken 16 khz olarak verilmiş. Birde kayıt edilen seste biraz atlamalar oluyor.
Matlab ile bu dosyayı okuyup 8 khz ile çalmaya çalıştığımda sürekli olarak gürültü geliyor. 16 khz ile çaldığımda yine gürültü var ama kayıt edilen sesin ritmi tutuyo sanki kayıt frekansı 16 khz miş gibi zaten de böyle olması gerekmiyor mu?
Mono olarak kayıt yapılırken wav dosyası Streo olarak gözüküyor. Bu konuda bilgisi olan var mı ?

Direk olarak bu mikrofon ile kayıt yapıp sorunsuz çalıştırabilen var mı? Mikrofonun ile ilgili çalışmalar yapan arkadaşlar varsa paylaşabilirler mi?

burakoz1989

merhaba hocam GPIOD->MODER=0x55000000; komutuyla 15,14,13,12 pinleri çıkış yaptınız ama 0x55000000 sayısının binary karşılığı 15,14,13,12 pinlere tekabul etmiyo bunu açıklayabilirmisiniz armda daha yeniyim kusra bakmayın :( çok teşekkür ederim

Klein

MODER kaydedicisinde her pin için 2 bit saklanıyor. 

ilk iki bit  0. pin  son 2 bit 15. pin için.

0x55000000  binary açılımı  0b0101010100......00

ikişer bit olarak ayırırsak
01 01 01 01 00......00

pine ilişkin MODER bitleri 01 olduğunda çıkış olduğuna göre
01   01   01   01   00 , .......... , 00
15 , 14 , 13 , 12 , 11 , .......... , 0
O     O    O    O     I                   I
olur.

burakoz1989

Alıntı yapılan: Klein - 01 Mayıs 2012, 16:29:10
MODER kaydedicisinde her pin için 2 bit saklanıyor. 

ilk iki bit  0. pin  son 2 bit 15. pin için.

0x55000000  binary açılımı  0b0101010100......00

ikişer bit olarak ayırırsak
01 01 01 01 00......00

pine ilişkin MODER bitleri 01 olduğunda çıkış olduğuna göre
01   01   01   01   00 , .......... , 00
15 , 14 , 13 , 12 , 11 , .......... , 0
O     O    O    O     I                   I
olur.

çok saolun hocam şimdi anladım her pin için 4 olasılık var 01 gpio olarak atanıyo çok teşekkür ettim :)

denizhan50

Selamun aleyküm kardeşlerim, karta bağlayacağım  sht75 sensörunden sıcaklık ve nem verılerıni okuyacağım ,kartla ılgılı uygulmaları inceledım ama harıcı sensörden verı okunmasıyla ılgılı bişeye rastlamadım bu konuda yardımcı olabilirmisinız acaba teşekkürlerr...

marecrisium

hocam entegre I2C ile haberleşme yapıyormuş yani user manuelde bu iletişimin nasıl kullanıldığına bakacaksın.Bu konu üzerinde çalışan arkadaşlar varsa örnek kodlar paylaşırlar belki.

denizhan50

#925
Alıntı yapılan: marecrisium - 26 Mayıs 2012, 03:31:08
hocam entegre I2C ile haberleşme yapıyormuş yani user manuelde bu iletişimin nasıl kullanıldığına bakacaksın.Bu konu üzerinde çalışan arkadaşlar varsa örnek kodlar paylaşırlar belki.
Diğer işlemcilerde kullanılan koduu arm için düzenledım ama sensörden verıyı okuyamıyorum nerde yanlıs yapıyorum çözemedım,,sht haberleşme fonksıyonlarının yeırne ı2c nın kendıı özell fonksıyonlaırınımı kullanmak gerekıyor acaba ..


#include "STM32F4xx.h"
#include "delay.h"
#include "HD44780.h"
#include "math.h"
#include "stdio.h"


				 
                            //adr  komut   r/w
#define YAZMA_DURUM 0x06    //000   0011    0
#define OKUMA_DURUM 0x07    //000   0011    1
#define ISI_OLCUM 0x03      //000   0001    1
#define NEM_OLCUM 0x05      //000   0010    1
#define RESET 0x1e          //000   1111    0


#define noACK 0
#define ACK   1

#define DATA   GPIO_B(7)
#define SCK   GPIO_B(6)
void SystemInit(void)
{
unsigned int i;

    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin       
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000001F;    // GPIO A,B,C,D,E clock'u aktif edelim
    
    GPIOD->MODER = 0x55005555;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin) 0..7 arasıda çıkış
    GPIOB->MODER = 0x00000500;     // GPIOB 4 ve 5 i çıkış yaptık.
	//GPIOE->MODER = 0x00000880;	   // GPIOE 4 ve 6 i çıkış yaptık.   
								   // DATA  ÇIKIŞ=E4 SCK ÇIKIŞ= E6
    GPIOA->OSPEEDR= 0x00000000;   // GPIOD nin tum cikislarinı Max. 2 Mhz de kullanacağız.
    GPIOB->OSPEEDR= 0xFFFFFFFF;	  // AYnı şey GPIOB içinde geçerli
    GPIOC->OSPEEDR= 0xFFFFFFFF;
    GPIOD->OSPEEDR= 0xFFFFFFFF;
	GPIOE->OSPEEDR= 0xFFFFFFFF;
}

	  

	 void bekle( unsigned int sure )
{
	int i;
	while( sure != 0 )	
	{
		i = 120;
		while( i != 0 )
		{
			i --;
		}
		sure --;
	
	}
}
  void ee_delay(void)
  { unsigned long y;
  for(y=0; y<50; y++);
}


typedef union 
{ unsigned int i;
  float f;
} value;

enum {ISI,NEM};

char s_yaz_byte(unsigned char deger)
{ 
  unsigned char i,hata=0;  
  for (i=0x80;i>0;i/=2)             
  { if (i & deger) DATA=1;          
    else  DATA=0; 
	 ee_delay();
	SCK=1;                          
   ee_delay();                       
   ee_delay();
   ee_delay();     	
    SCK=0;
	ee_delay();
  }
 DATA=1;   
  ee_delay();                        
   SCK=1;                          
  
  hata=DATA;
                      
   SCK=0;        
  return hata;  
                     
}

/***** bir bayt okumak için tanımlama *****/

char s_oku_byte(unsigned char ack)
{ 
  unsigned char i,val=0;
  DATA=1;                          
  
  for (i=0x80;i>0;i/=2)             //bit maskeleme
  { SCK=1;                          //iletişim için saat sinyali
    
	if (DATA) val=(val | i);        //bir bit oku  
    SCK=0;  					 
  }
  
  DATA=!ack; 
   ee_delay();                       
 SCK=1;                            
 ee_delay();
  ee_delay();
    ee_delay();     
  SCK=0;
  ee_delay();						    
  DATA=1;                           //veri değerini sil
  return val;
}

/***** yeni bir iletişim başlat *****/
 
void s_basla(void)

{  
   DATA=1;  SCK=0;                   //ilk durum
  ee_delay();
  SCK=1;
   ee_delay();
  DATA=0;
    ee_delay();
   SCK=0;  
    ee_delay();
	ee_delay();
    ee_delay();
  SCK=1;
   ee_delay();
   DATA=1;		   
    ee_delay();
   SCK=0;		   
}
		 /*** iletişim yenile: DATA-line=1 ve sonraki 9 SCK saykili takiben başa dön ***/

void s_baglanti_reset(void)

{  
  unsigned char i; 
  DATA=1; SCK=0;                    //ilk durum
  for(i=0;i<9;i++)                  //9 SCK saykili
  { SCK=1;
    SCK=0;
  }
  s_basla();                   //aktarmayi baslat
}
//---------------------------------------------------------------------------------- 
char s_softreset(void) 
  
{  
  unsigned char hata=0;   
  s_baglanti_reset();              //reset communication 
  hata+=s_yaz_byte(RESET);       //send RESET-command to sensor 
  return hata;                     //error=1 in case of no response form the sensor 
}   

//---------------------------------------------------------------------------------- 
char s_oku_statusreg(unsigned char *p_deger, unsigned char *p_top) 
//---------------------------------------------------------------------------------- 
// reads the status register with checksum (8-bit) 
{  
  unsigned char hata=0; 
  s_basla();                   //transmission start 
  hata=s_yaz_byte(OKUMA_DURUM); //send command to sensor 
  *p_deger=s_oku_byte(ACK);        //read status register (8-bit) 
  *p_top=s_oku_byte(noACK);   //read checksum (8-bit)   
  return hata;                     //error=1 in case of no response form the sensor 
} 
  

  //---------------------------------------------------------------------------------- 
char s_yaz_statusreg(unsigned char *p_deger) 
//---------------------------------------------------------------------------------- 
// writes the status register with checksum (8-bit)
{  
  unsigned char hata=0; 
  s_basla();                   //transmission start 
  hata+=s_oku_byte(YAZMA_DURUM);//send command to sensor 
  hata+=s_yaz_byte(*p_deger);    //send value of status register 
  return hata;                    //error>=1 in case of no response form the sensor 
}  
   


   
   /**** ölcüm yapar (nem/sıcaklık)****/
	 char s_olcum(unsigned char *p_deger, unsigned char *p_top, unsigned char mod)
{ 
  unsigned hata=0;
  unsigned int i;

  s_basla();                   //aktarmayı başlat.
  switch(mod){                     //sensöre komut göder.
    case ISI	: hata+=s_yaz_byte(ISI_OLCUM); break;
    case NEM	: hata+=s_yaz_byte(NEM_OLCUM); break;
    default     : break;	 
  }
  
  for (i=0;i<65535;i++) if(DATA==0) break; //sensör ölçümü tamamlayana kadar bekle.
  if(DATA) hata+=1;                // süre 2 saniye yi astiginda
  *(p_deger)  =s_oku_byte(ACK);    //ilk bayti oku
  *(p_deger+1)=s_oku_byte(ACK);    //ikinci bayti oku
  *p_top =s_oku_byte(noACK);		//toplamı oku
  
  return hata;
}



void sensor_hesapla(float *p_nem ,float *p_isi)
{ 
const float C1=-2.0468;           // for 12 Bit RH 
  const float C2=+0.0367;           // for 12 Bit RH 
  const float C3=-0.0000015955;     // for 12 Bit RH 
  const float T1=+0.01;             // for 12 Bit RH 
  const float T2=+0.00008;          // for 12 Bit RH


  float rh=*p_nem;					// rh:      nem [saat darbesi] 12 Bit 
  float t=*p_isi;					// t:       sicaklik [saat darbesi] 14 Bit
  float rh_lin;                     // rh_lin:  nem doğrusal
  float rh_true;                    // rh_true: sicaklik telafi nem
  float t_C;         			    // t_C   :  sicaklik [íC]

  t_C=t*0.01 - 40;	            	   //[íC] dan sıcaklık hesapla.
  rh_lin=C3*rh*rh + C2*rh + C1;        //[%RH] dan nem hesapla
  rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;  //[%RH] sıcaklık ısı telefisi hesapla

	 

  *p_isi=t_C;               //sıcaklık değeri döndür[íC]
  *p_nem=rh_true;              //nem değeri döndür.[%RH]
}





void  main(void)
{
    void SystemInit();
	 value nem_deger,isi_deger;
  unsigned char  topla, hata;
  unsigned int i;
  char S1[16],S2[16];
   
	s_baglanti_reset();

    while(1)
    { 
	
		hata=0; 
		//hata+=s_olcum((unsigned char*) &nem_deger.i,&topla,NEM);					
    s_olcum((unsigned char *)&nem_deger.i,&topla,NEM);    //nem ölçümü
    //hata+=s_olcum((unsigned char*) &isi_deger.i,&topla,ISI); 
	s_olcum((unsigned char *)&isi_deger.i,&topla,ISI);    //sıceklık ölçümü
    //if(hata!=0) s_baglanti_reset();
	//else//{
	nem_deger.f=(float)nem_deger.i;                   //tip dönüşümü
    isi_deger.f=(float)isi_deger.i;                   //tip dönüşümü
    
	sensor_hesapla(&nem_deger.f,&isi_deger.f);            //sıcaklık ve nem hesapla

          for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)

	//}

	 // sprintf(S1,"SiCAKLiK :%5.1fC%",isi_deger.f);	//sicaklik değerini s1 degiskenine bastır
	//sprintf(S2,"NEM......:%5.1f%%",nem_deger.f); //nem değerini s2 degiskenine bastır

      	
      Lcd_init();
      Lcd_Imlec_Yok();
	  sprintf(S1,"SiCAKLiK :%5.1fC%",isi_deger.f);	//sicaklik değerini s1 degiskenine bastır
      Lcd_Yaz(S1); Lcd_Git(2,1);
	  	sprintf(S2,"NEM......:%5.1f%%",nem_deger.f); //nem değerini s2 degiskenine bastır
      Lcd_Yaz(S2);

      Delay_ms(250);


    }

}


jozzef

#926
Merhaba arkadaşlar,
Örneklerin çoğu takip ettim. Aklıma belli sorular takıldı. Yardımcı olursanız sevinirim. Sorularım cevaplandıkta uygun cevabu sorunun altına yazacağım.
1. Bazen değişkenler için volatile tanımlamasını kullanıyoruz. Bunun nedeni nedir? (Google bana yardımcı olmadı)
2. OSC oturturtma rutuni tam olarak nedir?
3. DAC orneginde
"GPIOA->MODER=0xA8000200;        // GPIOA4 Analog inp yapildi"
demişiz. Analog olması için [1 1] yazmamız gerekmiyor mu?
Bu durumda  GPIOA->MODER=0xA8000300 yazmamız gerekmez mi?
4. GPIOA ve GPIOB 'nun default moder değerleri
-0xA800 0000 for port A
-0x0000 0280 for port B
Diğer Moderlerinki 0x0000 0000 iken bunların niye farklı?
5. Systick kullanırken LOAD, CTRL adreslerini kendimiz tanımlamışız, zira datasheetimizde de açıklama bulunmuyor. Hicbir definition yapmadan sadece "STM32F4xx.h" ve "startup_stm32f4xx.s" dosyalarını çağırarak aşağıdaki gibi systick'i configüre edebiliyorum.
   SysTick->LOAD = 168-1;
   SysTick->CTRL &= ~0x00010000;
   SysTick->CTRL |= 0x00000007;
Ancak bu 2 dosyada da systick adına hiç birşey yok! O zaman bu tanımlamalar nerde yapıldı da adresleri çağrıldı?
6. GPIO'ları alternate function olarak programlarken datasheete AFRH ve AFRL registerleri mevcutken biz AFR[1] kullandık. Zaten AFRH tanımsız, yani kullanılamıyor. Sorum bunu AFR[1] yazarak konfigüre edeceğimi buraya bakmasaydım nereden öğrenecektim. ST'nin bir programlama manueli var da bilmiyor muyum?
7. USART3 kullanırken USART'ı reset edip daha reseti kaldırdık. Clock uyguladığımız diğer çevresel birimlerede bunu yapabilirdik; ancak sadece buna yaptık. Nedeni nedir?
Baudrate hesaplarken:
USART3->BRR |= 0X1112; yerine USART3->BRR |= 0X1117; yazmamız gerekmez mi? Zira 0.438*16=7

marecrisium

#927
Alıntı yapılan: denizhan50 - 27 Mayıs 2012, 04:08:21
   
Diğer işlemcilerde kullanılan koduu arm için düzenledım ama sensörden verıyı okuyamıyorum nerde yanlıs yapıyorum çözemedım,,sht haberleşme fonksıyonlarının yeırne ı2c nın kendıı özell fonksıyonlaırınımı kullanmak gerekıyor acaba ..

#include "STM32F4xx.h"
#include "delay.h"
#include "HD44780.h"
#include "math.h"
#include "stdio.h"


				 
                            //adr  komut   r/w
#define YAZMA_DURUM 0x06    //000   0011    0
#define OKUMA_DURUM 0x07    //000   0011    1
#define ISI_OLCUM 0x03      //000   0001    1
#define NEM_OLCUM 0x05      //000   0010    1
#define RESET 0x1e          //000   1111    0


#define noACK 0
#define ACK   1

#define DATA   GPIO_B(7)
#define SCK   GPIO_B(6)
void SystemInit(void)
{
unsigned int i;

    for (i=0;i<0x00100000;i++);          // OSC oturtma ve kurtarma rutini
    RCC->CFGR |= 0x00009400;         // AHB ve APB hizlarini max degerlere set edelim
    RCC->CR |= 0x00010000;            // HSE Xtal osc calismaya baslasin       
    while (!(RCC->CR & 0x00020000));// Xtal osc stabil hale gelsin
    RCC->PLLCFGR = 0x07405408;      // PLL katsayilarini M=8, N=336, P=2 ve Q=7 yapalim
//  RCC->PLLCFGR = 0x07402A04;     // PLL katsayilarini M=4, N=168, P=2 ve Q=7 yapalim
    RCC->CR |= 0x01000000;            // PLL calismaya baslasin  (Rehber Sayfa 95)
    while(!(RCC->CR & 0x02000000)); // Pll hazir oluncaya kadar bekle
//  FLASH->ACR = 0x00000705;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    FLASH->ACR = 0x00000605;        // Flash ROM icin 5 Wait state secelim ve ART yi aktif edelim (Rehber Sayfa 55)
    RCC->CFGR |= 0x00000002;        // Sistem Clk u PLL uzerinden besleyelim
    while ((RCC->CFGR & 0x0000000F) != 0x0000000A); // Besleninceye kadar bekle
    RCC->AHB1ENR |= 0x0000001F;    // GPIO A,B,C,D,E clock'u aktif edelim
    
    GPIOD->MODER = 0x55005555;     // GPIOD nin 15, 14, 13, 12 pinleri cikis tanimlandi (LEDler icin) 0..7 arasıda çıkış
    GPIOB->MODER = 0x00000500;     // GPIOB 4 ve 5 i çıkış yaptık.
	//GPIOE->MODER = 0x00000880;	   // GPIOE 4 ve 6 i çıkış yaptık.   
								   // DATA  ÇIKIŞ=E4 SCK ÇIKIŞ= E6
    GPIOA->OSPEEDR= 0x00000000;   // GPIOD nin tum cikislarinı Max. 2 Mhz de kullanacağız.
    GPIOB->OSPEEDR= 0xFFFFFFFF;	  // AYnı şey GPIOB içinde geçerli
    GPIOC->OSPEEDR= 0xFFFFFFFF;
    GPIOD->OSPEEDR= 0xFFFFFFFF;
	GPIOE->OSPEEDR= 0xFFFFFFFF;
}

	  

	 void bekle( unsigned int sure )
{
	int i;
	while( sure != 0 )	
	{
		i = 120;
		while( i != 0 )
		{
			i --;
		}
		sure --;
	
	}
}
  void ee_delay(void)
  { unsigned long y;
  for(y=0; y<50; y++);
}


typedef union 
{ unsigned int i;
  float f;
} value;

enum {ISI,NEM};

char s_yaz_byte(unsigned char deger)
{ 
  unsigned char i,hata=0;  
  for (i=0x80;i>0;i/=2)             
  { if (i & deger) DATA=1;          
    else  DATA=0; 
	 ee_delay();
	SCK=1;                          
   ee_delay();                       
   ee_delay();
   ee_delay();     	
    SCK=0;
	ee_delay();
  }
 DATA=1;   
  ee_delay();                        
   SCK=1;                          
  
  hata=DATA;
                      
   SCK=0;        
  return hata;  
                     
}

/***** bir bayt okumak için tanımlama *****/

char s_oku_byte(unsigned char ack)
{ 
  unsigned char i,val=0;
  DATA=1;                          
  
  for (i=0x80;i>0;i/=2)             //bit maskeleme
  { SCK=1;                          //iletişim için saat sinyali
    
	if (DATA) val=(val | i);        //bir bit oku  
    SCK=0;  					 
  }
  
  DATA=!ack; 
   ee_delay();                       
 SCK=1;                            
 ee_delay();
  ee_delay();
    ee_delay();     
  SCK=0;
  ee_delay();						    
  DATA=1;                           //veri değerini sil
  return val;
}

/***** yeni bir iletişim başlat *****/
 
void s_basla(void)

{  
   DATA=1;  SCK=0;                   //ilk durum
  ee_delay();
  SCK=1;
   ee_delay();
  DATA=0;
    ee_delay();
   SCK=0;  
    ee_delay();
	ee_delay();
    ee_delay();
  SCK=1;
   ee_delay();
   DATA=1;		   
    ee_delay();
   SCK=0;		   
}
		 /*** iletişim yenile: DATA-line=1 ve sonraki 9 SCK saykili takiben başa dön ***/

void s_baglanti_reset(void)

{  
  unsigned char i; 
  DATA=1; SCK=0;                    //ilk durum
  for(i=0;i<9;i++)                  //9 SCK saykili
  { SCK=1;
    SCK=0;
  }
  s_basla();                   //aktarmayi baslat
}
//---------------------------------------------------------------------------------- 
char s_softreset(void) 
  
{  
  unsigned char hata=0;   
  s_baglanti_reset();              //reset communication 
  hata+=s_yaz_byte(RESET);       //send RESET-command to sensor 
  return hata;                     //error=1 in case of no response form the sensor 
}   

//---------------------------------------------------------------------------------- 
char s_oku_statusreg(unsigned char *p_deger, unsigned char *p_top) 
//---------------------------------------------------------------------------------- 
// reads the status register with checksum (8-bit) 
{  
  unsigned char hata=0; 
  s_basla();                   //transmission start 
  hata=s_yaz_byte(OKUMA_DURUM); //send command to sensor 
  *p_deger=s_oku_byte(ACK);        //read status register (8-bit) 
  *p_top=s_oku_byte(noACK);   //read checksum (8-bit)   
  return hata;                     //error=1 in case of no response form the sensor 
} 
  

  //---------------------------------------------------------------------------------- 
char s_yaz_statusreg(unsigned char *p_deger) 
//---------------------------------------------------------------------------------- 
// writes the status register with checksum (8-bit)
{  
  unsigned char hata=0; 
  s_basla();                   //transmission start 
  hata+=s_oku_byte(YAZMA_DURUM);//send command to sensor 
  hata+=s_yaz_byte(*p_deger);    //send value of status register 
  return hata;                    //error>=1 in case of no response form the sensor 
}  
   


   
   /**** ölcüm yapar (nem/sıcaklık)****/
	 char s_olcum(unsigned char *p_deger, unsigned char *p_top, unsigned char mod)
{ 
  unsigned hata=0;
  unsigned int i;

  s_basla();                   //aktarmayı başlat.
  switch(mod){                     //sensöre komut göder.
    case ISI	: hata+=s_yaz_byte(ISI_OLCUM); break;
    case NEM	: hata+=s_yaz_byte(NEM_OLCUM); break;
    default     : break;	 
  }
  
  for (i=0;i<65535;i++) if(DATA==0) break; //sensör ölçümü tamamlayana kadar bekle.
  if(DATA) hata+=1;                // süre 2 saniye yi astiginda
  *(p_deger)  =s_oku_byte(ACK);    //ilk bayti oku
  *(p_deger+1)=s_oku_byte(ACK);    //ikinci bayti oku
  *p_top =s_oku_byte(noACK);		//toplamı oku
  
  return hata;
}



void sensor_hesapla(float *p_nem ,float *p_isi)
{ 
const float C1=-2.0468;           // for 12 Bit RH 
  const float C2=+0.0367;           // for 12 Bit RH 
  const float C3=-0.0000015955;     // for 12 Bit RH 
  const float T1=+0.01;             // for 12 Bit RH 
  const float T2=+0.00008;          // for 12 Bit RH


  float rh=*p_nem;					// rh:      nem [saat darbesi] 12 Bit 
  float t=*p_isi;					// t:       sicaklik [saat darbesi] 14 Bit
  float rh_lin;                     // rh_lin:  nem doğrusal
  float rh_true;                    // rh_true: sicaklik telafi nem
  float t_C;         			    // t_C   :  sicaklik [íC]

  t_C=t*0.01 - 40;	            	   //[íC] dan sıcaklık hesapla.
  rh_lin=C3*rh*rh + C2*rh + C1;        //[%RH] dan nem hesapla
  rh_true=(t_C-25)*(T1+T2*rh)+rh_lin;  //[%RH] sıcaklık ısı telefisi hesapla

	 

  *p_isi=t_C;               //sıcaklık değeri döndür[íC]
  *p_nem=rh_true;              //nem değeri döndür.[%RH]
}





void  main(void)
{
    void SystemInit();
	 value nem_deger,isi_deger;
  unsigned char  topla, hata;
  unsigned int i;
  char S1[16],S2[16];
   
	s_baglanti_reset();

    while(1)
    { 
	
		hata=0; 
		//hata+=s_olcum((unsigned char*) &nem_deger.i,&topla,NEM);					
    s_olcum((unsigned char *)&nem_deger.i,&topla,NEM);    //nem ölçümü
    //hata+=s_olcum((unsigned char*) &isi_deger.i,&topla,ISI); 
	s_olcum((unsigned char *)&isi_deger.i,&topla,ISI);    //sıceklık ölçümü
    //if(hata!=0) s_baglanti_reset();
	//else//{
	nem_deger.f=(float)nem_deger.i;                   //tip dönüşümü
    isi_deger.f=(float)isi_deger.i;                   //tip dönüşümü
    
	sensor_hesapla(&nem_deger.f,&isi_deger.f);            //sıcaklık ve nem hesapla

          for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)

	//}

	 // sprintf(S1,"SiCAKLiK :%5.1fC%",isi_deger.f);	//sicaklik değerini s1 degiskenine bastır
	//sprintf(S2,"NEM......:%5.1f%%",nem_deger.f); //nem değerini s2 degiskenine bastır

      	
      Lcd_init();
      Lcd_Imlec_Yok();
	  sprintf(S1,"SiCAKLiK :%5.1fC%",isi_deger.f);	//sicaklik değerini s1 degiskenine bastır
      Lcd_Yaz(S1); Lcd_Git(2,1);
	  	sprintf(S2,"NEM......:%5.1f%%",nem_deger.f); //nem değerini s2 degiskenine bastır
      Lcd_Yaz(S2);

      Delay_ms(250);


    }

}




STM32F4'ün I2C donanımını kullanman gerekli hocam user manuelde nasıl kullanacağın,registerler falan yazılı oraya bi göz at derim.Bu şekilde bu kodlar bu işlemcide çalışmaz işlemciye özel tanımlamalar yapılması gerekiyor.

superconductor

Merhabalar arkadaşlar konuda biraz geri kalmışım deneme kartımın geç gelmesinden dolayı yanlış yerde sordu isem kusura bakmayın.

elimde stm32f4discovery  board mevcut .arm derslerindeki  örnek kodları (örn led yakıp söndürme) derlerken  kail hata vermiyor  ancak debug ettiğimde  kod  startup bölümünde çakılıyor.

kodlardaki  " int main() " ifadesi  yerine " int   __main()"   yazınca   çalıştı.  bu problem neden olur  aydınlatırsanız çok sevinirim.

kail mdk 4.53 deneme sürümü olarak kullanıyorum.

"__main"    yazmak nerden  esti  derseniz   startup  kodlarını inceledim  orda  mainli ifadelerin  tümü bu şekildeydi bende  bir deniyim  ölmem dedim.





jozzef

Arkadaşlar başlık bildiğiniz öksüz gibi kaldı. Yukarı da (https://www.picproje.org/index.php/topic,35794.msg290715.html#msg290715) kafama takılan bir çok soru yazdım; hiçbirine cevap gelmedi. Yardımcı olabilir misiniz?