BASCOM AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
goldskif
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт окт 25, 2013 17:13:03

Re: BASCOM AVR в вопросах и ответах

Сообщение goldskif »

[uquote="Novice user",url="/forum/viewtopic.php?p=3237981#p3237981"]так не проще?
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[/uquote]
Благодарствую! Влезло. 5401 байт. 6-разрядные часы-календарь на Ин-12.
Аватара пользователя
Dnepr_1186
Потрогал лапой паяльник
Сообщения: 398
Зарегистрирован: Чт мар 26, 2009 20:53:27
Откуда: Беларусь.Минская обл.

Re: BASCOM AVR в вопросах и ответах

Сообщение Dnepr_1186 »

Добрый вечер! Такая проблема. Измеряю частоту. Необходимо измерять от 10 до 250гц чтобы точно было. Выставил таймер

Config Timer1 = Timer , Prescale = 64 , Capture Edge = Falling
частота 16мгц.
Таймер переполняется каждые 0,26с. Т.е. частоту до 4гц измеряет некорректно. Оно мне и не надо. Но если на входе частота находится ниже этих 4гц, то на выходе после пересчета выскакивают ненужные мне неправильные цифры. Понятно что из-за переполнения таймера. Только как сделать так чтобы если частота на входе ниже этих 4-5гц чтобы на выходе после пересчета был 0?
Пытался чтобы по переполнению таймера частота на выходе устанавливалась в ноль. Но между переполнениями из регистра захвата по прерыванию успевает записываться какое-либо число и частота прыгает от 0 до случайного значения.
Просто если реализовывать чтобы по переполнению таймера частота не считалась то ведь на один прогон программы таймер переполнится, а на следующий может не успеть и из регистра захвата будет прочитано число которое неверно отобразит частоту.
Помогите разобраться.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: BASCOM AVR в вопросах и ответах

Сообщение Ivanoff-iv »

при переполнении ставь блокирующий флаг.
потом, когда пришел импульс:
если флаг сброшен: обнуляем счетчик, считаем частоту
если флаг установлен: обнуляем счетчик, сбрасываем флаг.
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
akl
Друг Кота
Сообщения: 4444
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: BASCOM AVR в вопросах и ответах

Сообщение akl »

[uquote="Dnepr_1186",url="/forum/viewtopic.php?p=3238148#p3238148"]...Таймер переполняется каждые 0,26с. Т.е. частоту до 4гц измеряет некорректно...[/uquote]Получается, что программа работает неправильно, т.к при частоте 4/сек (250'000 мкс) и дискрете таймера 4 мкс значение в оном не превысит 62'500.
Dnepr_1186 писал(а):...Оно мне и не надо...
Можно задействовать режим сравнения по одному из каналов A(B) и в регистр OCR1A(B) загрузить 100'000/4. Тогда все частоты меньше 10/сек игнорировать.
-----
По мне, толкаться в пределах разрядности таймера как-то не очень. Можно увеличить разрядность таймера добавлением всего 1 регистра куда складывать число переполнений и получить добротный НЧ частотомер. Для примера, программа измерения прямым счетом. Автор её использует переполнения. Думаю, легко адаптировать под метод обратного счета
freq.txt
(2.33 КБ) 328 скачиваний
goldskif
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт окт 25, 2013 17:13:03

Re: BASCOM AVR в вопросах и ответах

Сообщение goldskif »

Уперся в DS1307. Расхотела генерить. Кварцы менял, не помогает. Есть подозрение, что тактовый генератор принудительно включился. Какв баскравре его включить?
Аватара пользователя
Dnepr_1186
Потрогал лапой паяльник
Сообщения: 398
Зарегистрирован: Чт мар 26, 2009 20:53:27
Откуда: Беларусь.Минская обл.

Re: BASCOM AVR в вопросах и ответах

Сообщение Dnepr_1186 »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3238390#p3238390"]при переполнении ставь блокирующий флаг.
потом, когда пришел импульс:
если флаг сброшен: обнуляем счетчик, считаем частоту
если флаг установлен: обнуляем счетчик, сбрасываем флаг.[/uquote]
я был так близок к этому! Блокирующий флаг сделал, но ставил его не то место программы
Всем спасибо :))
koms48
Встал на лапы
Сообщения: 132
Зарегистрирован: Пт окт 19, 2012 05:54:55

Re: BASCOM AVR в вопросах и ответах

Сообщение koms48 »

