Програмирование двухрежимной работы микроконтроллера.

Обсуждаем контроллеры компании Atmel.
Ответить
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Demiurg, какие автоматы, какая параллельность, какие таймеры, какя блохаааа.... :facepalm: Вы ещё ось предложите прикрутить ТС'у.
Задача элементарная :

Код: Выделить всё

#define		BUTT	(PINB & (1<<4))	// Тут дефайним пин батона
#define		FR_TICK		0.1	//

bool 	mode=0;
uint32	time;

//*********************************************
void set_time(void){
	if(mode)	time=(3600/FR_TICK) + rand() % (3600/FR_TICK);	
	else		time=(3600/FR_TICK) * 1.5;
}
//*********************************************


//*********************************************
void main(void){

..........
..........

while(1){
	set_time();
	do{
		_delay_ms(1000*FR_TICK);
		if(!--time){
			set_time();
			PORTA |=(1<<4); 	/* Подаю ток на ножку PA4 */
			_delay_ms(3000); 	/* время подачи тока на ножку PA4 - 3 сек */
			PORTA &=~(1<<4); 	/* выключаю ножку PA4 */			
		}
	}while(!BUTT);
	_delay_ms(100);
	while(BUTT);
	mode=!mode;
}

}
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg писал(а): как в любой момент времени сделать смену режима.
что такое смена режима в понимании ТС? это прекращение одного алгоритма и переход на другой.
под ваше описание можно было бы подвести следующую задачу: есть две ножки МК, в первом режиме на одной из них светодиод мигает со скважностью 1:3, а на другой со скважностью 1:125, причем за 1 для первого принята 1 с, а для второго - 1 минута. во втором режиме обе ножки за единицу используют 1 секунду, но мигают со скважностью 1:3.3 и 1:2.7.

вот тут я бы не спешил с рекомендациями использовать для переключения режимов сброс, а для "мигания" _delay_ms(). тут, пожалуй, таймеры и т.п. "конечные автоматы", псевдомногозадачность или параллельность были бы более уместны, а может быть и вообще неизбежны.

вы же предлагаете игнорировать простоту и поступать "универсально".
надо вскопать клумбу под окном - берем К700, вспахиваем гектар вокруг дома, а лишнее потом утаптываем или укатываем в асфальт - вот что вы предлагаете. я же предлагаю взять лопатку и аккуратно вскопать только 1 кв.м клумбы
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Аlex писал(а):...
Вы повторили практически один в один код выше.
И у вас не выполнены условия задачи. Смена режима в любой момент. Отключение выхода, если он горит в момент смены режима.
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Demiurg писал(а):Отключение выхода, если он горит в момент смены режима.
Этого не было в условии.
Было вот что сказано :
если первый режим включился - 1,5 часа - нельзя будет его переключить.
Да и подождать 3 секунды, чтобы переключить режим - не проблема, по сравнению с 1.5 часами.
Так что, не вижу никаких проблем. Тем более, надобности в автоматах с распараллеливанием задач.

Про точность отсчёта, ТС также ничего не говорил, по этому подобный вариант вполне подойдёт.

ЗЫ: Если уж очень захочется переключать режим в момент 3-х секундной задержки - вставляем цикл из тех-же 100-миллисекундных тиков и, по нажатию на кнопку, делаем выход из него. Всё, проблема решена.
Реклама
Эиком - электронные компоненты и радиодетали
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Demiurg писал(а):В том то и дело, что за простым вопросом ТС непростые задачи.
Предложите что-нибудь, что отвечает требованиям ТС.
Так пусть он сначала сформулирует ТЗ. В первом же ответе я задал уточняющие вопросы
От какого момента должен идти отсчет, от последнего включения нагрузки или от нажатия/отпускания кнопки? Если программа досчитала 1.2 часа, но тут нажали кнопку и рандом выдал 1 час что должно произойти? Какая нужна точность? Надо ли переключаться пока нагрузка включена (те самые 3 секунды)?
и привел пример кода, который легко изменить и который более-менее удовлетворяет этим размытым требованиям. Теперь Alex привел нечто очень похожее.
Вариант с ресетом интересен своей предельной простотой. Даже если ТЗ изменится настолько что проще будет написать заново, о потере тех 17 строчек я не пожалею.
.
Ну и раз уж пошло соревнование чей код длиннее лучше, предлагаю заодно собрать свои поделия и сравнить хотя бы размер. Влезет ли код Demiurg'a в ту же ATtiny10 или хотя бы ATtiny25? Вроде упоминалось о выборе контроллера под задачу, так вот, эта задача большего не стоит. Ну и тогда уж стоит расписать под какое ТЗ делался код, точнее кто как его понял.
Реклама
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

