Picproje Elektronik Sitesi

MİKRODENETLEYİCİLER => Atmel => Konuyu başlatan: vitruvius - 03 Mayıs 2014, 23:05:48

Başlık: Header File ve c File
Gönderen: vitruvius - 03 Mayıs 2014, 23:05:48
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.
Başlık: Ynt: Header File ve c File
Gönderen: Tagli - 04 Mayıs 2014, 00:51:29
İ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.
Başlık: Ynt: Header File ve c File
Gönderen: vitruvius - 04 Mayıs 2014, 01:07:00
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.
Başlık: Ynt: Header File ve c File
Gönderen: Tagli - 04 Mayıs 2014, 08:20:38
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.
Başlık: Ynt: Header File ve c File
Gönderen: 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);


Başlık: Ynt: Header File ve c File
Gönderen: vitruvius - 04 Mayıs 2014, 13:00:32
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.
Başlık: Ynt: Header File ve c File
Gönderen: bocek - 04 Mayıs 2014, 15:51:20

#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)
{
...
}
Başlık: Ynt: Header File ve c File
Gönderen: Tagli - 04 Mayıs 2014, 17:15:40
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.