ADC devreye girince dma+usart hatalı veri yolluyor.

Başlatan tekosis, 22 Kasım 2018, 14:47:15

tekosis

22 Kasım 2018, 14:47:15 Son düzenlenme: 22 Kasım 2018, 14:49:13 tekosis
Kolay gelsin.

Aşağıda verdiğim kodda while döngüsünün içindeki adc okuma kısmını iptal edip bir delay koyduğum zaman fonksiyondaki dma kodu ile usart üzerinden veri yolladığımda problem yok. Ancak adc okuma satırlarını aktifleştirince bazen giden verinin sonuna <00>™ kodları ekleniyor, bunlara bir anlam veremedim. 9600 baudda da aynı hataları alıyorum. Bu hatanın sebebini bulamadım neden olabilir acaba?
program kodları :
//***************************************************************
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
 
HAL_UART_DMAStop(&huart1); //bunu kullanmak ya da kullanmamak hatayı etkilemiyor.
}
//***************************************************************
void denemeFonksiyonu1(){
 
HAL_UART_Transmit_DMA(&huart1,(uint8_t *)adc_veri_16bit,10000); 
}
//***************************************************************
int main(void)
{
  
HAL_Init();  SystemClock_Config();  MX_GPIO_Init();  MX_DMA_Init();
  
MX_USART1_UART_Init();  MX_ADC1_Init();
 for(
sayac=0;sayac<5000;sayac++){
 
adc_veri_16bit[sayac]=0x4142;// A ve B ascii değerleri
 

 
denemeDegeri=1;

  while (
1)
  {
   
// AŞAĞIDA KAPATILAN BLOK AKTİF EDİLDİĞİNDE HATALI VERİ ALIYORUM.
   
   /*  adc_veri_16bit[0]=0;adc_veri_16bit[1]=0;adc_veri_16bit[2]=0;
   while(!(((adc_veri_16bit[1]>TriggerDegeri) && (adc_veri_16bit[1]<TriggerDegeri+10)) && (adc_veri_16bit[1]<adc_veri_16bit[2]) 
 && (adc_veri_16bit[1]>adc_veri_16bit[0])))
 { 
 HAL_ADC_Start(&hadc1);
 adc_veri_16bit[0]=HAL_ADC_GetValue(&hadc1);
 HAL_ADC_Start(&hadc1);
 adc_veri_16bit[1]=HAL_ADC_GetValue(&hadc1); 
 HAL_ADC_Start(&hadc1);
 adc_veri_16bit[2]=HAL_ADC_GetValue(&hadc1); 
 } 
 adc_veri_16bit[0]=0x4142;
 adc_veri_16bit[1]=0x4142;
 adc_veri_16bit[2]=0x4142;
 */ 
 
HAL_Delay(1000);

 switch(
denemeDegeri)
   {
   case 
1denemeFonksiyonu1(); break;
   case 
2denemeFonksiyonu2(); break;
   case 
3denemeFonksiyonu3(); break;
   default : break;
   } 
  }
}

init ayarları:
//***************************************************************
static void MX_ADC1_Init(void)
{
  
ADC_ChannelConfTypeDef sConfig;
  
hadc1.Instance ADC1;
  
hadc1.Init.ScanConvMode ADC_SCAN_DISABLE;
  
hadc1.Init.ContinuousConvMode ENABLE;
  
hadc1.Init.DiscontinuousConvMode DISABLE;
  
hadc1.Init.ExternalTrigConv ADC_SOFTWARE_START;
  
hadc1.Init.DataAlign ADC_DATAALIGN_RIGHT;
  
hadc1.Init.NbrOfConversion 1;
  if (
HAL_ADC_Init(&hadc1) != HAL_OK)
  {
    
_Error_Handler(__FILE____LINE__);
  }
  
sConfig.Channel ADC_CHANNEL_0;
  
sConfig.Rank ADC_REGULAR_RANK_1;
  
sConfig.SamplingTime ADC_SAMPLETIME_1CYCLE_5;
  if (
HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  {
    
_Error_Handler(__FILE____LINE__);
  }
}
//***************************************************************
static void MX_USART1_UART_Init(void)
{
  
huart1.Instance USART1;
  
huart1.Init.BaudRate 115200;
  
huart1.Init.WordLength UART_WORDLENGTH_8B;
  
huart1.Init.StopBits UART_STOPBITS_1;
  
huart1.Init.Parity UART_PARITY_NONE;
  
huart1.Init.Mode UART_MODE_TX_RX;
  
huart1.Init.HwFlowCtl UART_HWCONTROL_NONE;
  
huart1.Init.OverSampling UART_OVERSAMPLING_16;
  if (
HAL_UART_Init(&huart1) != HAL_OK)
  {
    
_Error_Handler(__FILE____LINE__);
  }
}
//***************************************************************
static void MX_DMA_Init(void
{
  
__HAL_RCC_DMA1_CLK_ENABLE();
  
HAL_NVIC_SetPriority(DMA1_Channel1_IRQn00);
  
HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
  
HAL_NVIC_SetPriority(DMA1_Channel4_IRQn00);
  
HAL_NVIC_EnableIRQ(DMA1_Channel4_IRQn);
}
bunlar da cubemx ayarlarım:

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

tekosis

Çözüldü.
HAL_UART_TxCpltCallback ve DMA1_Channel4_IRQHandler içine bir kontrol biti koyup ana programda bunları izledim. şimdilik bununla problem çözüldü gibi görünüyor ama ilerleyen aşamalarda belki başka problemlere sebep olabilir. Şimdilik bu kodla ilerleyeceğim.

void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart){
 
usartTransmitDurumu=1;
 
//HAL_UART_DMAStop(&huart1); 
}
   
void DMA1_Channel4_IRQHandler(void)
{
 
dmakesmesioldumu=1;
  
HAL_DMA_IRQHandler(&hdma_usart1_tx);
}   
   
   
//Aşağıdaki program satırları ilk mesajımdaki ana programın ilgili kısımlarıdır...
   
   
while(usartTransmitDurumu!=|| dmakesmesioldumu!=1)
   {
   }
   
usartTransmitDurumu=0;
   
dmakesmesioldumu=0
 
 
adc_veri_16bit[0]=0adc_veri_16bit[1]=0adc_veri_16bit[2]=0;
     
   while(!(((
adc_veri_16bit[1]>TriggerDegeri) && (adc_veri_16bit[1]<TriggerDegeri+10)) && (adc_veri_16bit[1]<adc_veri_16bit[2]) 
 && (
adc_veri_16bit[1]>adc_veri_16bit[0])))
 {
 
HAL_ADC_Start(&hadc1);
 
//HAL_ADC_PollForConversion(&hadc1,100);
 
adc_veri_16bit[0]=HAL_ADC_GetValue(&hadc1);
 ..................
 ..................
 ..................
 ..................
 
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Yasal Uyarı: Picproje.org sitemizde 5651 sayılı kanunun 8. maddesine ve T.C.Knın 125. maddesine göre tüm üyelerimiz yaptıkları paylaşımlardan kendileri sorumludur. Picproje.org hakkında yapılacak tüm hukuksal şikayetleri İletişim sayfamızdan bize bildirdikten en geç 3 (üç) iş günü içerisinde ilgili kanunlar ve yönetmelikler çerçevesinde tarafımızca incelenerek gereken işlemler yapılacak ve site yöneticilerimiz tarafından bilgi verilecektir.