Binary Led (Nerede Yanlış Yapıyorum)

Başlatan ktulgar, 12 Ocak 2020, 15:41:07

ktulgar

Ledleri binary bir şekilde yakıp söndürmek istiyorum. 1 -> 2 -> 3 -> 0 ve en baştan bir


Programı karta atınca ilk sefer istediğim şekilde çalışıyor ama sonra saçma bir sırayla yanıp sönüyorlar

Bunlarda kodlar bu dünyaya henüz yeniyim lütfen yardım eder misiniz?

#include "main.h"


void SystemClock_Config(void);
static void MX_GPIO_Init(void);


uint16_t conditions[3] = {0x0010,0x0020,0x0030};


int main(void)
{
  
  HAL_Init();

 
  SystemClock_Config();

  
  MX_GPIO_Init();
  
  while (1)
		
  {
		
		for(int i=0 ; i<3 ; i++) {
		
			GPIOC->ODR = conditions [i] ;
			HAL_Delay(1000);
		
		}
		
		  GPIOC->ODR = 0x0000;
		  HAL_Delay(1000);
	    
  }
 
}


void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  
  __HAL_RCC_PWR_CLK_ENABLE();
  __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);
  
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }
  
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
  {
    Error_Handler();
  }
}


static void MX_GPIO_Init(void)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};

  
  __HAL_RCC_GPIOH_CLK_ENABLE();
  __HAL_RCC_GPIOA_CLK_ENABLE();
  __HAL_RCC_GPIOC_CLK_ENABLE();

  
  HAL_GPIO_WritePin(GPIOA, GPIO_PIN_7, GPIO_PIN_RESET);

  
  HAL_GPIO_WritePin(GPIOC, GPIO_PIN_4|GPIO_PIN_5, GPIO_PIN_RESET);

 
  GPIO_InitStruct.Pin = GPIO_PIN_7;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  
  GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
  HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

}


void Error_Handler(void)
{
 
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

MrDarK

Hatanın nerede olduğunu anlayamadım. Ama direkt sıfırlamak yerine şunu deneyebilirsin.

//GPIOC->ODR = 0x0000; //-> Buradaki kod yerine şunu kullanabilirsin.
GPIOC->ODR &= ~0x0030;

Birde önerim bu tarz işlemler için direkt fiziksel erişim yerine hal library fonksiyonları ile pinleri aktif edebilirsin.
Picproje Eğitim Gönüllüleri ~ MrDarK

HAKKITANIR

#2
Hoşgeldiniz,

uint16_t conditions[3] = {0x0010x0020x0040};

bunu bir dener misiniz.

ilgili çıkış led portunda 0X0030 yerine, 0X0040 yazmanız gerekmediğinden eminmisiniz.
0X0030 ile 0X0010 ve 0X0020 deki ledlerin ikisi birden yanar yanlış değilsem.
2 ledli çalışılmıyor değil mi? toplam 3 led olacak yani anladığım kadarıyla.

agora_meyhanesi42

For döngüsü bittikten sonra "i" değişkenini sıfırlaman gerekiyor. i=0
Yüksel Türk ! Senin için yükselmenin hududu yoktur...

ktulgar

Alıntı yapılan: agora_meyhanesi42 - 13 Ocak 2020, 23:47:19For döngüsü bittikten sonra "i" değişkenini sıfırlaman gerekiyor. i=0

for döngüsü bitip tekrar while e girerken i  zaten 0 oluyor ama 

Tagli

Kodunuzu "debug" ederek adım adım çalıştırın, register değerlerini kontrol edin. Öbür türlü insan saç baş yolar.
Gökçe Tağlıoğlu

ceyhanan

Hatanın sebebi donanımsal olarak yaptığın işlemin geçersiz olması, ODR registerı yerine BSRR registerını kullanırsan sorunun çözülür.

Donanım olarak bir bite doğrudan 1 yazabilirsin ancak 0 yazamazsın.

GPIOC->BSRR = 0xFFFF0000;
GPIOC->ODR = conditions[i];

şeklinde değiştirmelisin

Tagli

#7
Geçersiz olan işlem nedir? ODR'ye istediğin değeri yazabilirsin (16-bit olmak şartı ile), bunda bir sakınca yok.

Düzeltme: Dokümanda Word-mode ile erişime izin verildiği yazmış. Word-mode dediği 32-bit olsa gerek (bunu hatalı olarak 16-bit gibi düşünmüştüm). Bu register'ı daha önce hep sabit değerler ile kullanmıştım. Belki derleyicinin uygun kodu üretmesi için değişkenin 32-bit olması gerekiyordur. Atamadan hemen önce (uint32_t)'ye dönüştürülerek de denenebilir.
Gökçe Tağlıoğlu

AsHeS

Alıntı yapılan: ceyhanan - 17 Ocak 2020, 17:17:54Hatanın sebebi donanımsal olarak yaptığın işlemin geçersiz olması, ODR registerı yerine BSRR registerını kullanırsan sorunun çözülür.

Donanım olarak bir bite doğrudan 1 yazabilirsin ancak 0 yazamazsın.

GPIOC->BSRR = 0xFFFF0000;
GPIOC->ODR = conditions[i];

şeklinde değiştirmelisin
Böyle bir şey yok. User manuali dikkatli inceleyin lütfen.

AsHeS

#9
Alıntı yapılan: Tagli - 20 Ocak 2020, 14:06:46Geçersiz olan işlem nedir? ODR'ye istediğin değeri yazabilirsin (16-bit olmak şartı ile), bunda bir sakınca yok.

Düzeltme: Dokümanda Word-mode ile erişime izin verildiği yazmış. Word-mode dediği 32-bit olsa gerek (bunu hatalı olarak 16-bit gibi düşünmüştüm). Bu register'ı daha önce hep sabit değerler ile kullanmıştım. Belki derleyicinin uygun kodu üretmesi için değişkenin 32-bit olması gerekiyordur. Atamadan hemen önce (uint32_t)'ye dönüştürülerek de denenebilir.
ODR registerı 32 bit pointer olarak tanımlı kütüphanede 8 bit değişken bile olsa eşitlemede 32 bit e auto cast edilir. GCC nin 4 lü versiyonlarında 64-bit tutmuyordu ilginç şeyler yaşıyordunuz ama çözmüşlerdir en son 9 a gelmiş versiyon. Sorun muhtemel donanımsal kodda hata gözükmüyor.

Hangi pinlere bağlı bu ledler ??