1:
sTRog писал(а):Вопрос: Как реализовать двухрежимную работу микроконтроллера, с возможностью мгновенного переключения.
Смена режима - это смена режима. Интерпретации быть не может в принципе. Хотя бы потому, что во втором режиме интервал рандомный.

2: 792 bytes of CODE memory (+ 34 range fill )
93 bytes of DATA memory (+ 10 absolute )

3: Я один вчера трезвый был?
Контактная информация:
Реклама
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Вариант из 2-го поста: 588 байт флеша, 4 байта ОЗУ.
Вариант с ресетом (на Си) 538 байта флеша, 5 байт ОЗУ (на удивление много, я не знаю для чего там 5 байт ОЗУ занято если всего 1 переменная и та char).
Последний раз редактировалось COKPOWEHEU Сб июл 16, 2016 10:41:50, всего редактировалось 1 раз.
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Только ассемблерщики меряются у кого короче...
Вы не кодьте что попало. Напишите нормальный вариант. Чтобы можно было хотя бы в 100 мс уложиться с опросом кнопки. Чтобы была полная смена режима.
И выкладывайте варианты (рабочие, проверенные на реальном мк, времянки для теста уменьшить, не будем же по полтора часа ждать), не стесняйтесь. Я свой выложил.
Контактная информация:
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg, вы случайно не в Microsoft работаете? очень уж подход к написанию программ похож... где всякие GNU-шники решают задачу программой в 100 килобайт, Microsoft выдает пакет на сотню мегабайт с ежемесячными дополнениями по 50 мегабайт...

ну скажите мне откровенно: вам платят за количество строк программы умноженное на количество файлов в проекте? для чего делать, пусть и логически правильный, но абсолютно нерационально сложный проект для столь примитивной задачи?! Разумеется, результат разных подходов в памяти МК будет занимать место одного порядка, т.к. сложность задачи не меняется... но зачем тратить свое время на то, что никому не сделает лучше?!
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Подход 1 - каждый раз извращаться, придумывать как решить алгоритм.
Подход 2 - модульный подход и дробление процессов, этим добиваемся псевдопараллельности процессов и гарантированно получаем своевременную реакцию. Неважно, есть ли готовые модули или писать заново, главное тут следующее - проект собирается как конструктор. Модули общаются меж собой так или иначе, и на этом можно выстраивать любую логику управления.

Поэтому при кажущейся сложности (для вас, и только потому, что вы не поняли сути подхода) мы получаем более высокую скорость создания проектов. Объем кода не сильно превышает по сравнению со "стандартным" подходом.
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Вариант с задержками: 764 байта флеша и 4 байта ОЗУ
Вариант с таймером: 802 байта флеша и 8 байт ОЗУ
Делать на асме не буду, лень писать функцию рандома.
Поэтому при кажущейся сложности (для вас, и только потому, что вы не поняли сути подхода) мы получаем более высокую скорость создания проектов. Объем кода не сильно превышает по сравнению со "стандартным" подходом.
Вы забываете один момент. Мы здесь стараемся не приводить решения конкретной задачи, а показать как ее можно решить, чтобы новичок мог по образцу доделать под свои нужды. А разобраться в одном файле с тремя десятками сток (из которых десять - комментарии и оформление) гораздо проще, чем бегать по дереву каталогов, выясняя что откуда вызывается, да еще и без комментариев и описания "скелета", на который натягиваются ваши модули.
Вложения
res.zip
(23.57 КБ) 155 скачиваний
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Demiurg писал(а):Поэтому при кажущейся сложности (для вас, и только потому, что вы не поняли сути подхода) мы получаем более высокую скорость создания проектов.
во-первых, ваш подход не может вызвать непонимание у меня, не обольщайтесь.
во-вторых, посмотрите на мою подпись и ознакомьтесь с принципом бритвы Оккама... это философия, которая помогает понять мир. ваш подход избыточен, а значит, не может быть лучшим.

