Проблемы при программировании AVR на Си

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Проблемы при программировании AVR на Си

Сообщение THK » 13 май 2014, 20:19

Решил отдохнуть и... Собрал проект "Подключение микроконтроллера к локальной сети" с EasyElectronics благо была платка с сетью, SDкартой и мегой 1284 на борту.
Size after:
AVR Memory Usage
----------------
Device: atmega1284p

Program: 27756 bytes (21.2% Full)
(.text + .data + .bootloader)

Data: 1828 bytes (11.2% Full)
(.data + .bss + .noinit)
Впечатления самые положительные, скорость отдачи файла объемом 505Мб - 172 килобайта/с (1.3Мбита/с) При этом тормозов при управлении светодиодиком не заметил - реакция на нажатие кнопки в WEB интерфейсе мгновенная.
Так что говорить о большой "загрузке процессора" не стоит, вообще это некорректное выражение, нужно измерять время выполнения "главного цикла", а оно совсем небольшое.
Да, размер буфера сети 512 байт, при многопакетной передаче делать его больше нет смысла.
Пришлось немного подправить проект, т.к. работаю в WinAVR + имена регистров отличаются, если кому надо - выложу.

PS ATmega1284 в корпусе TQFP-44 стоит около 200 - 250 рублей (chipnn.ru) - это дорого?
Для большинства задачь ATmega644 будет более чем достаточно, применял ее только один раз, когда делал гелиостат, захотел сделать полный расчет (не таблицу, а именно расчет) положения солнца на небе. Тригонометрии там море, сами понимаете. :) Управление, естественно по сети.
Поискал в нете, STM32F205RET стоит от 320 до 400 рублей.

Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Проблемы при программировании AVR на Си

Сообщение Urbas81 » 13 май 2014, 23:39

THK писал(а):
Size after:
AVR Memory Usage
----------------
Device: atmega1284p

Program: 27756 bytes (21.2% Full)
(.text + .data + .bootloader)

Data: 1828 bytes (11.2% Full)
(.data + .bss + .noinit)
Подскажите, как в AVRStudio вывести такой отчет?

alexsis_76

Re: Проблемы при программировании AVR на Си

Сообщение alexsis_76 » 14 май 2014, 03:28

и
благо была платка с сетью, SDкартой и мегой 1284 на борту
Что для меги 1284 хороше , для меги32 плохо, слишком большой размер, поэтому попробывал впихать туда petitfat , заработало правда есть один небольшой глюк, а именно нигде не могу получить размер файла,когда выставляю вручную , страница грузится(в пределах указанного размера), когда пытаюсь получить размер у файловой системы, молчок
в результате оптимизации получилось
make all
AVR Memory Usage
----------------
Device: atmega32
Program: 15670 bytes (47.8% Full)
(.text + .data + .bootloader)
Data: 988 bytes (48.2% Full)
(.data + .bss + .noinit)
Done executing task "RunAvrGCC"
что внушает оптимизм
ATmega1284 в корпусе TQFP-44 стоит около 200 - 250 рублей (chipnn.ru)
немного погорячился 375р стоит в DIP корпусе , в TQFP-44 немного меньше(сейчас нет)
тогда этот STM32F107RBT6 там и Ethernet есть , правда нужно использывать внешний сетевой контроллер
Да, размер буфера сети 512 бай
как раз под размер сектора
Подскажите, как в AVRStudio вывести такой отчет?
да он вроде сам его рисует

Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Проблемы при программировании AVR на Си

Сообщение Urbas81 » 14 май 2014, 09:13

alexsis_76 писал(а): да он вроде сам его рисует
У меня нет, выводит кучу предупреждений, а о размере ни слова, может надо где-то что-то добавить в makefile? bkbв свойства проекта:?:

alexsis_76

Re: Проблемы при программировании AVR на Си

Сообщение alexsis_76 » 14 май 2014, 09:22

А Вы как компилируете, подключаете макефайл или редактируете сами

Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Проблемы при программировании AVR на Си

Сообщение Urbas81 » 14 май 2014, 10:25

alexsis_76 писал(а):А Вы как компилируете, подключаете макефайл или редактируете сами
Я не знаю как их редактировать, просто нажимаю Rebuild All, AVR Studio 4.19

alexsis_76

Re: Проблемы при программировании AVR на Си

Сообщение alexsis_76 » 14 май 2014, 11:09

только что скомпилировал в студии выплюнуло
Build started 14.5.2014 at 17:08:44
../lan.c: In function 'dhcp_filter':
../lan.c:109:6: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:112:6: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:115:6: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:118:6: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:158:5: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:160:5: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c: In function 'dhcp_poll':
../lan.c:279:3: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:281:3: warning: dereferencing type-punned pointer will break strict-aliasing rules
../cgi.c: In function 'cgi_chat_exec':
../cgi.c:158:3: warning: passing argument 2 of 'single_param' discards qualifiers from pointer target type
../cgi.c:14:7: note: expected 'prog_char *' but argument is of type 'const char *'
avr-gcc -mmcu=atmega32 -Wl,-Map=chatek.map counter.o enc28j60.o httpd.o lan.o main.o mmc.o ff.o cgi.o ds1820.o -o chatek.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature chatek.elf chatek.hex
avr-objdump -h -S chatek.elf > chatek.lss

AVR Memory Usage
----------------
Device: atmega32

Program: 27814 bytes (84.9% Full)
(.text + .data + .bootloader)

Data: 1857 bytes (90.7% Full)
(.data + .bss + .noinit)


Build succeeded with 9 Warnings...

Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Проблемы при программировании AVR на Си

Сообщение Urbas81 » 14 май 2014, 11:34

alexsis_76 писал(а):только что скомпилировал в студии выплюнуло
Build started 14.5.2014 at 17:08:44
../lan.c: In function 'dhcp_filter':
../lan.c:109:6: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:112:6: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:115:6: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:118:6: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:158:5: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:160:5: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c: In function 'dhcp_poll':
../lan.c:279:3: warning: dereferencing type-punned pointer will break strict-aliasing rules
../lan.c:281:3: warning: dereferencing type-punned pointer will break strict-aliasing rules
../cgi.c: In function 'cgi_chat_exec':
../cgi.c:158:3: warning: passing argument 2 of 'single_param' discards qualifiers from pointer target type
../cgi.c:14:7: note: expected 'prog_char *' but argument is of type 'const char *'
avr-gcc -mmcu=atmega32 -Wl,-Map=chatek.map counter.o enc28j60.o httpd.o lan.o main.o mmc.o ff.o cgi.o ds1820.o -o chatek.elf
avr-objcopy -O ihex -R .eeprom -R .fuse -R .lock -R .signature chatek.elf chatek.hex
avr-objdump -h -S chatek.elf > chatek.lss

AVR Memory Usage
----------------
Device: atmega32

Program: 27814 bytes (84.9% Full)
(.text + .data + .bootloader)

Data: 1857 bytes (90.7% Full)
(.data + .bss + .noinit)


Build succeeded with 9 Warnings...
А программа какая?

alexsis_76

Re: Проблемы при программировании AVR на Си

Сообщение alexsis_76 » 14 май 2014, 12:31

avrstudio 4 с чем то
попробуйте avrstudio 5

Alex_Jet
Сообщения: 1251
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Проблемы при программировании AVR на Си

Сообщение Alex_Jet » 15 май 2014, 10:02

Сделал версию 3.6 прошивки для моего manager of CCTV - прописал нормальные порты для SPI, переписал и отредактировал блоки для host watchdog. И прога стала совсем нестабильной - кое-где артефакты всякие появляются в web-полях, web-интерфейс постоянно вешается (при наличии пинга), watchdog МК постоянно его ресетит. Начал разбираться в чем принципиальные отличия предыдущей версии и новой. Получилось, что блок (в котором я не посылаю ICMP пакет на мониторируемый хост, а получаю от него пакеты и сбрасываю счетчик), который ранее был размещен в таймере и программа проходила его 1 раз в секунду, а теперь я его разместил в основной программе и на нем так понимаю все спотыкалось...

В общем было:

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

ISR(TIMER1_OVF_vect)
{	............................
	// Time of one second
	...........................
		// Timer for Host Watchdog
		if (TIMER_PING > 0)												// TIMER_PING==0 means off
		{	if (wdsettings.sendping == 0 && FLAG_PING)
			{	FLAG_PING = 0;											// We should receive a ping
				step_hoststatus();
			}
			if (++TIMER_PING > 252) TIMER_PING=1;				// For security reasons as we increas TIMER_PING also below in main
		}
		.....................
	}
}
Сделал так:

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

