Stm32f4 Discovery ADC yi LCD ye yazdırma YARDIM !

Başlatan Kaanx, 24 Mart 2013, 20:57:34

Kaanx

Merhabalar ADC3 den aldıgım analog degerı hesaplayıp lcd ye yazdırmak ıstıyorum fakat hala basarılı olamadım sayı degerlerini ve anlık değişimleri hala lcd ye aktaramadım  sırayla lcd kodlarımı ve main.c dosyalarımı verıcem yardımlarınızı beklıyorum.

Main.c

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

#define ADC3_DR_ADDRESS     ((uint32_t)0x4001224C)
 uint16_t ADC3ConvertedValue=0;   // unsigned olarak degıskenlerımızı belırledık
 uint32_t ADC3ConvertedVoltage=0;
void integer_yaz(uint32_t,char);
void deger_goster(uint32_t);
void ADC3_CH12_DMA_Config(void);



int main(void)
{
	initDiscovery();

	  lcd_init();
	  DelayMS(3);
	    LCD_LINE(1);
	    LCD_STR("ADC-1");

	    DelayMS(100);
	    LCD_LINE(2);
	    LCD_STR("Kaan Kandemir");
	    DelayMS(100);

	  /*ADC3 ayarları
	   * Periphal clock aktif edilir
	   * DMA2 stream0 kanal2 ayarları yapılır.
	   * ADC3 kanal12 analog giriş olarak tanımlanır
	   * ADC3 kanal12 ayarları set edilir.*/

	  ADC3_CH12_DMA_Config();

	  //Adc3 yazılımsal olarak çevrim baslatma

	  ADC_SoftwareStartConv(ADC3);
	  while(1)
	  {
		  ADC3ConvertedVoltage = ADC3ConvertedValue *3300/0xFFF;

		  deger_goster(ADC3->DR);

	  }


}
void  ADC3_CH12_DMA_Config(void)
{
	ADC_InitTypeDef       ADC_InitStructure;
	  ADC_CommonInitTypeDef ADC_CommonInitStructure;
	  DMA_InitTypeDef       DMA_InitStructure;
	  GPIO_InitTypeDef      GPIO_InitStructure;

	//SIMDI SIRAYLA ADC DMA GPIO BUS YOLLARININ CLOCKLARINI AKTIF EDELİM

	  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
	   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);

	//DMA AYARLARINI YAPALIM
	   DMA_InitStructure.DMA_Channel = DMA_Channel_2;
	     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
	     DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC3ConvertedValue;
	     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
	     DMA_InitStructure.DMA_BufferSize = 1;
	     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
	     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Disable;
	     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
	     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
	     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
	     DMA_InitStructure.DMA_Priority = DMA_Priority_High;
	     DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
	     DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
	     DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
	     DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
	     DMA_Init(DMA2_Stream0, &DMA_InitStructure);
	     DMA_Cmd(DMA2_Stream0, ENABLE);
	//GPIO AYARLARI YAPILIYOR C PORTUNDA İŞLEM YAPICAZ
	     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	      GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
	      GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
	      GPIO_Init(GPIOC, &GPIO_InitStructure);

	//ADC MODULU AYARLARI

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

	//ADC3 AYARLARI

	        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
	         ADC_InitStructure.ADC_ScanConvMode = DISABLE;
	         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
	         ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
	         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
	         ADC_InitStructure.ADC_NbrOfConversion = 1;
	         ADC_Init(ADC3, &ADC_InitStructure);
	//ADC3 REGULE KANAL 12
	         ADC_RegularChannelConfig(ADC3, ADC_Channel_12, 1, ADC_SampleTime_3Cycles);
	         ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);

	//ADC ICIN DMA AKTIF
	         ADC_DMACmd(ADC3, ENABLE);
	//ADC3 AKTIF
	         ADC_Cmd(ADC3, ENABLE);


}

