Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => Konuyu başlatan: MrDarK - 11 Haziran 2015, 09:32:00

Başlık: Register Seviyesinde Erişim Hakkında
Gönderen: MrDarK - 11 Haziran 2015, 09:32:00
Merhaba arkadaşlar ;

Bugün emblocks ile çok enteresan bi hata ile sizlerle birlikteyim. Kullandığım mcu STM32L152VB. RTC donanımının bazı registerlarına erişirken sorun olmuyor fakat CR registerına erişmek istediğimde böyle bir hata üretti. Fakat kütüphane fonksiyonlarından CR registerına ulaşımları var. Neden kütüphane fonksiyonu erişebiliyorken ben erişemiyorum acaba bu registere.

Hata aldığım kod parçası


/***********************************************************
* Function Name  : SetStore_Operation
* Description    :
* Input          : None
* Return         : None
***********************************************************/
void SetStore_Operation(uint32_t Status)
{

    /* Disable the write protection for RTC registers */
    RTC->WPR = 0xCA;
    RTC->WPR = 0x53;

    RTC->CR = 0x00040000;

    /* Enable the write protection for RTC registers */
    RTC->WPR = 0xFF;



Hata Kodu ;
error: expected identifier before '(' token

RTC->CR registerını yoruma aldığımda hata ortadan kalkıyor. WPR registerlarına erişimde sıkıntı çıkartmamasına rağmen neden CR'ye hata veriyor anlayamadım.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: z - 11 Haziran 2015, 09:36:50
Kütüphane de ne yapıldıysa sen de öyle erişmiyormusun?

Registere erişmek için önce kilidi açmış. Sen yapmıyormusun bu işlemi?
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: MrDarK - 11 Haziran 2015, 09:46:43
Hocam zaten bu örnek kod benim main dosyam içindeki örnek kod.

RTC->CR dediğimde tanımsızmış gibi uyarı variyor demek istiyorum. RTC->CR = 0x00040000; bu komuta hata veriyor. Fakat kütüphane dosyaları her türlü CR registerına ulaşabiliyor. Bana hata verip derlememesine anlam veremedim.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: z - 11 Haziran 2015, 09:51:58
RTC CR farklı şekilde tanımlanmıştır. Kütüphane içindeki kodları da yazsana buraya. Açık kütüphane değilmi?

Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: MrDarK - 11 Haziran 2015, 09:57:47
Açık hocam standart peripheral library kodları

Bu örnek standart Lib'den


/**
  * @brief  Adds or substract one hour from the current time.
  * @param  RTC_DayLightSaveOperation: the value of hour adjustment.
  *   This parameter can be one of the following values:
  *     @arg RTC_DayLightSaving_SUB1H: Substract one hour (winter time).
  *     @arg RTC_DayLightSaving_ADD1H: Add one hour (summer time).
  * @param  RTC_StoreOperation: Specifies the value to be written in the BCK bit
  *                            in CR register to store the operation.
  *   This parameter can be one of the following values:
  *            @arg RTC_StoreOperation_Reset: BCK Bit Reset.
  *            @arg RTC_StoreOperation_Set: BCK Bit Set.
  * @retval None
  */
void RTC_DayLightSavingConfig(uint32_t RTC_DayLightSaving, uint32_t RTC_StoreOperation)
{
  /* Check the parameters */
  assert_param(IS_RTC_DAYLIGHT_SAVING(RTC_DayLightSaving));
  assert_param(IS_RTC_STORE_OPERATION(RTC_StoreOperation));

  /* Disable the write protection for RTC registers */
  RTC->WPR = 0xCA;
  RTC->WPR = 0x53;

  /* Clear the bits to be configured */
  RTC->CR &= (uint32_t)~(RTC_CR_BCK);

  /* Configure the RTC_CR register */
  RTC->CR |= (uint32_t)(RTC_DayLightSaving | RTC_StoreOperation);

  /* Enable the write protection for RTC registers */
  RTC->WPR = 0xFF;
}



Buda benimkisi

/***********************************************************
* Function Name  : SetStore_Operation
* Description    :
* Input          : None
* Return         : None
***********************************************************/
void SetStore_Operation(uint32_t Status)
{

    /* Disable the write protection for RTC registers */
    RTC->WPR = 0xCA;
    RTC->WPR = 0x53;

    RTC->CR |= RTC_StoreOperation_Set;

    /* Enable the write protection for RTC registers */
    RTC->WPR = 0xFF;
}


Benimkinde RTC->CR |= RTC_StoreOperation_Set; şu şekilde bir atamaya hata veriyor. Hatanın sebebi RTC_StoreOperation_Set bilgisinden kaynaklanmıyor. Herhangi sabit bir data da denedim yapmıyor. Bu kodu standart lib içine koyucam çözemezsem fakat çok saçma birşey nerede hata yapıyorum acaba.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: z - 11 Haziran 2015, 10:05:25
RTC->CR = (uint32_t) (Sabit);

Bu şekilde dene.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: MrDarK - 11 Haziran 2015, 10:07:52
Alıntı yapılan: z - 11 Haziran 2015, 10:05:25
RTC->CR = (uint32_t) (Sabit);

Bu şekilde dene.

Herhangi bir değişim yok hata aynı. Kütüphane kodu içine ekledim yazdığım o ek yeri. Derlendi ve çalışıyor. Bu ve bunun gibi bir ihtiyacım olduğunda nasıl yapacağım ben bu işi. Biraz daha derinlemesine insek mi hocam. Her problem yaşadığımda kütüphaneye kod eklemek saçma olur. Ayrıca MCU değiştirdiğimde kütüphaneleri unutma olasılığımda yüksek.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: z - 11 Haziran 2015, 10:14:38
Üstüne git bu sorunun.

  RTC->CR |= (uint32_t)(RTC_DayLightSaving | RTC_StoreOperation);
Üsttekinde sorun olmuyor alttakinde sorun oluyorsa

  RTC->CR |= RTC_StoreOperation_Set;

Aşağıdaki yazıma da kızmaması lazım.

  RTC->CR |= (uint32_t)(RTC_StoreOperation_Set);

Eğer kızmıyorsa RTC_StoreOperation_Set nasıl tanımlanmış ona da bir bakmak lazım.

Hala kızıyorsa anlam veremedim.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: MrDarK - 11 Haziran 2015, 10:16:57
Hocam zaten kızdığı şey RTC_StoreOperation_Set yazmak değil dediğim gibi ;

RTC->CR registerına main kodum içinden herhangi bir şekilde işlem yapmama kızıyor. Emblocks forumlarına da yazayım belki bi cevap gelir.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: yldzelektronik - 11 Haziran 2015, 10:24:20
İlk mesajında verdiğin hata kodu sanki syntax hatası yapmışsın gibi gözüküyor?
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: z - 11 Haziran 2015, 10:25:09
Kütüphane dosyasının başında bir şeyler include edilmişmi peki?
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: MrDarK - 11 Haziran 2015, 10:29:04
Alıntı yapılan: yldzelektronik - 11 Haziran 2015, 10:24:20
İlk mesajında verdiğin hata kodu sanki syntax hatası yapmışsın gibi gözüküyor?
Evet ilk mesajımda buraya yapıştırırken sorun olmuş, ikincisinde böyle düşünebileceğiniz için düzelttim.

Alıntı yapılan: z - 11 Haziran 2015, 10:25:09
Kütüphane dosyasının başında bir şeyler include edilmişmi peki?

Hocam onuda düşündüm, eklediği dosyaları kendi main dosyama da ekledim. Oda işe yaramadı. Zaten beni sinir eden WPR registerına her türlü eriştiriyorken CR registerına takması. Bu arada kütüphanedeki include dosyaları.


/* Includes ------------------------------------------------------------------*/
#include "stm32l1xx_rtc.h"
#include "stm32l1xx_rcc.h"

/** @addtogroup STM32L1xx_StdPeriph_Driver
  * @{
  */

/** @defgroup RTC
  * @brief RTC driver modules
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/

/* Masks Definition */
#define RTC_TR_RESERVED_MASK    ((uint32_t)0x007F7F7F)
#define RTC_DR_RESERVED_MASK    ((uint32_t)0x00FFFF3F)
#define RTC_INIT_MASK           ((uint32_t)0xFFFFFFFF)
#define RTC_RSF_MASK            ((uint32_t)0xFFFFFF5F)
#define RTC_FLAGS_MASK          ((uint32_t)(RTC_FLAG_TSOVF | RTC_FLAG_TSF | RTC_FLAG_WUTF | \
                                            RTC_FLAG_ALRBF | RTC_FLAG_ALRAF | RTC_FLAG_INITF | \
                                            RTC_FLAG_RSF | RTC_FLAG_INITS | RTC_FLAG_WUTWF | \
                                            RTC_FLAG_ALRBWF | RTC_FLAG_ALRAWF | RTC_FLAG_TAMP1F | \
                                            RTC_FLAG_TAMP2F | RTC_FLAG_TAMP3F | RTC_FLAG_RECALPF | \
                                            RTC_FLAG_SHPF))

