02.03.2018, 14:17
|
|
Прописка
Регистрация: 25.11.2008
Сообщений: 114
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
<avr/eeprom.h>
Пытаюсь работать с EEPROM в Atmel Studio 7.
Если подключаю библиотеку и объявляю переменные в main.c :
Код:
|
//--------------------------------------------------------------
#include "main.h"
//—————————————-
#include ‹avr/eeprom.h›
uint16_t freq1e EEMEM = 500; uint16_t p_lene EEMEM = 1000; uint16_t freq2e EEMEM = 5000;
//----------------------------------------------------------------------
//—————————————-
void port_ini(void)
{
PORTD=0b00000011;
DDRD=0b11111100;
PORTC=0b00111100;
DDRC=0b00000000;
}
//—————————————-
//================================================== ===========
int main(void)
{
//================================================== ===========
port_ini(); //Инициализируем порты
LCD_ini(); //Инициализируем дисплей
clearlcd();//очистим дисплей |
То работает, но не видит функции чтения/записи из других файлов. Только в main.c.
Если делаю подключение/объявление в main.h :
Код:
|
#ifndef MAIN_H_
#define MAIN_H_
//================================================== ===========
#define F_CPU 8000000UL
#include ‹avr/io.h›
#include ‹avr/interrupt.h›
#include ‹util/delay.h›
#include ‹stdio.h›
#include ‹stdlib.h›
#include ‹avr/eeprom.h›
uint16_t freq1e EEMEM = 500; uint16_t p_lene EEMEM = 1000; uint16_t freq2e EEMEM = 5000;
//--------------------------------------
#include "lcd.h"
#include "timers.h"
#include "adc.h"
#include "encoders.h"
#include "eeprom.h"
//-------------------------------------------------------------
#define e1 PORTD|=0b00001000 // установка линии E в 1
#define e0 PORTD&=0b11110111 // установка линии E в 0
#define rs1 PORTD|=0b00000100 // установка линии RS в 1 (данные)
#define rs0 PORTD&=0b11111011 // установка линии RS в 0 (команда)
//-------------------------------------------------------------------
int EncValue11; int EncValue2; int EncValue3;
uint16_t freq1;
uint16_t p_len;
uint16_t freq2; |
То ругается : multiple definition of `freq1e' .
Какой "multiple" ?
В обоих случаях один раз.
Там ещё куча переменных, они не "multiple".
Что не так?
|
|
|
|
02.03.2018, 14:49
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: <avr/eeprom.h>
Сообщение от DPANYTA
|
Какой "multiple" ?
В обоих случаях один раз.
Там ещё куча переменных, они не "multiple".
Что не так?
|
Есть магическое слово extern. Но вы его нигде не используете. Разберитесь с ним.
|
|
|
|
02.03.2018, 15:02
|
|
Гражданин KAZUS.RU
Регистрация: 15.08.2010
Адрес: Днепр
Сообщений: 842
Сказал спасибо: 74
Сказали Спасибо 199 раз(а) в 174 сообщении(ях)
|
Re: <avr/eeprom.h>
У меня нет седьмой студии, но переменные в eeprom я не так объявляю.
У меня объявлены вот так:
PHP код:
|
uint16_t EEMEM SPEED1; //рецепт позиции 1 в eeprom
uint16_t EEMEM SPEED2; //поз. 2
uint16_t EEMEM SPEED3; //поз. 3
|
И все работает.
И еще. На прямую в них, через =, записать нельзя. Только через функции записи.
Последний раз редактировалось МВА; 02.03.2018 в 15:11.
|
|
|
|
02.03.2018, 15:11
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 919
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: <avr/eeprom.h>
Сообщение от Bill
|
Есть магическое слово extern. Но вы его нигде не используете. Разберитесь с ним.
|
Применение extern считается плохим тоном. Оно может вести куда угодно и потом вы и сами потеряетесь, откуда оно тянет функцию. Это очень порочный способ программирования.
|
|
|
|
02.03.2018, 15:17
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: <avr/eeprom.h>
Сообщение от Easyrider83
|
Применение extern считается плохим тоном. Оно может вести куда угодно и потом вы и сами потеряетесь, откуда оно тянет функцию. Это очень порочный способ программирования.
|
С чего это вы взяли?
|
|
|
|
02.03.2018, 17:50
|
|
Прописка
Регистрация: 25.11.2008
Сообщений: 114
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: <avr/eeprom.h>
Пробовал и uint16_t EEMEM SPEED1;
пробовал и uint16_t SPEED1 EEMEM ;
Без разницы.
Добавление магического слова extern привело к ошибке:
undefined reference to `freq2e'
Остальные переменные обходятся же без магии...
|
|
|
|
03.03.2018, 06:44
|
|
Гражданин KAZUS.RU
Регистрация: 02.06.2003
Адрес: Челябинск
Сообщений: 545
Сказал спасибо: 10
Сказали Спасибо 341 раз(а) в 202 сообщении(ях)
|
Re: <avr/eeprom.h>
Сообщение от DPANYTA
|
Добавление магического слова extern привело к ошибке:
undefined reference to `freq2e'
|
Еще раз: разберитесь с extern, где и как его использовать.
|
|
|
|
03.03.2018, 07:40
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,121
Сказал спасибо: 2,569
Сказали Спасибо 11,944 раз(а) в 5,991 сообщении(ях)
|
Re: <avr/eeprom.h>
Сообщение от DPANYTA
|
Какой "multiple" ?
...
Что не так?
|
Вы привели только два файла. А ведь есть еще Ваши файлы. А там какие инклюды? Да и в приведенных инклюды кастрировали.
Разберитесь со смыслом инклюдов, как работает этот механизм. Да и с экстерном тоже разобраться не мешает - что это и дляназачем. Про дурной тон - это вопрос религиозный.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
03.03.2018, 08:43
|
|
Заблокирован
Регистрация: 07.09.2014
Адрес: В Кремле!
Сообщений: 4,486
Сказал спасибо: 396
Сказали Спасибо 2,221 раз(а) в 1,319 сообщении(ях)
|
Re: <avr/eeprom.h>
Сообщение от Bill
|
С чего это вы взяли?
|
дак вот с того и взято, что ладно бы, если по имени переменной/функции вы можете вспомнить, в какой файл вы положили ее реальное описание... а если нет? Вот и представьте себе, что вы скопипастили текст в другой проект, а в тексте - extern, да еще и штук 10. Вам надо методом тыка найти каждый файл с реальным описанием. Нормальные ПО разработки конечно по щелчку на имени приведут к исходному тексту, но если вы просто из "блокнота" копируете?
Это один момент. Второй момент - вам не ясна структура связей проекта, что куда и откуда завязывается и на что ссылается.
Отсюда и получаются непонятки с "красными карточками".
А "multiple definion" - это "двойное определение", чаще всего получается из-за повторного подключения одного и того же заголовочника. Каждый заголовочник должен иметь "предохранитель" от повторного подключения в виде
#ifndef MY_HEADER_FILE_H
#define MY_HEADER_FILE_H
....
текст заголовочника
....
#endif
И еще. В первом сообщении в коде: что это такое
#include "main.h"
//—————————————-
#include
почему пустой инклюд?
Чтобы правильно подключать функции из других файлов, не используя extern, надо делать так:
Пишем файл my_file.c и в пару к нему my_file.h
В файле my_file.c пишем тексты функций, например
void MyFunct (int param)
{
... текст функции....
}
а в файле my_file.h пишем
void MyFunct (int param);
После этого в main.c вверху пишем
#include my_file.h
и далее в тексте спокойно уже вызываем нашу функцию
...
MyFunct(215);
...
Вот так, все корректно и красиво, наглядно видно, откуда пришла функция, и без всяких extern
Последний раз редактировалось NewWriter; 03.03.2018 в 08:56.
|
|
|
Сказали "Спасибо" NewWriter
|
|
|
03.03.2018, 09:37
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,121
Сказал спасибо: 2,569
Сказали Спасибо 11,944 раз(а) в 5,991 сообщении(ях)
|
Re: <avr/eeprom.h>
Сообщение от NewWriter
|
Пишем файл my_file.c и в пару к нему my_file.h
В файле my_file.c пишем тексты функций
|
Но тут есть один маленький деталь. У меня маленькая кучка файлов с необходимыми функциями, а не один. Что - копипастить их в один?!
Просто я их собираю в "myf.h", а этот уже в main. И экстернов не боюсь, в каждом хидере с экстернами есть предупреждающее описание. И никаких непоняток и фобий.
Сообщение от NewWriter
|
А "multiple definion" - это "двойное определение"
|
Если уж быть точным, то "множественное".
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 22:10.
|
|