Arm I2C ve ADC protokolünün kullanımı

Başlatan halit28, 27 Şubat 2012, 16:33:34

halit28

STM32F4 - Discovery I2C arayüz/interface ile bilgisi olan var mı ?

SpeedyX

Bu böyle olmaz, ARM demişsinde sarı çizmeli mehmet ağa...

Hangi işlemci?

Hem ADC protokolü diye birşey yok, I2C ise bir arayüz/interface, yine protokol değil.

İşlemcinin user manual inde herşey yazıyor, belirli registerlardan modülün ayarlarını yapıp başka registerlardan da okuma (varsa yazma) yapıyorsun. Örnek kod istersen işlemcinin üreticisinin genellikle "code bundle" adlı bir örnek kodlar arşivi bulunur, oradan ilgilendiğin konunun programını katalog eşliğinde inceleyerek çok güzel anlarsın.

halit28

#2
Eyvallah.

KABO

   Arkadasım.Ben LPC1769 cortex M3 serisi ARM ile ADC uygulaması yaptım.kodları asagıda veriyorum
/*************************************************************/
// -****** ADC INITIAL(ADC Kurulur)
/*************************************************************/
   void adc_initial()
   {      
      LPC_PINCON->PINSEL1 |= (1U<<16);   //AD0.1 aktif
      LPC_SC->PCONP |=1<<12;              //ADC guc koruması acik
      
      LPC_ADC->ADCR=1<<1|1<<8|1<<21;      //SEL=1,CLKDIV=1,burst=0,PDN=1    
   }
/*******************************************************************/
//***** ADC START YAPILIR

void adc_basla(void)
{
   LPC_ADC->ADCR |=(1<<24);     //Burst =0 iken adc start

//***************** ADC STOP
void adc_dur(void)
{
   LPC_ADC->ADCR &=~(1<<24);    // adc yi durdurur
}
//******************** ADC OKU
void adc_sonuc_al(void)
{
   if (LPC_ADC->ADDR1&(1UL<<31))
   {
         adc_sonuc=LPC_ADC->ADDR1;      
      adc_sonuc=(adc_sonuc>>4)& 0xFFF;
      hesap=((adc_sonuc*3300)/(4096));
      adc_dur();
      adc_basla();
   }
}

insallah bu kodlar işine yarar.hepsi denendi ve çalışıyor.
I2C protokolunu daha denemedim denedigimde sitede paylasıtrım.

BILGI PAYLASTIKCA COGALIR...

SpeedyX

Alıntı yapılan: halit28 - 01 Mart 2012, 13:16:21
O kadar iyi bilmiyoruz :) ders olarak görüyoruz ama bu konularda Türkçe kaynak varsa çok yardımcı olursunuz :))
Okulda ingilizce öğretmiyorlar mı?
İngilizceyi beğenmediysen rusça kaynak verelim?

Şimdi sen en azından okulda hangi işlemciyi öğrettiklerini bilmiyor musun yani? Çünkü ARM çekirdeğinin ADC si yok, işlemcinin ADC modülü var, onlar da farklılık gösteriyor.

cagrisma

Alıntı yapılan: SpeedyX - 07 Mart 2012, 23:40:42
Okulda ingilizce öğretmiyorlar mı?
İngilizceyi beğenmediysen rusça kaynak verelim?

Şimdi sen en azından okulda hangi işlemciyi öğrettiklerini bilmiyor musun yani? Çünkü ARM çekirdeğinin ADC si yok, işlemcinin ADC modülü var, onlar da farklılık gösteriyor.

Okulda ingilizce öğretiyolar o konuda sorun yok. Şimdili rusçayada gerek yok.
Kullanılan mikrodenetleyici STM32F4 Discovery kit,
şuandaki tek kaynak ST firmasinin verdigi datasheet. Bu konuda yeni oldugumuz icin arkadaş somuş acaba ilgilen bu konuda çalışan varmı diye. Zaten bunalmis hoca bu kit üzerinde çalışıyor, onun dışında türkçe kaynak yok şimdilik.
Bu şartlarda belirtilmiş bir istekti...

halit28

#6
Alıntı yapılan: SpeedyX - 07 Mart 2012, 23:40:42
Okulda ingilizce öğretmiyorlar mı?
İngilizceyi beğenmediysen rusça kaynak verelim?

Şimdi sen en azından okulda hangi işlemciyi öğrettiklerini bilmiyor musun yani? Çünkü ARM çekirdeğinin ADC si yok, işlemcinin ADC modülü var, onlar da farklılık gösteriyor.
Öğretiyorlar ben felsefik açıdan öğrenmek istemiyorum.  Rusça gönder uyar bana. Bordun ismini de  düzenleyip yazdım. Unutmuşum yazmayı.