void deger_goster(uint32_t ham)
{

	  uint32_t v=0,mv=0;
	  uint8_t text[50];

	  v=(ADC3ConvertedVoltage)/1000+48;
	  mv = (ADC3ConvertedVoltage%1000)/100+48;
	  sprintf((char*)text,"   ADC = %d,%d V   ",v,mv);



  LCD_LINE(1);
  LCD_STR2("10 Bit  = ");
  integer_yaz(ADC3->DR,v);

  LCD_LINE(2);
  LCD_STR2("Gerilim = ");
  integer_yaz(ADC3ConvertedVoltage,mv);

  /*0-3.3volt arası cevrım adımı ayarı*/

 		  //ADC3ConvertedVoltage=ADC3ConvertedValue*3300/0xFFF;
 		//  LCD_LINE(1);
 		//  LCD_STR("MEM DEGER");
 		//  integer_yaz(ADC3_DR_ADDRESS,0);
 		//  DelayMS(100);
 		//  LCD_LINE(2);
 		//  LCD_STR2("VOLTAJ=");
 		 // integer_yaz( ADC3ConvertedVoltage,1);
}
void integer_yaz(uint32_t deger,char flag)
{
 LCD_STR2( deger/1000+48);
 LCD_STR2((deger%1000)/100+48);
 if(flag==1) LCD_STR2('.');
 LCD_STR2((deger%100)/10+48);
 LCD_STR2((deger)%10+48);
}


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ş
}


4_bit_lcd.h

/*
/*
 * 4_bit_lcd.h
 *
 *  Created on: Feb 28, 2013
 *      Author: Kaan
 */





#define DATA_PORT GPIOC->ODR
#define CMD_PORT GPIOA->ODR

#define DATA 6
#define DATA_CLR 0xFFFFFC3F

#define LCD_E  0x100     //PA8
#define LCD_RS 0x200     //PA9

#define CMD 0
#define TXT 1

#define        LINE1    0x80        // İLK SATIR LCD_GOTO(1,X) İÇİN
#define        LINE2    0xC0        // 2. SATIR YÖNLENDİRME LCD_GOTO(2,X) İÇİN

void WaitLCDBusy(void);
void lcd_init(void);
void LCD_DATA(unsigned char data,unsigned char type);
void LCD_NYB(unsigned char nyb,unsigned char type);
void LCD_STR(const char *text);
void LCD_STR2(unsigned char *text);
void LCD_LINE(char line);
void DelayMS(unsigned int ms);
void delay(int ticks);

void initDiscovery(void);


4_bit_lcd.c

/*
/*
 * 4_bit_lcd.c
 *
 *  Created on: Mar 1, 2013
 *      Author: Kaan
 */
#include "stm32f4xx.h"
#include "4_bit_lcd.h"


void delay(int ticks) //us sevıyesınde beklme suresi
{
  while(ticks--);
}

void lcd_init(void) //lcd ayarlaı set edıliyor
{
    CMD_PORT &= ~(LCD_E);  //LCD_E = 0;                    //Enable 0 la
    CMD_PORT &= ~(LCD_RS); //LCD_RS = 0;                 //yazmaya hazırlan

    DelayMS(30);                //BASLAMADAN ÖNCE STABİLİZASYON AYARI
    LCD_NYB(0x30,0);              //BASLAMA SATIRI
    DelayMS(5);
    LCD_NYB(0x30,0);              //BAŞLAMA SATIRI
    DelayMS(1);
    LCD_DATA(0x02,0);           //4 BİT GÖNDERİLECEK HAZIRLAN, 1 line and 5*7 font
    LCD_DATA(0x28,0);           //4 BİT GÖNDERİLECEK HAZIRLAN, 2 line and 5*10 font
    LCD_DATA(0x0c,0);           //4 BİT GÖNDERİLECEK HAZIRLAN, 2 line and 5*7 font
    LCD_DATA(0x01,0);           //EKRANI TEMİZLE
    LCD_DATA(0x06,0);           //move cursor right after write
}

