У меня следующий вопрос. Может кто то делал что то подобное.
Мне нужен своего рода счетчик. Нужно считать импульсы.
Частота следования от 2 имп/сек. До 600 имп/сек.
Вроде все просто. НО! Порты задействованы без INT0/INT1 и так далее. Прерываний в программе нет и не хотелось бы их использовать.
Нужно просто увеличивать либо уменьшать значение переменной WORD при поступлении импульсов в порт с такими условиями.
Подсчет импульсов с записью в EEPROM
Сообщений 1 страница 21 из 21
Поделиться12024-10-31 11:40:23
Поделиться22024-10-31 12:41:31
Нужно считать импульсы.
Частота следования от 2 имп/сек. До 600 имп/сек.
Вроде все просто. НО! Порты задействованы без INT0/INT1.
только быстрый опрос порта, выделение 2х бит (к которым подключены 2 входа) и их анализ.
Вариантов больше нет ))
Поделиться32024-10-31 13:43:38
только быстрый опрос порта, выделение 2х бит (к которым подключены 2 входа) и их анализ.
Вариантов больше нет ))
Я в общем долго уже код ковыряю. Переделал схему. Использую INT0 INT1.
Без прерываний не вариант, поскольку частота импульсов может быть относительно большой.
Теперь надо настроить порты на прерывание и сделать счетчики. Пока еще не знаю как подойти к этому делу правильно.
Плохо что новичек в этих прерываниях. Раньше никогда не использовал.
Поделиться42024-10-31 14:02:43
вроде тут я выкладывал частотомер для низких частот (у меня 50 Герц сети измеряло).
Но для Вашей задачи еще проще:
On Int0 Encoder_schitaem Save ' импульсы
Config Int0 = Falling ' Установка прерывания INT0
Enable Int0 ' Прерывание
Enable Interrupts ' Обязательно
do
Ваш код
loop
---
Encoder_schitaem: ' обработчик прерываний импульсов
Incr Linejka_impulsy
Return
Поделиться52024-10-31 14:53:20
Александр Д. вроде тут я выкладывал частотомер для низких частот (у меня 50 Герц сети измеряло).
Но для Вашей задачи еще проще:
Да! Я уже с этим разобрался и сделал. Спасибо за действительно полезную информацию!
Но вот с INT1 какая то ерунда. Настройки те же, но вначале счет шел, затем после пары включений отключений МК
счет перестал идти О_О Я ничего не понял. Видимо INT1 все таки отличается от INT0, либо у меня что то сдохло в железе...
Пробую разобраться...
Поделиться62024-10-31 15:35:31
Странно. Подтяжки портов включены. Но подтяжка как я понял только на INT1 есть. INT0 не поддтянут.
Неужели порт спалил. Блин. Настройки все правильно сделаны.
config PORTD.2 = input ' R
config PORTD.3 = input ' L
PORTD.2 = 1 'Подтяжка порта на U+
PORTD.3 = 1 'Подтяжка порта на U+
Enable Interrupts
Config INT0 = Falling 'R
Config INT1 = Falling 'L
On Int0 rcount
On Int1 lcount
Enable Int0
Enable Int1
Дополню. Железо проверил.
Загадка. После сброса контроллера, все работает. Потом после начала/остановки счета, перестает считать.
Может GIFR = 64 не стоит использовать?
lcount:
incr countl
Gifr = 64 ' сбрасываем регистр хранения прерывания INT1
return
rcount:
incr countr
Gifr = 64 ' сбрасываем регистр хранения прерывания INT0
return
Делаю так. Вроде все правильно, просто в главном цикле показываю countl и countr.
Отредактировано Payatel (2024-10-31 15:46:42)
Поделиться72024-10-31 15:53:36
ээээ
А зачем сбрасывать??
Выйдет по Return и всё!
Поделиться82024-10-31 16:08:58
Использую INT0 INT1.
Справедливости ради, во многих чипах есть еще PCINT (pin change interrupt).
Отличие в том, что Вам нужно настроить маски, а также, поскольку реакция будет и на подъем, и на спад, хранить в битовой переменной прошлое состояние пина.
Без прерываний не вариант, поскольку частота импульсов может быть относительно большой.
Есть также возможность использовать таймер в режиме счетчика.
Я делала так в стабилизаторе оборотов холостого хода для старой машины (штатная схема в бортовом компе вышла из строя).
Замеряется не частота, а длительность импульса. Это для относительно низких частот дает более быстрое/точное измерение при известной скважности.
То есть либо вы считаете число импульсов за какое-то время, либо измеряете интервал их следования (можно сделать несколько замеров и усреднить для повышения точности).
Первое точнее, но занимает какое-то время, и не чувствительно к скважности. Второе быстрее, но менее точно и чувствительно к периодичности, и она должна быть известна наперед.
Отредактировано Cirno_9 (2024-10-31 16:16:44)
Поделиться92024-10-31 16:10:26
Я не стал сбрасывать. Убрал эти строчки из кода.
Но ситуация та же. По INT1 счет идет без нареканий.
По INT0, работает после сброса МК, если счет остановить, а потом возобновить, то всё, значение стоит на месте
и не меняется. И подтяжка порта после сброса есть. Но после начала счета, затем остановки, пропадает!
Блин что за мистика.
Поделиться102024-10-31 16:17:45
Организуйте внешнюю подтяжку.
Почти во всех случаях вряд ли стоит экономить один резистор.
Мало того, что так надежнее, так еще и безопаснее.
Допустим, у вас пин как вход и подтянут внутри МК. Снаружи пин подключен к кнопке на массу.
Если ошибочно или в результате какого-нибудь сбоя пин окажется сконфигурирован как выход, при нажатии кнопки вы сожжете МК.
Гораздо безопаснее, при наличии возможности, подтянуть пин извне резистором 10...50 кОм к плюсу питания, а последовательно с кнопкой включить резистор 100...300 Ом.
Так при любых ошибках, что случается при отладке, МК останется цел невредим. Да и искать проблемы проще.
Отредактировано Cirno_9 (2024-10-31 16:29:44)
Поделиться112024-10-31 16:20:28
Может GIFR = 64 не стоит использовать?
GIFR показывает, что было еще одно прерывание в момент обработки первого.
Если вы обрабатываете его потенциально быстрее, чем они сыпятся, то повторного захода не будет, и ничего сбрасывать не нужно.
Поделиться122024-10-31 16:22:46
Организуйте аппаратную подтяжку.
Почти во всех случаях вряд ли стоит экономить один резистор.
Да я уже паяльную станцию включил. В коде уберу обе подтяжки и запаяю пару резисторов.
А то вся эта мистика мне не по душе. Спасибо что отвечаете.
И спасибо что форум ваш работает.
Утверждается что время форумов прошло с появлением мессенджеров. Но по мне так лучше форума ничего не может быть.
К сожалению очень много сайтов с полезной информацией по BASCOM давно не работают.
Форумы так же либо не работают совсем, либо их в интернете уже и в помине нет.
Добавляю. В общем убрал в прошивке подтяжку портов с этими прерываниями.
Все заработало как нужно! В первые такое честно говоря. Но и с прерываниями я
работаю впервые. Бесценный опыт, скажем так. Благодарю вас за ответы и советы еще раз!)))
Отредактировано Payatel (2024-10-31 16:35:36)
Поделиться132024-10-31 16:35:50
Enable Interrupts
Config INT0 = Falling 'R
Config INT1 = Falling 'L
On Int0 rcount
On Int1 lcount
Enable Int0
Enable Int1
В этом куске кода Enable Interrupts лучше переместить в последнюю строку.
А то сперва вы разрешаете прерывания, в только потом настраиваете реакцию и объявляете адреса обработчиков.
Неизвестно, как среагирует баском, но во всяком случае это нелогично и может быть потенциально источником багов.
Сперва все настраиваем, а потом включаем.
Отредактировано Cirno_9 (2024-10-31 16:36:24)
Поделиться142024-10-31 16:53:02
В этом куске кода Enable Interrupts лучше переместить в последнюю строку.
А то сперва вы разрешаете прерывания, в только потом настраиваете реакцию и объявляете адреса обработчиков.
Неизвестно, как среагирует баском, но во всяком случае это нелогично и может быть потенциально источником багов.
Сперва все настраиваем, а потом включаем.
Да, действительно. Что то я запарился.
Весь день воюю с прошивкой, аппаратной частью, с отладкой.
Благо хоть что то уже удалось нормально реализовать)
Поделиться152024-10-31 20:56:26
Странно. Подтяжки портов включены. Но подтяжка как я понял только на INT1 есть. INT0 не поддтянут.
У вас не до конца был решен вопрос "с подтяжками"...
На аппаратном уровне.
Используйте внешние резисторы, как было уже сказано выше.
А то так можно и взаправду МК загубить...
Загляните по ссылке из этого сообщения
Или сразу сюда...
Там про "подтяжки" расписано так, что "потом хоть ночью разбуди..." 
Для кого и зачем собиралось и писалось ?..

