Идеи - это хорошо! Однако, чувствую, что без разницы какой это сброс (с помощью watchdog тоже легко реализуем с идеей от Андрея), да не сбрасывает периферию, просто заново все инициализирует. А если совсем зависнет, то ему поможет только HardReset, который по идее надо делать внешним устройством. Идею по сбросу реализовал, а в итоге смысла от нее нет.alexsis_76 писал(а):сброс этот не настоящий , Вы просто переходите по вектору 0 , сам контроллер при этом не ресетится , к тому же если он повиснет то сброс этот работать не будет (инструкция SoftReset() не выполнится ),сть у меня пара идей со старым методом,завтра попробую
Проблемы при программировании AVR на Си
Re: Проблемы при программировании AVR на Си
Re: Проблемы при программировании AVR на Си
кажись нашел , почему счетчик считает двойками(у Вас 4)
если нажать на кнопку сброса устройства . браузер шлет
у Вас
удаление onclick='ReLoadFunction(), приводит к невозможности перезагрузки ( 10.1.1.2 10.1.1.1 HTTP 468 [TCP Retransmission] GET /Manager/?pg=5&rstm=1 HTTP/1.1 ) не отправляется , но счетчик тикает нормально, правда приходится вручную обновлять страницу, правда некоторые моменты мне непонятны , но дело в этом, сейчас ковыряю парсер
если нажать на кнопку сброса устройства . браузер шлет
устройство отрабатывает запрос, счетчик увеличивается на 1, устройство уходит в перезагрузку,затемGET /Manager/?pg=5&rstm=1 HTTP/1.1\r\n
по нажатию кнопки запускается скрипт , после 5 секунд срабатывает ReLoadFunction() которая требует<input type=\"submit\" value=\"Reset manager\" onclick='ReLoadFunction()'></form></center>\
<script>function ReLoadFunction() {setTimeout(function() {location.reload();}, 5000)}</script>"));
устройство к тому времени уже перезагрузилось, и выполняет запрос , счетчик увеличивается на 1 и мы видим на экране значение счетчика 2 вместо 1GET /Manager/?pg=5&rstm=1 HTTP/1.1\r\n
у Вас
плюс одно нажатие 54 раза повторяет свой запрос
удаление onclick='ReLoadFunction(), приводит к невозможности перезагрузки ( 10.1.1.2 10.1.1.1 HTTP 468 [TCP Retransmission] GET /Manager/?pg=5&rstm=1 HTTP/1.1 ) не отправляется , но счетчик тикает нормально, правда приходится вручную обновлять страницу, правда некоторые моменты мне непонятны , но дело в этом, сейчас ковыряю парсер
Re: Проблемы при программировании AVR на Си
Думаю, дело в том (как сказал THK), что в ответ я браузеру ничего не отправлял, а молча уходил в перезугрузку. Браузер же судя по снифферу как раз делал еще 4 запроса. Как только я стал отправлять хотя бы 200ОК, так счетчик стал нормально считать и сниффер не показывает сообщений ушедших "в никуда". Сначала я в обработчике по команде перезагрузки, как и вы сделал www_server_reply(http200OK), затем reset - страница в фрейме исчезала поскольку html данных не сообщал, после обновления счетчик делал +1 безошибочно. Тогда я решил сделать перезагрузку с помощью FLAG_Reset, а после return на допстраницу, где содержится скрипт по обновлению - и все работает как надо.
Чтобы МК сбрасывался по WD надо в основной программе при условии FLAG_Reset==1 добавить задержку порядка 1 секунды.
Вчера, кстати, проверил работу библиотеки reset.c - не работает "RST_HARD_RESET" (сброс кнопкой reset) - из того что смог попробовать. Хотя я ее доработал, "убрав" самый первый if из исходника - может быть из-за этого.
Чтобы МК сбрасывался по WD надо в основной программе при условии FLAG_Reset==1 добавить задержку порядка 1 секунды.
Вчера, кстати, проверил работу библиотеки reset.c - не работает "RST_HARD_RESET" (сброс кнопкой reset) - из того что смог попробовать. Хотя я ее доработал, "убрав" самый первый if из исходника - может быть из-за этого.
Re: Проблемы при программировании AVR на Си
Да скорей всего
происходит как раз из=за того что стек tcp желает что-бы ему ответили , если нет то он полагает что пакет не принят и делает Retransmission так что [TCP Retransmission] GET /Manager/?pg=5&rstm=1, шлет стек10.1.1.2 10.1.1.1 HTTP 468 [TCP Retransmission] GET /Manager/?pg=5&rstm=1
это зачем, он вроде и так нормально сбрасывается , ни к чему все эти извраты, дело не в нем былоЧтобы МК сбрасывался по WD надо в основной программе при условии FLAG_Reset==1 добавить задержку порядка 1 секунды.
Re: Проблемы при программировании AVR на Си
Блин все перепробывал , после вот этого молчок
p.s. в такие времена с благодарностью вспоминаешь внутрисхемный отладчик PIC, работать одно удовольствие, все таки правильно сделал что пересел на pic в микрочиповском стеке такого ..... нет
поставил отладочный диод , если комментируешь вышеприведенный кусок парсера страница работает (естественно не сохраняются поля)светодиод послеif (find_key_val(str,Strbuf,5,"pg"))
загорается , стоит расскоментировать парсер ,if (find_key_val(str,Strbuf,5,"pg"))
не работает , светодиод не горит , парсер возвращает 0 , попытка подставить вfind_key_val
принудительные значения результата не дает,такое ощущение что контроллер даже не заходит внутрь,find_key_val
, снижал частоту контроллера до 8 МГЦ, пробывал прошивать со своим макефайлом, при вводе пароля (правильного)рисуетfind_key_val(str,Strbuf,5,"pg"))
смотрел ассемблерные листинги, вызова на месте, глухо как в танке ,никогда такого не было,какие будут предложения401 Unauthorized
p.s. в такие времена с благодарностью вспоминаешь внутрисхемный отладчик PIC, работать одно удовольствие, все таки правильно сделал что пересел на pic в микрочиповском стеке такого ..... нет
Re: Проблемы при программировании AVR на Си
Так Вы же сами пишете что "сброс этот не настоящий , Вы просто переходите по вектору 0 , сам контроллер при этом не ресетится , к тому же если он повиснет то сброс этот работать не будет (инструкция SoftReset() не выполнится )"!?alexsis_76 писал(а):это зачем, он вроде и так нормально сбрасывается , ни к чему все эти извраты, дело не в нем былоЧтобы МК сбрасывался по WD надо в основной программе при условии FLAG_Reset==1 добавить задержку порядка 1 секунды.
А какой сброс тогда настоящий? Мне кажется что кнопкой RESET, однако если удаленно, то только Watchdog.
Я не понимаю почему моя реализация программы с моим компилятором работает у меня и не работает у Вас??? Как будто вы не ATmega32 используете...
На данный момент у меня проблема с зависанием устройства при "частом" переключении выходов. Вот сейчас удаленно с работы нажал 7 раз сверху-вниз и снизу вверх и все...баста.
Re: Проблемы при программировании AVR на Си
.агаМне кажется что кнопкой RESET, однако если удаленно, то только Watchdog
ATmega32AКак будто вы не ATmega32 используете
Сам в шоке , сегодня приведу мысли в порядок , завтра буду разбираться, особенно меня добивает компиляция с разными макефайламиЯ не понимаю почему моя реализация программы с моим компилятором работает у меня и не работает у Вас???
Re: Проблемы при программировании AVR на Си
Разобрался с функцией вывода в буфер, поменял в библиотеке, теперь в переменную попадает то, что нужно. Теперь пытаюсь осилить момент, когда в поле необходимо вводить спецсимволы, типа /?, и чтоб они не зааменялись числами, а так и сохранялись, как это можно решить?alexsis_76 писал(а):
Re: Проблемы при программировании AVR на Си
сохраняйте их как строкичтоб они не зааменялись числами
Re: Проблемы при программировании AVR на Си
Мне б код для Alarm List последнее поле, а лучше 2 последних поля в строкеalexsis_76 писал(а):сохраняйте их как строкичтоб они не зааменялись числами
Re: Проблемы при программировании AVR на Си
не вопрос, тока завтраМне б код
Re: Проблемы при программировании AVR на Си
пробуйте
замените
а
замените
typedef struct {
uint8_t ip[4];
uint16_t port;
unsigned char msg[32]; // max length of message is 32 symbols. 2 last bytes for \n\0
uint8_t check;
} alarm_line;
alarm_line alarmline;
// Send UDP message
void send_alarm_n(uint8_t i) {
uint16_t plen;
uint8_t j;
eeprom_read_block(&alarmline, &EEMEM_ALARMLIST, sizeof(alarmline));
if (alarmline.check == 1) {
if ((alarmline.ip[0]>0) && (alarmline.ip[0]<255)) {
for (j=0;j<30;j++) {
if (alarmline.msg[j] == '\0') {
alarmline.msg[j] = '\n';
alarmline.msg[j+1] = '\0';
break;
}
}
plen = 0;
plen = fill_buf(Strbuf,plen,alarmline.msg,sizeof(alarmline.msg));
//client_set_gwip(alarmline.ip);
send_udp(buf, Strbuf, plen, 1048, alarmline.ip, alarmline.port);
}
}
}
/////////////
// Alarm-List
/////////////
//if (pg==55) {
if (pg==5) {
if (find_key_val(str,Strbuf,30,"ip")) {
if (str_to_ip(alarmline.ip, RXbyte, 0) == 1) {
if (find_key_val(str,Strbuf,6,"port")) {
alarmline.port = StrToInt(Strbuf);
}
find_key_val(str,alarmline.msg,30,"msg");
urldecode(alarmline.msg);//сохраняем как есть
// convert URL spase ('+') to normal space ' '
//for (i=0;i<6;i++) {
// if (alarmline.msg == '+') {
//alarmline.msg = ' ';
//}
//}
if (find_key_val(str,Strbuf,4,"k")) {
alarmline.check = 1;
}
else {
alarmline.check = 0;
}
eeprom_write_block(&alarmline, &EEMEM_ALARMLIST[PrmInt], sizeof(alarmline));
}
}
}
а
во втором поле вроде как ip , или он не нужен?лучше 2 последних поля в строке
Re: Проблемы при программировании AVR на Си
alexsis76, а что вы вообще думаете о стеке TCP_UDP_IP Tuxgraphics? В связи с тем, что есть желание прикрутить SMTP клиента, стал с ним разбираться и понял, что как-то он не логично сделан. Куча каких-то функций и сходу не понятно как с ними работать и столько же калбэков. А вот стек от товарища Lifelover (http://we.easyelectronics.ru/electro-an ... lient.html) более логичен - явно выделены eth, IP, TCP/UDP уровни.
Tuxgraphics пишет - что все ради экономии памяти МК, однако другим пользователям стека прибавляет только головной боли - вот как мне с его стеком отправить TCP мессадж?
Tuxgraphics пишет - что все ради экономии памяти МК, однако другим пользователям стека прибавляет только головной боли - вот как мне с его стеком отправить TCP мессадж?
Re: Проблемы при программировании AVR на Си
ооо достойный товарищ, лично мне его стек тоже нравится,но так как на avr уже не актуально(доделываю остатки), то и пробывать не сталстек от товарища Lifelover
отправить TCP мессадж Tuxgraphics можно лишь на http, другого нет и если Вы об этом то очень просто, тут как раз Urbas81 этим занимается , если можете перейти на другую платформу , то микрочиповский стек то что Вам нужновот как мне с его стеком отправить TCP мессадж
вот список того что он может
тут уже все есть придумывать ничего не надо//#define STACK_USE_UART // Application demo using UART for IP address display and stack configuration
#define STACK_USE_UART2TCP_BRIDGE // UART to TCP Bridge application example
//#define STACK_USE_IP_GLEANING
#define STACK_USE_ICMP_SERVER // Ping query and response capability
#define STACK_USE_ICMP_CLIENT // Ping transmission capability
//#define STACK_USE_HTTP_SERVER // Old HTTP server
#define STACK_USE_HTTP2_SERVER // New HTTP server with POST, Cookies, Authentication, etc.
//#define STACK_USE_SSL_SERVER // SSL server socket support (Requires SW300052)
//#define STACK_USE_SSL_CLIENT // SSL client socket support (Requires SW300052)
#define STACK_USE_AUTO_IP // Dynamic link-layer IP address automatic configuration protocol
#define STACK_USE_DHCP_CLIENT // Dynamic Host Configuration Protocol client for obtaining IP address and other parameters
#define STACK_USE_DHCP_SERVER // Single host DHCP server
//#define STACK_USE_FTP_SERVER // File Transfer Protocol (old)
//#define STACK_USE_SMTP_CLIENT // Simple Mail Transfer Protocol for sending email
#define STACK_USE_SNMP_SERVER // Simple Network Management Protocol v2C Community Agent
//#define STACK_USE_TFTP_CLIENT // Trivial File Transfer Protocol client
//#define STACK_USE_GENERIC_TCP_CLIENT_EXAMPLE // HTTP Client example in GenericTCPClient.c
//#define STACK_USE_GENERIC_TCP_SERVER_EXAMPLE // ToUpper server example in GenericTCPServer.c
#define STACK_USE_TELNET_SERVER // Telnet server
//#define STACK_USE_ANNOUNCE // Microchip Embedded Ethernet Device Discoverer server/client
#define STACK_USE_DNS // Domain Name Service Client for resolving hostname strings to IP addresses
//#define STACK_USE_NBNS // NetBIOS Name Service Server for repsonding to NBNS hostname broadcast queries
//#define STACK_USE_REBOOT_SERVER // Module for resetting this PIC remotely. Primarily useful for a Bootloader.
//#define STACK_USE_SNTP_CLIENT // Simple Network Time Protocol for obtaining current date/time from Internet
//#define STACK_USE_UDP_PERFORMANCE_TEST // Module for testing UDP TX performance characteristics. NOTE: Enabling this will cause a huge amount of UDP broadcast packets to flood your network on the discard port. Use care when enabling this on production networks, especially with VPNs (could tunnel broadcast traffic across a limited bandwidth connection).
//#define STACK_USE_TCP_PERFORMANCE_TEST // Module for testing TCP TX performance characteristics
#define STACK_USE_DYNAMICDNS_CLIENT // Dynamic DNS client updater module
//#define STACK_USE_BERKELEY_API // Berekely Sockets APIs are available
при желании можно,но Вы уже уперлись в предел памятиесть желание прикрутить SMTP клиента
обычный стек достаточно просто сделанный , такой же используется в ардуине, довольно скромно , но основные функции выполняета что вы вообще думаете о стеке TCP_UDP_IP Tuxgraphics?
да там вроде все расписано, а калбэки- куда же без нихКуча каких-то функций и сходу не понятно как с ними работать и столько же калбэков
можете попробывать это http://www.ulrichradig.de/home/index.php/avr/eth_m32_ex
от наших германских друзей
вообще сейчас эти поделки не делает только ленивый
Re: Проблемы при программировании AVR на Си
Спасибо, заработало, второе поле тоже исправил.alexsis_76 писал(а):пробуйте
Re: Проблемы при программировании AVR на Си
Господа! Какие есть методы отладки/поиска косяка в прошивке чтобы выяснить из-за чего устройство (или ENC28J60) виснет когда несколько раз подряд активируешь/деактивируешь выходы?Alex_Jet писал(а):На данный момент у меня проблема с зависанием устройства при "частом" переключении выходов. Вот сейчас удаленно с работы нажал 7 раз сверху-вниз и снизу вверх и все...баста.
Re: Проблемы при программировании AVR на Си
использывать отладчик , под ним поискать, как вариант отладочный светодиод,логический анализ работы программы, а как виснет то , совсем или на время, кстати если есть uart попробуйте слать отладочные сообщения на компКакие есть методы отладки/поиска косяка в прошивке чтобы выяснить из-за чего устройство (или ENC28J60) виснет
Re: Проблемы при программировании AVR на Си
Да, про UART уже подумал - можно вставлять сообщения. По внешним признакам виснит именно ENC28J60 (МК Events продолжает отрабатывать). Правда тут вычитал что у нее Reset реально не подтянут к плюсу - поэтому надо перепроверить - может из-за этого (при вкл./выкл. выходов у меня реле срабатывают - может что-то пробегает в этот момент?).
Re: Проблемы при программировании AVR на Си
а у Вас внешним резистором не подтянутПравда тут вычитал что у нее Reset реально не подтянут к плюсу -
кстити не разу не слышал чтоб висла ENC28J60 там просто нечему виснутьPins have an internal weak pull-up
Re: Проблемы при программировании AVR на Си
Вчера вечером все посмотрел. Reset у ENC28J60 подтянут 10 кОм резистором. Виснет как понял все - пинга нет, по UART команды не вводятся (стандартные команды по UART для Netalarm - "HELP", "CONFIG"). Пробовал для дебага выводить фразы по UART, но сейчас понял, что не там их вставлял (в обработчике если pg == 1). Надо вероятно вставлять в функции типа check_event(); send_log().
Иногда виснет так, что помогает только отключение питания! Иногда просто кнопка на выводе RESET МК. А вот WD не сбрасывает МК!!! Значит, в int main все крутится.
Косвенную причину нашел - виснет только тогда, когда на всей плате есть 220В (импульсный БП на плате в стороне от МК и ENC28J60 и 220В заходит на пару исполнительных реле). Как только отключаю от 220В (на "борту" платы АКБ 12В 6800мАч) - все хорошо, никаких зависаний. Что-то где-то пробегает от сети когда щелкаю релюшками (5 шт.). Буду копать дальше и разбираться где что подтянуть и зашунтировать.
Иногда виснет так, что помогает только отключение питания! Иногда просто кнопка на выводе RESET МК. А вот WD не сбрасывает МК!!! Значит, в int main все крутится.
Косвенную причину нашел - виснет только тогда, когда на всей плате есть 220В (импульсный БП на плате в стороне от МК и ENC28J60 и 220В заходит на пару исполнительных реле). Как только отключаю от 220В (на "борту" платы АКБ 12В 6800мАч) - все хорошо, никаких зависаний. Что-то где-то пробегает от сети когда щелкаю релюшками (5 шт.). Буду копать дальше и разбираться где что подтянуть и зашунтировать.