Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => ARM => Konuyu başlatan: Kaanx - 27 Mart 2013, 01:36:17

Başlık: Ynt: Stm32f4 Discovery while(1) ile sonsuz döngüye girmıyor
Gönderen: Kaanx - 27 Mart 2013, 01:36:17
Merhabalar arkadaşlar gün  geçmiyor ki başka bi sorunla karsılaşmiyim.ADC modulunu ıncelerken hesapladıgım degerı lcd ye yazdırmayı denedım bir nevi yazdırdm fakat tam bir stabil kod cıkaramadım bende hesapladıgım volt degerıne göre ledlerı yakayım dedim ve basladım.Kodu dun yazıp derledıgımde potansiyometreden gelen degeri hesaplayıp o voltaj degerıne göre ledler yanıp sonuyordu bugun uzerınde biraz degısıklık yaptım tekrar debug ettim fakat istediğim degerde ledler yanmadı.Sorunum su;

Potansiyometreden degeri degiştiriyorum 0 ile 1 volt arasında led1 1 ile 2 arasında led 2 ... olarak led 4 e kadar bir sıralamam var.Ben potansiyometreden degerı degıstırıyorum fakat o degere göre led yanmıyor.Reset butonuna bastıgımdan sonra o degerın ledi yanıyor.Yani while(1){..}
içerisinde sonsuz döngü olmuyor 1 kere deger alıyor o degere göre ledi yakıp bırakıyor.Reset dıyorum tekrar o degeri hesaplayıp ılgılı ledleri yakıyor.Bu sorunu nasıl çözebilirim arkadaşalar kodlar asagıdaki gibidir.Atollic True studio kullanıyorum bununda bir etkisi olabilir mi ?

#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_adc.h"
#include <stdio.h>
#include "misc.h"

uint8_t ADCoku()
{
ADC_RegularChannelConfig(ADC1,ADC_Channel_0,1,ADC_SampleTime_56Cycles); //ADC KANAL 0 SECILDI VE 56 CYCLES KONUMUNDA
ADC_SoftwareStartConv(ADC1); //DONUSUME BASLA DEDİK
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET); //HER DÖNUSUM SONRASI BAYRAGI SIFIRLAYALIM
return ADC_GetConversionValue(ADC1);

}

int main(void)
{
uint8_t value=0; //8 bitlik bir degişken atadık gerilimin digital degerini saklamak ıcın

// port yönlendirmelerini yapalım
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;

//SECTIGIMIZ BIRIMLERIN CLOCK PALSLERINI VERELIM

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOD,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);

//A VE D PORTLARININ ÖZELLİKLERNİ BELIRLEYELIM
/*D PORTU*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD,&GPIO_InitStructure);
/*A PORTU ANALOG OKUMAYI BU PORTTAN YAPIYORUZ*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; // ANALOG GİRİŞ MODU
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA,&GPIO_InitStructure);

/*ADC-1 AYARLARINI YAPALIM */

ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;
ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
    ADC_CommonInit(&ADC_CommonInitStructure);

    ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;
    ADC_InitStructure.ADC_ScanConvMode=DISABLE;
    ADC_InitStructure.ADC_Resolution=ADC_Resolution_8b;
    ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion=1;
    ADC_Init(ADC1,&ADC_InitStructure);

    ADC_Cmd(ADC1,ENABLE);

    while(1)
    {
   
    value=ADCoku(); // deger dondur
    double voltaj,voltaj1; //
    voltaj=3*value; //bölücü köprü parametresi
    voltaj1=voltaj/241;

    /*LED DURUMLARININ KONTROLLERİ*/

    if(voltaj1<1 && voltaj1>=0)           /* 0 İLE 1 ARASINDA*/
    {
    GPIO_SetBits(GPIOD,GPIO_Pin_12);
    GPIO_ResetBits(GPIOD,GPIO_Pin_13);
    GPIO_ResetBits(GPIOD,GPIO_Pin_14);
    GPIO_ResetBits(GPIOD,GPIO_Pin_15);

    }

    else if(voltaj1>=1 && voltaj1<2)      /*1 İLE 2 ARASINDA*/
    {
    GPIO_SetBits(GPIOD,GPIO_Pin_12);
    GPIO_SetBits(GPIOD,GPIO_Pin_13);
    GPIO_ResetBits(GPIOD,GPIO_Pin_14);
    GPIO_ResetBits(GPIOD,GPIO_Pin_15);

    }
    else if (voltaj1>=2 && voltaj1<3)      /*2 İLE 3 ARASINDA*/
    {
    GPIO_SetBits(GPIOD,GPIO_Pin_12);
    GPIO_SetBits(GPIOD,GPIO_Pin_13);
    GPIO_SetBits(GPIOD,GPIO_Pin_14);
    GPIO_ResetBits(GPIOD,GPIO_Pin_15);

    }

    else if(voltaj1>=3 && voltaj1<4)       /* 3 İLE 4 ARASINDA*/
    {
    GPIO_SetBits(GPIOD,GPIO_Pin_12);
    GPIO_SetBits(GPIOD,GPIO_Pin_13);
    GPIO_SetBits(GPIOD,GPIO_Pin_14);
    GPIO_SetBits(GPIOD,GPIO_Pin_15);

    }
    }





}

uint16_t EVAL_AUDIO_GetSampleCallBack(void)
{
    return 0; // ses çipini kullanıyorsanız tek sample veriyi burada return ile döndürün.
}
void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size)
{
    return; // ses çipini kullanıyorsanız  burada çipe veri aktarımı DMA sona ermiş
}



mesaj birleştirme:: 27 Mart 2013, 02:09:28

Sorun atolicten kaynaklıymıs sımdı Stlınk ten yukledım progarmı calıstı.
Başlık: Ynt: Stm32f4 Discovery while(1) ile sonsuz döngüye girmıyor
Gönderen: Kaanx - 27 Mart 2013, 02:49:51
St linkten attgım kod çalıstı fakat Atollicten debug ettiğim kod çalısmıyor.Nedeni nedir bu konuda bilgisi olan var mı ?