Поделиться162024-11-06 10:57:38
У меня еще и микроконтроллер походу оказался с побитыми портами. Перешел на атмега16. Что не напишешь, память улетает только в путь. Вот опять сейчас приколы подьехали. Записываю в память 24lc32 4 различных значения. Записывается судя по протеусу все правильно, там можно таблицу памяти при отладке глянуть. А вот читается какая то ерунда. Первое число 2 а потом последние три цыфры правильно... При отключении питания, и включении, почему то в память записывается какой то мусор... Во блин цирк.... Такого еще у меня не было...
Поделиться172024-11-06 12:47:56
Паузы после записи выдерживаете?
Поделиться182024-11-06 12:49:10
For Adres_w = 0 To 8191 Step 32 ' Очистка EEPROM
H_adr_eeprom = High(adres_w)
L_adr_eeprom = Low(adres_w) 'adress of EEPROM
I2cstart ' repeated start
I2cwbyte Cmd_eeprom_w
I2cwbyte H_adr_eeprom ' Задаём адрес, куда писать
I2cwbyte L_adr_eeprom
For Temp = 0 To 31 ' Всю страницу, все 32 байта
I2cwbyte 255
Next
I2cstop ' generate stop
Waitms 2 ' Обязательно!
Next
Return
'--------------------------------------------------------------------------------------------------
Chitaem_zapisi_loga:
H_adr_eeprom = High(adres_w)
L_adr_eeprom = Low(adres_w) 'adress of EEPROM
I2cstart
I2cwbyte Cmd_eeprom_w
I2cwbyte H_adr_eeprom ' Задаём адрес, откуда читать
I2cwbyte L_adr_eeprom
I2cstart ' repeated start
I2cwbyte Cmd_eeprom_r ' address R
I2crbyte Flag_sost , Ack
I2crbyte Flag_trevogi , Ack
I2crbyte Temp_3 , Ack
I2crbyte Hour , Ack
I2crbyte Mine , Ack
I2crbyte Seco , Ack
I2crbyte Dat , Ack
I2crbyte Month , Nack
I2cstop ' generate stop
Return
Отредактировано Александр Д. (2024-11-06 12:52:27)
Поделиться192024-11-06 21:47:16
Записываю в память 24lc32 4 различных значения. Записывается судя по протеусу все правильно, там можно таблицу памяти при отладке глянуть. А вот читается какая то ерунда.
По выделенному...
Не "записывается", а "отправляется на запись"... 
Согласитесь, это "две больших разницы"... 
И есть ли уверенность, что модель 24LC32A в Proteus полностью соответствует "железу" ?
Это все-таки модель, а не копия "начинки"...
Попробуйте писать не 4, а 2 значения... Все равно же симулируете схему, а в "железе" уже по-полной.
Поиграйтесь с таймингом, скоростью...
Для примера "неполноценности" - ID-номер в моделях 1-Wire ограничен 4-мя байтами... 
Поделиться202024-11-07 11:39:09
Странно. Подтяжки портов включены. Но подтяжка как я понял только на INT1 есть. INT0 не поддтянут.
Дополню. Железо проверил.
Загадка. После сброса контроллера, все работает. Потом после начала/остановки счета, перестает считать.
Может = 64 не стоит использовать?Отредактировано Payatel (2024-10-31 15:46:42)
В некоторых МК нет GIFR, а в некоторых прерывания находятся совсем на других битах.
Что у вас за МК не ясно, но GIFR=64 это единственное что есть в интернете, или чаще всего встречается, и в полне вероятно у вас стоит так, потому, что в нете так.
Сбрасывать флаг имеет смысл только если на прерывании контакт и есть дребезг.
lcount:
incr countl
Gifr = 64 ' сбрасываем регистр хранения прерывания INT1
returnrcount:
incr countr
Gifr = 64 ' сбрасываем регистр хранения прерывания INT0
returnОтредактировано Payatel (2024-10-31 15:46:42)
Потом
64=&b0100 0000
Как вы одним битом сбрасываете то инт0, то инт1?
Ну и т.д. , можно на лекцию расписать
По этому, начните с изучения даташита мк. Есть на русском языке вполне доходчиво всё
Добавлю
Всё прерывание можно на асм написать, на форуме есть как, пару строк, и оно не будет вообще заметно для работы основной программы как по времени, так и по объёму памяти
А так у вас бэйсик делает кучу не нужных действий, жрёт память и долго отвлекается на прерывание.
Отредактировано kip (2024-11-07 11:46:02)
Поделиться212024-11-07 12:47:07
не применяю ассм с 2006 года, так как часто бывает потребность переноса кода между AVR и PIC.