Уперся в DS1307.
Упрись в даташит.
Есть подозрение, что тактовый генератор принудительно включился.
Какв баскравре его включить?
Закусывать нада(с)
Из какой высказанной "золотым скифом" плесени пенициллин можно выжать?
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Грубиян. :)) Впрочем, и правда ничерта непонятно, что сие значит, и в чем вопрос. Я так подозреваю, что речь идет про 7- бит регистра секунд, и про то что генератор наоборот остановлен. Только в чем проблема так и не могу понять. goldskif, будьте добры, код покажите, в котором проблема у Вас.
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
Аватара пользователя
vem566
Друг Кота
Сообщения: 4732
Зарегистрирован: Вс янв 24, 2010 13:14:02
Откуда: Омск

Re: BASCOM AVR в вопросах и ответах

Сообщение vem566 »

При старте программы записать принудительно в регистр секунд ноль. Если все остальное нормально - часы пойдут. Можно посмотреть на 2 ноге генерацию кварца.
koms48
Встал на лапы
Сообщения: 132
Зарегистрирован: Пт окт 19, 2012 05:54:55

Re: BASCOM AVR в вопросах и ответах

Сообщение koms48 »

[uquote="edm2007",url="/forum/viewtopic.php?p=3241512#p3241512"]Грубиян. :)) Впрочем, и правда ничерта непонятно, что сие значит, и в чем вопрос. Только в чем проблема так и не могу понять. goldskif, будьте добры, код покажите, в котором проблема у Вас.[/uquote]
Не грубиян, а хам и циник.
Ежели я задам вопрос:
Мужики, телевизор у меня помрал, чё делать-то.
Какие ответы меня ожидают? :kill:
Нету тела, нету дела!
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Re: BASCOM AVR в вопросах и ответах

Сообщение kip96 »

Кварц может не генерить, при отсутствии батарейки (контакта или низкого напряжения), проблемы с кварцем(тоже не редкость), не правильной разводки (см. описание на микру).
Все делают ошибки, только мудрецы - новые, а дураки - старые.
goldskif
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт окт 25, 2013 17:13:03

Re: BASCOM AVR в вопросах и ответах

Сообщение 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

Debounce B_set , 0 , Setup_timedate , Sub                   ' обработка кнопки "SET"

Waitms 500

Loop

End
'***********************[Процедуры обработки подпрограмм и прерываний]*******************************

Refresh:                                                    ' прерывание таймера Т0 (индикация)

Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6       ' гасим индикатор

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

Return                 
Последний раз редактировалось goldskif Сб ноя 25, 2017 20:29:35, всего редактировалось 1 раз.
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: BASCOM AVR в вопросах и ответах

Сообщение *Trigger* »

goldskif писал(а):Вот думаю, как можно обрезать анодные импульсы по длительности?


В простом случае нужно использовать два прерывания - по переполнению и по совпадению. В прерывании по переполнению зажигается нужный разряд, а в прерывании по совпадению - гасятся все разряды. Тогда ширина анодного импульса будет пропорциональна числу в регистре сравнения.

Если же таймера с прерыванием по совпадению нет или он уже занят, можно сделать так:
Завести глобальную переменную-флаг, в которой будет храниться тип следующего прерывания. При входе в прерывание проверяем флаг. Если он равен 0, то зажигаем разряд и загружаем в счётный регистр таймера число, определяющее ширину импульса (время до переполнения таймера). Если же флаг равен 1, то гасим все разряды и загружаем в счётный регистр число, определяющее длительность паузы. В конце каждого прерывания инвертируем флаг (из 0 в 1 и наоборот).
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
goldskif
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт окт 25, 2013 17:13:03

Re: BASCOM AVR в вопросах и ответах

Сообщение goldskif »

[uquote="*Trigger*",url="/forum/viewtopic.php?p=3242832#p3242832"]
goldskif писал(а):Вот думаю, как можно обрезать анодные импульсы по длительности?

В простом случае нужно использовать два прерывания - по переполнению и по совпадению. В прерывании по переполнению зажигается нужный разряд, а в прерывании по совпадению - гасятся все разряды. Тогда ширина анодного импульса будет пропорциональна числу в регистре сравнения.
Если же таймера с прерыванием по совпадению нет или он уже занят, можно сделать так:
Завести глобальную переменную-флаг, в которой будет храниться тип следующего прерывания. При входе в прерывание проверяем флаг. Если он равен 0, то зажигаем разряд и загружаем в счётный регистр таймера число, определяющее ширину импульса (время до переполнения таймера). Если же флаг равен 1, то гасим все разряды и загружаем в счётный регистр число, определяющее длительность паузы. В конце каждого прерывания инвертируем флаг (из 0 в 1 и наоборот).[/uquote]
А просто впихнуть Waitms 5 где-нибудь между Set Dig* нельзя?
Novice user
Мудрый кот
Сообщения: 1704
Зарегистрирован: Вт янв 05, 2016 10:14:25
Откуда: поселок Мелеуз

