Проблема подсчета количества импульсов с блока генератора
Проблема подсчета количества импульсов с блока генератора
Добрый день! Подскажите начинающему.
Задача такая: С матричной клавиатуры вводится цифра (одноразрядное число) в строку. Переменная R отслеживает нажатие. Стринг преобразуется в число.
Затем запускается генератор, счетчик_1 отсчитывает необходимое количество импульсов (по максимальному пределу равному введенному числу), блокирует работу генератора и сам себя обнуляет. Другой счетчик_2 считает количество сгенерированных импульсов. При нажатии следующей цифры на клавиатуре, строка перезаписывается, счетчик_2 сбрасывается переменной R и начинает отсчет новых импульсов. Результаты вывожу на дисплей по I2C. Вроде все просто.
Проблема: При такой схеме как на картинке, происходит недосчет на один импульс. Если убрать переменную R, которая сбрасывает счетчик_2 и заменить ее кнопкой с клавиатуры, например * , проблема уходит.
Подскажите, пожалуйста, в чем ошибка?
Может неверны временные интервалы?
Задача такая: С матричной клавиатуры вводится цифра (одноразрядное число) в строку. Переменная R отслеживает нажатие. Стринг преобразуется в число.
Затем запускается генератор, счетчик_1 отсчитывает необходимое количество импульсов (по максимальному пределу равному введенному числу), блокирует работу генератора и сам себя обнуляет. Другой счетчик_2 считает количество сгенерированных импульсов. При нажатии следующей цифры на клавиатуре, строка перезаписывается, счетчик_2 сбрасывается переменной R и начинает отсчет новых импульсов. Результаты вывожу на дисплей по I2C. Вроде все просто.
Проблема: При такой схеме как на картинке, происходит недосчет на один импульс. Если убрать переменную R, которая сбрасывает счетчик_2 и заменить ее кнопкой с клавиатуры, например * , проблема уходит.
Подскажите, пожалуйста, в чем ошибка?
Может неверны временные интервалы?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Bupper 14 янв 2022, 15:59, всего редактировалось 1 раз.
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
Проблема подсчета количества импульсов с блока генератора
Подсказываю. Картинки это хорошо, но выкладывать проект полезнее. Вероятность получить дельный совет куда как выше.
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Проблема подсчета количества импульсов с блока генератора
Мы не видим как настроили счётчики. Зачем конвертация в стринг и обратно?
Используйте блок изменение числа. Сэкономите на одной переменной, стринг тем более тяжёлая переменная для мк
Проект приложите.
Используйте блок изменение числа. Сэкономите на одной переменной, стринг тем более тяжёлая переменная для мк
Проект приложите.
Проблема подсчета количества импульсов с блока генератора
Стринг мне понадобиться в дальнейшем. Я буду суммировать строки и потом получать многоразрядные числа.aidar_i писал(а): 14 янв 2022, 15:40 Мы не видим как настроили счётчики. Зачем конвертация в стринг и обратно?
Используйте блок изменение числа.
Счетчик_1 - счет вверх до установленного предела. При достижении единица на выходе. Счетчик_2 - просто счет вверх
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Последний раз редактировалось Bupper 14 янв 2022, 15:46, всего редактировалось 1 раз.
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Проблема подсчета количества импульсов с блока генератора
Когда нужно , тогда и конвертируйте, не тащите через весь проект.
Проблема подсчета количества импульсов с блока генератора
В принципе в условие запуска генератора можно поставить изменение числа, но проблема не уходит.aidar_i писал(а): 14 янв 2022, 15:45 Когда нужно , тогда и конвертируйте, не тащите через весь проект.
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Проблема подсчета количества импульсов с блока генератора
Я не насчёт этой проблемы пока писал.
Я проект не смотрел ещё, может Naladchik около компа. Попробуйте добавить в счетчике 2 +1
Проблема подсчета количества импульсов с блока генератора
Да, если ничего не смогу придумать, добавлю просто +1.
Может счетчик_2 сбрасывается с задержкой на такт, поэтому и пропускает 1 импульс генератора. Непонятно.
[ref]Naladchik[/ref],
Проект приложил
Может счетчик_2 сбрасывается с задержкой на такт, поэтому и пропускает 1 импульс генератора. Непонятно.
[ref]Naladchik[/ref],
Проект приложил
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Проблема подсчета количества импульсов с блока генератора
Попробуйте так
[spoiler] [/spoiler]
Вообщем у Вас в переменную записывается -1, а должна 0. Собака где то здесь мне кажется зарыта.
[spoiler] [/spoiler]
Вообщем у Вас в переменную записывается -1, а должна 0. Собака где то здесь мне кажется зарыта.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Проблема подсчета количества импульсов с блока генератора
aidar_i, Да, спасибо! Тут была ошибка. Явно был -1. Однако проблема недосчета все равно остается.
Т.е. ошибка именно в способе сброса счетчика_2. Я генерирую сигнал R по нажатию клавиши на клавиатуре. Если сигнал R заменить на кнопку *, например, и сбрасывать счетчик вручную, ошибки нет. Т.е. общая логика верна.
Прикладываю корректный проект.
Т.е. ошибка именно в способе сброса счетчика_2. Я генерирую сигнал R по нажатию клавиши на клавиатуре. Если сигнал R заменить на кнопку *, например, и сбрасывать счетчик вручную, ошибки нет. Т.е. общая логика верна.
Прикладываю корректный проект.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
-
- Капитан
- Сообщения: 908
- Зарегистрирован: 04 окт 2015, 19:10
- Откуда: Новосибирск
- Имя: Павел
- Благодарил (а): 20 раз
- Поблагодарили: 22 раза
-
- Полковник
- Сообщения: 3358
- Зарегистрирован: 24 дек 2016, 16:55
- Откуда: Уфа
- Имя: Айдар
- Благодарил (а): 13 раз
- Поблагодарили: 100 раз
- Контактная информация:
Проблема подсчета количества импульсов с блока генератора
В проекте я написал комментарии, что исправить В комментарии немного неправильно написал, читать : не счётчик запускается через 10мс, а второй импульс запускается через 60 мс как сработал R , а счётчик единицу, которая была после первого импульса, сбрасывает на ноль после сработки R через 40 мс, уменьшая счёт на единицу.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Проблема подсчета количества импульсов с блока генератора
aidar_i, спасибо вам что тратите свое время! В принципе, все что вы написали в комментариях понятно. Явная проблема с временем срабатывания сброса. Однако проблема остается. Вот что я перепробывал:
Первый вариант: R выносим в начало платы. Убираем задержку на R. Добавляем задержку перед генератором. Результат: При первом счете перебор на единицу. При последующих счетах все нормально. Число 1 с клавиатуры не считает (счет = 0).
Второй вариант: R выносим в начало платы . Убираем задержку на R, перед генератором задержки нет. Результат: счет на единицу меньше.
Третий вариант: R выносим в начало платы . Задержка перед R, перед генератором задержки нет. Результат: счет на единицу меньше.
Первый вариант: R выносим в начало платы. Убираем задержку на R. Добавляем задержку перед генератором. Результат: При первом счете перебор на единицу. При последующих счетах все нормально. Число 1 с клавиатуры не считает (счет = 0).
Второй вариант: R выносим в начало платы . Убираем задержку на R, перед генератором задержки нет. Результат: счет на единицу меньше.
Третий вариант: R выносим в начало платы . Задержка перед R, перед генератором задержки нет. Результат: счет на единицу меньше.
- Dryundel
- Полковник
- Сообщения: 2430
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 3 раза
- Поблагодарили: 30 раз
Проблема подсчета количества импульсов с блока генератора
[ref]Bupper[/ref], Вы слишком запутываете логику. Ну хорошо, при имеющейся схеме, путем ухищрений, добъетесь таки нужного количества импульсов от конкретной кнопки. Так встанет другая проблема. Что произойдёт если нажать следующую кнопку, когда импульсы ещё не закончились?
В добавок преобразования в стринг и обратно. Это тяжёлые операции, которые загрузят процессор.
В дальнейшем Вы вроде хотите собирать цифры в число.
Вы бы описали свою задумку. Какой планируется получить результат? В чем идея?
Может тогда проще будет Вам помочь.
В добавок преобразования в стринг и обратно. Это тяжёлые операции, которые загрузят процессор.
В дальнейшем Вы вроде хотите собирать цифры в число.
Вы бы описали свою задумку. Какой планируется получить результат? В чем идея?
Может тогда проще будет Вам помочь.
Проблема подсчета количества импульсов с блока генератора
[ref]Dryundel[/ref], Да, вы правы. Будет проблема, что при быстром нажатии на следующую кнопку на клавиатуре счет собьется. Постараюсь подобрать необходимую частоту генератора. Сейчас стоит такт в 10мс, в принципе нормально, считает быстро.
Логика схемы работает нормально, просто добавил +1 к счету. Меня устраивает. Лишние преобразования в стринг уберу.
Это пока часть проекта. Основная задача сейчас: организовать ввод 6ти разрядного числа с клавиатуры и отображение на семисегментных индикаторах (выполненных в виде отдельных микросхем), которые управляются драйверами CD4026. Эти компоненты есть в наличии и приходится работать с ними. Драйверы управляются тактовыми сигналами по одной ножке. С ардуино будет использовано 6 пинов на выход. Соответственно на каждый драйвер мне необходимо подавать количество импульсов равное нажатой цифре на клавиатуре, плюс организовать поразрядное смещение.
Логика схемы работает нормально, просто добавил +1 к счету. Меня устраивает. Лишние преобразования в стринг уберу.
Это пока часть проекта. Основная задача сейчас: организовать ввод 6ти разрядного числа с клавиатуры и отображение на семисегментных индикаторах (выполненных в виде отдельных микросхем), которые управляются драйверами CD4026. Эти компоненты есть в наличии и приходится работать с ними. Драйверы управляются тактовыми сигналами по одной ножке. С ардуино будет использовано 6 пинов на выход. Соответственно на каждый драйвер мне необходимо подавать количество импульсов равное нажатой цифре на клавиатуре, плюс организовать поразрядное смещение.
- Dryundel
- Полковник
- Сообщения: 2430
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 3 раза
- Поблагодарили: 30 раз
Проблема подсчета количества импульсов с блока генератора
А Вы не ищете лёгких путей.Bupper писал(а): 14 янв 2022, 15:13 Соответственно на каждый драйвер мне необходимо подавать количество импульсов равное нажатой цифре на клавиатуре, плюс организовать поразрядное смещение.

Зачем подавать на каждый индикатор импульсы отдельно. Эти драйверы соединяются в шлейф и сами поразрядно смещаются. Работают на весьма высокой частоте. Почему бы не подавать импульс каждый такт программы точнее каждые два такта, а не использовать генератор?
А для поразрядного смещения подавать на вход первого драйвера на 10 импульсов больше чем значение кнопки, начиная со второго нажатия после сброса. Ну как вариант.
Проблема подсчета количества импульсов с блока генератора
Да, я про такое думал. Если правильно Вас понял, то тогда для смещения второго разряда надо подать в 10 раз больше импульсов, для третьего разряда в 100 раз импульсов больше, для шестого - в 1000000 раз больше, так? При тактовой частоте ардуино 8Мгц (16/2 если на каждые 2 такта программы подавать), только пересчет на шестой разряд одной цифры займет 1/8 с, а если цифра 9 то более 1 с. Сюда надо еще добавить счеты на последующие разряды и еще работа внутренней программы. Что-то долго.
У меня "параллельная" передача данных, всяко быстрее чем последовательно.
Может я неправильно понял как Вы предлагаете?
У меня "параллельная" передача данных, всяко быстрее чем последовательно.
Может я неправильно понял как Вы предлагаете?
- Dryundel
- Полковник
- Сообщения: 2430
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 3 раза
- Поблагодарили: 30 раз
Проблема подсчета количества импульсов с блока генератора
Совсем не правильно.Bupper писал(а): 19 янв 2022, 14:36 Если правильно Вас понял, то тогда для смещения второго разряда надо подать в 10 раз больше импульсов, для третьего разряда в 100 раз...
Разберитесь с этой микросхемой и как она в шлейф подключается.
Надо подавать для кнопки 7 например 7+10 =17 импульсов и тае всегда независимо от регистра, кроме первой цифры.
Отправлено спустя 3 минуты 41 секунду:
Частота процессора и частота цикла программы это совсем разные вещи. Вам ни за что не удастся сделать нормальный проект с циклом меньше 1 мс. А это всего 500 импульсов в секунду.Dryundel писал(а): 19 янв 2022, 14:44 При тактовой частоте ардуино 8Мгц (16/2 если на каждые 2 такта программы подавать),
Проблема подсчета количества импульсов с блока генератора
Что-то я как то не могу понять. Вроде в шлейф CD4026 подключаются последовательно по переполнению, как обычные счетчики. При переходе счета с 9 на 0 генерируется сигнал на выходе переноса, и поступает на последующий разряд.
Есть вариант: задействовать 2 пин CD4026 ClockInhibit - не реагирует на входные импульсы и держит ранее выставленную цифру. Но тогда и перенос работать не будет.
У меня заполнение индикаторов будет справа налево. Т.е. если число 37, то сперва на крайнем правом индикаторе 3, затем 3 переходит на второй индикатор справа, а 7 появляется на крайней справа. Для шести индикаторов получим 000037.
Можете хоть немного намекнуть, как вы подразумеваете подключение CD4026 в шлейф? При этом передача импульсов только на первый драйвер?
PS. С частотой процессора это я так, для примера)
PS2. Я все таки не уточнил ранее, извиняюсь, что мне обязательно надо, чтобы введенное с клавиатуры число отображалась следующим образом:
000345
а не
345000.
Разница получается большая, так как первый разряд в первом случае должен постоянно менять свое значение, сначала 3, потом 4, потом 5.
Есть вариант: задействовать 2 пин CD4026 ClockInhibit - не реагирует на входные импульсы и держит ранее выставленную цифру. Но тогда и перенос работать не будет.
У меня заполнение индикаторов будет справа налево. Т.е. если число 37, то сперва на крайнем правом индикаторе 3, затем 3 переходит на второй индикатор справа, а 7 появляется на крайней справа. Для шести индикаторов получим 000037.
Можете хоть немного намекнуть, как вы подразумеваете подключение CD4026 в шлейф? При этом передача импульсов только на первый драйвер?
PS. С частотой процессора это я так, для примера)
PS2. Я все таки не уточнил ранее, извиняюсь, что мне обязательно надо, чтобы введенное с клавиатуры число отображалась следующим образом:
000345
а не
345000.
Разница получается большая, так как первый разряд в первом случае должен постоянно менять свое значение, сначала 3, потом 4, потом 5.
Последний раз редактировалось Bupper 19 янв 2022, 16:15, всего редактировалось 1 раз.
- Dryundel
- Полковник
- Сообщения: 2430
- Зарегистрирован: 22 май 2017, 23:15
- Откуда: Ярославль
- Имя: Андрей
- Благодарил (а): 3 раза
- Поблагодарили: 30 раз
Проблема подсчета количества импульсов с блока генератора
[spoiler=Видосики]Bupper писал(а): 19 янв 2022, 15:55 Можете хоть немного намекнуть, как вы подразумеваете подключение CD4026 в шлейф? При этом передача импульсов только на первый драйвер?
https://www.youtube.com/watch?v=kvJp9cL3adc
https://www.youtube.com/watch?v=CmcJZcyq9qk
https://www.youtube.com/watch?v=gu4nltC_ZcU
[/spoiler]
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя