так не проще? if _day > 28 and _month = 2 then _day = 1 if _day > 30 then if _month = 4 or _month = 6 or _month = 9 or _month = 11 then _day = 1 end if if _day > 31 then _day = 1
Благодарствую! Влезло. 5401 байт. 6-разрядные часы-календарь на Ин-12.
Заголовок сообщения: Re: BASCOM AVR в вопросах и ответах
Добавлено: Пн ноя 20, 2017 20:17:51
Потрогал лапой паяльник
Карма: 1
Рейтинг сообщений: 2
Зарегистрирован: Чт мар 26, 2009 20:53:27 Сообщений: 398 Откуда: Беларусь.Минская обл.
Рейтинг сообщения:0
Добрый вечер! Такая проблема. Измеряю частоту. Необходимо измерять от 10 до 250гц чтобы точно было. Выставил таймер
Config Timer1 = Timer , Prescale = 64 , Capture Edge = Falling частота 16мгц. Таймер переполняется каждые 0,26с. Т.е. частоту до 4гц измеряет некорректно. Оно мне и не надо. Но если на входе частота находится ниже этих 4гц, то на выходе после пересчета выскакивают ненужные мне неправильные цифры. Понятно что из-за переполнения таймера. Только как сделать так чтобы если частота на входе ниже этих 4-5гц чтобы на выходе после пересчета был 0? Пытался чтобы по переполнению таймера частота на выходе устанавливалась в ноль. Но между переполнениями из регистра захвата по прерыванию успевает записываться какое-либо число и частота прыгает от 0 до случайного значения. Просто если реализовывать чтобы по переполнению таймера частота не считалась то ведь на один прогон программы таймер переполнится, а на следующий может не успеть и из регистра захвата будет прочитано число которое неверно отобразит частоту. Помогите разобраться.
при переполнении ставь блокирующий флаг. потом, когда пришел импульс: если флаг сброшен: обнуляем счетчик, считаем частоту если флаг установлен: обнуляем счетчик, сбрасываем флаг.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
...Таймер переполняется каждые 0,26с. Т.е. частоту до 4гц измеряет некорректно...
Получается, что программа работает неправильно, т.к при частоте 4/сек (250'000 мкс) и дискрете таймера 4 мкс значение в оном не превысит 62'500.
Dnepr_1186 писал(а):
...Оно мне и не надо...
Можно задействовать режим сравнения по одному из каналов A(B) и в регистр OCR1A(B) загрузить 100'000/4. Тогда все частоты меньше 10/сек игнорировать. ----- По мне, толкаться в пределах разрядности таймера как-то не очень. Можно увеличить разрядность таймера добавлением всего 1 регистра куда складывать число переполнений и получить добротный НЧ частотомер. Для примера, программа измерения прямым счетом. Автор её использует переполнения. Думаю, легко адаптировать под метод обратного счета
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Уперся в DS1307. Расхотела генерить. Кварцы менял, не помогает. Есть подозрение, что тактовый генератор принудительно включился. Какв баскравре его включить?
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
при переполнении ставь блокирующий флаг. потом, когда пришел импульс: если флаг сброшен: обнуляем счетчик, считаем частоту если флаг установлен: обнуляем счетчик, сбрасываем флаг.
я был так близок к этому! Блокирующий флаг сделал, но ставил его не то место программы Всем спасибо
Уперся в DS1307. Упрись в даташит. Есть подозрение, что тактовый генератор принудительно включился. Какв баскравре его включить? Закусывать нада(с) Из какой высказанной "золотым скифом" плесени пенициллин можно выжать?
Грубиян. Впрочем, и правда ничерта непонятно, что сие значит, и в чем вопрос. Я так подозреваю, что речь идет про 7- бит регистра секунд, и про то что генератор наоборот остановлен. Только в чем проблема так и не могу понять. goldskif, будьте добры, код покажите, в котором проблема у Вас.
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
При старте программы записать принудительно в регистр секунд ноль. Если все остальное нормально - часы пойдут. Можно посмотреть на 2 ноге генерацию кварца.
Грубиян. Впрочем, и правда ничерта непонятно, что сие значит, и в чем вопрос. Только в чем проблема так и не могу понять. goldskif, будьте добры, код покажите, в котором проблема у Вас.
Не грубиян, а хам и циник. Ежели я задам вопрос: Мужики, телевизор у меня помрал, чё делать-то. Какие ответы меня ожидают? Нету тела, нету дела!
Кварц может не генерить, при отсутствии батарейки (контакта или низкого напряжения), проблемы с кварцем(тоже не редкость), не правильной разводки (см. описание на микру).
_________________ Все делают ошибки, только мудрецы - новые, а дураки - старые.
Всем спасибо. Проблема была в том ,что на 7 выводе DS1307 не было колебаний 1 Гц. Хотя в коде кусок есть
Код:
I2cstart ' DS1307 - LED-1Hz моргалка секунд I2cwbyte &HD0 ' посылаем команду записи I2cwbyte &H07 I2cwbyte &B00010000 I2cstop
Причем часы так работали и моргали пару лет. Но как оказалось, обычно на схемах в протеусе светодиод от вывод 7 идет на минус (через резистор), и он вполне себе моргает. А вот в железе оказалось довольно глючно. Моргал, потом перестал и никакие попытки воткнуть другие кварцы и DS-ки результата не давали. Я уж думал, что DS-ка плохо запускалась или запрет где стоит. А оказалось, что вывод 7 DS1307 это вывод с общим коллектором и правильно было цеплять светодиод или другую моргалку/нагрузку на плюс, а не на землю. Вот ведь блин..
А теперь другая проблема. Знаю, что общеизвестная. Паразитная засветка оптронов к газоразрядным индикаторам. Происходит от того, что анодный импульс после пропадания не сразу рассасывается в оптроне. Вот думаю, как можно раздвинуть анодные импульсы, чтобы между ними зазор был для гашения, а не сразу друг за другом шли.. Кусок кода обычный Спойлер
Код:
' **********************[Основной цикл] ************************** Do ' основной цикл
Gosub Getdatetime ' считываем время и дату из DS1307
If _sec < 50 Then Gosub Break_time ' показываем время Else Gosub Break_date ' показ даты последние 10 сек каждой минуты End If
Incr Count : If Count > 6 Then Count = 1 ' выбираем какой разряд сейчас включать
Portd = Lookup(i(count) , Digits) ' закидываем в порт код цифры
Select Case Count ' включаем соответствующий разряд индикатора Case 1 : Set Dig1 Case 2 : Set Dig2 Case 3 : Set Dig3 Case 4 : Set Dig4 Case 5 : Set Dig5 Case 6 : Set Dig6 End Select
Вот думаю, как можно обрезать анодные импульсы по длительности?
В простом случае нужно использовать два прерывания - по переполнению и по совпадению. В прерывании по переполнению зажигается нужный разряд, а в прерывании по совпадению - гасятся все разряды. Тогда ширина анодного импульса будет пропорциональна числу в регистре сравнения.
Если же таймера с прерыванием по совпадению нет или он уже занят, можно сделать так: Завести глобальную переменную-флаг, в которой будет храниться тип следующего прерывания. При входе в прерывание проверяем флаг. Если он равен 0, то зажигаем разряд и загружаем в счётный регистр таймера число, определяющее ширину импульса (время до переполнения таймера). Если же флаг равен 1, то гасим все разряды и загружаем в счётный регистр число, определяющее длительность паузы. В конце каждого прерывания инвертируем флаг (из 0 в 1 и наоборот).
_________________ Этот пост оказался полезен? Не поленись, нажми слева!
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Вот думаю, как можно обрезать анодные импульсы по длительности?
В простом случае нужно использовать два прерывания - по переполнению и по совпадению. В прерывании по переполнению зажигается нужный разряд, а в прерывании по совпадению - гасятся все разряды. Тогда ширина анодного импульса будет пропорциональна числу в регистре сравнения. Если же таймера с прерыванием по совпадению нет или он уже занят, можно сделать так: Завести глобальную переменную-флаг, в которой будет храниться тип следующего прерывания. При входе в прерывание проверяем флаг. Если он равен 0, то зажигаем разряд и загружаем в счётный регистр таймера число, определяющее ширину импульса (время до переполнения таймера). Если же флаг равен 1, то гасим все разряды и загружаем в счётный регистр число, определяющее длительность паузы. В конце каждого прерывания инвертируем флаг (из 0 в 1 и наоборот).
А просто впихнуть Waitms 5 где-нибудь между Set Dig* нельзя?
после "Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6" вставить задежку ,только не 5 мсек а много меньше (подобрать экспериментально),например Waitus 10
Отлично. Паразитка исчезла где-то при Waitus 400. Благодарствую! -- Вообще это весьма ценная информация. Я когда планировал часы на ГРИ с оптронами, знал, проблема паразитной засветки вылезет. И народ советует по незнанию всякую хрень, кто анодное напряжение крутит, кто предлагает бросить все и делать на транзисторных ключах.. Длительность послесвечения оптрона, вот и все..
Задержки в прерываниях - дурной тон. Прерывание должно выполняться за максимально короткое время. Конкретно в этом случае лишние 80 тактов (10 мкс при 8 мГц) ничего плохого не сделают, но лучше сразу привыкать делать правильно.
_________________ Этот пост оказался полезен? Не поленись, нажми слева!
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Полностью согласен, задержек в прерывании быть не должно. Вариант с прерыванием по совпадению очень прост, и позволяет лишь средствами таймера регулировать длительность включенного состояния при неизменной частоте. Например, так легко регулируется яркость семисегментного индикатора, одним только изменением содержимого регистра сравнения.
Код:
Config Timer0 = Timer , Prescale = 64 , Clear Timer = 0 ' конфигурируем таймер индикации (~500 Гц) On Ovf0 Refresh ' вектор прерывания по переполнению On Oc0a Dimmer ' вектор прерывания по совпадению (длительность импульса)
Ocr0a = 127 ' загрузка значения в регистр сравнения
'***********************************[Процедуры обработки подпрограмм и прерываний]*******************************
Refresh: ' прерывание таймера Т0 (индикация)
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4 : Set Dig5 : Set Dig6 ' гасим индикатор
Incr Count : If Count > 6 Then Count = 1 ' выбираем какой разряд сейчас включать
Portd = Lookup(i(count) , Digits) ' закидываем в порт код цифры
Select Case Count ' и включаем соответствующий разряд индикатора Case 1 : Reset Dig1 Case 2 : Reset Dig2 Case 3 : Reset Dig3 Case 4 : Reset Dig4 Case 5 : Reset Dig5 Case 6 : Reset Dig6 End Select
Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4 : Set Dig5 : Set Dig6 ' гасим индикатор
Return ' выход из обработчика прерывания
_________________ "Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Та всё нормально. Соль тоже нельзя жрать. Но если знаешь сколько, то можно. На счёт таймера, то не нужен доп. Там один и тот же таймер может вызывать прерывание и по совпадению и прерыванию. Код не сильно увеличиться. Внимательно смотрите пример.
Добавлено after 7 minutes 26 seconds: Кроме того, код можно существенно сократить, если в прерывании не сохранять все регистры, а только нужные. Сделать это очень просто. Открывайте проект в протеусе, запуск\пауза, находите кусок кода с прерыванием. включаем Дизасемблер. Увидите в начале прерывание сохранение всех регистров, в конце восстановление. В теле прерывания смотрите какие регистры используются,записываете. Остальные все удаляете из \сохранения и востановления\. Для 2313 сокращение будет существенно. Не забудьте в конфигурацию таймера добавить "nosave" з.ы. зачем сообщение удалили про доп таймер. Мне тоже ответ удалять?
_________________ Все делают ошибки, только мудрецы - новые, а дураки - старые.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 35
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения