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

Обсуждение статей, технологий домашней автоматизации, программных и аппаратных решений
Alex_Jet
Сообщения: 1251
Зарегистрирован: 12 янв 2014, 18:00
Откуда: Россия, г.Томск

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

Сообщение Alex_Jet » 20 апр 2014, 19:34

alexsis_76 писал(а):сброс этот не настоящий , Вы просто переходите по вектору 0 , сам контроллер при этом не ресетится , к тому же если он повиснет то сброс этот работать не будет (инструкция SoftReset() не выполнится ),сть у меня пара идей со старым методом,завтра попробую
Идеи - это хорошо! Однако, чувствую, что без разницы какой это сброс (с помощью watchdog тоже легко реализуем с идеей от Андрея), да не сбрасывает периферию, просто заново все инициализирует. А если совсем зависнет, то ему поможет только HardReset, который по идее надо делать внешним устройством. Идею по сбросу реализовал, а в итоге смысла от нее нет.

alexsis_76

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

Сообщение alexsis_76 » 21 апр 2014, 03:57

кажись нашел , почему счетчик считает двойками(у Вас 4)
если нажать на кнопку сброса устройства . браузер шлет
GET /Manager/?pg=5&rstm=1 HTTP/1.1\r\n
устройство отрабатывает запрос, счетчик увеличивается на 1, устройство уходит в перезагрузку,затем
<input type=\"submit\" value=\"Reset manager\" onclick='ReLoadFunction()'></form></center>\
<script>function ReLoadFunction() {setTimeout(function() {location.reload();}, 5000)}</script>"));
по нажатию кнопки запускается скрипт , после 5 секунд срабатывает ReLoadFunction() которая требует
GET /Manager/?pg=5&rstm=1 HTTP/1.1\r\n
устройство к тому времени уже перезагрузилось, и выполняет запрос , счетчик увеличивается на 1 и мы видим на экране значение счетчика 2 вместо 1
у Вас
4 раза повторяет свой запрос
плюс одно нажатие 5
удаление onclick='ReLoadFunction(), приводит к невозможности перезагрузки ( 10.1.1.2 10.1.1.1 HTTP 468 [TCP Retransmission] GET /Manager/?pg=5&rstm=1 HTTP/1.1 ) не отправляется , но счетчик тикает нормально, правда приходится вручную обновлять страницу, правда некоторые моменты мне непонятны , но дело в этом, сейчас ковыряю парсер

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

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

Сообщение Alex_Jet » 21 апр 2014, 06:23

Думаю, дело в том (как сказал 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 из исходника - может быть из-за этого.

alexsis_76

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

Сообщение alexsis_76 » 21 апр 2014, 07:29

Да скорей всего
10.1.1.2 10.1.1.1 HTTP 468 [TCP Retransmission] GET /Manager/?pg=5&rstm=1
происходит как раз из=за того что стек tcp желает что-бы ему ответили , если нет то он полагает что пакет не принят и делает Retransmission так что [TCP Retransmission] GET /Manager/?pg=5&rstm=1, шлет стек
Чтобы МК сбрасывался по WD надо в основной программе при условии FLAG_Reset==1 добавить задержку порядка 1 секунды.
это зачем, он вроде и так нормально сбрасывается , ни к чему все эти извраты, дело не в нем было

alexsis_76

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

Сообщение alexsis_76 » 21 апр 2014, 11:14

Блин все перепробывал , после вот этого молчок
if (find_key_val(str,Strbuf,5,"pg"))
поставил отладочный диод , если комментируешь вышеприведенный кусок парсера страница работает (естественно не сохраняются поля)светодиод после
if (find_key_val(str,Strbuf,5,"pg"))
загорается , стоит расскоментировать парсер ,
find_key_val
не работает , светодиод не горит , парсер возвращает 0 , попытка подставить в
find_key_val
принудительные значения результата не дает,такое ощущение что контроллер даже не заходит внутрь,
find_key_val(str,Strbuf,5,"pg"))
, снижал частоту контроллера до 8 МГЦ, пробывал прошивать со своим макефайлом, при вводе пароля (правильного)рисует
401 Unauthorized
смотрел ассемблерные листинги, вызова на месте, глухо как в танке :twisted: ,никогда такого не было,какие будут предложения

p.s. в такие времена с благодарностью вспоминаешь внутрисхемный отладчик PIC, работать одно удовольствие, все таки правильно сделал что пересел на pic в микрочиповском стеке такого ..... нет

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

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

Сообщение Alex_Jet » 21 апр 2014, 14:38

alexsis_76 писал(а):
Чтобы МК сбрасывался по WD надо в основной программе при условии FLAG_Reset==1 добавить задержку порядка 1 секунды.
это зачем, он вроде и так нормально сбрасывается , ни к чему все эти извраты, дело не в нем было
Так Вы же сами пишете что "сброс этот не настоящий , Вы просто переходите по вектору 0 , сам контроллер при этом не ресетится , к тому же если он повиснет то сброс этот работать не будет (инструкция SoftReset() не выполнится )"!?
А какой сброс тогда настоящий? Мне кажется что кнопкой RESET, однако если удаленно, то только Watchdog.

Я не понимаю почему моя реализация программы с моим компилятором работает у меня и не работает у Вас??? Как будто вы не ATmega32 используете...

