Вт сен 18, 2012 22:56:10
Ср сен 19, 2012 12:01:50
within писал(а):Проблема. Если главный бесконечный цикл оставить пустым - всё ок. Но не соответствует замыслу использования меню с настройками. Если вписать в него обращение к функциям или просто вкл./выкл. подсветки, то часы начинают сильно отставать. Часы на асинхронном таймере с часовым кварцем.
Читать тяжело кодwithin писал(а):На примитивность кода прошу ругаться только в том случае, если это и есть сутью проблемы.
Ср сен 19, 2012 21:12:34
А, ну вот возможная причина.
У тебя ВСЁ зафигачено в прерывание. И подсчет времени (мдя, BCD подсчет времени порадовал )
И даже опрос температуры - он ДОЛГИЙ!!! а ты в прерывании его делаешь.
За вывод на LCD из секундного прерывания нужно выдать медаль
Мало тормозов от LcdClear(), так ты ещё добавил тормоза от кучи-кучи sprintf() и добил LcdUpdate().
ЖЖЖуть!
Ср сен 19, 2012 21:56:02
Поясни картинку ещё раз.within писал(а):А теперь посмотри картинку и прикинь, что к чему. Сверху - время всего прерывания. Снизу - sprintf. От начала верхнего до начала нижнего - подсчёт времени/даты и чтение датчика(9 бит, если не заметил). От конца нижнего до конца верхнего - LcdUpdate. Много времени занимает?
Т.е. высокий уровень на нижнем графике - это суммарное время кучки вызовов sprintf() + LcdStringBold()?Снизу - sprintf
Ср сен 19, 2012 22:16:57
Ср сен 19, 2012 22:32:44
Давай посчитаем вместе. Я вот тупо замерил линейкой расстояние между фронтами и у меня получилось, что в прерывании ты сидишь ~273мс, т.е. 27% времени.within писал(а):Точно. Всё правильно понял. Даже если придется добавлять минуты, часы, дни, месяцы, года, не думаю, что оно станет в три раза больше.
Ср сен 19, 2012 23:20:32
mas123 писал(а):Давай посчитаем вместе. Я вот тупо замерил линейкой расстояние между фронтами и у меня получилось, что в прерывании ты сидишь ~273мс, т.е. 27% времени.within писал(а):Точно. Всё правильно понял. Даже если придется добавлять минуты, часы, дни, месяцы, года, не думаю, что оно станет в три раза больше.
Считаешь это "ниачем"?
mas123 писал(а):А теперь попробуй провести опыты на живом приборе. Точно так же перекидывай какую-нить ножку порта при входе-выходе из прерывания. К этой ноге подключи осцилл. Второй сигнал осцилла на вход импульсов 1 сек.
И понаблюдай что происходит при нажатии на кнопки или при мигании подсветки. Короче, сделай чтоб часы отставали.
Очень и очень вероятно, что ты увидишь "пропажу" импульсов прерывания. Либо, увидишь что отработка прерывания превышает 1 сек.
Ср сен 19, 2012 23:47:33
Да, лучше именно так.within писал(а):Эммм... Да! В данном случае это ничто. Пусть хоть 900мс там сидит, это не космическая станция. Ничего не пропустит. А 73% запаса это совсем не мало. Или лучше, чтоб он за 10мс всё сделал и остальные 990 читал клаву?
Нахождение в прерывании 27% времени - это ОЧЕНЬ много.within писал(а): Лучше не смайлики шоковые вставляй, а обьясни, чем тебя число 273 так пугает?
Ты издеваешься или прикидываешься?within писал(а):Как наличие чего-либо в главном цикле, даже запрета прерываний, может повлиять на продолжительность обработчика?
Ну, в таком случае копай свой цикл. Я тогда не понимаю смысле твоего вопроса. Зачем спрашивать, ежели ты УЖЕ ЗНАЕШЬ где проблема - так ищи её, разбирай каждую строчку основной функции, коли в ней проблема.within писал(а): Прерывание может приходить с опозданием, но не из-за обработчика(соотношение 27%обработчика/73%главного цикла), а, скорее, из-за чего-то в этом цикле. Моё мнение, считаю его вполне логичным.
Чт сен 20, 2012 07:45:55
Нахождение в прерывании 27% времени - это ОЧЕНЬ много.
Ты издеваешься или прикидываешься?
- ты запретил прерывание, надолго. А оно произошло.
- разрешил прерывание... ну пусть через 800 мс от прихода прерывания.
- прерывание начали выполнять, в это время таймер снова дотикал до 255.
И что в итоге? теряем 1 сек в подсчете.
Ну, в таком случае копай свой цикл. Я тогда не понимаю смысле твоего вопроса. Зачем спрашивать, ежели ты УЖЕ ЗНАЕШЬ где проблема - так ищи её, разбирай каждую строчку основной функции, коли в ней проблема.
Я же не зря просил промерять время нахождения в прерывании на живой железке.
Ну-ка, мистер точно знающий, расскажи мне:
* что будут делать функции LcdClear(), sprintf (), LcdStringBold(), LcdString() и LcdUpdate() будучи одновременно вызванными из основного цикла и из прерывания?
Как у тебя в этих функциях организована потокобезопасность?
* а нет ли у тебя хорошей такой наводки на PD5? Схемы-то нет... Надеюсь, резюк на VCC там нормальный?
Чт сен 20, 2012 08:35:18
Эээ, делалось для того, чтоб часы отставали?within писал(а):Нахождение в прерывании 27% времени - это ОЧЕНЬ много.
Смотря для чего устройство делалось.
Точно издеваешься. Сильно сдвинув время входа в обработчик прерываний ты даешь ему возможность потерять следующее прерывание.within писал(а):Ты издеваешься или прикидываешься?
- ты запретил прерывание, надолго. А оно произошло.
- разрешил прерывание... ну пусть через 800 мс от прихода прерывания.
- прерывание начали выполнять, в это время таймер снова дотикал до 255.
И что в итоге? теряем 1 сек в подсчете.
А каким образом тут увеличился обработчик? Прерывания сдвинулись во времени. Но продолжительность каждого не изменилась.
А. точно, не должны вызываться. При условии что "bit a" компилятор обработает как volatile.within писал(а):2.Они не будут вызываться одновременно, как ты это себе представляешь? Посмотри внимательней код.
Т.е. за качество входных сигналов с кнопок ты ручаешься. Хорошо.within писал(а):3. А причём тут PD5? Он в меню сам не заходит. А просто часы отстают.
Чт сен 20, 2012 16:56:15
Эээ, делалось для того, чтоб часы отставали?
Точно издеваешься. Сильно сдвинув время входа в обработчик прерываний ты даешь ему возможность потерять следующее прерывание.
Ну и проверь функцию delay_ms() - не запрещает ли она прерывания при работе.
Чт сен 20, 2012 19:51:34
Хм, исходя из (2) - убери всё из цикла в main() и будет тебе "щастье".within писал(а):Прерывание, как следствие переполнения таймера/счётчика, происходит раз в сек. Исходя из этого, имеем 1000мс от начала одного до начала другого на всё, что душа пожелает при условии, что: 1. это время внутри обработчика; 2. помимо обработчика ничего более не надо.
Тебе требуется ТАК много времени на опрос кнопок?within писал(а):В этом устройстве, помимо обработчика, нужно три кнопки читать. На это нужно время.
Именно в нём потому, что ничего другого нет. А причина элементарная - потеря прерывания. Думаешь иначе? Давай, выдвини свою теорию.within писал(а):
- Код:
Точно издеваешься. Сильно сдвинув время входа в обработчик прерываний ты даешь ему возможность потерять следующее прерывание.
Это не я издеваюсь, это ты...) Я это прекрасно понимаю и без твоих смешков) Но я не сдвигаю время входа! Я пытаюсь узнать, что в цикле while может это сделать? Почему именно в нём?
Ага. Давай посмотрим на гениальный код:within писал(а):Ты думаешь, что даже при самом плохом раскладе вычислений и чтения температуры(9 бит), этот расклад может сожрать 73% времени сверх?
devices=w1_init(); //ищем датчик
ds18b20_init(0,-50,50,1); //ставим границы "аварии", и разрешение 9бит
if(devices>0)
{
Tnew=ds18b20_temperature(0); //читаем температуру
}
Я не знаю что CVAVR творит в данной функции, но я бы уже давно посмотрел на asm исходник.within писал(а):Ну и проверь функцию delay_ms() - не запрещает ли она прерывания при работе.
А ты разве не знаешь? Если бы знал, то не писал бы такое.
within писал(а):Как вариант, ты никогда не использовал одновременно прерывания и задержки времени. Хотя странно это... Давно ты с контроллерами знаком? Как изучал? Что делал? На каком языке писал?
Чт сен 20, 2012 22:51:46
Сколько времени занимает поиск датчика? И зачем его искать каждую секунду? Сколько времени выполняется инициализация?
Кстати, а писать "0" вместо NULL это специально? Да, компилятору это одинаково, но не так читабельно.
А ты УВЕРЕН что настроил термометр на 9 бит, а?
#define DS18B20_9BIT_RES 0 // 9 bit thermometer resolution
unsigned char ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high,
unsigned char resolution);
Я не знаю что CVAVR творит в данной функции, но я бы уже давно посмотрел на asm исходник.
Чт сен 20, 2012 22:58:13
Чт сен 20, 2012 23:19:13
Не-а, не верю. Ты не писал ничего "в команде" - по коду видно. Ты не писал ничего серьезного - один только подсчет двухзначного числа в двух переменных чего стоит.within писал(а):Я перед недалёким человеком не буду хвалиться) Что ни напишу, всё насмешки. Так что моё останется за кадром. Скажу лишь то, область моих изделий куда шире, чем твоя.
Т.е. точных цифр ты назвать не можешь. Вот ещё один признак.within писал(а):Сколько времени занимает поиск датчика? И зачем его искать каждую секунду? Сколько времени выполняется инициализация?
Менее 27% времени. В пределах допустимого и с ОООООЧЕНЬ приличным запасом.
Мдя.... ну что-же, давай посмотрим в гениальный код:within писал(а):А ты УВЕРЕН что настроил термометр на 9 бит, а?
А ты уверен, что нет, а? Косвенное доказательство: время опроса. Если тебе не верится,
почитай:
- Код:
#define DS18B20_9BIT_RES 0 // 9 bit thermometer resolution
unsigned char ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high,
unsigned char resolution);
Вещь простая, а ты спрашиваешь, уверен ли я?
Спроси себя лучше, уверен ли ты?
devices=w1_init(); //ищем датчик
ds18b20_init(0,-50,50,1); //ставим границы "аварии", и разрешение 9бит
Советов просил ты. Тебя тыкнули носом в "бяко"-код и в дикое прерывание. Да ткнули носом у всех на виду, да обидно и неприятно - чё уж тут говорить. Знакомо. Меня самого тыкали также ещё в Фидо.within писал(а):Я не знаю что CVAVR творит в данной функции, но я бы уже давно посмотрел на asm исходник.
Так какого лезешь с советами?
Хм, CAVR твой первый и пока что единственный компилятор на данное время, походу. Ты ответь - смотрел ли в асмовской код, который компилятор нагородил, изучал его?within писал(а):Или возможность прерывания временной задержки зависит от компилятора? Хм... Ты странный.
Кстати, ежели тебя не пугает такое огромное время в обработчике прерываний - это признак отсутствия "широты устройств".within писал(а):Короче, если есть, что сказать, помимо ужасающих 27% времени на обработчик,
Хех. смотри внимательно. У тебя и у меня AVR + DS18B20 + LCD.within писал(а):и ты разбираешь в основных принципах работы авр'ок, то говори по сути, а не разводи болтовню.
Не, ну это просто финиш... Если у тебя кроме прерывания нет ничего больше и часы отстают - ты будешь с упорством уверять что прерывания в норме...within писал(а): Прерывание в пределах нормы. Если есть что-то ещё - пиши. Нет - выпендривайся в других темах.
Чт сен 20, 2012 23:24:29
Был у меня опыт преподавания. Когда писал диплом в универе, пол года в своей родной школе вел информатику.within писал(а):Ты преподом не работаешь?
Чт сен 20, 2012 23:43:04
Хм, вот про 15-17 лет я ошибся.within писал(а):Я перед недалёким человеком не буду хвалиться) Что ни напишу, всё насмешки. Так что моё останется за кадром. Скажу лишь то, область моих изделий куда шире, чем твоя.
Пт сен 21, 2012 09:53:20
Пт сен 21, 2012 17:30:25
Но вот скажи мне - а зачем врать о своей опытности в AVR?
Т.е. точных цифр ты назвать не можешь. Вот ещё один признак.
Ну что, так кто из нас уверен, а? 10-ти битный режим у тебя.
Советов просил ты. Тебя тыкнули носом в "бяко"-код и в дикое прерывание. Да ткнули носом у всех на виду, да обидно и неприятно - чё уж тут говорить. Знакомо.
Кстати, ежели тебя не пугает такое огромное время в обработчике прерываний - это признак отсутствия "широты устройств".
У тебя часы отстают и клава работает "не так как надо".
Не, ну это просто финиш... Если у тебя кроме прерывания нет ничего больше и часы отстают - ты будешь с упорством уверять что прерывания в норме...
Был у меня опыт преподавания. Когда писал диплом в универе, пол года в своей родной школе вел информатику.
И на выпускном концерте 11-ти классники выбрали меня в категории "самый умный учитель". На что остальные учителя дико обиделись - "мы же сами учили этого шалопая, а теперь его самым умным назвали"
Но, если бы ты читал внимательнее выше, увидел бы область где я работаю.
Я человек не злой (по вторникам), так что можно начать с начала, обсуждать твой жуткий код и ловить прерывания
Здравствуйте!
Я удивляюсь людям. Настоящие специалисты тратят своё время на помощь тем, кто сделав чудовищные вещи в простейшей программе, кричит что более опытен. Ужос нах.
По теме.
Не считаю себя шибко грамотным специалистом, но подпишусь под каждым словом mas123
Из своего небогатого опыта могу сказать, что функции работы 1wire весьма прожорливы по времени и достаточно вольно работают с прерываниями. У меня в одной из моих поделок, при инициализации, опросе числа датчиков, опросе температуры достаточно ощутимо мигали индикаторы. А индикация была сделана на прерывании по таймеру.
Поэтому послушайте дельного совета и оставьте в прерывании МИНИМАЛЬНО НЕОБХОДИМЫЙ там код. И все будет хорошо.
Пт сен 21, 2012 18:46:52
Так удиви, расскажи что за областиwithin писал(а):Я говорил, что область шире, а не опыта больше в авр.
Это к вопросу об оформлении кода. Константы-то не зря придумали.within писал(а):Ну что, так кто из нас уверен, а? 10-ти битный режим у тебя.
Согласен, протупил. Экспериментировал, а поменять забыл.
Хм, и с чем же твой препод не согласился?within писал(а):Меня терзают смутные сомнения, что ты прав. Сегодня проконсультировался с преподом знакомым. Он не особо с тобой согласился.
Ок, раз такое время обработки прерываний не страшно, то и отставание часов тоже не страшно. Значит, проблема решенаwithin писал(а):Эммм... Это признак того, что в этом устройстве такое время обработчика не страшно.Кстати, ежели тебя не пугает такое огромное время в обработчике прерываний - это признак отсутствия "широты устройств".
Ты сейчас напоминаешь героя анекдота, который ищет не там где потерял, а под фонарем. Ибо там светлее.within писал(а):Было бы другое устройство, где несколько обрабатываемых событий, происходящих произвольно, я бы последовал совету. Но, увы, не в этот раз.
Тогда поясни эту фразу:within писал(а):Клава работает как надо.У тебя часы отстают и клава работает "не так как надо".
Я могу объяснить раз, ну два... ну, три. А когда на всё объяснения следует ответ "нет, прерывания нормальны, глючит что-то другое, хотя там больше ничего нет"...within писал(а):Видать, давно это было. Испортился ты( Не увидел бы, а смог бы определить.
Я понял, что ты сейчас не преподаешь.Не злой, а вот насмехаться любишь.Я человек не злой (по вторникам), так что можно начать с начала, обсуждать твой жуткий код и ловить прерывания
within писал(а):Процитируй, где моя "большая опытность".
Ну какая тебе разница сколько лет я держу в руках паяльник и клаву?Если бы знал, то не писал бы такое. Как вариант, ты никогда не использовал одновременно прерывания и задержки времени. Хотя странно это... Давно ты с контроллерами знаком? Как изучал? Что делал? На каком языке писал?
Я перед недалёким человеком не буду хвалиться) Что ни напишу, всё насмешки. Так что моё останется за кадром. Скажу лишь то, область моих изделий куда шире, чем твоя.
Я бы на твоем месте, вначале посмотрел бы код. Даже при полной уверенности в своей правоте. Глаз-то замыливается на своем коде.Вещь простая, а ты спрашиваешь, уверен ли я? Спроси себя лучше, уверен ли ты?
within писал(а):И где же те чудовищные ошибки?
sek++; //
if(sek>9) //
{ //
sek=0; //
d_sek++; //
} //
if(d_sek>5) //
{ //
sek=0; //
d_sek=0; //
min++; //
} //
sprintf (lcd_buf, "%u", d_hour); //заносим в буфер время
LcdStringBold(2,2); //
sprintf (lcd_buf, "%u", hour); //
LcdStringBold(4,2); //
sprintf (lcd_buf, ":"); //
LcdStringBold(6,2); //
sprintf (lcd_buf, "%u", d_min); //
LcdStringBold(8,2); //
sprintf (lcd_buf, "%u", min); //
LcdStringBold(10,2); //
sprintf (lcd_buf, ":"); //
LcdString(12,2); //
sprintf (lcd_buf, "%u", d_sek); //
LcdString(13,2); //
sprintf (lcd_buf, "%u", sek); //
LcdString(14,2); //
if(c==0)
{
.....
}
if(c==1)
{
.....
}
if(c==2)
{
.....
}
if(c==3)
{
.....
}
within писал(а):Так покажи мне там минимально необходимый код обработчика.