то, что вы умеете так делать, вовсе не обязывает вас так делать всегда. и тем более декларировать исключительную правильность вашего метода...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Всем здравствуйте. Большое спасибо, за то, что не остались равнодушны и помогаете бестолковому новичку.

Теперь по делу:
Кто-то не понял, о чем я просил. Возможно повторюсь, но попытаюсь более понятно объяснить.
1) Задача:
СпойлерЕсть микроконтроллер (atmega 16-16AU SMD, если интересно) К нему подключены кнопка, светодиод (для отслеживания режима) и устройство.
1) Подается питания на МК - включается режим А (начиная с подачи питания, через (диапозон от 1 до 2 часов) - подается напряжение на ножку 3 сек.
2) Нажатие на кнопку в любой момент времени приводит к переключению на режим Б (начиная с момента переключения на режим Б, сразу же пойдет отсчет времени (1.5 часа) до подачи напряжения - 3 сек.
3) Нажатие на кнопку в любой момент времени приводит к переключению на режим А и т.д.

Допустимая погрешность: 1-3 секунды, конечно чем точнее, тем лучше, но так или иначе токая точность тоже допустима.
Теперь вопросы, по кодам, что вы выложили:
1) Код пользователя COKPOWEHEU
Спойлер

Код: Выделить всё

#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>
#define F_CPU 1000000UL

int mode __attribute__ ((section (".noinit"))); //активный режим. Секция noinit говорит о том что при старте программы инициализироваться переменная не будет

#define LED_ON() do{PORTA |= (1<<4);}while(0) //включение нагрузки
#define LED_OFF() do{PORTA &=~(1<<4);}while(0) //выключение нагрузки

inline void _delay_s(unsigned int s){ while(s--)_delay_ms(1000); } //даже не знаю нужен ли тут комментарий

int main(){
	DDRB = (1<<4);
	mode = !mode; //меняем режим при каждом перезапске
	while(1){
		if(mode)_delay_s(5400); else _delay_s(3600 + random()%3600);
		LED_ON();
		_delay_s(3);
		LED_OFF();
	}
}
Вопросы:
1) inline void _delay_s(unsigned int s){ while(s--)_delay_ms(1000); } - функция делает задержку в 1 сек, пока s-- - что это значит?
2) Где указана работа с кнопкой? Т.е. как МК поймет, что нужно переключится на другой режим?
3) Код откомпилировался на ура.
*********************************************


2) Предложение ARV
СпойлерОчень тупо и кратко:
1. кнопку переключения режимов вешаем на сброс
2. сразу после сброса читаем из EEPROM флаг, проверяем, затем инвертируем его и сохраняем в EEPROM
3. по результатам проверки флага переходим к тупому циклу отработки того или иного режима - задержки хоть по году могут быть
Вопросы:
1) Вешаем на сброс - т.е. на RESET ?. И с каждой подачи на RESET будет перезапускаться программа?
2)
2. сразу после сброса читаем из EEPROM флаг, проверяем, затем инвертируем его и сохраняем в EEPROM
3. по результатам проверки флага переходим к тупому циклу отработки того или иного режима - задержки хоть по году могут быть
Не могли бы, пожалуйста, привести пример? Мне достаточно сложно понять, как это сделать програмно.
*********************************************


3) Код Аlex
Выдает такие ошибки при компиляции:
СпойлерSeverity Code Description Project File Line
Warning #warning "F_CPU not defined for <util/delay.h>" [-Wcpp] Pick2 c:\program files\atmel\studio\7.0\toolchain\avr8\avr8-gnu-toolchain\avr\include\util\delay.h 90
Error recipe for target 'main.o' failed Pick2 D:\Dream\2Pick\Pick2\Pick2\Debug\Makefile 79
Error unknown type name 'bool' Pick2 D:\Dream\2Pick\Pick2\Pick2\main.c 12
Error unknown type name 'uint32' Pick2 D:\Dream\2Pick\Pick2\Pick2\main.c 13
Error invalid operands to binary % (have 'int' and 'double') Pick2 D:\Dream\2Pick\Pick2\Pick2\main.c 17
Warning overflow in implicit constant conversion [-Woverflow] Pick2 D:\Dream\2Pick\Pick2\Pick2\main.c 18
Warning return type of 'main' is not 'int' [-Wmain] Pick2 D:\Dream\2Pick\Pick2\Pick2\main.c 24
Error expected expression before '...' token Pick2 D:\Dream\2Pick\Pick2\Pick2\main.c 26
И так же непонятно, как происходит обработка кнопки?
****************************************


