15 Kasım 2018, 23:08:50

Haberler:

Picproje Pazar Sohbetleri: https://bit.ly/2GHsjAK


STM8'DE if else fonksiyonu

Başlatan isoment01, 05 Kasım 2018, 17:16:14

isoment01

05 Kasım 2018, 17:16:14 Son düzenlenme: 05 Kasım 2018, 17:57:04 isoment01
Arkadaşlar basit bir buton artır, azalt komutum var fakat tutarsız çalışıyor. buton up komutları düzgün işlerken, down komutları işlemiyor vs. kodlarım ve devre şemam burada yardımlarını bekliyorum.
Kod Seç
/* Includes ------------------------------------------------------------------*/
#include "stm8s.h"
#include "flash.h"
#include "main.h"

/**
  * @addtogroup GPIO_Toggle
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Evalboard I/Os configuration */

#define LED_GPIO_PORT  (GPIOC)
#define LED_GPIO_PINS  (GPIO_PIN_7 | GPIO_PIN_6 | GPIO_PIN_5 | GPIO_PIN_4 | GPIO_PIN_3)
#define BUTTON_PORT (GPIOD)
#define BUTTON_DIM_UP  (GPIO_PIN_4)
#define BUTTON_DIM_DOWN  (GPIO_PIN_5)
char Dimdizi[10] = {184152104200136112208161600}; // %0 den %100'e kadar ki dim voltajları
int i;

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/


/* Private function prototypes -----------------------------------------------*/
void Delay (uint16_t ui16Count);
void ConfigureClock(void);



/* Main program.*/