//--------------------------------------------------------------------------------//
void LCD_DATA(unsigned char data,unsigned char type){

    WaitLCDBusy();                  //MESGUL OLABİLİR BİRAZ GECİKME KOYDUK

    if(type == CMD){
        CMD_PORT &= ~(LCD_RS);                 //KOMUT MOD
    } else {
        CMD_PORT |= LCD_RS;                 //KARAKTER/DATA MOD
    }

    LCD_NYB(data>>4,type);               //WRITE THE UPPER NIBBLE
    LCD_NYB(data,type);                  //WRITE THE LOWER NIBBLE
}
//--------------------------------------------------------------------------------//
void WaitLCDBusy(void){
    DelayMS(2);              //DELAY 1 MİLİSANİYE
}
//--------------------------------------------------------------------------------//
void LCD_NYB(unsigned char nyb,unsigned char type){
    DATA_PORT &= DATA_CLR;    //LCD_PORT &= 0xF0;                     //CLEAR LOWER PORT NIBBLE
    DATA_PORT |= (nyb<<DATA); //LCD_PORT |= (nyb & 0x0F);             //SATIR BİLGİSİ GÖNDER

    if(type == CMD){
        CMD_PORT &= ~(LCD_RS);                 //KOMUT MOD
    } else {
        CMD_PORT |= LCD_RS;                 //KARAKTER/DATA MOD
    }

    CMD_PORT |= LCD_E;    //LCD_E = 1;          //AKTİF LCD DATA LINE
    delay(100);
    CMD_PORT &= ~(LCD_E); //LCD_E = 0;       //DEAKTİF LCD DATA LINE
}
//--------------------------------------------------------------------------------//
void LCD_STR(const char *text){ // lcd 1. satır yazmak ıcın
    while(*text){
        LCD_DATA(*text++,1);
    }
}
void LCD_STR2(unsigned char *text){ //lcd 2. satır için yaz
    while(*text)
    {
        LCD_DATA(*text++,1);
    }
}
//--------------------------------------------------------------------------------//
void LCD_LINE(char line){ //lcd goto yerıne line olarak belirledik
    switch(line){
        case 0:
        case 1:
            LCD_DATA(LINE1,0);
            break;
        case 2:
            LCD_DATA(LINE2,0);
            break;
    }
}
//--------------------------------------------------------------------------------//

//--------------------------------------------------------------------------------//
void DelayMS(unsigned int ms){
    unsigned int x;
    for(x=0;x<ms;x++)
        delay(600);
}
void initDiscovery(void)
{
  RCC->CFGR = RCC_CFGR_SW_HSE;
  RCC->AHB1ENR = RCC_AHB1ENR_GPIOAEN|RCC_AHB1ENR_GPIOCEN;
  RCC->CR |= RCC_CR_HSEON;

  while((RCC->CR & RCC_CR_HSERDY)==0);

  GPIOC->MODER=GPIO_MODER_MODER6_0|GPIO_MODER_MODER7_0|GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0;
  GPIOA->MODER=GPIO_MODER_MODER8_0|GPIO_MODER_MODER9_0;

  GPIOC->OSPEEDR = GPIO_OSPEEDER_OSPEEDR6_1 | GPIO_OSPEEDER_OSPEEDR7_1 | GPIO_OSPEEDER_OSPEEDR8_1 | GPIO_OSPEEDER_OSPEEDR9_1;
  GPIOA->OSPEEDR = GPIO_OSPEEDER_OSPEEDR8_1 | GPIO_OSPEEDER_OSPEEDR9_1;
}


hatalarımı ve ne yapmam gerektıgını yazarsanız cok sevınırım yardımlarınızı beklıyorum.

Kaanx

LCD DE ALDIGIM GÖRUNTU ORADAKİ BELİRSİZ KARAKTER DEGISIYOR FAKAT SAYI OLARAK GÖREMİYORUM ACIKLAMASININ http://www.mcu-turkey.com/msp430-uyg-26/ GİBİ OLDUGUNU DUSNDUM FAKAT Bİ YERDE HATAM VAR YARDIMLARINI BEKLIYORUM.


marecrisium

void deger_goster(uint32_t ham)

Bu fonsiyona while içinden ADC3->DR registerini göndermişsin. ham değişkeni ile bunu almışsın ama bunu hiç kullanmamışsın. Yanlış değer göstermesi normal.

Kaanx

Adc3Convertedvalue=ADC3->DR mi yapmam gerekiyor ? zahmet olmazsa yazabilir misiniz ?

marecrisium

 void deger_goster(uint32_t ham) içindeki ham değeri senin ADC den okuduğun değerdir. Bu veriyi kullanarak dönüşümlerini yap.
Örneğin 10 bit için  gerilim=ham*3.3/1024 tür. Buradan yola çıkarak kendin yazabilirsin.

Kaanx

#5
Hocam ben onu main de while dongusunun ıcersınde su sekılde tanımlamıstım aynı yola cıkmıyor mu ?
while(1)
      {
          ADC3ConvertedVoltage = ADC3ConvertedValue *3300/0xFFF;

          deger_goster(ADC3->DR);

      }