4) Второй вариант кода от COKPOWEHEU выдал ошибки при компиляции:
СпойлерSeverity Code Description Project File Line
Error recipe for target 'main.o' failed 3Pick D:\Dream\3Pick\3Pick\3Pick\Debug\Makefile 79
Warning 'TIM0_COMPA_vect' appears to be a misspelled signal handler 3Pick D:\Dream\3Pick\3Pick\3Pick\main.c 22
Error 'OCR0A' undeclared (first use in this function) 3Pick D:\Dream\3Pick\3Pick\3Pick\main.c 36
Message each undeclared identifier is reported only once for each function it appears in 3Pick D:\Dream\3Pick\3Pick\3Pick\main.c 36
Error 'TCCR0A' undeclared (first use in this function) 3Pick D:\Dream\3Pick\3Pick\3Pick\main.c 37
Error 'TCCR0B' undeclared (first use in this function) 3Pick D:\Dream\3Pick\3Pick\3Pick\main.c 38
Error 'WGM02' undeclared (first use in this function) 3Pick D:\Dream\3Pick\3Pick\3Pick\main.c 38
Error 'TIMSK0' undeclared (first use in this function) 3Pick D:\Dream\3Pick\3Pick\3Pick\main.c 39
Error 'OCIE0A' undeclared (first use in this function) 3Pick D:\Dream\3Pick\3Pick\3Pick\main.c 39
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

sTRog писал(а):...
При смене режима, если в момент нажатия работает выход, выход должен быть отключен? 3 секунды работы выхода (неважно сколько секунд) жесткое время?
Контактная информация:
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Есть микроконтроллер (atmega 16-16AU SMD, если интересно)
Вот это было дельное уточнение. А зачем такой мощный контроллер? Хватает и ATtiny13 или ATtiny25 у которых всего 8 ног.
1) Код пользователя COKPOWEHEU
Этот код использовать не стоит, он писался больше как доказательство возможности такого извращения. Если вы не обратили внимание на контекст, кнопка висит на ресете контроллера. Рабочая и отлаженная версия вместе с моделью для протеуса тут, только надо после изменения режима (переменной mode) добавить обнуление счетчика времени (переменная sec или time в зависимости от версии). Ну и режимы тогда поменять местами, у меня первым идет режим с фиксированным временем.
начиная с момента переключения на режим Б, сразу же пойдет отсчет времени
Все мои версии делались в расчете на то, что счет продолжается. Впрочем, добавить обнуление переменной не проблема.
s-- - что это значит?
Учите Си. Это уменьшение переменной на 1, а проверка в while означает что цикл будет выполняться пока переменная не равна нулю.
2) Предложение ARV
Вопросы:
1) Вешаем на сброс - т.е. на RESET ?. И с каждой подачи на RESET будет перезапускаться программа?
Да, но программа это отслеживает (у ARV используется переменная в EEPROM, у меня в ОЗУ) и при каждом перезапуске меняет режим. Единственное что функция рандома может в таких условиях неправильно работать.
Не могли бы, пожалуйста, привести пример? Мне достаточно сложно понять, как это сделать програмно.
Именно про него, точнее про мою реализацию его алгоритма, вы спрашивали "где кнопка".
4) Второй вариант кода от COKPOWEHEU выдал ошибки при компиляции:
Писалось под ATtiny13, там у регистров другие имена. Думаю, будет полезнее если сами разберетесь как это исправить.
Кто-то не понял, о чем я просил. Возможно повторюсь, но попытаюсь более понятно объяснить.
Кнопка с фиксацией или без? Планируется ли индикация режима?
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

