Haberler:

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

Ana Menü

Header File ve c File

Başlatan vitruvius, 03 Mayıs 2014, 23:05:48

vitruvius

Merhaba, bu header file ve fonksiyon yazma işine yeni girdim iki sorum olacak.

Bir adet header file ve buna bağlı olarak c file yazdım (specs.h ve specs.c). Ana c file içinde specs.c içinde tanımladığım bir fonksiyonu çağırdımda şu uyarıyı alıyorum.

Alıntı YapWarning   1   implicit declaration of function 'send_target_seri_no' [-Wimplicit-function-declaration]

Bu neden oluyor?

specs.c: (Fonksiyon içindeki bilinmeyenler (P1_Target, P2_Traget v.b.) specs.h içinde tanımlı)
#include "specs.h"
#include <util/delay.h>

#define delay_time 20

void send_target_seri_no ()
{
	char buffer[10];
	
	_delay_ms(delay_time);
	itoa(P1_Target, buffer, 10);
	uart_puts(buffer);
	
	_delay_ms(delay_time);
	itoa(P2_Target, buffer, 10);
	uart_puts(buffer);
	
	_delay_ms(delay_time);
	itoa(L_Target, buffer, 10);
	uart_puts(buffer);
	
	_delay_ms(delay_time);
	uart_putc('.');
	
	_delay_ms(delay_time);
	itoa(J_Target, buffer, 10);
	uart_puts(buffer);
	
	_delay_ms(delay_time);
	itoa(M_Target, buffer, 10);
	uart_puts(buffer);
	
	_delay_ms(delay_time);
	itoa(T_Target, buffer, 10);
	uart_puts(buffer);
	
	_delay_ms(delay_time);
	itoa(N_Target, buffer, 10);
	uart_puts(buffer);
}


Şu da ana kod:
#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>

#include "uart.h"
#include "bus_free_check.h"
#include "specs.h"

#define F_CPU 4000000UL
#define UART_BAUD_RATE      19200

int main(void)
{
	DDRB = 0xFF; // PORTB is output.
	DDRD = 0b01010000; // PORTD is input/output.
	
	PORTD = 0x00;
	PORTB = 0x00;
	
	uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
	
	sei();
	
    while(1)
    {
		 send_target_seri_no();
    }
}


İkinci sorum da şu: Bir header file içinde "Button_1" tanımlayıp c kodu içinde butonun basılı olup olmama durumunu kontrol etmek istiyorum.

Aşağıdakilerden biri gibi tanımlayınca sorun oluyor:
#define	Button_1	PINA1
#define	Button_1	PINA,1


Ana kodda şu şekilde bakıyorum:
if (bit_is_set(Button_1))
	{
		.
	}


bit_is_set içine (PINx, No) tarzı yapmak gerektiğinden aşağıdaki hatayı alıyorum. Peki bu tanımlamayı nasıl yapmam gerekir?

Hata:
Error	2	macro "bit_is_set" requires 2 arguments, but only 1 given


Teşekkürler.

Tagli

İlk sorun için: Acaba specs.c dosyasını projeye dahil etmemiş olabilir misin? Yani derleyicinin o dosyadan hiç haberi yoksa böyle bir hata verebilir belki.

İkinci soru hakkında maalesef fikrim yok.
Gökçe Tağlıoğlu

vitruvius

Yok dahil ettim ve kod çalışıyor aslında. Sadece uyarı almak canımı sıkıyor. Acaba fonksiyonun prototype'ını tanımlamadığımdan mı oluyor? Atıyorum

void send_target_seri_no (int a, char b)
gibi.

Tagli

#3
specs.h dosyasında, specs.c içinde geçen fonksiyonların prototiplerinin olması gerekir. Header dosyası main tarafından eklenince bu prototipler zaten main'e aktarılmış oluyor.
Gökçe Tağlıoğlu

Goo

bit_is_set(,) fonksiyonuna iki adet parametre girişi yapmalısın. O yüzden şöyle kullanabilirsin:

#define	Button_1_port	 PINA
#define   Button_1    1


bit_is_set (Button_1_port, Button1);



vitruvius

Alıntı yapılan: Tagli - 04 Mayıs 2014, 08:20:38
specs.h dosyasında, specs.c içinde geçen fonksiyonların prototiplerinin olmadı gerekir. Header dosyası main tarafından eklenince bu prototipler zaten main'e aktarılmış oluyor.

Peki bu prototype'ları neye göre yazmalıyım? Bahsettiğim fonksiyon için "buffer" ile alakalı olmalı sanırım. Ama başka bir fonksiyonda herhangi bir değişkenim yok sadece sırayla bir sürü karakter yolluyorum. Orada ne yapmalıyım? Şöyle bir şey denedim specs.c'de:

void send_target_seri_no (char buffer)
{
	char buffer[10];
	
	_delay_ms(delay_time);
	itoa(P1_Target, buffer, 10);
	uart_puts(buffer);
	
	_delay_ms(delay_time);
	itoa(P2_Target, buffer, 10);
	uart_puts(buffer);
	
	_delay_ms(delay_time);
	itoa(L_Target, buffer, 10);
	uart_puts(buffer);
}


specs.h'nin başına da şu şekilde ekledim:

void send_target_seri_no (char buffer);


Main.c altında şöyle çağırınca hata ve bir mesaj alıyorum.
send_target_seri_no();


Hata:
Error	2	too few arguments to function 'send_target_seri_no'


Mesaj:
Message	3	declared here


Mesaja tıklayınca specs.h'de yukarda yazdığım satıra götürüyor.

Alıntı yapılan: Goo - 04 Mayıs 2014, 11:43:07
bit_is_set(,) fonksiyonuna iki adet parametre girişi yapmalısın. O yüzden şöyle kullanabilirsin:

#define	Button_1_port	 PINA
#define   Button_1    1


bit_is_set (Button_1_port, Button1);




Bu yöntemi denemiştim ama okunurluluğu azaltıyor bana göre o yüzden
if (bit_is_set(Button_1))
şeklinde kullanabileceğim bir hile arıyorum.

bocek

#define BUTTON1_IS_ON bit_is_set(PINA,1)

veya 

#define BUTTON_PIN PINA
#define BUTTON_BIT 1
#define BUTTON1_IS_ON BUTTON_PIN&(1<<BUTTON_BIT)

veya

#define BUTTON1_IS_ON PINA&(1<<1)

if(BUTTON1_IS_ON)
{
 ...
}
1 ya da 0. işte 'bit'ün mesele..

Tagli

vitruvius, argüman alacak şekilde tanımladığın bir fonksiyonu argümansız olarak çağırıyorsun. Hata vermesinin sebebi bu. Aslında zaten void send_target_seri_no (char buffer) fonksiyonu buffer argümanını hiç kullanmıyor. Bu argümanı sil.
Gökçe Tağlıoğlu