int main(void)
{	........................
	while(1)
	{	........................
		if (wdsettings.sendping == 0 && FLAG_PING)				// We should receive a ping from host
		{	Step_HostStatus();
			FLAG_PING = 0;
		}
		.......................
	}
	return(0);
}
Исправил так (также в основном цикле main):

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

	// Spontanious messages must not interfer with web pages. We are idle here:
        if (dat_p==0)
	{	if (wdsettings.sendping && client_waiting_gw()==0 && FLAG_PING)
		{	client_icmp_request(buf, wdsettings.monitoredip);	// Sent ping to the host
			Step_HostStatus();
			FLAG_PING = 0;
		}
		if (wdsettings.sendping == 0 && FLAG_PING)					// We should receive a ping from host
		{	Step_HostStatus();
			FLAG_PING = 0;
		}
		goto UDP;
        }
И все стало работать довольно хорошо. В связи с чем вопрос - есть ли какие-нибудь правила по размещению тех или иных частей программы в основном цикле? Получается что "многоразовая" (в основном цикле) проверка условий слишком тормозит программу и приводит к непредсказуемым последствиям! Выходит в основном цикле необходимо выполнять минимум "мастер" условий, в которые включать подчиненные условия.
На данный момент в основном цикле есть у меня, например, следующее:

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

		// Time to resethost
		if (HostStatus > 5 && HostBackAfterReboot)					// If not ping more than 5 times, and the host is not reboot
		{	ResetHost();
		}
		if (FLAG_ResetHost == 1)
		{	PIN_SET_ON(wdsettings.todo);
		}
		if (FLAG_ResetHost == 3)
		{	PIN_SET_OFF(wdsettings.todo);
			FLAG_ResetHost = 0;
		}
Сейчас понимаю, что эту часть нет необходимости много раз проверять на истину и следует перенести ее в тот же 1-секундный таймер - все будет работать и так.
Так же по многим другим частям программы...

alexsis_76

Re: Проблемы при программировании AVR на Си

Сообщение alexsis_76 » 15 май 2014, 11:55

в котором я не посылаю ICMP пакет на мониторируемый хост, а получаю от него пакеты и сбрасываю счетчик), который ранее был размещен в таймере и программа проходила его 1 раз в секунду, а теперь я его разместил в основной программе и на нем так понимаю все спотыкалось..
а зачем прерывании то,у меня так
if(FLAG_PING)
{
LED_STATUS_ON;
send_ping();
}
if(pinghost.check_ping)
{
ping_reply();
LED_STATUS_OFF;
}
если установлен флаг FLAG_PING(зависит от ;желаемого пинга) то посылаем ICMP пакет, если разрешен пинг, принимаем пакеты, все работает
В связи с чем вопрос - есть ли какие-нибудь правила по размещению тех или иных частей программы в основном цикле? Получается что "многоразовая" (в основном цикле) проверка условий слишком тормозит программу и приводит к непредсказуемым последствиям! Выходит в основном цикле необходимо выполнять минимум "мастер" условий, в которые включать подчиненные условия.
да особых требований нет, не должно быть больших задержек типа delay,так называемая блокирующая задежка, условий типа while(чего то ждем) можем ждать долго или не дождаться вовсе,из за этого главный цикл стопорится и перестает выполнятся packetloop_icmp_tcp устроиство перестает отвечать на запрсы, проверка условий если они сделаны правильно ничуть не тормозит программу

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Проблемы при программировании AVR на Си

Сообщение THK » 16 май 2014, 18:03

alexsis_76 писал(а):в примерах чена есть SD бутлоадер
Что то не могу найти, ткните носом, пожалуйста.

alexsis_76

Re: Проблемы при программировании AVR на Си

Сообщение alexsis_76 » 16 май 2014, 18:06

на главной странице
Download: Sample projects (AVR, AVR_boot, PIC, Win32) June 8, 2012
там

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Проблемы при программировании AVR на Си

Сообщение THK » 16 май 2014, 19:43

Спасибо, нашел с Вашей подачи.
Надо было смотреть в Petit FatFs...

THK
Модератор
Сообщения: 588
Зарегистрирован: 18 мар 2011, 19:00
Откуда: Серпухов, МО

Re: Проблемы при программировании AVR на Си

Сообщение THK » 17 май 2014, 21:45

В начале темы спрашивалось, как прочесть фьюзы, вот ответ:
http://chipenable.ru/index.php/programm ... rammy.html

Alex_Jet
Сообщения: 1251
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Проблемы при программировании AVR на Си

