15 Ağustos 2020, 11:07:54

Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME


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

Tagli

20 Ocak 2020, 17:06:46 #7 Son düzenlenme: 20 Ocak 2020, 17:50:05 Tagli
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, 20: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

21 Ocak 2020, 06:10:11 #9 Son düzenlenme: 21 Ocak 2020, 13:12:59 AsHeS
Alıntı yapılan: Tagli - 20 Ocak 2020, 17: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 ??