На данный момент у меня проблема с зависанием устройства при "частом" переключении выходов. Вот сейчас удаленно с работы нажал 7 раз сверху-вниз и снизу вверх и все...баста.

alexsis_76

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

Сообщение alexsis_76 » 21 апр 2014, 15:21

Мне кажется что кнопкой RESET, однако если удаленно, то только Watchdog
.ага
Как будто вы не ATmega32 используете
ATmega32A
Я не понимаю почему моя реализация программы с моим компилятором работает у меня и не работает у Вас???
Сам в шоке , сегодня приведу мысли в порядок , завтра буду разбираться, особенно меня добивает компиляция с разными макефайлами

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

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

Сообщение Urbas81 » 22 апр 2014, 10:37

alexsis_76 писал(а):
Разобрался с функцией вывода в буфер, поменял в библиотеке, теперь в переменную попадает то, что нужно. Теперь пытаюсь осилить момент, когда в поле необходимо вводить спецсимволы, типа /?, и чтоб они не зааменялись числами, а так и сохранялись, как это можно решить?

alexsis_76

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

Сообщение alexsis_76 » 22 апр 2014, 13:21

чтоб они не зааменялись числами
сохраняйте их как строки

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

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

Сообщение Urbas81 » 22 апр 2014, 15:12

alexsis_76 писал(а):
чтоб они не зааменялись числами
сохраняйте их как строки
Мне б код :mrgreen: для Alarm List последнее поле, а лучше 2 последних поля в строке :roll:

alexsis_76

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

Сообщение alexsis_76 » 22 апр 2014, 17:08

Мне б код
не вопрос, тока завтра

alexsis_76

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

Сообщение alexsis_76 » 23 апр 2014, 04:31

пробуйте
замените
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));
}
}
}

а
лучше 2 последних поля в строке
во втором поле вроде как ip , или он не нужен?

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

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

Сообщение Alex_Jet » 23 апр 2014, 06:44

alexsis76, а что вы вообще думаете о стеке TCP_UDP_IP Tuxgraphics? В связи с тем, что есть желание прикрутить SMTP клиента, стал с ним разбираться и понял, что как-то он не логично сделан. Куча каких-то функций и сходу не понятно как с ними работать и столько же калбэков. А вот стек от товарища Lifelover (http://we.easyelectronics.ru/electro-an ... lient.html) более логичен - явно выделены eth, IP, TCP/UDP уровни.
Tuxgraphics пишет - что все ради экономии памяти МК, однако другим пользователям стека прибавляет только головной боли - вот как мне с его стеком отправить TCP мессадж?

alexsis_76

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

Сообщение alexsis_76 » 23 апр 2014, 07:54

стек от товарища Lifelover
ооо достойный товарищ, лично мне его стек тоже нравится,но так как на avr уже не актуально(доделываю остатки), то и пробывать не стал
вот как мне с его стеком отправить TCP мессадж
отправить TCP мессадж Tuxgraphics можно лишь на http, другого нет и если Вы об этом то очень просто, тут как раз Urbas81 этим занимается , если можете перейти на другую платформу , то микрочиповский стек то что Вам нужно
вот список того что он может
//#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
от наших германских друзей
вообще сейчас эти поделки не делает только ленивый

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

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

Сообщение Urbas81 » 23 апр 2014, 10:43

alexsis_76 писал(а):пробуйте
Спасибо, заработало, второе поле тоже исправил.

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

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

Сообщение Alex_Jet » 24 апр 2014, 08:51

Alex_Jet писал(а):На данный момент у меня проблема с зависанием устройства при "частом" переключении выходов. Вот сейчас удаленно с работы нажал 7 раз сверху-вниз и снизу вверх и все...баста.
Господа! Какие есть методы отладки/поиска косяка в прошивке чтобы выяснить из-за чего устройство (или ENC28J60) виснет когда несколько раз подряд активируешь/деактивируешь выходы?

alexsis_76

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

Сообщение alexsis_76 » 24 апр 2014, 10:47

Какие есть методы отладки/поиска косяка в прошивке чтобы выяснить из-за чего устройство (или ENC28J60) виснет
использывать отладчик , под ним поискать, как вариант отладочный светодиод,логический анализ работы программы, а как виснет то , совсем или на время, кстати если есть uart попробуйте слать отладочные сообщения на комп

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

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

Сообщение Alex_Jet » 24 апр 2014, 14:18

Да, про UART уже подумал - можно вставлять сообщения. По внешним признакам виснит именно ENC28J60 (МК Events продолжает отрабатывать). Правда тут вычитал что у нее Reset реально не подтянут к плюсу - поэтому надо перепроверить - может из-за этого (при вкл./выкл. выходов у меня реле срабатывают - может что-то пробегает в этот момент?).

alexsis_76

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

Сообщение alexsis_76 » 24 апр 2014, 14:21

Правда тут вычитал что у нее Reset реально не подтянут к плюсу -
а у Вас внешним резистором не подтянут
Pins have an internal weak pull-up
кстити не разу не слышал чтоб висла ENC28J60 там просто нечему виснуть

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

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

Сообщение Alex_Jet » 25 апр 2014, 10:04

Вчера вечером все посмотрел. 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 шт.). Буду копать дальше и разбираться где что подтянуть и зашунтировать.

Ответить