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

Ошибки в 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 пользователей онлайн

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

    • Ловите, как раз на широкую полосу для Палника рисовали, автора не знаю. Все, что нужно.   
    • @Андрей0З9  Это что за учитель и где, такой по трудовому обучению, задает задачи по физике 10 класса.?!  Бред полный.
    • Румынский дядька - перфекционист-фенечник. Бисера и бусин - дофига, вот и ставит куда не попадя, в данном случае бусинками выставил единую высоту ряда конденсаторов. Подобное встречалось, когда на ножки впаиваемых элементов одевались короткие кембрики одинаковой высоты, чем задавалась единая высота монтажа. Ну видимо румынскому дядьке лень было нарезать кучу одинаковой мелочёвки, зато было вналичии много бисера..., и креативно и желаемого достиг. С уважением, Сергей. 
    • О, это очень полезные регистры! в 88 только GPIOR0 сохранил свои полезные свойства. использую их как флаги событий прерываний. для GPIOR0 адрес порта ввода-вывода 0х1Е, а значит к нему применяются команды cbi, sbi, sbic, sbis   ну и   in, out. Когда происходит прерывание, процессор переходит на адрес обработки прерывания, вот там-то мы и располагаем код: sbi   GPIOR0, 0     ;установить в 1 бит 0 в регистре GPIOR0 reti                        ;вернуться из прерывания   Без использования регистра GPIOR0, а с использованием обычного регистра код выглядел бы иначе: push   R0                          ;освобождаем регистр R0 для SREG и сохраняем его in        R0, SREG               ;сохраняем SREG в R0, все флаги операций текущей программы sbr     R23, 1<<0             ;выставляем флаг признака прерывания, например бит 0 в регистре R23 out    SREG, R0               ;восстанавливаем SREG, все флаги операций текущей программы pop   R0                          ;восстанавливаем значение R0 reti                                  ;вернуться из прерывания   Нетрудно заметить......!   А, да команда: sbr     R23, 1<<0 в идеале изменяет флаги в SREG, потому и такая длинная цепочка команд.
    • Сабсоник 3 порядка потом усилитель на Оу. Далее все на столе отстроить и все 
    • Вот и я думаю сделать на сдвоенном операционнике входной усилитель и сабсоник. 
    • Я всегда подозревал, что эта схема была содрана кЕтайцами с какого-то старого и хорошо известного (но не у нас) блока питания, и что в оригинале использовались именно 741 операционники. И вот тому подтверждение... Все равно те микросхемы и транзисторы что они используют в наборах, чаще всего подделки. Мне например, пришлось заменить D1047 транзистор что шел в наборе на пару таких же, но нормальных (выдраных с дохлого усилка). Транзистор из набора (маркировка явно "левая", без какого-либо намека на изготовителя) сильно грелся даже на 1,5А. Такой же транзистор D1047, но из усилка грелся раза в два меньше, да и маркировка "нормальная".  Подозреваю что и TL081 что в наборе идут тоже возможно что перемаркированные 741 (они супердешевые, сравнимо с 358). 741 операционники выпускали все кому не лень, аналогов было выпущено очень много за полвека.  Были и на плюс-минус 22в, надо смотреть конкретный даташит и производителя, даже от буквы в конце это зависит.  Например, есть такой аналог uA741 от ST ("микро-А741"). ua741-957400.pdf ua741.pdf MA741.PDF
×
×
  • Создать...