Haberler:

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

Ana Menü

stm8s003f3 eeprom sorunu

Başlatan isoment01, 02 Ekim 2018, 10:07:07

isoment01

Arkadaşlar merhaba, elimde Stm8s003f3 bulunmak ben bu mikroişlemcinin çıkış portlarını kullanarak bu portlara butonlarla belirli değerler göndermek bu değerleri eeproma kaydetmek istiyorum. İlk aşamada sıkıntım yok fakat eeproma kayıt ederken hata yaşıyorum şöyleki; mikrokontroller da enerji var iken eeprom kayıt yapıyor(bunu iarda görebiliyorum) fakat enerji kesildiğinde eeprom'un belleğindeki veri siliniyor ve benim eepromda veri yokken döndürmesini istediğim değerden başlıyor sisteme tekrar enerji verdiğimde.
 Kodum şu şekilde yardımlarını bekliyorum.
/* 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] = {184, 152, 104, 200, 136, 112, 208, 16, 160, 0}; // %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_PINS, GPIO_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_DOWN, GPIO_MODE_IN_PU_NO_IT);
  
  
  char status1= 1;
  char status2= 1;
  char status3= 1;  

  while (1)
  {
    
    i= FlashRead(DIM_ADDRESS);
    
    if (status3==1)
    {
      if(i==0) 
      {
      i=5;
      }
      
    }
    
     status3=0;
    // Check button status 
   
    if ((GPIO_ReadInputData (BUTTON_PORT) & (BUTTON_DIM_UP)) ==  (u8)0x00 )
    {
      if (status1==1)
      {
      Delay(20000);

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

    GPIO_Write( GPIOC,  Dimdizi[i]);
    
    FlashWrite(DIM_ADDRESS, 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_t* file, uint32_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)
  {
  }
}
#endif

isoment01

#ifndef __FLASH_H
#define __FLASH_H

#include <stm8s.h>

#define DIM_ADDRESS    0x4002


extern uint16_t FlashRead(uint16_t);
extern void FlashWrite(uint16_t address, uint16_t value);


#endif  /* __FLASH_H */

/*****END OF FILE****/
flash.h
#include "flash.h"

//*****************************************************************************
//
//! Get the value from flash memory.
//!
//! \param adress, address which will be read from flash memory.
//!
//! This function should be called by the application to get the value from
//! flash memory.
//!
//! \return readValue.
//
//*****************************************************************************
uint16_t FlashRead(uint16_t address)
{
  uint16_t readValue      = 0x00;
  
  /* Define FLASH programming time */
  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
  /* Unlock Data memory */
  FLASH_Unlock(FLASH_MEMTYPE_DATA);
  
  /* Read a byte at a specified address */
  readValue = FLASH_ReadByte(address + 1);
  readValue <<= 8;
  readValue |= FLASH_ReadByte(address);
  
  return readValue;
}

//*****************************************************************************
//
//! Set value to flash memory.
//!
//! \param adress, flash memory address to write.
//! \param value, value which will be written to  flash memory
//!
//! This function should be called by the application to write value to
//! flash memory.
//!
//! \return None.
//
//*****************************************************************************
void FlashWrite(uint16_t address, uint16_t value)
{
  
  /* Define FLASH programming time */
  FLASH_SetProgrammingTime(FLASH_PROGRAMTIME_STANDARD);
  
  /* Unlock Data memory */
  FLASH_Unlock(FLASH_MEMTYPE_DATA);
  FLASH_ProgramByte(address + 1, value >> 8);
  FLASH_ProgramByte(address, value & 0xff);
}
flash.c

JKramer

Eeprom'un belli bir yazma ömrü var, ana döngüde sürekli eeprom'a yazıyorsunuz. Eeprom'un başka bir kısmını deneyebilirsiniz, belki bozulmamıştır.

isoment01

Hocam yaptığı her işlemi belli bir adreste güncellemesi lazım değil mi sürekli zaten ? Çünkü enerji-aç kapa yapıldığı an son veriyi açılışta dönderecek..

Mucit23

Eeprom böyle bir kullanım için uygun depolama alanı değil. Static Ram kullanabilirsiniz. RTC içlerinde Backup Register'lar var ve VBAT pininde enerji olduğu sürece içeriği silinmiyor.

isoment01

#5
Hocam neden uygun değil daha açık anlatır mısınız bir de benim kodlarımda mantıksal bir hata var mı ? Uygun olmayabilir bunu anlıyorum fakat doğru çalışmamasını pek anlayamıyorum. Bu işlemler çok sık tekrarlanan işlemler olmayacak bu arada günde bir kaç defa. Dahası bizim olayımız zaten sistemden enerji kesildiğinde son değeri tutup, açılışta bu değerle başlaması bunun için eeprom nasıl uygun olmaz ?

JKramer

Önce kullandığınız mikrodenetleyicinin kataloğuna bakıp eeprom'un ömrüne, yani kaç kere yazılabileceğine bakın. Daha sonra uygulamanızda, eeprom'a hangi aralıklarla yazacağınıza göre ömrünün ne zaman biteceğini tespit edin. Çıkan sonuç uygunsa sizin için, bir sorun yok demektir.

Bunun dışında ilk mesajda verdiğiniz, deneme yaparken kullandığınız kodun döngüyü ne kadar sürede tamamladığına, yani ne kadar sık eeprom'a yazdığına bakın. Eeprom ömrüne zaten bakmıştınız, devreyi ne kadar süre çalıştırdığınıza... of yoruldum, anlamışsınızdır artık :).

isoment01

#7
100k imiş operasyon sayısı fakat sanırım benim kodlarım da hatalı, while ın içinde sürekli değeri eeproma kaydediyorum ki bu döngünün çok hızlı olacagını düşünürsek sanırım yanlış yapıyorum. Kafam çok karıştı. Elektrikler gittiğinde devreye girmesi lazım aslında sadece bunu devre üzerinde oynama yapmadan nasıl yapabilirim. Yani kapasitörlerle vs olabilir mi.
Alıntı yapılan: JKramer - 02 Ekim 2018, 11:45:09Önce kullandığınız mikrodenetleyicinin kataloğuna bakıp eeprom'un ömrüne, yani kaç kere yazılabileceğine bakın. Daha sonra uygulamanızda, eeprom'a hangi aralıklarla yazacağınıza göre ömrünün ne zaman biteceğini tespit edin. Çıkan sonuç uygunsa sizin için, bir sorun yok demektir.

Bunun dışında ilk mesajda verdiğiniz, deneme yaparken kullandığınız kodun döngüyü ne kadar sürede tamamladığına, yani ne kadar sık eeprom'a yazdığına bakın. Eeprom ömrüne zaten bakmıştınız, devreyi ne kadar süre çalıştırdığınıza... of yoruldum, anlamışsınızdır artık :).