Сообщение Alex_Jet » 18 июн 2014, 06:30

Здравствуйте, форумчане!
Совсем не было времени чтобы довести разработку до ума, да и ATmega32 что-то совсем стала глючить (нормально не шьется, всегда ошибки при верификации), а отпаивать ее от собранной платы желания нет (обязательно оторвется пара дорожек даже с феном). Зашил предпредыдущую версию прошивки с минимальным "функционалом", просто чтобы девайс работал. Выяснил, что зависания МК (чаще) и ENC (реже) происходит от включения/выключения реле, которое питает нагреватели на плате (резисторы по 15Вт), дорожки к которым идут через всю плату. Керамику (0,1мкФ) уже запаял с 3-х сторон ATmega32, а толку нет. Что можно предпринять для устранения этого бага? У самого мысль либо впаять после реле небольшой конденсатор на 400В, либо попробовать поставить варистор.

Urbas81
Сообщения: 313
Зарегистрирован: 28 авг 2012, 14:22

Re: Проблемы при программировании AVR на Си

Сообщение Urbas81 » 18 июн 2014, 11:45

Alex_Jet писал(а):Здравствуйте, форумчане!
Совсем не было времени чтобы довести разработку до ума, да и ATmega32 что-то совсем стала глючить (нормально не шьется, всегда ошибки при верификации), а отпаивать ее от собранной платы желания нет (обязательно оторвется пара дорожек даже с феном). Зашил предпредыдущую версию прошивки с минимальным "функционалом", просто чтобы девайс работал. Выяснил, что зависания МК (чаще) и ENC (реже) происходит от включения/выключения реле, которое питает нагреватели на плате (резисторы по 15Вт), дорожки к которым идут через всю плату. Керамику (0,1мкФ) уже запаял с 3-х сторон ATmega32, а толку нет. Что можно предпринять для устранения этого бага? У самого мысль либо впаять после реле небольшой конденсатор на 400В, либо попробовать поставить варистор.
Наблюдал подобную картину на самодельном мегадевайсе, когда включал через реле на плате другое реле на 12 вольт, на катушке которого не поставлен диод, зависало даже на длинном проводе, т.е реле находилось метрах в 2 от прибора, как только повесил обратный диод, зависания прекратились.

Alex_Jet
Сообщения: 1251
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

Re: Проблемы при программировании AVR на Си

Сообщение Alex_Jet » 18 июн 2014, 20:49

Диоды были заранее предусмотрены на реле. Связываю проблему именно с коммутацией 220В, которые через всю плату проходят к нагревателям.

Нашел хороший топик на эту тему (http://www.microchip.su/showthread.php?t=14810). Понимаю, что все из-за большой переходной емкости контакты-катушка реле. По признакам зависания есть ощущение, что необходимо подтягивать RST МК меньшим сопротивлением - 1-3,3 кОм (сейчас 10 кОм), ставить на землю кондер и может быть еще диод параллельно подтягивающему резистору (http://www.efo.ru/cgi-bin/go?1217#n6). На контакты реле нужен снаббер - интересная статейка тут: http://old.meandr.ru/texts/RC.html

Установил снаббер на контакты обоих силовых реле - проблема решилась!!! На всякий случай установил 0,1мкФ (0806) между RST и землей. Для второй ревизии устройства буду переразводить всю плату и, вероятно, переходить на ATmega328P. Впаянная ATmega32 очень криво шьется - на данный момент работает только одна прошивка!!! и то шьется с ошибками, начиная с 17FF. Даже при небольшом изменении прошивки (просто в текстовой части web-интерфейса убираю слова/символы - память высвобождается) ATmega32 шьется криво с ошибкой уже в другом секторе и работает крайне нестабильно...

ROM
Сообщения: 63
Зарегистрирован: 15 май 2013, 12:44

Re: Проблемы при программировании AVR на Си

Сообщение ROM » 05 апр 2015, 20:12

alexsis_76 писал(а):Urbas81 Добрый вечер а Вы клиента инициализировали
вот это
init_mac(mymac);
client_ifconfig(myip,netmask);
в архиве исходник программы , там есть работающий клиент , если что спрашивайте
А можно и мне архив с исходником, а то у меня теже проблемы :(

alexsis_76

Re: Проблемы при программировании AVR на Си

Сообщение alexsis_76 » 06 апр 2015, 15:02

А можно и мне архив с исходником, а то у меня теже проблемы
с чем

Ответить