REKLAMA

termometr cyfrowy.rar

Błąd kompilacji ds18b20 - undefined reference w pliku makefile, ATmega8

Witam po raz kolejny, ponieważ mam taki problem ze zkompilowaniem kodu, otóż chciałem sobie zrobić termometr który wyświetla temperaturę na wyświetlaczu lcd 2x16, czujnik to ds18b20, posiadam odpowiednie instrukcje do obsługi tegoż czujnika, chyba problem tkwi w pliku makefile, oto błąd: > "make.exe" all avr-gcc -g -Wall -Os -mmcu=atmega8 -DF_CPU=1000000 -Wl,-Map,main.map -o main.elf main.o hd44780.o main.o: In function `main': C:\termometr cyfrowy/main.c:44: undefined reference to `ds18b20_ConvertT' C:\termometr cyfrowy/main.c:53: undefined reference to `ds18b20_Read' make.exe: *** [main.elf] Error 1 > Process Exit Code: 2 > Time Taken: 00:00 kod źródłowy nie jest mojego autorstwa poniżej dodaję plik do pobrania w którym jest folder z projektem. Błąd jest chyba w pliku "ds18b20" utworzonym w programie makefile, niewiem jak to rozwiązać, jeśli byłby ktoś tak uprzejmy to proszę podesłać mi odpowiednie pliki i powiedzieć co było nie tak. Z góry dziękuję


Pobierz plik - link do postu
  • termometr cyfrowy.rar
    • hd44780.h
    • Makefile
    • ds18b20.h
    • ds18b20.c
    • hd44780.c
    • main.c


termometr cyfrowy.rar > main.c

/*
Plik " main.c "

KURS AVR-GCC cz.5
(xyz.isgreat.org)

Termometr cyfrowy, przyk³ad nr. 3
(schemat i opis dzia³ania w artykule)
atmega16 (1MHz)
*/

#include & lt; stdio.h & gt;
#include & lt; avr/io.h & gt;
#include & lt; util/delay.h & gt;
#include " hd44780.h "
#include " ds18b20.h "

/* W tablicy bêd¹ formowane komunikaty tekstowe
wysy³ane do wyœwietlacza */
char str[17]= " Termometr " ;

int main(void)
{
/* Zmienna przechowuje aktualn¹ wartoœæ temperatury */
double temp;
/* W tablicy zapisywane bêd¹ dane odczytane z uk³adu ds18b20 */
unsigned char ds18b20_pad[9];

/* Funkcja inicjalizuje wyœwietlacz */
lcd_init();
/* W³¹cza wyœwietlanie */
LCD_DISPLAY(LCDDISPLAY);
/* Czyœci ekran */
LCD_CLEAR;

/* Wyœwietla tytu³ */
LCD_LOCATE(0,0);
lcd_puts(str);

while(1)
{
/* Funkcja 'ds18b20_ConvertT' wysy³a do uk³adu ds18b20
polecenie pomiaru */
if(ds18b20_ConvertT())
{

/* 750ms - czas konwersji */
_delay_ms(750);

/* Odczyt z uk³adu ds18b20, dane zapisywane s¹ w tablicy ds18b20_pad.
Dwie pierwsze pozycje w tablicy to kolejno mniej znacz¹cy bajt i bardziej
znacz¹cy bajt wartoœæ zmierzonej temperatury */
ds18b20_Read(ds18b20_pad);

/* Sk³ada dwa bajty wyniku pomiaru w ca³oœæ. Cztery pierwsze bity mniej
znacz¹cego bajtu to czêœæ u³amkowa wartoœci temperatury, wiêc ca³oœæ
dzielona jest przez 16 */
temp = ((ds18b20_pad[1] & lt; & lt; 8) + ds18b20_pad[0]) / 16.0 ;

/* Formu³uje komunikat w tablicy 'str' */
sprintf(str, " %4.1f\xdf " " C " , temp);

LCD_LOCATE(5,1);
/* Wysy³a komunikat do wyœwietlacza */
lcd_puts(str);
}
}
}