void main(void)
{

    
ConfigureClock();
//enableInterrupts();
//  GPIO_setup();
GPIO_Init (LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINSGPIO_MODE_OUT_OD_LOW_FAST);
GPIO_Init (BUTTON_PORT, (GPIO_Pin_TypeDef)BUTTON_DIM_UP,GPIO_MODE_IN_PU_NO_IT);
GPIO_Init (BUTTON_PORT, (GPIO_Pin_TypeDef)BUTTON_DIM_DOWNGPIO_MODE_IN_PU_NO_IT);

  
int status11;
  
int status21;

iFlashRead(DIM_ADDRESS);
    if(
i<|| i>9)
      {
      
i=5;
      }

  while (
1)
  {


 
    if ((
GPIO_ReadInputData(BUTTON_PORT) & (BUTTON_DIM_UP)) == (u8)0x00 )
    {
      if (
status1==1)
      {

    
status1=0;
    
i++;

    if(
i>=9i=9;          
      }
      
Delay(5000);
    
FlashWrite(DIM_ADDRESSi);
 
    }
    else 
status1=1;
  
    if ((
GPIO_ReadInputData(BUTTON_PORT) & (BUTTON_DIM_DOWN)) == (u8)0x00 )
    {
      if (
status2==1)
      {
    
      
status2=0;
      
i--;
    
      if(
i<=0i=0;
      }
      
Delay(5000);
    
FlashWrite(DIM_ADDRESSi);
  
    }
    
    else 
status2=1;


    
GPIO_WriteGPIOC,  Dimdizi[i]);
  
  

  }


}

//-********-*-*-*-*-***-*-***************
void ConfigureClock()
{
  
CLK_DeInit();
  
CLK_HSIPrescalerConfig(CLK_PRESCALER_HSIDIV4);
}
//------------------------
//-----------------------------------
void Delay(uint16_t nCount)
{
  
/* Decrement nCount value */
  
while (nCount != 0)
  {
    
nCount--;
  }
}
//**********************************

#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_tfileuint32_t line)
{
  
/* User can add his own implementation to report the file name and line number,
    ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */

  /* Infinite loop */
  
while (1)
  {
  }
}
https://hizliresim.com/DDLyo3

eeburakdemir

Merhaba,
Neden kontrol şartları içinde portları bitwise işlemine tabi tutuyorsunuz ? Yazılımın öyle mi olması gerekiyor ? yoksa basit bir artır, azalt ile dim mi yapmaya çalışıyorsunuz ?
Asla pes etme...

alone_lover

06 Kasım 2018, 06:02:32 #2 Son düzenlenme: 06 Kasım 2018, 06:03:39 alone_lover
Detaylı incalayemedim fakat:
Kod Seç
if ((GPIO_ReadInputData(BUTTON_PORT) & (BUTTON_DIM_DOWN)) == (u8)0x00 )
gibi if komutlarındaki "&" yerine "&&" koyarak deneyebilir misin?
Şöyle:

Kod Seç
if ((GPIO_ReadInputData(BUTTON_PORT) && (BUTTON_DIM_DOWN)) == (u8)0x00 )

isoment01

Alıntı yapılan: eeburakdemir - 05 Kasım 2018, 20:40:53Merhaba,
Neden kontrol şartları içinde portları bitwise işlemine tabi tutuyorsunuz ? Yazılımın öyle mi olması gerekiyor ? yoksa basit bir artır, azalt ile dim mi yapmaya çalışıyorsunuz ?
hocam merhaba, ordaki bitwise işlemleri aslında convertörümün çıkış gerilimini ayarlıyor. Oradaki değerlere göre port çıkışlarında multiple voltage divider ile   converter çıkışını ayarlıyor hocam.

isoment01

Alıntı yapılan: alone_lover - 06 Kasım 2018, 06:02:32Detaylı incalayemedim fakat:
Kod Seç
if ((GPIO_ReadInputData(BUTTON_PORT) & (BUTTON_DIM_DOWN)) == (u8)0x00 )
gibi if komutlarındaki "&" yerine "&&" koyarak deneyebilir misin?
Şöyle:

Kod Seç
if ((GPIO_ReadInputData(BUTTON_PORT) && (BUTTON_DIM_DOWN)) == (u8)0x00 )
bunu denedim hata verdi neden bu sintax kullanılmış anlamadım. Örnekten almıştım. Kütüphanede böyle tanımlanmıştı galiba tekrar bakmam lazım. Fakat aynı kodlar up için de var orda bir sıkıntı yok cidden hala çözebilmiş değilim

crazy

08 Kasım 2018, 01:57:39 #5 Son düzenlenme: 08 Kasım 2018, 02:11:23 crazy
Alıntı yapılan: isoment01 - 08 Kasım 2018, 00:42:28bunu denedim hata verdi neden bu sintax kullanılmış anlamadım. Örnekten almıştım. Kütüphanede böyle tanımlanmıştı galiba tekrar bakmam lazım. Fakat aynı kodlar up için de var orda bir sıkıntı yok cidden hala çözebilmiş değilim
if ((GPIO_ReadInputData(BUTTON_PORT) && (BUTTON_DIM_DOWN)) == (u8)0x00 ) yerine
&  kullanman lazım. (Portd 5 bitinin 1 mi 0 kontrol ediyorsun.)
if(GPIOD->IDR &0x0020) != 0)
Linkte örnek işine yarıyabilir.
https://www.newbiehack.com/categories/newbiehack-tutorial-ARM-created625201661927PM-nomenu

isoment01

Alıntı yapılan: crazy - 08 Kasım 2018, 01:57:39if ((GPIO_ReadInputData(BUTTON_PORT) && (BUTTON_DIM_DOWN)) == (u8)0x00 ) yerine
&  kullanman lazım. (Portd 5 bitinin 1 mi 0 kontrol ediyorsun.)
if(GPIOD->IDR &0x0020) != 0)
Linkte örnek işine yarıyabilir.
https://www.newbiehack.com/categories/newbiehack-tutorial-ARM-created625201661927PM-nomenu
Alıntı yapılan: crazy - 08 Kasım 2018, 01:57:39if ((GPIO_ReadInputData(BUTTON_PORT) && (BUTTON_DIM_DOWN)) == (u8)0x00 ) yerine
&  kullanman lazım. (Portd 5 bitinin 1 mi 0 kontrol ediyorsun.)
if(GPIOD->IDR &0x0020) != 0)
Linkte örnek işine yarıyabilir.
https://www.newbiehack.com/categories/newbiehack-tutorial-ARM-created625201661927PM-nomenu
merhaba zaten o şekilde kullanıyorum hocam