sTRog писал(а):Мне достаточно сложно понять, как это сделать програмно
мне тоже не совсем понятны ваши формулировки в задаче. например:
sTRog писал(а):режим А (начиная с подачи питания, через (диапозон от 1 до 2 часов) - подается напряжение на ножку 3 сек
лично я это понимаю так: подали питание, подождали от 1 до 2 часов (интересно, как именно задается этот интервал?!) и однократно 3 секунды выдали сигнал. что происходит потом - не понятно. у меня есть подозрения, что вы имели ввиду "после подачи питания каждые 1-2 часа подается 3-секундный импульс на выход" - это так? из написанного вами этого явно не следует.

поэтому сделать для вас решение вашей задачи я не могу, ибо крайне не люблю догадываться о чужих планах. так как, судя по вопросу о s--, вы не сможете понять мой код самостоятельно, для меня это означает лишний геморрой "поддержки" моей писанины, в чем я так же не заинтересован.

если вы сформулируете задачу абсолютно однозначно и исчерпывающе, я смогу реализовать решение по своему принципу для вас, которое будет решать вашу задачу 100%. но обсуждать свой код мне будет интереснее (и веселее) с другими - Demiurg и/или COKPOWEHEU :)))
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Это не хвост, это антенна
Сообщения: 1492
Зарегистрирован: Ср июн 25, 2008 15:19:44

Сообщение Demiurg »

Ради прикола я мог бы написать и на асме. Размяться так сказать. С блэкджеком и шлюхами. С дроблением процессов и конечными автоматами. Как перешел на си несколько лет назад, не писал проекты на асме (я тогда обрубил себе дорогу назад, полностью бросил писать на асме и проекты, до тех пор, пока не начал более-менее писать на си). Но занят, во-первых, добиваю висяки, во-вторых, развиваю сейчас одно направление. Приборы, в которых используется измерение переменного напряжения и тока.

Лирика:
Один из последних проектов на асме, так баловался. Видео.
Вложения
LCD_4.rar
(29.35 КБ) 133 скачивания
Контактная информация:
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Почему ругается на обьявление порта?
Только добавляю строку
DDRA;
и сразу выдает три ошибки

Error recipe for target 'main.o' failed TEST D:\Dream\TEST\TEST\TEST\Debug\Makefile 79
Error expected identifier or '(' before 'volatile' TEST D:\Dream\TEST\TEST\TEST\main.c 13
Error expected ')' before '(' token TEST D:\Dream\TEST\TEST\TEST\main.c 13

Ругается, словно он не понимает значенич DDRA, но библиотека #include <avr/io.h> подключена же.
Говорящий с текстолитом
Аватара пользователя
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Сообщение COKPOWEHEU »

Естественно он на такую запись будет ругаться. Вы же даже не присваиваете порту какое-то значение. Это примерно тоже самое что написать int x; x; Ну и если какие-то проблемы компиляции выкладывайте весь код, makefile и, если есть сомнения, фузы. Без этого гадать можно долго.
Встал на лапы
Сообщения: 131
Зарегистрирован: Вс май 08, 2016 22:45:48

Сообщение sTRog »

Код
Спойлер

Код: Выделить всё

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>



float Kvant;
float Sec;
float Min;
float Hour;
char mod = 0;

DDRA4 = 1; //Так можно сделать порт А4 на вход?
DDRA |=(1<<4); //А на такую запись он и ругается.


void main (void)
{
	while (1)
	{
		if (mod==0)
		{
			
		} 
		else
		{
			
		}
		
	}
}
Ошибки:
СпойлерSeverity Code Description Project File Line
Error expected ')' before '(' token TEST D:\Dream\TEST\TEST\TEST\main.c 16
Error recipe for target 'main.o' failed TEST D:\Dream\TEST\TEST\TEST\Debug\Makefile 79
Warning data definition has no type or storage class TEST D:\Dream\TEST\TEST\TEST\main.c 15
Warning type defaults to 'int' in declaration of 'DDRA4' TEST D:\Dream\TEST\TEST\TEST\main.c 15
Error expected identifier or '(' before 'volatile' TEST D:\Dream\TEST\TEST\TEST\main.c 16
makefile
Спойлер################################################################################
# Automatically-generated file. Do not edit!
################################################################################

SHELL := cmd.exe
RM := rm -rf

USER_OBJS :=

LIBS :=
PROJ :=

