C Programlama diliyle şamatalar

Başlatan z, 23 Ekim 2011, 15:32:04

sseedat

Merhabalar,

Herhangi bir interrupt(spi, uart ) fonksiyonunu main.c dosyasında tanımlamak zorundamıyız. Eğer değilsek başka bir dosyada nasıl yapabilirim bu işi.

saygılar.
Görünmez bir mezarlıktır Zaman...

desert

#1006
hayır değilsin istediğin .c uzanlıtı bir dosyada kesme fonksiyonunun kullanabilirsin
örneğin usart.c dosyası içinde
void USART1_IRQHandler(void)
{
............
}

gibi kullanabilirsin

sseedat

Evet dediğiniz şekilde yapıyorum fakat kesme fonksiyonuna girmediğini gördüm. Kesme fonksiyonu main dosyasında olunca sorun yok.

Acaba eksik yaptığım bir şeyler mi var ?
Görünmez bir mezarlıktır Zaman...

pea

O konu kullandığınız derleyiciye bağlı. ISR vektör tablosunun oluşturulması için preprocessor komutları istiyor çoğu derleyici.
Renesas HEW için örnek:

#pragma INTERRUPT timer_int() 

// 1/1000 saniyelik interrupt
void timer_int(void) {}


sect30.inc isimli tanımlama dosyasında da
;---------------------------------------------------------------
; variable vector section
;---------------------------------------------------------------
	.section	vector,ROMDATA	; variable vector table
	.org	VECTOR_ADR 
	.lword	dummy_int		; vector 21
	.lword	dummy_int		; vector 22
	;.lword	dummy_int		; vector 23
	.glb	_timer_int
	.lword	_timer_int

gibi bir ek yapılıyor.

Yani compiler'ın help bölümünü okuyun.

sseedat

selamlar,

global static bir değişkenimin ilk değeri 0 her interrupt geldiğinde 1 arttırıyorum. Fakat nasıl oluyorsa ilk interrupta girdiğimde 1 den başlıyor.
Bunun nasıl olduğunu anlayamadım?

static volatile rxCounter = 0;

void interrupt()
{
// burda rxCounter değişkeninin değeri = 1 ve interrupt a ilk kez giriyor
.....
.....
rxCounter++;
}
Görünmez bir mezarlıktır Zaman...

kantirici

Merhaba,

sprintf  ile int bir değişkeni hex olarak bir diziye kaydetmek istiyorum. Fakat ascii değil. Örneğin 32 bit bir değişken için;

a = 0x87654321; ise;

b[3] = 87, b[2] = 65, b[1] = 43, b[0] = 21 şeklinde olmasını istiyorum. sprintf ile mümkün mü ?

quarko

Alıntı yapılan: kantirici - 14 Mayıs 2016, 10:40:07
Merhaba,

sprintf  ile int bir değişkeni hex olarak bir diziye kaydetmek istiyorum. Fakat ascii değil. Örneğin 32 bit bir değişken için;

a = 0x87654321; ise;

b[3] = 87, b[2] = 65, b[1] = 43, b[0] = 21 şeklinde olmasını istiyorum. sprintf ile mümkün mü ?

Burada sprintf değilde union ve struct ile yeni bir tip tanımlayıp 32 bit değişkenin byte larına erişebilirsin.

typedef union
{
  struct BYTES 
  {
    uint8_t byte1;
    uint8_t byte2;
    uint8_t byte3;
    uint8_t byte4;
  }bytes; 
  
  uint32_t  all;
 
}my_type;


"my_type" türünden "a" diye bir değişken tanımlayıp;

a.bytes.byte1,  a.bytes.byte2,  a.bytes.byte3,  a.bytes.byte4 şeklinde tüm byte lara erişip sprintf le dizine atabilirsin. Tamamına erişmek içinde "a.all" şeklinde kullanabilirsin.
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

Klein


kantirici


@quarko hocam maalesef union yapısı işimi görmüyor.

@Klein hocam iar da denedim fakat yine tek tek attı diziye ascii olarak.

quarko

Union yapısı neden işini görmüyor ki. Byte lara erişebildiysen sprintf ile istediğini yapabilirsin.
"Vicdanın ziyası ulum-u diniyedir. Aklın nuru fünun-u medeniyedir. İkisinin imtizacıyla hakikat tecelli eder."

F493

Alıntı yapılan: quarko - 14 Mayıs 2016, 16:41:49
Union yapısı neden işini görmüyor ki. Byte lara erişebildiysen sprintf ile istediğini yapabilirsin.

Selam,
 
   @quarko  dogru cevabı vermiş. 

   başka bir yöntem,
   
   a = 0x87654321; ise;

   // (a = 0x87654321)
   ilkByte = a & 0x000000FF; 

   // (a>>8) sonrasi (a = 0x00876543)
   ikinciByte = (a>>8) & 0x000000FF; 

   // (a>>16) sonrasi (a = 0x00008765)
   UcuncuByte = (a>>16) & 0x000000FF;

   (a>>24) sonrasi (a = 0x00000087)
   DorduncuByte = (a>>24) & 0x000000FF;

  b[0] = ilkByte ;
  b[1] = ikinciByte ;
  b[2] = UcuncuByte ;
  b[3] = DorduncuByte ;

Esen kalın.

magnetron

uint8_t *byteptr =&a

byte1= *byteptr;byteptr++
byte2= *byteptr;byteptr++
byte3= *byteptr;byteptr++
byte4= *byteptr;

Klein

ASCII istemediğini farketmemişim.

Eğer yanlış anlamıyorsam union  veya struct iş görmez.
sanırım beklenti şu

0x87654321 sayısını
0x87 , 0x65, 0x43, 0x21 şeklinde bölmek istemiyor. Decimal  87, 65, 43, 21 şeklinde bölmek istiyor. Sonuç dizisini okuduğunda  hex  0x57, 0x41, 0x2B, 0x15 görecek.

Yine yanlış anlamışsam , dikkate almayın.

kantirici

Merhaba arkadaşlar.

Header dosyaları ilgili bir sorum var. Bir lib. oluşturduk ve projemizde farklı .c dosyalarına header dosyalarını include ederek kullanmak isteyelim.

Bu durumda her include durumunda daha önceden lib. zaten include edilmişse tekrar derlenmemesi için;

#ifndef  LIB_H
#define LIB_H

uint8_t a,b,c;

void fgh();
...........

#endif

gibi bir koruma içerisine alırız.

Buradaki #ifndef  LIB_H yazımını ;#ifndef  LIB_H_, #ifndef  _LIB_H, #ifndef  __LIB_H_ gibi çeşitli biçimlerde görüyorum. Bunlar tam olarak neyi ifade ediyorlar ?

yldzelektronik

@kantirici

Eğer yanlış bilmiyorsam, onlar sadece tanımlama,

İstediğin gibi tanımlarsın. İster __ ile başla ister direk kelime ile başla.Sonuçta aynı tanımı #define ile bir alt satırda yapıyorsun.

Yani

#ifndef __LIB
#define __LIB


ile

#ifndef LIB
#define LIB


Arasında bir fark yok.Kritik nokta. Yeterki #ifndef ile sorguladığın tanımı bir alt satırında define ile yeniden tanımla.
Kişinin başına gelen hayır Allah'tandır. Kişinin başına gelen şer nefsindendir. Nefislerimizle kendimize zulüm ediyoruz.