Перейти к содержанию

Ошибки в ATMELStudio7.0


Lihey.german

Рекомендуемые сообщения

Доброго всем здравия! Пытаюсь скомпилировать код в АтмелСтудио7, вроде всё правильно написано но выпадают куча ошибок таких


Error        undefined reference to `LCD_SendStr'    GccApplication4    D:\7.0\GccApplication4\GccApplication4\main.c    150

Перелопатил весь инет в поисках решения но безрезультатно.

Исходник: 

Скрытый текст


#define F_CPU 8000000

#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdint.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <avr/eeprom.h>
#include "bcd.h"
#include "lcd_lib_2.h"
#include "i2c.h"
#include "buttons.h"
#define RTC_adr_write 0b11010000
#define RTC_adr_read  0b11010001
unsigned char hour;
unsigned char MIN;
unsigned char sec;
unsigned char day;
unsigned char wday;
unsigned char month;
unsigned char year;
unsigned int  temp;
unsigned char t1;
unsigned char t2;
unsigned char alarm_hour;
unsigned char alarm_min;
unsigned char alarm_on;
unsigned char i=0;                  // переменная кнопок
unsigned char al_on;                // переменная состояния будильника (вкл / выкл)
unsigned char al;                   // переменная сработки будильника
unsigned char j=1;                  // подуровни меню
#define LED_PORT PORTB
#define LED_DDR DDRB
#define LED PB0

uint8_t alarm_hour_ee EEMEM = 0;
uint8_t alarm_min_ee EEMEM = 0;
uint8_t alarm_on_ee EEMEM = 0;

const uint8_t alarm[] PROGMEM   = {0x02,0x04,0x04,0x0E,0x0E,0x1F,0x1F,0x04};
unsigned char bcd (unsigned char data)
{
    unsigned char bc;

    bc=((((data&(1<<6))|(data&(1<<5))|(data&(1<<4)))*0x0A)>>4)+((data&(1<<3))|(data&(1<<2))|(data&(1<<1))|(data&0x01));

    return bc;
}
unsigned char bin(unsigned char dec){

    char bcd;

    char n, dig, num, count;

    num = dec;
    count = 0;
    bcd = 0;
    for (n=0; n<4; n++) {
        dig = num%10;
        num = num/10;
        bcd = (dig<<count)|bcd;
        count += 4;
    }

    return bcd;
}
void RTC_init(void){

    i2c_start_cond();               // запуск i2c
    i2c_send_byte(RTC_adr_write);   // передача адреса устройства, режим записи
    i2c_send_byte(0x0E);            // передача адреса памяти
    i2c_send_byte(0b00100000);      // запустить преобразование температуры и выход на 1 Гц
    i2c_send_byte(0b00001000);      // разрешить выход 32 кГц
    i2c_stop_cond();                // остановка i2c

}
void RTC_read_time(void){

    i2c_start_cond();               // запуск i2c
    i2c_send_byte(RTC_adr_write);   // передача адреса устройства, режим записи
    i2c_send_byte(0x00);            // передача адреса памяти
    i2c_stop_cond();                // остановка i2c

    i2c_start_cond();               // запуск i2c
    i2c_send_byte(RTC_adr_read);    // передача адреса устройства, режим чтения
    sec = bcd(i2c_get_byte(0));     // чтение секунд, ACK
    MIN = bcd(i2c_get_byte(0));     // чтение минут, ACK
    hour = bcd(i2c_get_byte(0));    // чтение часов, ACK
    wday = bcd(i2c_get_byte(0));    // чтение день недели, ACK
    day = bcd(i2c_get_byte(0));     // чтение число, ACK
    month = bcd(i2c_get_byte(0));   // чтение месяц, ACK
    year = bcd(i2c_get_byte(1));    // чтение год, NACK
    i2c_stop_cond();                // остановка i2c

}
void RTC_write_time(unsigned char hour1,unsigned char min1, unsigned char sec1){

    i2c_start_cond();               // запуск i2c
    i2c_send_byte(RTC_adr_write);   // передача адреса устройства, режим записи
    i2c_send_byte(0x00);            // передача адреса памяти
    i2c_send_byte(bin(sec1));       // 0x00 скунды (целесообразно ли задавать еще и секунды?)
    i2c_send_byte(bin(min1));       // 0x01 минуты
    i2c_send_byte(bin(hour1));      // 0x02 часы
    i2c_stop_cond();                // остановка i2c

}
void RTC_write_date(unsigned char wday, unsigned char day, unsigned char month, unsigned char year){

    i2c_start_cond();               // запуск i2c
    i2c_send_byte(RTC_adr_write);   // передача адреса устройства, режим записи
    i2c_send_byte(0x03);            // передача адреса памяти
    i2c_send_byte(bin(wday));       // 0x03 адень недели (воскресенье - 1, пн 2, вт 3, ср 4, чт 5, пт 6, сб 7)
    i2c_send_byte(bin(day));        // 0x04 день месяц
    i2c_send_byte(bin(month));      // 0x05 месяц
    i2c_send_byte(bin(year));       // 0x06 год
    i2c_stop_cond();                // остановка i2c

}


// чтение температуры
void RTC_read_temper(void){


    i2c_start_cond();               // запуск i2c
    i2c_send_byte(RTC_adr_write);   // передача адреса устройства, режим записи
    i2c_send_byte(0x11);            // передача адреса памяти
    i2c_stop_cond();                // остановка i2c

    i2c_start_cond();               // запуск i2c
    i2c_send_byte(RTC_adr_read);    // передача адреса устройства, режим чтения
    t1 = i2c_get_byte(0);           // чтение MSB температуры
    t2 = i2c_get_byte(1);           // чтение LSB температуры
    i2c_stop_cond();                // остановка i2c

    t2=(t2>>6);                     // сдвигаем на 6 - точность 0,25 (2 бита)
    // сдвигаем на 7 - точность 0,5 (1 бит)
    t2=t2*5;

}

// вывод дня недели
void put_wday (void) {
    if (wday==1) {LCD_SendStr("Sun");}
    if (wday==2) {LCD_SendStr("Mon");}
    if (wday==3) {LCD_SendStr("Tue");}
    if (wday==4) {LCD_SendStr("Wed");}
    if (wday==5) {LCD_SendStr("Thu");}
    if (wday==6) {LCD_SendStr("Fri");}
    if (wday==7) {LCD_SendStr("Sat");}
}


//
// ========================================================================================================================
// ========================================================================================================================

ISR (TIMER0_OVF_vect)               // вектор прерывания по переполнеинию таймера 0
{

    BUT_Debrief ();                     // опрос 4х кнопок

}

int main (void)
{


    // инициализации
    LCD_Init();
    i2c_init();
    BUT_Init();
    RTC_init();


    LED_DDR |= (1<<LED);
    LED_PORT &= ~(1<<LED);

    // загрузить из eeprom значения будильника
    alarm_hour = eeprom_read_byte(&alarm_hour_ee);
    alarm_min = eeprom_read_byte(&alarm_min_ee);
    alarm_on = eeprom_read_byte(&alarm_on_ee);


    LCD_SetUserChar(alarm, 1);      // загружаем пользовательский символ в ОЗУ дисплея


    //инициализация таймера 0
    TCCR0 |= 0b00000101;            // Включаем предделитель 1/1024
    TIMSK |= 0b00000001;            // разрешаем прерывания по переполнению таймера T0.
    TCNT0=0;                        // Обнуляем счётный регистр таймера T0

    sei();                          // глобально разрешить прерывания

    main:
    LCD_Clear();

    while (1)
    {

        i=BUT_GetKey();

        // вывод времени
        RTC_read_time ();

        LCD_Goto(0,0);
        BCD_2Lcd(hour);
        LCD_WriteData(':');
        BCD_2Lcd(MIN);
        LCD_WriteData(':');
        BCD_2Lcd(sec);

        // вывод даты
        LCD_Goto(0,1);
        BCD_2Lcd(day);
        LCD_WriteData('/');
        BCD_2Lcd(month);
        LCD_WriteData('/');
        BCD_2Lcd(year);

        // вывод дня недели
        LCD_Goto(10,0);
        put_wday ();

        // вывод температуры
        RTC_read_temper();
        LCD_Goto(10,1);
        LCD_WriteData('+');
        BCD_2Lcd(t1);
        LCD_WriteData(',');
        BCD_1Lcd(t2);

        LCD_WriteData('C');

        // будильник
        if(alarm_on==1)       {
            if(alarm_hour==hour)  {
                if(alarm_min==MIN)    {
                    if(sec==1)            {
                        al=1;
                    }
                }
            }
        }


        // отображение включенности будильника
        if (alarm_on==1) {LCD_Goto(15,0); LCD_WriteData(1);}
        else {LCD_Goto(15,0); LCD_WriteData(' ');}


        // отключение сигнала будильника (сброс флага при нажатии кнопки 3)
        i=BUT_GetKey();

        if (i==3)
        { al=0; }


        // при сработке будильника совершит действие
        if (al==1)
        {

            LED_PORT |= (1<<LED);

        }

        else
        {

            LED_PORT &=~(1<<LED);

        }

        //_delay_ms(200);


        //=== дальше настройки =====================================================================================================
        //==========================================================================================================================
        // кнопка 1 заходит в меню и перелистывает уровни менюшки
        // кнопка 2 увеличивает переменную на 1 (защита от переполнения предусмотрена)
        // кнопка 3 немедленно выходит из меню настроек
        //


        if (i==1)
        {

            LCD_Clear();

            while (3)                           // настрока будильника
            {

                i=BUT_GetKey();

                if (i==1)
                {
                    j++;
                }

                if (i==3)                       // отменить и выйти
                {
                    i=0;
                    j=1;
                    goto main;
                }

                // индикация настроек будильника
                if (j==1) {LCD_Goto(6,1); LCD_SendStr("^^");}
                if (j==2) {LCD_Goto(6,1); LCD_SendStr("   ^^");}
                if (j==3) {LCD_Goto(9,1); LCD_SendStr("   ^^");}

                LCD_Goto(0,0);
                LCD_SendStr("Alarm");

                LCD_Goto(6,0);
                BCD_2Lcd(alarm_hour);
                LCD_WriteData(':');
                BCD_2Lcd(alarm_min);
                LCD_WriteData('-');
                if (alarm_on==1)
                { LCD_SendStr("on "); }
                else
                { LCD_SendStr("off"); }

                switch (j)
                {
                    case (1):
                    {
                        if (j!=1) {break;}
                        if (i==2)
                        {
                            
                            alarm_hour++;
                            if (alarm_hour>23) {alarm_hour=0;}
                            
                        }
                    }

                    case (2):
                    {
                        if (j!=2) {break;}
                        if (i==2)
                        {
                            
                            alarm_min++;
                            if (alarm_min>59) {alarm_min=0;}
                            
                        }
                    }

                    case (3):
                    {
                        if (j!=3) {break;}
                        if (i==2)
                        {
                            
                            alarm_on++;
                            if (alarm_on>1) {alarm_on=0;}
                            
                        }
                    }

                }


                if (j==4)                       // сохранить настройки и продолжить
                {
                    //сохранить значения в eeprom
                    eeprom_write_byte(&alarm_hour_ee, alarm_hour);
                    eeprom_write_byte(&alarm_min_ee, alarm_min);
                    eeprom_write_byte(&alarm_on_ee, alarm_on);
                    j=1;
                    LCD_Clear();
                    break;
                }

            }

            while (2)                           // настройка времени
            {

                i=BUT_GetKey();

                if (i==1)
                {
                    j++;
                }

                if (i==3)                       // отменить и выйти
                {
                    i=0;
                    j=1;
                    goto main;
                }

                // индикация настраевомого времени
                if (j==1) {LCD_Goto(6,1); LCD_SendStr("^^");}
                if (j==2) {LCD_Goto(6,1); LCD_SendStr("   ^^");}

                LCD_Goto(0,0);
                LCD_SendStr("Time");

                LCD_Goto(6,0);
                BCD_2Lcd(hour);
                LCD_WriteData(':');
                BCD_2Lcd(MIN);
                LCD_WriteData(':');
                BCD_2Lcd(0);


                switch (j)
                {
                    case (1):
                    {
                        if (j!=1) {break;}
                        if (i==2)
                        {
                            
                            hour++;
                            if (hour>23) {hour=0;}
                            
                        }
                    }

                    case (2):
                    {
                        if (j!=2) {break;}
                        if (i==2)
                        {
                            
                            MIN++;
                            if (MIN>59) {MIN=0;}
                            
                        }
                    }

                }


                if (j==3)                       // сохранить настройки и продолжить
                {
                    RTC_write_time(hour, MIN, 0);
                    j=1;
                    LCD_Clear();
                    break;
                }


            }

            while (2)                           // настрока даты
            {

                i=BUT_GetKey();

                if (i==1)
                {
                    j++;
                }

                if (i==3)                       // отменить и выйти
                {
                    i=0;
                    j=1;
                    goto main;
                }

                // индикация настраиваемой даты и дня недели
                if (j==1) {LCD_Goto(5,1); LCD_SendStr("^^");}
                if (j==2) {LCD_Goto(5,1); LCD_SendStr("   ^^");}
                if (j==3) {LCD_Goto(8,1); LCD_SendStr("   ^^");}
                if (j==4) {LCD_Goto(11,1); LCD_SendStr("   ^^");}

                LCD_Goto(0,0);
                LCD_SendStr("Date");

                LCD_Goto(5,0);
                BCD_2Lcd(day);
                LCD_WriteData('/');
                BCD_2Lcd(month);
                LCD_WriteData('/');
                BCD_2Lcd(year);
                LCD_WriteData(' ');
                put_wday();


                switch (j)
                {
                    case (1):
                    {
                        if (j!=1) {break;}
                        if (i==2)
                        {
                            
                            day++;
                            if (day>31) {day=1;}
                            
                        }
                    }

                    case (2):
                    {
                        if (j!=2) {break;}
                        if (i==2)
                        {
                            
                            month++;
                            if (month>12) {month=1;}
                            
                        }
                    }

                    case (3):
                    {
                        if (j!=3) {break;}
                        if (i==2)
                        {
                            
                            year++;
                            if (year>40) {year=12;}
                            
                        }
                    }

                    case (4):
                    {
                        if (j!=4) {break;}
                        if (i==2)
                        {
                            
                            wday++;
                            if (wday>6) {wday=0;}
                            
                        }
                    }

                }


                if (j==5)                       // сохранить настройки и продолжить
                {
                    RTC_write_date (wday, day, month, year);
                    j=1;
                    LCD_Clear();
                    break;
                }

            }


        }


        //=== конец настроек =======================================================================================================
        //==========================================================================================================================


    } // end while(1)
} // end main
 

Если кому попадались такие ошибки или кто знает их решение- пожалуйста поделитесь.
И да, я только учусь...

58e911f329c84_.png.4e5a87d7156b08fd2e914f41fa978139.png

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

То, что вы приложили - это не весь исходник, а только один файл проекта. В проекте должно быть еще несколько других файлов - они есть? Ссылки не найдены на те функции и переменные/константы, которые определены в отсутствующих файлах. Если остальные файлы есть, то нужно приинклюдить заголовочные файлы от остальных модулей.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Гость
Эта тема закрыта для публикации ответов.
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...