O_SRCS :=
C_SRCS :=
S_SRCS :=
S_UPPER_SRCS :=
OBJ_SRCS :=
ASM_SRCS :=
PREPROCESSING_SRCS :=
OBJS :=
OBJS_AS_ARGS :=
C_DEPS :=
C_DEPS_AS_ARGS :=
EXECUTABLES :=
OUTPUT_FILE_PATH :=
OUTPUT_FILE_PATH_AS_ARGS :=
AVR_APP_PATH :=$$$AVR_APP_PATH$$$
QUOTE := "
ADDITIONAL_DEPENDENCIES:=
OUTPUT_FILE_DEP:=
LIB_DEP:=
LINKER_SCRIPT_DEP:=

# Every subdirectory with source files must be described here
SUBDIRS :=


# Add inputs and outputs from these tool invocations to the build variables
C_SRCS += \
../main.c


PREPROCESSING_SRCS +=


ASM_SRCS +=


OBJS += \
main.o

OBJS_AS_ARGS += \
main.o

C_DEPS += \
main.d

C_DEPS_AS_ARGS += \
main.d

OUTPUT_FILE_PATH +=TEST.elf

OUTPUT_FILE_PATH_AS_ARGS +=TEST.elf

ADDITIONAL_DEPENDENCIES:=

OUTPUT_FILE_DEP:= ./makedep.mk

LIB_DEP+=

LINKER_SCRIPT_DEP+=


# AVR32/GNU C Compiler



./%.o: .././%.c
@echo Building file: $<
@echo Invoking: AVR/GNU C Compiler : 4.9.2
$(QUOTE)C:\Program Files\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -x c -funsigned-char -funsigned-bitfields -DDEBUG -I"C:\Program Files\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.98\include" -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega16a -B "C:\Program Files\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.98\gcc\dev\atmega16a" -c -std=gnu99 -MD -MP -MF "$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -MT"$(@:%.o=%.o)" -o "$@" "$<"
@echo Finished building: $<




# AVR32/GNU Preprocessing Assembler



# AVR32/GNU Assembler




ifneq ($(MAKECMDGOALS),clean)
ifneq ($(strip $(C_DEPS)),)
-include $(C_DEPS)
endif
endif

# Add inputs and outputs from these tool invocations to the build variables

# All Target
all: $(OUTPUT_FILE_PATH) $(ADDITIONAL_DEPENDENCIES)

$(OUTPUT_FILE_PATH): $(OBJS) $(USER_OBJS) $(OUTPUT_FILE_DEP) $(LIB_DEP) $(LINKER_SCRIPT_DEP)
@echo Building target: $@
@echo Invoking: AVR/GNU Linker : 4.9.2
$(QUOTE)C:\Program Files\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-gcc.exe$(QUOTE) -o$(OUTPUT_FILE_PATH_AS_ARGS) $(OBJS_AS_ARGS) $(USER_OBJS) $(LIBS) -Wl,-Map="TEST.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mmcu=atmega16a -B "C:\Program Files\Atmel\Studio\7.0\Packs\atmel\ATmega_DFP\1.0.98\gcc\dev\atmega16a"
@echo Finished building target: $@
"C:\Program Files\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O ihex -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "TEST.elf" "TEST.hex"
"C:\Program Files\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -j .eeprom --set-section-flags=.eeprom=alloc,load --change-section-lma .eeprom=0 --no-change-warnings -O ihex "TEST.elf" "TEST.eep" || exit 0
"C:\Program Files\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objdump.exe" -h -S "TEST.elf" > "TEST.lss"
"C:\Program Files\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-objcopy.exe" -O srec -R .eeprom -R .fuse -R .lock -R .signature -R .user_signatures "TEST.elf" "TEST.srec"
"C:\Program Files\Atmel\Studio\7.0\toolchain\avr8\avr8-gnu-toolchain\bin\avr-size.exe" "TEST.elf"







# Other Targets
clean:
-$(RM) $(OBJS_AS_ARGS) $(EXECUTABLES)
-$(RM) $(C_DEPS_AS_ARGS)
rm -rf "TEST.elf" "TEST.a" "TEST.hex" "TEST.lss" "TEST.eep" "TEST.map" "TEST.srec" "TEST.usersignatures"
Причем не важно, напишу я просто DDRA; или DDRA |=(1<<4); - он ругается одинаково. Код вообще пустой, проверял, из за чего ошибки, и дело иммено с объявлением портов.
Фузы я не знаю, что такое :oops:
Ответить

Вернуться в «AVR»