Ve deger göster bolumunde su sekılde işlemeye calıstım
void deger_goster(uint32_t ham)
{

      uint32_t v=0,mv=0;
      uint8_t text[50];

      v=(ADC3ConvertedVoltage)/1000+48;
      mv = (ADC3ConvertedVoltage%1000)/100+48;
      sprintf((char*)text,"   ADC = %d,%d V   ",v,mv);



  LCD_LINE(1);
  LCD_STR2("10 Bit  = ");
  integer_yaz(ADC3->DR,v);

  LCD_LINE(2);
  LCD_STR2("Gerilim = ");
  integer_yaz(ADC3ConvertedVoltage,mv);

marecrisium

 ADC3ConvertedValue değişkenine nerede değer atıyosun göremedim hala ?

Kaanx

uint16_t ADC3ConvertedValue=0;


uint olarak aldıgını dusunerekten ADC3->DR= ADC3ConvertedValue eşitliğini yapmamamıstım ben bunu mu yapmam gerekıyor ?

marecrisium

ADC3ConvertedValue = ADC3->DR yapman gerekir.

Kaanx

Hocam dediğnizi mainde yazarak ve deger_goster fonksıyonları ıcerısınde yazarak denedim fakat sonuc degısmedi ekranda deger oln yerlerde kıpırdamalar var fakat sayı olarak gözukmuyor.lcd de karakterleri göremıyrm yani

marecrisium

int main(void)
{  int adcdeger=0;
    char adcchar[16];
     initDiscovery();
      lcd_init();
      DelayMS(3);
        LCD_LINE(1);
        LCD_STR("ADC-1");
        DelayMS(100);
        LCD_LINE(2);
        LCD_STR("Kaan Kandemir");
        DelayMS(100);
      /*ADC3 ayarları
       * Periphal clock aktif edilir
       * DMA2 stream0 kanal2 ayarları yapılır.
       * ADC3 kanal12 analog giriş olarak tanımlanır
       * ADC3 kanal12 ayarları set edilir.*/
      ADC3_CH12_DMA_Config();
      //Adc3 yazılımsal olarak çevrim baslatma
      ADC_SoftwareStartConv(ADC3);

   while(1)
{
   adcdeger=ADC3->DR;
   sprintf(adcchar,"ADC %d",adcdeger);
   LCD_STR2(adcchar);

}

}


Şu kodu bir dene gerekli yerleri düzenle,bu mantıkla çalışması gerekir. adc değerini düzgün olarak okuduktan sonra istediğin işlemi yapabilirsin bu değer ile.

Kaanx

Hocam tesekkurler dedikleriniz denicem. olmazsa başka bahara artık geçicem bu konuyu :) While(1) ile sonsuz dönguye girmıyor kit pot tan deger degıstırıyorum ledlerın yanması gerek fakat resetledıkten sonra komuta göre led yanıyor.

SrtG

{
 LCD_STR2(deger/1000+48);
 LCD_STR2((deger%1000)/100+48);
 if(flag==1) LCD_STR2('.');
 LCD_STR2((deger%100)/10+48);
 LCD_STR2((deger)%10+48);
}


bu bölümlerde;

main.c(148): error:  #167: argument of type "unsigned int" is incompatible with parameter of type "unsigned char *"

hatasıyla karşılaşıyorum.

if(flag==1) LCD_STR2('.'); 
satırında ise
main.c(150): error:  #167: argument of type "int" is incompatible with parameter of type "unsigned char *"

hatası alıyorum. aynı şekilde,

LCD_STR2(adcchar);

satırında da adcchar  yukarıda char adcchar[16]; olarak tanımlandığı için yine aynı hatayı alıyorum...

Bunları nasıl düzeltebilirim...
Ayrıca Resimde oluşturduğun devrenin bağlantılarını ya da şemasını da yazabilir misin?
Teşekkürler.

respected

Kaanx yaptınmı ? Eğer olmadıysa  proje olarak gönderebilirim. Daha önce LCD ile epey uğraşmıştım. Hatta burada rw ucu kullanmadan sürülen dosyayı paylaşmıştım.

SrtG

Alıntı yapılan: respected - 10 Haziran 2013, 15:08:09
Kaanx yaptınmı ? Eğer olmadıysa  proje olarak gönderebilirim. Daha önce LCD ile epey uğraşmıştım. Hatta burada rw ucu kullanmadan sürülen dosyayı paylaşmıştım.

projeyi gönderirsen çok yardımcı olmuş olursun gerçekten...