#define INITMODE_TIMEOUT         ((uint32_t) 0x00002000)
#define SYNCHRO_TIMEOUT          ((uint32_t) 0x00008000)
#define RECALPF_TIMEOUT          ((uint32_t) 0x00001000)
#define SHPF_TIMEOUT             ((uint32_t) 0x00002000)


Kendi koduma ekleyip çalışmadığını gördüğüm için kaldırmayı tercih ettim.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: yldzelektronik - 11 Haziran 2015, 10:39:17
Aldığın hata nedir tam olarak?
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: MrDarK - 11 Haziran 2015, 11:14:24
Alıntı yapılan: MrDarK - 11 Haziran 2015, 09:32:00

Hata Kodu ;
error: expected identifier before '(' token

Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: CLR - 11 Haziran 2015, 13:46:24
Bu problem erişememe problemi değil ki, editörde oluşan bir hatadan dolayı compile hatası.

Ayrıca erişilmeyecek registeri kullansan bile compiler onu hatasız derler ama işlemci ulaşamaz.

Muhtemelen

RTC->CR = 0x00040000;

bu satır içinde bir yerde editörün gördüğü ama senin göremediğin bir karakter vardır. Normal C'de program yazarkende karşılaşılabilir(registerlerle alakası yok), genelde o program parçacığını bir yerden koplaya yapıştır yaparken oluşur.