halit28

#7
Alıntı yapılan: KABO - 07 Mart 2012, 21:21:08
   Arkadasım.Ben LPC1769 cortex M3 serisi ARM ile ADC uygulaması yaptım.kodları asagıda veriyorum
/*************************************************************/
// -****** ADC INITIAL(ADC Kurulur)
/*************************************************************/
   void adc_initial()
   {      
      LPC_PINCON->PINSEL1 |= (1U<<16);   //AD0.1 aktif
      LPC_SC->PCONP |=1<<12;              //ADC guc koruması acik
      
      LPC_ADC->ADCR=1<<1|1<<8|1<<21;      //SEL=1,CLKDIV=1,burst=0,PDN=1    
   }
/*******************************************************************/
//***** ADC START YAPILIR

void adc_basla(void)
{
   LPC_ADC->ADCR |=(1<<24);     //Burst =0 iken adc start

//***************** ADC STOP
void adc_dur(void)
{
   LPC_ADC->ADCR &=~(1<<24);    // adc yi durdurur
}
//******************** ADC OKU
void adc_sonuc_al(void)
{
   if (LPC_ADC->ADDR1&(1UL<<31))
   {
         adc_sonuc=LPC_ADC->ADDR1;      
      adc_sonuc=(adc_sonuc>>4)& 0xFFF;
      hesap=((adc_sonuc*3300)/(4096));
      adc_dur();
      adc_basla();
   }
}

insallah bu kodlar işine yarar.hepsi denendi ve çalışıyor.
I2C protokolunu daha denemedim denedigimde sitede paylasıtrım.


Eyvallah. En azından dediğimi anladı bir kişide olsa. Protokol filan dert etmedi.

SpeedyX

O zaman o kodun yardımı hiç dokunmaz, bunalmis hocanın notlarında istedikleriniz var, eminim bu işlemcinin code bundle ı da vardır. Kitin üzerinde ortadaki chipin üstünde chipin adı yazıyor, oraya bakarak öğrenebilirsiniz. Malesef bu konuda türkçe kaynak aramak bile çok yanlış adım olur.

MC_Skywalker

Chip'i üreten firmanın web sitesini ziyaret etmeyi alışkanlık haline getirmekte fayda var kanâtindeyim.

STM32F1 için bir ADC uygulmama notun dan yolaçıkılabilir.
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/APPLICATION_NOTE/CD00258017.pdf

cseb

Alıntı yapılan: KABO - 07 Mart 2012, 21:21:08
   Arkadasım.Ben LPC1769 cortex M3 serisi ARM ile ADC uygulaması yaptım.kodları asagıda veriyorum
/*************************************************************/
// -****** ADC INITIAL(ADC Kurulur)
/*************************************************************/
   void adc_initial()
   {      
      LPC_PINCON->PINSEL1 |= (1U<<16);   //AD0.1 aktif
      LPC_SC->PCONP |=1<<12;              //ADC guc koruması acik
      
      LPC_ADC->ADCR=1<<1|1<<8|1<<21;      //SEL=1,CLKDIV=1,burst=0,PDN=1    
   }
/*******************************************************************/
//***** ADC START YAPILIR

void adc_basla(void)
{
   LPC_ADC->ADCR |=(1<<24);     //Burst =0 iken adc start

//***************** ADC STOP
void adc_dur(void)
{
   LPC_ADC->ADCR &=~(1<<24);    // adc yi durdurur
}
//******************** ADC OKU
void adc_sonuc_al(void)
{
   if (LPC_ADC->ADDR1&(1UL<<31))
   {
         adc_sonuc=LPC_ADC->ADDR1;      
      adc_sonuc=(adc_sonuc>>4)& 0xFFF;
      hesap=((adc_sonuc*3300)/(4096));
      adc_dur();
      adc_basla();
   }
}

insallah bu kodlar işine yarar.hepsi denendi ve çalışıyor.
I2C protokolunu daha denemedim denedigimde sitede paylasıtrım.

Ben bu kodları deniyorum ama LCD de ADC değeri devamlı 0 görünüyor. Kodlarda bi terslik mi var acaba. LCD ye aşağıdaki gibi yazdırıyorum:


        adc_basla();
   adc_sonuc_al();
   adc_dur();
   sprintf(adc_bilgisi,"ADC=%d   ",adc_sonuc);
        lcd_gotoxy(2,1);
   lcd_yaz(adc_bilgisi);

muhittin_kaplan

yukardaki kodları eğer STM32F4 ile deniyorsanız Boşuna denemeyin.
Kouyu Tekrar Okuyun...

cseb


cseb

#13
Arkadaşlar aşağıdaki gibi kendim yazmaya çalıştım ama yine lcd de değer hep sıfır görünüyor, yardım edebilirmisiniz.

int main (void)
{

    SystemInit ();
   SysTick_Config(12000000/1000);

    LPC_PINCON->PINSEL1=0x00010000;     /* binary: 00000000_00000001_00000000_00000000 */
    LPC_PINCON->PINMODE1=0x00000000;
    LPC_SC->PCONP = (LPC_SC->PCONP & 0xEFEFF7DE) | 0x1000;      /* Enable peripheral clock for ADC (default is disabled) */
    LPC_ADC->ADCR=0x01200102;     /* binary: 00000001_00100000_00000001_00000010 */
   //LPC_ADC->ADINTEN=0x00000100;   
   LPC_GPIO0->FIODIR = 0x00000000;              
   LPC_GPIO2->FIODIR = 0xFFFFFFFF;  // GPIO'ların hepsi çıkış oluyor


   lcd_init();
   
   DelayMs(1500);
   lcd_clear();
   lcd_gotoxy(2,1);
   lcd_yaz("ADC okunuyor....");
   DelayMs(500);
   
   while(1){
   

   LPC_ADC->ADCR |= 0x01000000;   
   while (LPC_ADC->ADGDR & 0x80000000 == 0);
   adc =(LPC_ADC->ADGDR >> 4)&0x00000FFF;
   sprintf(adc_bilgisi,"ADC=%4d        ",adc);
   lcd_gotoxy(2,1);
   lcd_yaz(adc_bilgisi);
   DelayMs(250);
   }
}

KABO

Ben sana kucuk calıstırıp denedigim bir programı gonderiyorum.umarım işine yarar.Program Analog girişteki bilgiye göre porta baglı bir ledin parlaklıgını degiştiriyor



#include <LPC17xx.h>

short a;
uint32_t adc_sonuc;
uint32_t hesap;
/*****************************************************************/
void init_PLL(void)
{
   LPC_SC->SCS |= 0X20;
   while((LPC_SC->SCS &( 1<<5))==0);
   LPC_SC->CCLKCFG = 3;
   LPC_SC->PCLKSEL0 = 0;
   LPC_SC->PCLKSEL1 = 0;
   LPC_SC->CLKSRCSEL = 1;
   LPC_SC->PLL0CFG = 0X40063;
   LPC_SC->PLL0CON   = 0X01;
   LPC_SC->PLL0FEED = 0XAA;
   LPC_SC->PLL0FEED = 0X55;
   while(!(LPC_SC->PLL0STAT & (1<<26)));
   LPC_SC->PLL0CON   = 0X03;
   LPC_SC->PLL0FEED = 0XAA;
   LPC_SC->PLL0FEED = 0X55;
}
/********   TIMER 1 INITIAL********************************/
void tmr1_initial()
{
   LPC_TIM1->PR    = 0x00000000;                   // On Bolme ( Bolucu )
   LPC_TIM1->TCR   = 0x00000002;                  // Timer Kontrolde Sayiciyi temizle
   LPC_TIM1->MCR   = 0x00000003;                   //mach kontrol register        //  ???????   
   LPC_TIM1->MR0   = 6000000;                              
   LPC_TIM1->TCR   = 0x00000001;                   //Timer0'i baslat
   NVIC_EnableIRQ(TIMER1_IRQn); // Enable timer interrupt
}
  /********   TIMER 0 INITIAL**********************************/

void tmr0_initial()
{

   LPC_PINCON->PINSEL7 |=0x280000;
   LPC_TIM0->TCR   = 0x2;
   LPC_TIM0->PR    = 0x00000000;                   // On Bolme ( Bolucu )
   LPC_TIM0->EMR    = 0x00F3;
   LPC_TIM0->MCR   = 0x1B;    
   NVIC_EnableIRQ(TIMER0_IRQn); // Enable timer interrupt
}
/********   TIMER 2 INITIAL**********************************/
void tmr2_initial()
{
   LPC_SC->PCONP |=0X400000;
   LPC_PINCON->PINSEL0 |= 0XFF000;               // MAT2.0 ,MAT2.1 ,MAT2.2 ,MAT2.3 ,
   LPC_TIM2->TCR   = 0x2;
   LPC_TIM2->PR    = 0x00000000;                   // On Bolme ( Bolucu )
   LPC_TIM2->MCR   = 0x1B;        
   LPC_TIM2->EMR   = 0x0F3;
   NVIC_EnableIRQ(TIMER2_IRQn); // Enable timer interrupt
}
/********   TIMER 3 INITIAL**********************************/
void tmr3_initial()
{
   LPC_SC->PCONP |=1<<23;
   LPC_PINCON->PINSEL0 |= 0XF00000;               // 
   LPC_TIM3->PR    = 0x00000000;                   // On Bolme ( Bolucu )
   LPC_TIM3->TCR   = 0x2;                  // Timer Kontrolde Sayiciyi temizle
   LPC_TIM3->MCR   = 0x1B;                   //mach kontrol register        //  ???????   
   LPC_TIM3->EMR   = 0xF3;
   NVIC_EnableIRQ(TIMER3_IRQn); // Enable timer interrupt
}
/*************************************************************/
/*************************************************************/


/*****************************************************/
//********************************************************
/**********************************************************/
/*             TIMER 1 KESME ALT PROGRAMI                 */
/*            SOFTSTART - SOFTSTOP                 */
void TIMER1_IRQHandler (void)
{
      if (a==0)   
        {      
      LPC_GPIO0->FIOSET0=1<<1;
      LPC_GPIO0->FIOCLR0=1<<0;
      a=1;
      }
     else
        {
        LPC_GPIO0->FIOSET0=1<<0;
      LPC_GPIO0->FIOCLR0=1<<1;   
      a=0;
      }
   LPC_TIM1->MR0   =100+(hesap*1500);   
   /*********************************************************/   
   LPC_TIM1->IR |= 1 << 0; // Clear MR0 interrupt   
   LPC_TIM1->IR |= 1 << 1;

}
/*********************************************************/
//*******  TIMER-2
/*********************************************************/
void TIMER0_IRQHandler (void)
{

    LPC_TIM0->IR |= 1 << 1; // Clear MR1 interrupt
    LPC_TIM0->IR |= 1 << 0; // Clear MR0 interrupt
}   
/*********************************************************/
//*******  TIMER-2
/*********************************************************/
void TIMER2_IRQHandler (void)
{
   LPC_TIM2->IR |= 1 << 1; // Clear MR1 interrupt   
   LPC_TIM2->IR |= 1 << 0; // Clear MR0 interrupt
}   
/*********************************************************/
// ******   TIMER-3
/*********************************************************/
void TIMER3_IRQHandler (void)
{      
   //*****************************************************
   LPC_TIM3->IR |= 1 << 0; // Clear MR0 interrupt
   LPC_TIM3->IR |= 1 << 1; // Clear MR1 interrupt   
}
   
/**********************************************************/

/*************************************************************/
// -****** ADC INITIAL
/*************************************************************/
   void adc_initial()
   {      
      LPC_PINCON->PINSEL1 |= (1U<<16);   //AD0.1 aktif
      LPC_SC->PCONP |=1<<12;              //ADC guc koruması acik
      
      LPC_ADC->ADCR=1<<1|1<<8|1<<21;      //SEL=1,CLKDIV=1,burst=0,PDN=1    
   }
/*******************************************************************/
//***** ADC START

void adc_basla(void)
{
   LPC_ADC->ADCR |=(1<<24);     //Burst =0 iken adc start
}
//***************** ADC STOP
void adc_dur(void)
{
   LPC_ADC->ADCR &=~(1<<24);    // adc yi durdurur
}
//******************** ADC OKU
void adc_sonuc_al(void)
{
   if (LPC_ADC->ADDR1&(1UL<<31))
   {
         adc_sonuc=LPC_ADC->ADDR1;      
      adc_sonuc=(adc_sonuc>>4)& 0xFFF;
      hesap=((adc_sonuc*3300)/(4096));
      adc_dur();
      adc_basla();
   }
}
//**********************************************************
////////////////////////////////////////////////////////////
/*                 MAIN                            */
//////////////////////////////////////////////////////////
//********************************************************
int main()
{
   LPC_SC->PCONP=LPC_SC->PCONP & 0xFBF7FF3F;

   LPC_PINCON->PINSEL1=LPC_PINCON->PINSEL1 & 0x03;
   LPC_PINCON->PINSEL2=0;
   LPC_PINCON->PINSEL3=0;
   LPC_PINCON->PINSEL4=0;

   init_PLL();   

   tmr1_initial();
   adc_initial();



/**********************************************************************/
    LPC_GPIO4->FIODIR3 |=0x30;
    LPC_GPIO0->FIODIR0 |=0x30;
    LPC_GPIO1->FIODIR1 |=0xC7;
    LPC_GPIO1->FIODIR0 |=0x10;
    LPC_GPIO1->FIODIR2 |=0x3;
    LPC_GPIO2->FIODIR0 |=0xFC;

   LPC_GPIO0->FIODIR0 = 0x00FF;
   LPC_GPIO2->FIODIR |=0xFFF;
   adc_basla();
   while(1)
   {
   
      adc_sonuc_al();
   
   }
}
BILGI PAYLASTIKCA COGALIR...