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

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

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

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


Вы здесь » Программирование ATMEL в BASCOM. » Приборы, средства и способы измерения величин » Подсчет импульсов с записью в EEPROM


Подсчет импульсов с записью в EEPROM

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

1

У меня следующий вопрос. Может кто то делал что то подобное.
Мне нужен своего рода счетчик. Нужно считать импульсы.
Частота следования от 2 имп/сек. До 600 имп/сек.
Вроде все просто. НО! Порты задействованы без INT0/INT1 и так далее. Прерываний в программе нет и не хотелось бы их использовать.
Нужно просто увеличивать либо уменьшать значение переменной WORD при поступлении импульсов в порт с такими условиями.

0

2

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

Нужно считать импульсы.
Частота следования от 2 имп/сек. До 600 имп/сек.
Вроде все просто. НО! Порты задействованы без INT0/INT1.

только быстрый опрос порта, выделение 2х бит (к которым подключены 2 входа) и их анализ.
Вариантов больше нет ))

+1

3

только быстрый опрос порта, выделение 2х бит (к которым подключены 2 входа) и их анализ.
Вариантов больше нет ))

Я в общем долго уже код ковыряю. Переделал схему. Использую INT0  INT1.
Без прерываний не вариант, поскольку частота импульсов может быть относительно большой.
Теперь надо настроить порты на прерывание и сделать счетчики. Пока еще не знаю как подойти к этому делу правильно.
Плохо что новичек в этих прерываниях. Раньше никогда не использовал.

0

4

вроде тут я выкладывал частотомер для низких частот (у меня 50 Герц сети измеряло).
Но для Вашей задачи еще проще:

  On Int0 Encoder_schitaem Save      ' импульсы
  Config Int0 = Falling       ' Установка прерывания INT0
  Enable Int0                 ' Прерывание

  Enable Interrupts           ' Обязательно

do
Ваш код
loop

---
Encoder_schitaem:             ' обработчик прерываний импульсов
    Incr Linejka_impulsy
Return

0

5

Александр Д. вроде тут я выкладывал частотомер для низких частот (у меня 50 Герц сети измеряло).
Но для Вашей задачи еще проще:

Да! Я уже с этим разобрался и сделал. Спасибо за действительно полезную информацию!
Но вот с INT1 какая то ерунда. Настройки те же, но вначале счет шел, затем после пары включений отключений МК
счет перестал идти О_О Я ничего не понял. Видимо INT1 все таки отличается от INT0, либо у меня что то сдохло в железе...
Пробую разобраться...

0

6

Странно. Подтяжки портов включены. Но подтяжка как я понял только на 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)

0

7

ээээ
А зачем сбрасывать??
Выйдет по Return  и всё!

0

8

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

Использую INT0  INT1.

Справедливости ради, во многих чипах есть еще PCINT (pin change interrupt).
Отличие в том, что Вам нужно настроить маски, а также, поскольку реакция будет и на подъем, и на спад, хранить в битовой переменной прошлое состояние пина.

Без прерываний не вариант, поскольку частота импульсов может быть относительно большой.

Есть также возможность использовать таймер в режиме счетчика.
Я делала так в стабилизаторе оборотов холостого хода для старой машины (штатная схема в бортовом компе вышла из строя).
Замеряется не частота, а длительность импульса. Это для относительно низких частот дает более быстрое/точное измерение при известной скважности.
То есть либо вы считаете число импульсов за какое-то время, либо измеряете интервал их следования (можно сделать несколько замеров и усреднить для повышения точности).
Первое точнее, но занимает какое-то время, и не чувствительно к скважности. Второе быстрее, но менее точно и чувствительно к периодичности, и она должна быть известна наперед.

Отредактировано Cirno_9 (2024-10-31 16:16:44)

0

9

Я не стал сбрасывать. Убрал эти строчки из кода.
Но ситуация та же. По INT1 счет идет без нареканий.
По INT0, работает после сброса МК, если счет остановить, а потом возобновить, то всё, значение стоит на месте
и не меняется. И подтяжка порта после сброса есть. Но после начала счета, затем остановки, пропадает!
Блин что за мистика.

0

10

Организуйте внешнюю подтяжку.
Почти во всех случаях вряд ли стоит экономить один резистор.
Мало того, что так надежнее, так еще и безопаснее.
Допустим, у вас пин как вход и подтянут внутри МК. Снаружи пин подключен к кнопке на массу.
Если ошибочно или в результате какого-нибудь сбоя пин окажется сконфигурирован как выход, при нажатии кнопки вы сожжете МК.

Гораздо безопаснее, при наличии возможности, подтянуть пин извне резистором 10...50 кОм к плюсу питания, а последовательно с кнопкой включить резистор 100...300 Ом.
Так при любых ошибках, что случается при отладке, МК останется цел невредим. Да и искать проблемы проще.

Отредактировано Cirno_9 (2024-10-31 16:29:44)

0

11

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

Может GIFR = 64 не стоит использовать?

GIFR показывает, что было еще одно прерывание в момент обработки первого.
Если вы обрабатываете его потенциально быстрее, чем они сыпятся, то повторного захода не будет, и ничего сбрасывать не нужно.

0

12

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

Организуйте аппаратную подтяжку.
Почти во всех случаях вряд ли стоит экономить один резистор.

Да я уже паяльную станцию включил. В коде уберу обе подтяжки и запаяю пару резисторов.
А то вся эта мистика мне не по душе. Спасибо что отвечаете.
И спасибо что форум ваш работает.
Утверждается что время форумов прошло с появлением мессенджеров. Но по мне так лучше форума ничего не может быть.
К сожалению очень много сайтов с полезной информацией по BASCOM давно не работают.
Форумы так же либо не работают совсем, либо их в интернете уже и в помине нет.

Добавляю. В общем убрал в прошивке подтяжку портов с этими прерываниями.
Все заработало как нужно! В первые такое честно говоря. Но и с прерываниями я
работаю впервые. Бесценный опыт, скажем так. Благодарю вас за ответы и советы еще раз!)))

Отредактировано Payatel (2024-10-31 16:35:36)

0

13

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

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)

0

14

В этом куске кода Enable Interrupts лучше переместить в последнюю строку.
А то сперва вы разрешаете прерывания, в только потом настраиваете реакцию и объявляете адреса обработчиков.
Неизвестно, как среагирует баском, но во всяком случае это нелогично и может быть потенциально источником багов.
Сперва все настраиваем, а потом включаем.

Да, действительно. Что то я запарился.
Весь день воюю с прошивкой, аппаратной частью, с отладкой.
Благо хоть что то уже удалось нормально реализовать)

0

15

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

Странно. Подтяжки портов включены. Но подтяжка как я понял только на INT1 есть. INT0 не поддтянут.

У вас не до конца был решен вопрос "с подтяжками"...
На аппаратном уровне.
Используйте внешние резисторы, как было уже сказано выше.
А то так можно и взаправду МК загубить...

Загляните по ссылке из этого сообщения
Или сразу сюда...
Там про "подтяжки" расписано так, что "потом хоть ночью разбуди..." ;)

Для кого и зачем собиралось и писалось ?.. ;)  :dontknow:

+1

16

У меня еще и микроконтроллер походу оказался с побитыми портами. Перешел на атмега16. Что не напишешь, память улетает только в путь. Вот опять сейчас приколы подьехали. Записываю в память 24lc32 4 различных значения. Записывается судя по протеусу все правильно, там можно таблицу памяти при отладке глянуть. А вот читается какая то ерунда. Первое число 2 а потом последние три цыфры правильно... При отключении питания, и включении, почему то в память записывается какой то мусор... Во блин цирк.... Такого еще у меня не было...

0

17

Паузы после записи выдерживаете?

0

18

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)

0

19

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

Записываю в память 24lc32 4 различных значения. Записывается судя по протеусу все правильно, там можно таблицу памяти при отладке глянуть. А вот читается какая то ерунда.

По выделенному...
Не "записывается", а "отправляется на запись"... ;)
Согласитесь, это "две больших разницы"... ;)

И есть ли уверенность, что модель 24LC32A в Proteus полностью соответствует "железу" ?
Это все-таки модель, а не копия "начинки"...
Попробуйте писать не 4, а 2 значения... Все равно же симулируете схему, а в "железе" уже по-полной.
Поиграйтесь с таймингом, скоростью...

Для примера "неполноценности" - ID-номер в моделях 1-Wire ограничен 4-мя байтами... ;)

0

20

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

Странно. Подтяжки портов включены. Но подтяжка как я понял только на INT1 есть. INT0 не поддтянут.

Дополню. Железо проверил.
Загадка. После сброса контроллера, все работает. Потом после начала/остановки счета, перестает считать.
Может = 64 не стоит использовать?

Отредактировано Payatel (2024-10-31 15:46:42)

В некоторых МК нет  GIFR, а в некоторых прерывания находятся совсем на других битах.
Что у вас за МК не ясно, но GIFR=64 это единственное что есть в интернете, или чаще всего встречается, и в полне вероятно у вас стоит так, потому, что в нете так.
Сбрасывать флаг имеет смысл только если на прерывании контакт и есть дребезг.

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

lcount:
incr countl
Gifr = 64                ' сбрасываем регистр хранения прерывания INT1
return

rcount:
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)

0

21

не применяю ассм с 2006 года, так как часто бывает потребность переноса кода между AVR и PIC.

0


Вы здесь » Программирование ATMEL в BASCOM. » Приборы, средства и способы измерения величин » Подсчет импульсов с записью в EEPROM