Re: BASCOM AVR в вопросах и ответах

Сообщение Novice user »

после "Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6" вставить задежку ,только не 5 мсек а много меньше (подобрать экспериментально),например Waitus 10
goldskif
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт окт 25, 2013 17:13:03

Re: BASCOM AVR в вопросах и ответах

Сообщение goldskif »

[uquote="Novice user",url="/forum/viewtopic.php?p=3242872#p3242872"]после "Reset Dig1 : Reset Dig2 : Reset Dig3 : Reset Dig4 : Reset Dig5 : Reset Dig6" вставить задежку ,только не 5 мсек а много меньше (подобрать экспериментально),например Waitus 10[/uquote]
Отлично. Паразитка исчезла где-то при Waitus 400. Благодарствую!
--
Вообще это весьма ценная информация. Я когда планировал часы на ГРИ с оптронами, знал, проблема паразитной засветки вылезет.
И народ советует по незнанию всякую хрень, кто анодное напряжение крутит, кто предлагает бросить все и делать на транзисторных ключах.. Длительность послесвечения оптрона, вот и все..
Аватара пользователя
*Trigger*
Друг Кота
Сообщения: 3059
Зарегистрирован: Пн май 11, 2009 14:15:00
Откуда: СПб

Re: BASCOM AVR в вопросах и ответах

Сообщение *Trigger* »

Задержки в прерываниях - дурной тон. Прерывание должно выполняться за максимально короткое время.
Конкретно в этом случае лишние 80 тактов (10 мкс при 8 мГц) ничего плохого не сделают, но лучше сразу привыкать делать правильно.
Этот пост оказался полезен? Не поленись, нажми Изображение слева!
:) :)) :)))
Куплю индикаторы ИТС-1А, ИТС-1Б, ИГВ1-8х5Л, ИГПС1-222/7, ИГПС1-111/7 и подобные.
Аватара пользователя
edm2007
Поставщик валерьянки для Кота
Сообщения: 2255
Зарегистрирован: Вт апр 21, 2009 22:24:10
Откуда: Иркутск
Контактная информация:

Re: BASCOM AVR в вопросах и ответах

Сообщение edm2007 »

Полностью согласен, задержек в прерывании быть не должно. Вариант с прерыванием по совпадению очень прост, и позволяет лишь средствами таймера регулировать длительность включенного состояния при неизменной частоте. Например, так легко регулируется яркость семисегментного индикатора, одним только изменением содержимого регистра сравнения.

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

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

Return                                                      ' выход из обработчика прерывания

'----------

Dimmer:                                                     ' прерывание таймера Т0 (регулировка яркости)

Set Dig1 : Set Dig2 : Set Dig3 : Set Dig4 : Set Dig5 : Set Dig6       ' гасим индикатор

Return                                                      ' выход из обработчика прерывания
"Слишком много людей ломаются, даже не подозревая о том, насколько близки к успеху они были в тот момент, когда упали духом". Томас Алва Эдисон
goldskif
Открыл глаза
Сообщения: 68
Зарегистрирован: Пт окт 25, 2013 17:13:03

Re: BASCOM AVR в вопросах и ответах

Сообщение goldskif »

А длительность равную Waitus 400 как поставить? Пока засветка есть
Последний раз редактировалось goldskif Вс ноя 26, 2017 09:35:53, всего редактировалось 1 раз.
Аватара пользователя
kip96
Держит паяльник хвостом
Сообщения: 965
Зарегистрирован: Ср авг 26, 2009 08:24:50
Откуда: 1300км от Пупа

Re: BASCOM AVR в вопросах и ответах

Сообщение kip96 »

Та всё нормально. Соль тоже нельзя жрать. Но если знаешь сколько, то можно.
На счёт таймера, то не нужен доп. Там один и тот же таймер может вызывать прерывание и по совпадению и прерыванию. Код не сильно увеличиться. Внимательно смотрите пример.

Добавлено after 7 minutes 26 seconds:
Кроме того, код можно существенно сократить, если в прерывании не сохранять все регистры, а только нужные. Сделать это очень просто. Открывайте проект в протеусе, запуск\пауза, находите кусок кода с прерыванием. включаем Дизасемблер. Увидите в начале прерывание сохранение всех регистров, в конце восстановление. В теле прерывания смотрите какие регистры используются,записываете. Остальные все удаляете из \сохранения и востановления\. Для 2313 сокращение будет существенно. Не забудьте в конфигурацию таймера добавить "nosave"
з.ы.
зачем сообщение удалили про доп таймер. Мне тоже ответ удалять?
Все делают ошибки, только мудрецы - новые, а дураки - старые.
Ответить

Вернуться в «AVR»