eeburakdemir

Merhaba,
Kodun nasıl çalıştığını kontrol etmek için up kısmını comment edip down kısmını çalıştırın. Birde böyle deneyelim. En azından neden olduğunu görelim. Ayrıca buton okuma kısmındaki pull up dirençlerini büyütün. Küçük değerleri takarsaniz hassasiyet artar. 10k gibi bir değere yükseltin. Hatta şunu da ekleyelim en son; timer kurup girişleri 100ms de bir şeklinde okuma yapabilirsiniz.
Asla pes etme...

isoment01

Alıntı yapılan: eeburakdemir - 08 Kasım 2018, 21:30:50Merhaba,
Kodun nasıl çalıştığını kontrol etmek için up kısmını comment edip down kısmını çalıştırın. Birde böyle deneyelim. En azından neden olduğunu görelim. Ayrıca buton okuma kısmındaki pull up dirençlerini büyütün. Küçük değerleri takarsaniz hassasiyet artar. 10k gibi bir değere yükseltin. Hatta şunu da ekleyelim en son; timer kurup girişleri 100ms de bir şeklinde okuma yapabilirsiniz.
evet onu yapayım. Timer'a girişleri okutup bunu nasıl yorumlayacagız. Hatayı nasıl görmemize yarayacak ? Bir de bu arada donanımsal olarak sanırım 6k8 yapmıstım ama bir sonuc alamamıstım daha da yükseltecegım. Normalde girişler 3v3 ile 0 arasında gitmesi gerek değil mi. Tlp nin çıkısını okudugumda bazen sapma oluyor 2.2V 1.8V vs. gibi değerler  görüyorum dicem ki sorun burda sonucta datasheete baktıgımda 1v un altındaki değerleri lojik 0 gösteriyor gpiolarda ama bazen bu degerleri gördüğümde de up down yapıyorum o zaman kafam karışıyor. 2.2V 1.8V arası değerler görmem pull up direncınden kaynaklı değil mi ?

eeburakdemir

** Sizin programınızda up kısmı çalışıyordu hatırladığım kadarıyla. Bu bloğu comment yapın dememin amacı down kısmının doğru çalıtığından emin olmak.

** 100ms de bir girişleri okuyun dememin sebebi de, her okumayı belirli aralıklarda yapın. Örneğin, sürekli bir while döngüsü içinde giriş okumayın. Belirli aralıklarda okuma yapın ki mcu sürekli meşgul olmasın. Kalan zamanlarda diğer işleri yapsın. Hatta butona basıldığında timer başlatın, süre sonunda butonda hala sinyal var mı ? gibi düşünebilirsiniz. 1ms kesme kurun, girişleri okuyun. Buna system timer deniliyor.

** Çıkıştaki voltajların değişmesinin sebebi butona basılıp çekilirken oluşan debounce'dan kaynaklıdır. Giriş direncini düşürürseniz ve çıkış direncini de düşürürseniz hassasiyetlik artar. Bir önceki açıklamam da bundan bahsetmiştim. Opto nun datasheetinden giriş akımına göre çıkışın tepkisi olan grafiği incelemenizi öneririm. Ama sizin programsal bir sorundan ziyade donanım kısmını da kontrol edin derim. Optoların girişindeki 100nf gereksiz. Buton okumak için filtreye gerek yok yani. ( Siz bilirsiniz yine de ) Totalde 4k7 gibi bir dirençle sürmüşsünüz girişi gördüğüm kadarıyla, giriş siyali nedir ? Çıkışların pull up direncini yükseltin.

** Bunları yaptınız sinyalleri kontrol ettiniz ve sorun yoksa yazılım kısmında önerilerimi adım adım yapın derim ki nerede çakıldığınızi rahat bulun.
Asla pes etme...