Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Счетчик импульсов на tiny2313A


Счетчик импульсов на tiny2313A

Сообщений 1 страница 7 из 7

1

Доброго времени суток.
В МК я, можно сказать, новичок, поэтому решил спросить совета у более опытных людей. Суть проблемы такова - имеется устройство, считающее импульсы от внешнего генератора. Считает как в большую сторону, так и в меньшую. При достижении 0 кратковременно устанавливается высокий уровень на выходе, давая понять тому, что к нему подключено, что счет окончен. Собрано устройство на tiny2313A, индикация организована на таймере0, порты В0 - В6 аноды индикатора, D0, D1, D4, D5 - катоды, D2, D3 - входы импульсов, А1 - выход.
Все как бы работает, но при отсчете от какого-либо значения большего 255 до 0, при достижении значения 255 на выходе, по какой-то непонятной мне причине, появляется высокий уровень. Причем происходит это спонтанно - может сутки отработать как часы, а может глючить через раз. При этом, если импульсы продолжают поступать, то отсчет продолжается.
Вот кусок кода, отвечающий за увеличение/уменьшение переменной и реакцию устройства при достижении переменной нулевого значения. Переменная Счет нужна для того, чтобы при достижении 0 не дергался постоянно выход. Не пинайте, пожалуйста, за его корявость.

Код:
Config Int0 = Falling
Config Int1 = Falling
On Int0 Меньше
On Int1 Больше
......................
......................
Выход = 0
Число = 0
Счет = 0
Do
  If Число = 0 And Счет = 1 Then
   Выход = 1
   Waitms 250
   Выход = 0
   Счет = 0
  End If
Loop
End
'------------
'Подпрограммы
'------------
Меньше:
If Число > 0 Then Decr Число
Счет = 1
Eifr = 64
Return
'------------------------------
Больше:
If Число < 9999 Then Incr Чмсло
Счет = 1
Eifr = 128
Return


Ткните, пожалуйста, носом откуда у проблемы ноги растут.
Спасибо.

0

2

Во первых непонятно что вы пишете в регистр EIFR? Насколько я знаю биты 0...4 этого регистра предназначены только для чтения, а во вторых зачем писать в регистр, предназначенный для контроля возникновения прерывания?
Не очень понятно назначение переменной СЧЁТ. И еще, нужно более подробно описать что поступает на вход. Это асинхронные импульсы, синхронные... Каков их источник. В данном случае может быть так называемая гонка. Т.е пришел импульс на декремент, получился 0, выход сработал, но не выдержав интервал удержания в 250 мс срабатывает другой вход. Нужно чуть подробнее все описать.

Отредактировано sva-don (2017-03-04 10:26:44)

0

3

Не видно, каккие переменные объявили. Может у вас там байты

0

4

На счет регистра EIFR - взято отсюда http://decada.org.ru/project/lessons/bascom_avr/10/. "...даже если вы нажмете кнопку перед включением прерываний, данные о срабатывании где-то сохранятся, и после включения прерывание немедленно выполнится. ...что нужно сделать для устранения нашей проблемы - это установить соответствующие биты в GIFR перед командой Return в подпрограмме обработки. Тогда дальнейшие (бесполезные) прерывания после продолжения работы обрабатываться не будут."
Источник импульсов - генераторы на NE555, первый с частотой примерно 1 Гц, второй в "медленном" режиме, примерно, герца 3-4, в "быстром" герц 15-20. На счет формы врать не буду, вживую не смотрел, но в Протеусе получается прямоугольник. Кстати, при симуляции в Протеусе наблюдается та же картина, что и на "живом" устройстве.
Первый генератор работает в "рабочем" режиме, т. е. получается как бы таймер, выдержка которого задается вторым генератором. Второй генератор подключен к обоим входам счетчика, первый, через диод, только к входу "Меньше". Управляется первый генератор четырьмя кнопками: "Fast", "Slow", "+", "-". Как это работает - для увеличения значения счетчика зажимаем одновременно "Fast" или "Slow" и "+", для уменьшения "Fast" или "Slow" и "-".
На счет прихода импульса при отсчете на другой вход... Практически уверен, что не приходит, т.к. для запуска генератора необходимо нажатие двух кнопок. В реальности это гальваническая ванна и время нового цикла на ней устанавливают сразу же по окончанию закончившегося и извлечении детали. Между двумя запусками ванны может пройти несколько часов, и показания счетчика остаются неизменными.
Переменная Счет выполняет роль флага начала/окончания рабочего цикла. Без нее, когда счетчик досчитает до 0, на выходе будет "дергаться" высокий уровень, а мне нужен одиночный импульс. Пока Счет не будет установлен в 1, программе, по моей задумке, должно быть абсолютно все равно, чему равно отсчитываемое число.

На счет переменных не совсем понял. Если б я объявил не то, что надо, оно б не работало вообще? Но, поскольку я в тупике, вот псевдоним и переменные, используемые в приведенном в первом посте куске кода:

Код:
Выход Alias Porta.1
..................................
..................................
Dim Число As Word
Dim Счет As Bit

0

5

Ну во первых, GIFR и EIFR разные регистры, и не только первой буквой. По этому вы знаете, что включаете или отключаете командой EIFR=64? . По моему, биты там по другому стоят, проверьте. Во вторых, если у вас в протеусе таже бяка, что же вам мешает пройтись в пошаговом режиме, и поймать её?. Загружайте .obj и вперёд.

0

6

Согласен, с GIFR и EIFR протупил. EIFR это в 2313 без "А". Хотя, судя из описания, функционал битов 6 и 7 в GIFR и EIFR одинаков - Bit 6 – INTF0: External Interrupt Flag 0, Bit 7 – INTF1: External Interrupt Flag 1. И далее, одинаково для обоих, разве что INT0 заменяется в тексте на INT1: " The flag is cleared when the interrupt routine is executed. Alternatively, the flag can be cleared by writing a logical one to it. This flag is always cleared when INT0 is configured as a level interrupt."
Из описания 2313 на русском: "Этот флаг очищается аппаратно после выхода из подпрограммы обработки прерывания. Этот Флаг, также, может быть очищен записью в него лог.1. Этот Флаг постоянно очищен, если вывод INT0 работает в Режиме Прерывания по Уровню." Практически то же написано и у Белова. И, если я правильно понимаю вышенаписанное, то командой GIFR(EIFR) = 64 (01000000) я пишу 1 в 6 бит, а GIFR(EIFR) = 128 (10000000), соответственно, в 7, т. е. альтернативно очищаю эти флаги. Хотя, судя по тому же описанию, это должно выполнятся и без моего участия, тем более, что удаление этих команд из текста программы ничего не изменило.
Ничего не мешает, кроме абсолютно рендомного проявления глюка) Сегодняшнее утро, отладочный файл загружен, почти 3 часа прогонов в диапазане 255 +/- 10 - 15... и ничего. Ладно, скормим симулятору .hex, уменьшим частоту задающего генератора... На 5 переключении направления счета - пабаммм! Я ж поэтому и решился потревожить глупыми вопросами более опытных товарищей - может кто уже сталкивался с магией числа 255 в 2313 тиньке...
П. С. Морщенье мозга привело к крамольной мысли - не из таймера ли ноги растут? Каким образом не пойму, но считает то он как раз до 255 и в программе, написанной без его применения (соответственно допиленная под необходимые нужды http://avrproject.ru/publ/kak_podkljuch … mi/2-1-0-9) ничего подобного не наблюдается. Хоть и бредово, но попробую индикацию на Таймер1 повесить...

Отредактировано scrue (2017-03-05 20:52:35)

0

7

scrue написал(а):

не из таймера ли ноги растут? Каким образом не пойму, но считает то он как раз до 255

TAIMER0 - 8-ми разрядный. Поэтому он и считает до 255.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Счетчик импульсов на tiny2313A