Реэнтерабельное прерывание и мой стиль программирования

Раздел начинающих пользователей
Правила форума
В песочнице можно спрашивать когда незнаешь где спросить.
В песочнице нелзя посылать в гугл
В песочнице можно задавать любой вопрос, но на него могут и неответить.
Песочница для тех, кто начинает свои вопросы с защиты чайников от пинков.
В песочницу будут перетаскиваться вопросы неполучившие ответа.
Песочница - попытка навести порядок.
На песочницу большие надежды.

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение Steve Key (Steve Key) » 23 май 2013, 09:17

В прерывании по таймеру делается минимум действий, в данной программе - просто устанавливается флаг, сигнализирующий главному циклу, что прерыание было.
При установленном флаге в главном цикле вызываются подпрограммы, требующие определенной периодичности вызова - динамическая индикация и опрос клавиатуры.
Подпрограмму динамической индикации можно вызывать и непосредственно из тела прерывания.
Схема сделана "классически": к линиям, задающим "общие" сигналы индикаторов (в данном случае - общие аноды) подключены линии для опроса клавиатуры.
Диоды предотвращают замыкание выходов микроконтроллера между собой при нажатии нескольких кнопок одновременно.
Внимание: чтобы была возможность зафиксировать нажатие любого количества кнопок одновременно, следует установить диоды последовательно с каждой кнопкой!
Фишка: именно ОПРОС кнопок производится в программе динамической индикации Indication.
Еще фишка: производится опрос кнопок, линия которых активирована В ПРЕДЫДУЩЕМ цикле индикации - чтобы логические уровни успели установиться (ну мало ли, ёмкость там...).
Считанные данные помещаются в память, последующий "разбор" их производится уже в подпрограмме Inkeys.
Разбивка числа для индикации на цифры и преобразование этих цифр в семисегментный код идёт в главном цикле (сделано неоптимально, ибо не суть).
Подпрограммы преобразования в 7-сегментный код аж две штуки: одна практически повторяет популярную на этом форуме (но ТАМ преобразование идёт ОДНОВРЕМЕННО с динамической индикацией, а оператор CASE в зависимости от отображаемой цифры будет выполняться за разное время, а я конвертацию делаю в "некритичной" по
времени части программы (главный цикл).
Другой вариант подпрограммы конвертации использует предварительно "вбитую" в массив таблицу перекодировки (обычно у меня оперативки остаётся много свободной, а вот программная память может невзначай и закончиться), и выполняется всегда за одно и то же кол-во тактов (наверное)...
Подпрограммы "разбора" нажатых-отжатых кнопок тоже две: одна - простой вариант, когда кнопок одна-две-три, и те с "неполной" обработкой ("лишние" ветви попрограмы можно, как правило, убрать), другая же - полноформатная, обрабатывает любое (ну, практически) кол-во кнопок, переход на нужные действия
- с помощью того же оператора CASE.
Обе подпрограммы сравнивают кол-во проходов каждой "нажатой" кнопки с "константой дребезга" (конечно же - АНТИдребезга), вроде бы при относительно нормальных кнопках достаточно трех повторений нажатого состояния кнопки при частоте опроса 50 Гц. Константу можно менять, подгоняя под конкретные нужды - скорость реакции на нажатие кнопки и качество самих кнопок.
Жду вопросов (может, забыл чего описАть)...
FlowCode 5.5.2.1, Proteus 7.10, PICkit 2
Аватар пользователя
Ник: Steve Key
Имя: Steve Key
(Шахты)
Специалист
Специалист
Информация о пользователе

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение Steve Key (Steve Key) » 23 май 2013, 09:49

mim писал(а):путать эффект Дребезга со скоростью опроса кнопки.

Да я не путаю, "подавление дребезга" же - это как правило, просто тупо задержка, чтобы контакты кнопки сомкнулись понадежнее...
А насчет "защелки на пролёте" - если она будет вызываться часто, то имеет шанс "поймать" дребезжащие контакты как последовательность "замкнуто-разомкнуто-замкнуто", т. е., вместо одного нажатия "считать" 2 и более...
FlowCode 5.5.2.1, Proteus 7.10, PICkit 2
Аватар пользователя
Ник: Steve Key
Имя: Steve Key
(Шахты)
Специалист
Специалист
Информация о пользователе

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение Steve Key (Steve Key) » 23 май 2013, 10:04

Я смотрю, mim вот выложил файл DSN, и файл PWI.
Добавляю... :oops:
У вас нет доступа для просмотра вложений в этом сообщении.
FlowCode 5.5.2.1, Proteus 7.10, PICkit 2
Аватар пользователя
Ник: Steve Key
Имя: Steve Key
(Шахты)
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение carworker (carworker) » 23 май 2013, 11:39

mim писал(а):
carworker писал(а):А я после того как перепробовал множество .... и по возможности...


«Между нами говоря, почему люди не думают? Вас это не бесит? Почему им просто не подумать?»
Сериал "Шерлок (Sherlock)"

Как раз люди думают но более креативно. А других это бесит. Я на работе каждый день сталкиваюсь с промэлектроникой , чаще с автомобильной и вижу как это сделано.
Кроме того 3 комерческих устройства чудненько работают. Один из них стенд для проверки и ремонта и настройки дизельных CDI форсунок Делфи, Бош, Денсо где куча cенсорных кнопок (представляешь почему сенсорных?)и датчиков, исполнительных устройств с ОТДЕЛЬНЫМИ ШИМ (вопрос- зачем регулятору давления отдельный ШИМ чип Бош ставит в ЭБУ упр. двигателя )и с выводом даты на жк LCD и USB2. И все на трех контроллерах PIC не считая спец чипов. Опрос кнопок сделан на 16F690 Передача "ведущему" PIC24FJ64GB004 порт в порт. В итоге сделали по 2 бита в портах (прием-передача. Кнопки +/- "плавно давление" вынудили) "Ведомый" PIC24FJ64GB004 по SPI c "ведущим" Я реализовывал железо а два студента 5 курса написали прошивки. И даже мне, начинающему представлять с помощью Фловкода что такое SPIxBUF стало понятно куда надо задвигать а откуда выдвигать после двух испорченых макеток. Надо только вникнуть и два а то и больше контроллера с разными прошивками под определенные разработчиком задачи будут работать не мешая друг другу а просто обмениваясь датой. И никто даже МИМ в обратном меня не переубедят!
Кстати а как в Фловкод работать с PIC24FJ64GB004? Или только кусочками кусочками составлять проги на похожем МК ?
Ник: carworker
Имя: carworker
(Одесса)
Ученик
Ученик
Информация о пользователе
Вернуться наверх

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение Вячеслав (Вячеслав) » 23 май 2013, 15:40

Steve Key писал(а):Жду вопросов (может, забыл чего описАть)...

Описано пОлно. Просто вопросы. Зачем осколок pwi.zip?
По проекту Uchebnaia.zip:
1. До основного цикла объявлена, но не инициализирована переменная tmp и заносится в порт А. И что туда запишется? Может просто занесёшь в него код, сэкономишь обращение к порту?
2. Как понимаю, любое объявление переменной - это ячейка ОЗУ контроллера, а их нужно экономить по возможности. Вот макрос "вычисления" - называется -"Делим на разряды" . Там, как мне кажется, 2 лишних переменных- в разделении на знакоместа можно обойтись четырьмя.
Глянь на форуме, как это делается проще.
Аватар пользователя
Ник: Вячеслав
Имя: Вячеслав
(Саратов)
Разработчик
Разработчик
Информация о пользователе
Вернуться наверх

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение Steve Key (Steve Key) » 24 май 2013, 05:49

Вячеслав писал(а):Зачем осколок pwi.zip?

Я не был уверен, нужен ли он (вон mim выложил в своём архиве два файла), выложил на всяк случай...
Т. е., достаточно файла .DSN?

Вячеслав писал(а):1. До основного цикла объявлена, но не инициализирована переменная tmp и заносится в порт А. И что туда запишется? Может просто занесёшь в него код, сэкономишь обращение к порту?

А она не заносится, В НЕЁ читается ИЗ порта А, чтобы порт проинициализировать на вход... :D
Просто, нужно же куда-то читать.

Вячеслав писал(а):2. Как понимаю, любое объявление переменной - это ячейка ОЗУ контроллера, а их нужно экономить по возможности. Вот макрос "вычисления" - называется -"Делим на разряды" . Там, как мне кажется, 2 лишних переменных- в разделении на знакоместа можно обойтись четырьмя.

Первый вопрос - а экономить-то зачем? Они что, энергию (дополнительную) потребляют? Скорость (как в винде) снижают? :shock:
Экономить надо тогда, когда память данных будет "под завязку" забита, и чуть-чуть не помещается.
А 2 "лишних" переменных - это чтобы сократить затраты ВРЕМЕНИ на действия деления-умножения (я так еще с 8080 процессора запомнил, что плюс-минус - это быстро, сдвиг - еще быстрее, а деление-умножение - у-у-у-у!).
Кроме того, я и не старался продемонстрировать своё умение в вычислениях, так что, эта часть программы написана "в лоб", без всякой оптимизации. :headbang:

Кстати, в 5-й версии FlowCode появились "булевы" переменные, которые занимают один бит в некоем байте, вот уже экономия... И константы появились - они вообще память не занимают. :D
(Напомнило: Чукча съездил в Москву, приезжает обратно в стойбище, говорит: вы, чукчи, тупые, Карл Маркс и Фридрих Энгельс - это не четыре человека, а два, Владимир Ильич Ленин - это не три человека, а один, а Слава Капээсэс - вообще не человек!)

Вячеслав писал(а):Глянь на форуме, как это делается проще.

Я безусловно при необходимости "освежу" в памяти наработанные алгоритмы оптимальных вычислений, но сейчас ведь речь не об этом? :oops:
FlowCode 5.5.2.1, Proteus 7.10, PICkit 2
Аватар пользователя
Ник: Steve Key
Имя: Steve Key
(Шахты)
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение mim (mim) » 24 май 2013, 05:58

Steve Key писал(а):Кстати, в 5-й версии FlowCode появились "булевы" переменные, которые занимают один бит в некоем байте, вот уже экономия...

Можешь показать на примере?
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение Steve Key (Steve Key) » 24 май 2013, 06:28

mim писал(а):Можешь показать на примере?

Конечно, только не раньше понедельника, видимо, 5-я версия дома стоИт, вчера вечером смотрел тексты (своей программы с реэнтерабельностью, спецом сделал булеву и константу), а на работу не скопировал (да и "интернет кончился", модем USB, лимит выработал... :oops:)
FlowCode 5.5.2.1, Proteus 7.10, PICkit 2
Аватар пользователя
Ник: Steve Key
Имя: Steve Key
(Шахты)
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение Steve Key (Steve Key) » 24 май 2013, 11:15

mim писал(а):модель кнопки с дребезгом

Кстати, крутая кнопка!!! :D
Занимательно с ней эксперименты ставить.

Подавление дребезга срабатывает только если больше 0.4 сек. ставить, если меньше - двойной импульс идёт. 8-)
Последний раз редактировалось Steve Key 24 май 2013, 12:16, всего редактировалось 1 раз.
FlowCode 5.5.2.1, Proteus 7.10, PICkit 2
Аватар пользователя
Ник: Steve Key
Имя: Steve Key
(Шахты)
Специалист
Специалист
Информация о пользователе
Вернуться наверх

Re: Реэнтерабельное прерывание и мой стиль программирования

Сообщение mim (mim) » 24 май 2013, 11:45

Вот и проверь "свой стиль"... А то ты со своим дребезгом уже не первый год мозги пудришь...
I Am Legend
Аватар пользователя
Ник: mim
Имя: mim
(Из Лесу, вестимо...)
Легенда
Легенда
Информация о пользователе
Вернуться наверх

Пред.След.

Вернуться в ПЕСОЧНИЦА

Кто сейчас на форуме

Пользователь просматривает форум: Enigm