19 Ocak 2020, 22:35:11

Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H


Binary Led (Nerede Yanlış Yapıyorum)

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

ktulgar

12 Ocak 2020, 18:41:07 Son düzenlenme: 13 Ocak 2020, 16:11:11 mehmet Sebep: Kodları "Code" butonu ile paylaşıyoruz.
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=i<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_ClkInitStructFLASH_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(GPIOAGPIO_PIN_7GPIO_PIN_RESET);

  
  
HAL_GPIO_WritePin(GPIOCGPIO_PIN_4|GPIO_PIN_5GPIO_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 *fileuint32_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

13 Ocak 2020, 22:53:05 #2 Son düzenlenme: 14 Ocak 2020, 14:12:18 HAKKITANIR
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 - 14 Ocak 2020, 02: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