termometr cyfrowy.rar > ds18b20.h

/*
Plik ds18b20.h

(xyz.isgreat.org)
*/

#ifndef DS18B20_H
#define DS18B20_H

/* DS18B20 przy³¹czony do portu PD7 AVRa */
#define SET_ONEWIRE_PORT PORTD |= _BV(7)
#define CLR_ONEWIRE_PORT PORTD & = ~_BV(7)
#define IS_SET_ONEWIRE_PIN PIND & _BV(7)
#define SET_OUT_ONEWIRE_DDR DDRD |= _BV(7)
#define SET_IN_ONEWIRE_DDR DDRD & = ~_BV(7)

unsigned char ds18b20_ConvertT(void);
int ds18b20_Read(unsigned char []);
void OneWireStrong(char);
unsigned char OneWireReset(void);
void OneWireWriteByte(unsigned char);
unsigned char OneWireReadByte(void);

#endif


termometr cyfrowy.rar > hd44780.h

/*
Plik hd44780.h
*/

#ifndef LCD_HD44780
#define LCD_HD44780

/* RS */
#define SET_OUT_LCD_RS DDRD |= _BV(PD0)
#define SET_LCD_RS PORTD |= _BV(PD0)
#define CLR_LCD_RS PORTD & = ~_BV(PD0)

/* RW */
#define SET_OUT_LCD_RW DDRD |= _BV(PD1)
#define SET_LCD_RW PORTD |= _BV(PD1)
#define CLR_LCD_RW PORTD & = ~_BV(PD1)

/* E */
#define SET_OUT_LCD_E DDRD |= _BV(PD2)
#define SET_LCD_E PORTD |= _BV(PD2)
#define CLR_LCD_E PORTD & = ~_BV(PD2)

/* D4 */
#define SET_OUT_LCD_D4 DDRD |= _BV(PD3)
#define SET_IN_LCD_D4 DDRD & = ~_BV(PD3)
#define SET_LCD_D4 PORTD |= _BV(PD3)
#define CLR_LCD_D4 PORTD & = ~_BV(PD3)
#define IS_SET_LCD_D4 PIND & _BV(PD3)

/* D5 */
#define SET_OUT_LCD_D5 DDRD |= _BV(PD4)
#define SET_IN_LCD_D5 DDRD & = ~_BV(PD4)
#define SET_LCD_D5 PORTD |= _BV(PD4)
#define CLR_LCD_D5 PORTD & = ~_BV(PD4)
#define IS_SET_LCD_D5 PIND & _BV(PD4)

/* D6 */
#define SET_OUT_LCD_D6 DDRD |= _BV(PD5)
#define SET_IN_LCD_D6 DDRD & = ~_BV(PD5)
#define SET_LCD_D6 PORTD |= _BV(PD5)
#define CLR_LCD_D6 PORTD & = ~_BV(PD5)
#define IS_SET_LCD_D6 PIND & _BV(PD5)

/* D7 */
#define SET_OUT_LCD_D7 DDRD |= _BV(PD6)
#define SET_IN_LCD_D7 DDRD & = ~_BV(PD6)
#define SET_LCD_D7 PORTD |= _BV(PD6)
#define CLR_LCD_D7 PORTD & = ~_BV(PD6)
#define IS_SET_LCD_D7 PIND & _BV(PD6)


#define LCD_NOP asm volatile( " nop\n\t " " nop\n\t " " nop\n\t " " nop\n\t " ::);



#define LCDCOMMAND 0
#define LCDDATA 1

#define LCD_LOCATE(x,y) WriteToLCD(0x80|((x)+((y)*0x40)), LCDCOMMAND)

#define LCD_CLEAR WriteToLCD(0x01, LCDCOMMAND)
#define LCD_HOME WriteToLCD(0x02, LCDCOMMAND)

/* IDS */

#define LCDINCREMENT 0x02
#define LCDDECREMENT 0x00
#define LCDDISPLAYSHIFT 0x01

#define LCD_ENTRY_MODE(IDS) WriteToLCD(0x04|(IDS), LCDCOMMAND)

