11.06.2024, 20:22
|
#11
|
Частый гость
Регистрация: 01.07.2016
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
eddy, хм
Запросто зип
Да, беспаечная макетка
|
|
|
|
11.06.2024, 20:37
|
#12
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
Вот ваша ошибка:
Сообщение от Darkmaster777
|
При прерывании я просто читаю порт "пустоту" чтоб убрать несоответствие и можно было сбросить флаг (RBIF).
ПОТОМ просто смотрю что на входах (типа RB4==0,temp1++).
|
1. порт должен читается один раз за прерывание во временную переменную.
Код:
|
Button = PORT;
RBIF=0;
; определяем только что нажатые кнопки
W = Button;
W ^= ButtonOld;
W &= Button;
ButtonJastPressed = W;
; определяем только что отпущеные кнопки
W = Button;
W ^= ButtonOld;
W &= ButtonOld;
ButtonJustReleased = W
; обновляем старое значение кнопок
ButtonOld = Button;
ButtonPressed = Button; |
2. импульсы должны инкриминироваться или по фронту или по спаду
Код:
|
//по фронту
if(ButtonJastJustPressed&(1‹‹4))
{temp4++;
ButtonJustPressed &=~(1‹‹4);
// по спаду
if(ButtonJustReleased&(1‹‹5))
{temp5++;
ButtonJustReleased &=~(1‹‹5); |
3.В основной код состояние счетчиков должно передаваться атомарно
4.ну и для ускорения обработки код приведенный выше пошется на ASMе где переменная W -рабочий аккумулятор.
|
|
|
|
11.06.2024, 21:04
|
#13
|
Частый гость
Регистрация: 01.07.2016
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
DmitriyVDN,
Я в общем-то почти так и делал, в одном из вариантов..
Кроме записи в переменную Предыдущего состояния.
По фронту конечно замечательно, но я пытался замутить просто по изменению.
Мне просто кажется что импульсы с одного датчика мешают другому... Хз
|
|
|
|
11.06.2024, 22:04
|
#14
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 738
Сказал спасибо: 363
Сказали Спасибо 809 раз(а) в 381 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
Сообщение от Darkmaster777
|
Мне просто кажется что импульсы с одного датчика мешают другому..
|
Это элементарно проверяется ( например, логическим анализатором на линиях RB4 и RB5 )
Последний раз редактировалось j-Roger; 11.06.2024 в 22:49.
|
|
|
|
11.06.2024, 22:41
|
#15
|
Гражданин KAZUS.RU
Регистрация: 10.06.2010
Сообщений: 598
Сказал спасибо: 222
Сказали Спасибо 234 раз(а) в 154 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
Сообщение от Darkmaster777
|
По фронту конечно замечательно, но я пытался замутить просто по изменению.
Мне просто кажется что импульсы с одного датчика мешают другому... Хз
|
вот по этому они и мешают. Это же очевидно... или нет?
прерывание по изменению на RB5, вы делаете проверку (RB4=1,RB5==0)
RB4==0,temp1++
RB5==0,temp5++ (счетчик увеличился)
прерывание по изменинию на RB4, вы делаете проверку (RB4=0,RB5==0)
RB4==0,temp1++ (счетчик увеличился)
RB5==0,temp5++ (счетчик увеличился)
прерывание по изменинию на RB5, вы делаете проверку (RB4=0,RB5==1)
RB4==0,temp1++ (счетчик увеличился)
RB5==0,temp5++
прерывание по изменинию на RB4, вы делаете проверку (RB4=1,RB5==1)
RB4==0,temp1++
RB5==0,temp5++
игого получаем счетчики считают в два раза больше положенного
|
|
|
Сказали "Спасибо" DmitriyVDN
|
|
|
12.06.2024, 00:58
|
#16
|
Почётный гражданин KAZUS.RU
Регистрация: 27.01.2005
Адрес: Россия, КЧР, Нижний Архыз
Сообщений: 3,646
Сказал спасибо: 117
Сказали Спасибо 814 раз(а) в 591 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
Таки для начала стоило бы запаять. Ну или подтяжки по полкилоома поставить на всякий пожарный: "беспаечная макетка" - тот еще источник фокусов. Ну, а коль МК имеет вменяемый счетный вход для энкодера, то грех им не воспользоваться, а не лупить тупой ногодрыг, как на всратой аврке! У тех же STM32 можно и антидребезг настроить на входе энкодера, подозреваю, тут не хуже… Хотя, с пиками я имел дело лет 15 назад, потом были небольшие извращения с STM8. Но таки потом я полностью на STM32 перешел (правда, в свете последних событий немного стал посматривать на китайские RISC-V, но покуда запас STM32 еще ого-го, да и на алике они все еще "по пять рублей за кучку" - даже 100-ногие F303 вполне по адекватным ценам).
__________________
Если ты пользуешься Windows, то ты финансируешь мировой терроризм!
|
|
|
|
12.06.2024, 01:59
|
#17
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 738
Сказал спасибо: 363
Сказали Спасибо 809 раз(а) в 381 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
У ТС очень уж древний ПИК, там никаких таймеров с входами для энкодера нет...
[оффтоп]
А вот в ПИКах чуть посвежее ( которым в обед уже лет как 5-10, например из серий PIC16F1xxx и PIC16F1xxxx ) реакция на внешние прерывания организована вполне вменяемо, практически точь-в-точь как у STM32 - можно выбрать либо фронт, либо спад, либо и то и другое:
Для данной задачи было бы так: разрешаем прерывание по спаду сигнала на линиях RB4 и RB5, в прерывании проверяем флаги для линий RB4 и RB5, обновляем соответствующий счетчик если флаг установлен. Всё. А, ну еще сбрасываем флаги вручную.
Понятное дело, что на старом ПИКе это программно можно решить. Но с более продвинутой периферией это получается элегантнее и с меньшим "оверхедом" ( ваш капитан Очевидность )
P.S.
Кроме того, у "свежих" ПИКов на борту может быть модуль PPS ( Peripheral Pin Select ) - в качестве цифрового входа периферии может быть выбран любой пин, a на пин можно вывести сигнал с любого цифрового выхода периферии. За редкими исключениями. Можно один сигнал ШИМ вывести на все пины одновременно ))))
[/оффтоп]
Последний раз редактировалось j-Roger; 12.06.2024 в 02:57.
|
|
|
|
12.06.2024, 06:12
|
#18
|
Частый гость
Регистрация: 01.07.2016
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
DmitriyVDN, значит надо мне подумать, переписать.
eddy, ну само собой, бейспайка это не нормальная плата, всё возможно.
j-Roger, древний, 3шт осталось, надо использовать.
Так я ж не профи, хобби время от времени.
Всем пасибо, как перепишу проверю, приду отпишусь
Блин и в переменную я считывал порт, и даже если счёт должен идти по одному каналу, всё равно считает обе переменные хранения и во вторую в2 раза больше
Код:
|
void count_rpm(void) //count RBIE
{
static uint8_t PulseOld;
static uint8_t PulseNew;
static uint8_t PulseW;
PulseNew = PORTB;
PulseW = ((PulseNew ^ PulseOld)& PulseNew);
PulseOld = PulseNew;
if(!(PulseW &= ~(1‹‹4))) {fan1++;}
if(!(PulseW &= ~(1‹‹6))) {fan2++;}
} |
Последний раз редактировалось Darkmaster777; 12.06.2024 в 15:54.
|
|
|
|
12.06.2024, 21:17
|
#19
|
Гражданин KAZUS.RU
Регистрация: 17.06.2008
Адрес: Украина
Сообщений: 738
Сказал спасибо: 363
Сказали Спасибо 809 раз(а) в 381 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
Darkmaster777, как-то так?..
PHP код:
|
void count_rpm(void) { // считаем, что изначально уровни пассивны (единицы на линиях порта) static uint8_t PulseOld = _PORTB_RB4_MASK | _PORTB_RB5_MASK; uint8_t PulseNew, FallingEdges;
PulseNew = PORTB; // получить единицы в разрядах, где уровень на линиях порта изменился с 1 на 0 FallingEdges = (uint8_t) ((PulseOld ^ PulseNew) & ~PulseNew); PulseOld = PulseNew;
if (FallingEdges & _PORTB_RB4_MASK) { fan1++; } if (FallingEdges & _PORTB_RB5_MASK) { fan2++; } }
|
И нужно не забыть об АТОМАРНОМ чтении/записи 16-битных fan1 и fan2 вне обработчика прерывания
|
|
|
Сказали "Спасибо" j-Roger
|
|
|
12.06.2024, 21:48
|
#20
|
Частый гость
Регистрация: 01.07.2016
Сообщений: 16
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
|
Re: Подсчёт импульсов по входам с общей подтяжкой
j-Roger, да, типа того.У вас хороший пример спасибо
Я переписал чуть по другому проверку теперь считает нормально если подключать отдельно каналы
Код:
|
pulse = PORT;
if( (pulse & (1‹‹4))==0){temp1++;} |
Чо т я в предыдущем сообщении с Бит-операциям мутил...
Ну и естественно надо добавить запись в лишнюю переменную Предыдущего Состояния порта.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Тема |
Автор |
Раздел |
Ответов |
Последнее сообщение |
Подсчёт импульсов
|
yellow87 |
Микроконтроллеры, АЦП, память и т.д |
29 |
27.01.2012 20:54 |
Часовой пояс GMT +4, время: 19:05.
|
|