Микроконтроллеры | Ликбез по программированию PIC |
|
---|---|---|
picmaniac: AHTOXA, не поможете ли нам разобраться с дугами 1-->2 и 3-->0 из примера в книге (Приложение 12, рис.6). Откуда берутся указанные там конъюнкции? А также 0-->1 и 2-->3. Кстати на рис.5 опечатка: узел 0 в знаменателе должен иметь не 00, а 10, как на рис.4 и рис.6 |
|
|
Вечерком, ладно? |
|
|
|
||
Дуга 0-->0 : ~z1&~z2 : нет z1 (команда на закрытие) нет z2 (команда на открытие) ; Пока всё логично... Дуга 0-->1 : ~z1&z2 : нет z1 (команда на закрытие) есть z2 (команда на открытие) ; Напутали. надо: z1&~z2 Дуга 1-->2 : z1&~z2 : есть z1 (команда на закрытие) нет z2 (команда на открытие) ; Чушь. Я бы написал уже ~z1&~z2. Те же воздействия, что и на дуге 2-->2. То же самое и с 3-->0 Дуга 2-->3 : z1&~z2 : есть z1 (команда на закрытие) нет z2 (команда на открытие) ; Опять напутали. Похоже они банально перепутали z1 и z2... |
|
|
Вот и я так подумал - перепутали. А потом усомнился... Вдруг я чего-то недопонял. Странно, книга-то достаточно солидная, и написана очень хорошо. И такая досадная неточность. Может быть, мы всё-таки не понимаем чего, а? И ещё вопрос - для какого автомата нарисован этот граф - Мура или Мили? |
|
|
picmaniac: Странно, книга-то достаточно солидная, и написана очень хорошо Ну, всяко бывает... Тем более, в приложении. Это скорее всего чей-то курсовой проект. picmaniac: для какого автомата нарисован этот граф - Мура или Мили? Судя по тому, что писал chav1961, Мили (воздействия на стрелках). Здесь, кстати, виден недостаток этого Мили: У Мура воздействия производились бы на входах в узлы, для данного приложения получилось бы логичнее. ИМХО, естественно. |
|
|
Мы малость отвлеклись от основного задания. picmaniac: Далее проверяем флаг RBIF. Если и он не установлен, значит это ложное прерывание. picmaniac: Прерывание от таймера тайм-аута должно иметь наивысший приоритет. Поэтому первым делом проверяем флаг запроса от таймера тайм-аута... Насчёт действий при выходе по тайм-ауту я ещё подумаю. picmaniac: Для каждого входа потребуются свои регистры TMRTEMP и RESULT AHTOXA: Или, если нужно осреднение, то в прерывании полученная длительность прибавляется к сумме длительностей по данному каналу, и увеличивается счётчик импульсов данного канала. По достижении счётчиком нужного значения (например, 8 ), производится деление суммы на счётчик, запись результата в переменную-результат по каналу, и обнуление суммы и счётчика... Могу предложить еще вариант. Также как и варианте AHTOXи суммируем все периоды в одной ячейке. При достижении 8 периодов вычисляем среднее, затем вычитаем это среднее из суммы и прибавляем текущее значение периода. И так в каждом периоде. При обработке 4-х каналов процедуры общие. Не надо ли тут задуматься насчет косвенной адресации? |
|
|
Zandy: Что значит ложное? Почему оно может возникнуть? Мало ли, от помехи, например. В этом случае следует просто сбросить все флаги запросов и выйти. Регистров нам, думаю, хватит на все нужды. С тайм-аутом нам ещё предстоит определиться. Прежде всего подумаем - в каком случае наступает тайм-аут? Упрощенно - в том случае, если хотя бы на одном из входов не произошло изменения уровня за время, большее чем продолжительность самого длительного периода, допустимого по диапазону нормальной работы устройства. Подсчитывать это время может один из аппаратных таймеров, на который мы возложим эту функцию. Назову его "таймером тайм-аута". Период его инкрементирования от нуля до переполнения и будет определять время тайм-аута. Как определяется момент наступления тайм-аута? Устанавливается флаг запроса на прерывание от таймера тайм-аута (аппаратно). Назову этот флаг "флагом тайм-аута". Происходит прерывание по тайм-ауту. Какие действия следует предпринять при наступлении тайм-аута? Сбросить флаг тайм-аута. Затем определить, по какому именно входу произошел тайм-аут. Затем выполнить необходимые для этого случая действия, чтобы в основной программе потом выявить факт наступления тайм-аута. Как один из возможных вариантов предлагаю в случае тайм-аута по входу записывать в соответствующий этому входу регистр периода RESULT максимально возможное число 255. А частоту импульсов заполнения подберём так, чтоб в допустимом диапазоне работы число в регистре заведомо не достигало 255. Или ещё вариант - записывать в RESULT нулевое значение. В общем, подумаем. Пока это не важно. В каком случае следует обнулять таймер тайм-аута, чтоб не допустить ложных тайм-аутов? Обнулять его следует периодически, если всех входах частоты импульсов укладываются в допустимый диапазон. Т.е. в том случае, если по каждому входу произошло изменение уровня за тот промежуток времени, пока таймер тайм-аута инкрементируется от нуля до переполнения. Если хотя бы на одном из входов за это время изменения уровня не было - должен произойти тайм-аут и сбрасывать таймер нельзя. Как реализовать это в программе? У меня пока есть одна идея, но не очень красивая. Следует выделить отдельный регистр ОЗУ для флагов. Биты в этом регистре будут соответствовать входам. Лишние биты маскируем нулями. Изначально устанавливаем все значащие биты в 1. При выявлении изменения уровня на входе - сбрасываем соответствующий бит в 0. Как только все биты окажутся сброшены в 0 - вот тут и следует обнулить таймер тайм-аута и снова установить все значащие биты регистра флагов в 1. Вот такие предложения. Насчёт приоритета. Zandy правильно заметил. Что для нас важнее - "поймать" изменение уровня на входе и поскорей его обработать, или обработать запрос на прерывание по тайм-ауту? Видимо, первое всё же важнее. Так что я, похоже, поспешил с расстановкой приоритетов тогда. Подумаю ещё... |
|
|
Zandy:В этом случае усредненный результат мы будем получать 1 раз через 8 периодов. Вычитать среднее - как-то неаккуратненько... Может начать накапливаться ошибка. Если уж надо получать среднее каждый раз, то надо завести циклический буфер и переменную-позицию в этом буфере. byte measures[8]; // буфер на 8 измерений ... прерывание, вычисляем длину_интервала... потом: if (pos == 255) { // первый замер - заполним весь буфер Извиняйте, что на Си, должен же я помиссионерствовать маленько |
|
|
К сожалению в си пока не секу. Циклический буфер, это и есть 8 регистров с организацией циклической записи в них? |
|
|
Форум про радио — сайт, посвященный обсуждению электроники, компьютеров и смежных тем. pro-radio.online | Обратная связь |
© 2003—2025 |