/* BCD */
#define LCDDISPLAY 0x04
#define LCDCURSOR 0x02
#define LCDBLINK 0x01

#define LCD_DISPLAY(DCB) WriteToLCD(0x08|(DCB), LCDCOMMAND)

/* RL */
#define LCDLEFT 0x00
#define LCDRIGHT 0x04

#define LCD_SHIFT_DISPLAY(RL) WriteToLCD(0x18|(RL), LCDCOMMAND)
#define LCD_SHIFT_CURSOR(RL) WriteToLCD(0x10|(RL), LCDCOMMAND)

#define LCD_CGRAM_ADDRESS(A) WriteToLCD(0x40|((A) & 0x3f), LCDCOMMAND)
#define LCD_DDRAM_ADDRESS(A) WriteToLCD(0x80|((A) & 0x7f), LCDCOMMAND)

#define LCD_WRITE_DATA(D) WriteToLCD((D),LCDDATA)


void lcd_init(void);
void WriteToLCD(unsigned char v,unsigned char rs);
unsigned char ReadAddressLCD(void);
void lcd_puts(char *str);

#endif


termometr cyfrowy.rar > ds18b20.c

/*
Plik ds18b20.c
(minimum kodu do odczytu temperatury z ds18b20)

xyz.isgreat.org
*/

#include & lt; avr/io.h & gt;
#include & lt; util/delay.h & gt;
#include " ds18b20.h "


/**********************************************************/

unsigned char ds18b20_ConvertT(void)
{
if (!OneWireReset()) return 0;

OneWireWriteByte(0xcc); // SKIP ROM
OneWireWriteByte(0x44); // CONVERT T

return -1;
}

/***********************************************************/

int ds18b20_Read(unsigned char scratchpad[])
{
unsigned char i;

if (!OneWireReset()) return 0;

OneWireWriteByte(0xcc); // SKIP ROM
OneWireWriteByte(0xbe); // READ SCRATCHPAD

for(i=0; i & lt; 10; i++) scratchpad[i] = OneWireReadByte();

return 1;
}

/**********************************************************/

void OneWireStrong(char s)
{
if (s)
{
SET_ONEWIRE_PORT;
SET_OUT_ONEWIRE_DDR;
}
else
{
SET_IN_ONEWIRE_DDR;
}
}

/**********************************************************/

unsigned char OneWireReset()
{
CLR_ONEWIRE_PORT;

if (!(IS_SET_ONEWIRE_PIN)) return 0;

SET_OUT_ONEWIRE_DDR;
_delay_us(500);
SET_IN_ONEWIRE_DDR;
_delay_us(70);

if(!(IS_SET_ONEWIRE_PIN))
{
_delay_us(500);
return(1);
}

_delay_us(500);

return(0);
}

/**********************************************************/

void OneWireWriteByte(unsigned char byte)
{
unsigned char i;

CLR_ONEWIRE_PORT;

for (i=0; i & lt; 8; i++)
{
SET_OUT_ONEWIRE_DDR;

if (byte & 0x01)
{
_delay_us(7);
SET_IN_ONEWIRE_DDR;
_delay_us(70);
}
else
{
_delay_us(70);
SET_IN_ONEWIRE_DDR;
_delay_us(7);
}

byte & gt; & gt; = 1;
}
}

/***********************************************************/

unsigned char OneWireReadByte(void)
{
unsigned char i, byte = 0;

SET_IN_ONEWIRE_DDR;

for (i=0; i & lt; 8; i++)
{
SET_OUT_ONEWIRE_DDR;
_delay_us(7);
SET_IN_ONEWIRE_DDR;
_delay_us(7);
byte & gt; & gt; = 1;

if(IS_SET_ONEWIRE_PIN) byte |= 0x80;

_delay_us(70);
}

return byte;
}


termometr cyfrowy.rar > hd44780.c

/*
Plik hd44780.c

Definicje kilku funkcji do obs³ugi alfanumerycznego
wyœwietlacza LCD HD44780
*/