Veya heycanla program yazarken keyboard üzerinde saçma bir tuş basma kombinasyonu oluşursa böyle karakterler oluşabiliyor.
 
Çözümü ise, komple o satırı silip yeniden elle yazmak veya boşukları silip tekrar boşluk vermekle  çözülebilir. Komple satırı silersen aynı kodu bir yerden kopyala /yapıştır yaparsan yine çözülmeyebilir. 
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: MrDarK - 11 Haziran 2015, 13:59:52
Alıntı yapılan: CLR - 11 Haziran 2015, 13:46:24
Bu problem erişememe problemi değil ki, editörde oluşan bir hatadan dolayı compile hatası.

Ayrıca erişilmeyecek registeri kullansan bile compiler onu hatasız derler ama işlemci ulaşamaz.

Muhtemelen

RTC->CR = 0x00040000;

bu satır içinde bir yerde editörün gördüğü ama senin göremediğin bir karakter vardır. Normal C'de program yazarkende karşılaşılabilir(registerlerle alakası yok), genelde o program parçacığını bir yerden koplaya yapıştır yaparken oluşur.

Veya heycanla program yazarken keyboard üzerinde saçma bir tuş basma kombinasyonu oluşursa böyle karakterler oluşabiliyor.
 
Çözümü ise, komple o satırı silip yeniden elle yazmak veya boşukları silip tekrar boşluk vermekle  çözülebilir. Komple satırı silersen aynı kodu bir yerden kopyala /yapıştır yaparsan yine çözülmeyebilir. 

Hocam üst mesajlarımda söylediğim şeyi tekrar edeyim. Aynı kodu komple kestim ve stm32l1xx_rtc.c kodu içine yapıştırdım hiçbirşey değiştirmeden. Orada derlenip çalışıyor aynı kod. Sinir olduğum kısım burası. Çok büyük olasılıkla emblocksla alakalı bir durum. Emblocks forumunda da bu konuyu açtım. Çözüldüğünde buraya da cevabı koyacağım tabi çözülebilirse :)

Dipnot şunu fark ettim ; diğer birimlerin de CR registerlarını derletemiyorum. LCD->CR ,RCC->CR hepsine aynı hatayı veriyor. CLR hocamın da dediği gibi bi şekilde CR 'yi bence hatalı görüyor IDE
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: z - 11 Haziran 2015, 16:27:12
CR adında bir değişken yada fonksiyon vs tanımladınmı main içinde?
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: MrDarK - 11 Haziran 2015, 16:37:51
Alıntı yapılan: z - 11 Haziran 2015, 16:27:12
CR adında bir değişken yada fonksiyon vs tanımladınmı main içinde?


Fazlasıyla paralel düşünüyoruz hocam, hayır tanımlamadım :) Fakat yazılımım içinde aradım dediğiniz şeyi. Değişken tanımlamalarında kurallarım vardır. Global için g_ uint8 için ui8 eklerim mutlaka isimlerine.

Şimdi boş bir proje ürettim orada denedim aynı hatayı veriyor.


/*
**
**                           Main.c
**
**
**********************************************************************/
/*
   Last committed:     $Revision: 00 $
   Last changed by:    $Author: $
   Last changed date:  $Date:  $
   ID:                 $Id:  $

**********************************************************************/
#include "stm32l1xx.h"

int main(void)
{
  while(1)
  {

    RTC->CR = 0;        // Hata Veriyor.
    RTC->WPR = 0;        // Hata Vermiyor.
  }
}


"stm32l1xx.h" dosyasının içeriği
https://github.com/sebseb7/pentstm32l1/blob/master/core/stm32l1xx.h
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: z - 11 Haziran 2015, 16:56:08
Gıcık oldum bende.

Peki Global  CR adında bir değişken tanımlayabilirmisin?

Buna izin veriyormu?
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: yldzelektronik - 11 Haziran 2015, 17:47:40
Aldığın hata hep aynı mı?Boş projede aldığın hata mesajı da aynı ise boş projeyi paylaşırsan bakayım. Merak ettim nasıl bir şey ola ki.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: bocek - 12 Haziran 2015, 14:26:43
Anlaşılan CR yazımını tek bir karakter olarak yani 'Carriage Return'  yani <Enter> yani ASCII(13) olarak görüyor ve bundan dolayı hata veriyor.
Derleyicinin bir 'bug'ı tabii ama belki bir yerlerde ayarı filan vardır.
Başlık: Ynt: Register Seviyesinde Erişim Hakkında
Gönderen: ErsinErce - 12 Haziran 2015, 14:45:16
bu tarz sıkıntılarda genelde bir önceki satırda sıkıntı olabiliyor
RTC->WPR 8 bitlik bir register mı?