#include & lt; avr/io.h & gt;
#include & lt; util/delay.h & gt;
#include " hd44780.h "

/*--------------------------------------------------------*/
/* Zapis danej lub instrukcji */

void WriteToLCD (unsigned char v,unsigned char rs)
{
unsigned char bf;

SET_OUT_LCD_D4;
SET_OUT_LCD_D5;
SET_OUT_LCD_D6;
SET_OUT_LCD_D7;

if(v & 0x10) SET_LCD_D4; else CLR_LCD_D4;
if(v & 0x20) SET_LCD_D5; else CLR_LCD_D5;
if(v & 0x40) SET_LCD_D6; else CLR_LCD_D6;
if(v & 0x80) SET_LCD_D7; else CLR_LCD_D7;

CLR_LCD_E;
if(rs) SET_LCD_RS;else CLR_LCD_RS;
CLR_LCD_RW;

LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;

if(v & 0x01) SET_LCD_D4; else CLR_LCD_D4;
if(v & 0x02) SET_LCD_D5; else CLR_LCD_D5;
if(v & 0x04) SET_LCD_D6; else CLR_LCD_D6;
if(v & 0x08) SET_LCD_D7; else CLR_LCD_D7;

LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;

SET_IN_LCD_D4;
SET_IN_LCD_D5;
SET_IN_LCD_D6;
SET_IN_LCD_D7;

CLR_LCD_RS;
SET_LCD_RW;
SET_LCD_D7;


/* Przyda³by siê pe³ny odczyt */
do
{
LCD_NOP;
SET_LCD_E;
LCD_NOP;
bf = IS_SET_LCD_D7;
CLR_LCD_E;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
LCD_NOP;
CLR_LCD_E;

}while( bf );
}


/*--------------------------------------------------------*/
/* Funkcja odczytuje adres i flage zajetosci */

unsigned char ReadAddressLCD ( void)
{
unsigned char g = 0 ;

CLR_LCD_RS;
SET_LCD_RW;

SET_IN_LCD_D4;
SET_IN_LCD_D5;
SET_IN_LCD_D6;
SET_IN_LCD_D7;

LCD_NOP;
SET_LCD_E;
LCD_NOP;

if(IS_SET_LCD_D4) g+=16;
if(IS_SET_LCD_D4) g+=32;
if(IS_SET_LCD_D4) g+=64;
if(IS_SET_LCD_D4) g+=128;

CLR_LCD_E;
LCD_NOP;
SET_LCD_E;
LCD_NOP;

if(IS_SET_LCD_D4) g+=8;
if(IS_SET_LCD_D4) g+=4;
if(IS_SET_LCD_D4) g+=2;
if(IS_SET_LCD_D4) g+=1;

CLR_LCD_E;

return g ;
}


/*---------------------------------------------------------*/
/* Inicjalizacja wyœwietlacza */

void lcd_init(void)
{
_delay_ms(31);

SET_OUT_LCD_RS;
SET_OUT_LCD_RW;
SET_OUT_LCD_E;
SET_OUT_LCD_D4;
SET_OUT_LCD_D5;
SET_OUT_LCD_D6;
SET_OUT_LCD_D7;

CLR_LCD_E;
CLR_LCD_RS;
CLR_LCD_RW;
SET_LCD_D4;
SET_LCD_D5;
CLR_LCD_D6;
CLR_LCD_D7;

LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_ms(10);

LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_ms(2);

LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_ms(2);

CLR_LCD_D4;
LCD_NOP;
SET_LCD_E;
LCD_NOP;
CLR_LCD_E;
LCD_NOP;
_delay_us(80);

WriteToLCD (0x28 , LCDCOMMAND) ;
LCD_DISPLAY(0) ;
LCD_CLEAR ;
LCD_ENTRY_MODE(LCDINCREMENT) ;
}


/*--------------------------------------------------------*/
/* Wyswietla tekst na aktualnej pozycji kursora */

void lcd_puts(char *str)
{
unsigned char i =0;

while( str[i])
LCD_WRITE_DATA(str[i++]) ;
}