OBB
|
|
1 | |
Вызов подпрограммы из обработчика события28.03.2016, 15:01. Показов 14820. Ответов 53
Метки нет (Все метки)
Добрый день!
Пишу простенькую программу "мигающий светодиод". Реализовал с использованием таймера 0. Код
.def temp = r16 ;рабочая переменная .def counter = r17 ;счетчик .def max_counter_value = r18 ;счетчик .def currentValue = r19 ;результат ;============ прерывания ============ rjmp RESIT ;RESIT External Pin, Power-on Riset, Brown-out Riset, Watchdog Riset reti ;INT0 External Ymtirrupt Request 0 reti ;PCINT0 Pin Change Ymtirrupt Request 0 reti ;TIMER1_COMPA Timer/Counter1 Compare Match A reti ;TIMER1_OVF Timer/Counter1 Overflow rjmp TIMER0_OVF;TIMER0_OVF Timer/Counter0 Overflow reti ;EE_RDY EEPROM Ready reti ;ANA_COMP Analog Comparator reti ;ADC ADC Conversion Complete reti ;TIMER1_COMPB Timer/Counter1 Compare Match B reti ;TIMER0_COMPA Timer/Counter0 Compare Match A reti ;TIMER0_COMPB Timer/Counter0 Compare Match B reti ;WDT Watchdog Time-out reti ;USI_START USI START reti ;USI_OVF USI Overflow RESIT: ;начальная инициализация ldi temp,low(ROMEND) ;загрузка указателя стека out SPL,temp LDI currentValue, $00 ldi temp, $05 out TCCR0B,temp ldi max_counter_value, $33 CLR temp OUT SREG, temp LDI temp, $FF OUT DDRB, temp clr counter ;очищаем счетчик clr temp ldi temp,(1<<TOIE0) ;разр. прерывания Timer0 out TIMSK,temp sei ;разрешаем прерывания Gcykle: ;основной пустой цикл rjmp Gcykle TIMER0_OVF:;обработчик прерывания Timer0 yms counter ;в каждом прерывании увеличиваем на 1 CP counter, max_counter_value BRSH ChangeState ;некий код который надо выполнить даже в случае перехода на ChangeState reti ;конец обработки прерывания таймера ChangeState: LDI counter, $00 COM currentValue OUT PORTB, currentValue reti |
28.03.2016, 15:01 | |
Ответы с готовыми решениями:
53
Вызов обработчика события Вызов обработчика события. Ручной вызов обработчика события Косвенный вызов DoEvents() из обработчика события? |
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
05.04.2016, 11:07 | 41 |
[QUOTE="dymyurk1978"][QUOTE="YTYOUT"]
Не факт. Не каждая итерация основного цикла выполняется строго определенное время. Сложились условия, выполнили быстро. Сложились другие условия, выполнились долгие задачи. А так да, анализируем выполнение каждой функции. Если времени вагон, от прерываний можно отказаться.
0
|
1 / 1 / 0
Регистрация: 09.08.2014
Сообщений: 96
|
|
05.04.2016, 21:07 | 42 |
[QUOTE="YTYOUT"][QUOTE="Цитата:[/QUOTE]
Вы считаете в моём случае надо порт бомбить бесконечным циклом. Только бы в прерывания не лезть? В моём случае я его и за прерывание не держу. Есть в контроллере удобная фишка - реакция на фронт сигнала. А то что к нему прерывание прикручено болтами не моя прихоть. Но уж прикручено так чего не пользовать. Это как пепельница в машине у некурящего. Она есть, он в ней жвачку держит. Но чисто концептуально, жвачка в пепельнице - фу, да как можно!
0
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
05.04.2016, 22:08 | 43 |
А зачем лезть , только потому, что случайно под руку подвернулась фишка.
Чем по Вашему отличается rjmp PC от sbis Port,Pin rjmp pc-1
0
|
0 / 0 / 0
Регистрация: 06.12.2016
Сообщений: 3,044
|
|
05.04.2016, 22:19 | 44 |
Сообщение от Пагранист
Но долго сидеть в прерывании не принято. Выставил флаг, в основном цикле проверяем флаг.
0
|
1 / 1 / 0
Регистрация: 09.08.2014
Сообщений: 96
|
|
06.04.2016, 01:02 | 45 |
Сообщение от dymyurk1978
0
|
0 / 0 / 0
Регистрация: 28.06.2010
Сообщений: 211
|
|
08.04.2016, 02:07 | 46 |
Сообщение от dymyurk1978
На обычном асме писать трудно и нудно, думаю, это анахронизм, пишу на макроассемблере. Тут у людей уровень разный и понятие маленький проект тоже разное.
Сообщение от Пагранист
Поэтому пишу на асме. На мой взгляд, делать что-то серьезное в прерывании чревато. В простых проектах, может, и сойдет, а в серьезных можно получить проблемы. Можно испортить переменную случайным и трудно определяемым образом. Или при какой-нибудь очередной модернизации (увеличили скорость движка, увеличили число импульсов на оборот движка, ввели дополнительную обработку сигнала) может не хватить времени на обработку. Зачем закладывать такую мину. Так что сейчас в прерывании только ставлю флаг или минимально необходимые действия. Может быть, и есть случаи, когда в прерывании необходини сложная обработка, но пока не сталкивался.
0
|
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
|
|
08.04.2016, 06:39 | 47 |
Сообщение от Otixomdr_1
Особенности начинают проявляться при дефиците времени, когда возникает необходимость обработки события, когда еще не завершена обработка предыдущего. Но к программированию это имеет мало отношения, а больше к физическому смыслу - допустимо ли отбросить недоделанную обработку и начать новую, или наоборот, обязательно завершить, или организовать подсчет вызовов (а тут однобитовым флагом не обойтись) и потом обработать все, опять же если это имеет физический смысл. Правда есть еще один универсальный и волшебный способ - применить СТМ и забыть о проблемах.
0
|
0 / 0 / 0
Регистрация: 28.06.2010
Сообщений: 211
|
|
12.04.2016, 21:45 | 48 |
Сообщение от инкер
Я писал про «порчу» переменных, вызванных спецификой работы прерывания. Скажем, в указанной программе тахометра основная программа начала работу с 2-х байтной переменной V – скорость движка (например, для расчета следящей системы). Скажем, V в шестнадцатеричном виде равно 01 00. Пусть программа считала старший байт 01, и в это время произошло прерывание. Пусть в прерывании было рассчитано новое значение V, равное 00 FF. Затем основная программа возьмет младший байт и получит значение V, равное 01 FF. Получается ошибка. Вероятность такого попадания прерывания может быть очень мала, поэтому очень редко система будет дергаться. В сложных системах отыскать такую ошибку бывает непросто. При простой установке флага в прерывании такой проблемы практически нет.
Сообщение от инкер
Поскольку прерывания несколько проблематичны, стараюсь, по возможности от них уходить. Либо МК сам проводит опрос, либо, в сложных случаях, удобней установить отдельный МК, выполняющий отдельную функцию. В этом плане у меня, в основном, реализуется вариант «отбросить недоделанную обработку», называю это - отрезать ветку. Тут все просто. По установленному в прерывании флагу происходит возврат на самый верхний уровень (в элиту), где и производится обработка прерывания. Тут никаких проблем со стеком и прочим. Только надо разделить переменные элиты и ветки и передачу переменных из ветки в элиту проводить в подпрограмме ниже элиты.
Сообщение от инкер
0
|
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
|
|
13.04.2016, 13:21 | 49 |
Сообщение от Otixomdr_1
Упоминание СТМ было пародией на излюбленный прием решения всех проблем, которые только появляются у микроконтоллерщиков - забыть навсегда свой и применить СТМ. ))
0
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
13.04.2016, 23:04 | 50 |
Я уже не первый раз вижу призывы на форуме AVR перейти на STM . Создается впечатление , что у STM так плохи дела , что они вынуждены прибегать к помощи зазывал.
0
|
0 / 0 / 0
Регистрация: 22.08.2009
Сообщений: 525
|
|
14.04.2016, 07:43 | 51 |
Сообщение от YTYOUT
0
|
0 / 0 / 0
Регистрация: 02.10.2012
Сообщений: 1,946
|
|
14.04.2016, 08:57 | 52 |
Я с удовольствием осваиваю ARM на STM Dyscovery , но при этом не бросаюсь фразами
0
|
0 / 0 / 0
Регистрация: 28.06.2010
Сообщений: 211
|
|
19.04.2016, 18:21 | 53 |
Сообщение от инкер
Аналогичная проблема может возникнуть для двух и более зависимых переменных, которые должны относится к одному сеансу измерений. В прерывании могут использоваться общие с основной программой ресурсы (тот же АЦП, таймер и т.д.). Да и спустя несколько лет при доработке программы вспоминать о проблемах большого прерывания неудобно. Думаю, сложная работа в прерывании, «боковые» выходы из подпрограммы и т.д. – это делают начинающие. При серьезной работе надо от этого уходить. STM, говорят, подорожали.
0
|
0 / 0 / 0
Регистрация: 28.10.2010
Сообщений: 893
|
|
19.04.2016, 23:40 | 54 |
Сообщение от Otixomdr_1
<Изображение удалено> СТМ --- Как подсадят достаточное количество, так цены и поднимут.
0
|
19.04.2016, 23:40 | |
19.04.2016, 23:40 | |
Помогаю со студенческими работами здесь
54
Вызов единственного обработчика события при переопределении Вызов обработчика события после вывода изображения на оси Вызов обработчика кнопки из другого обработчика. Создание объекта-события и обработчика события Выход из обработчика события Создание обработчика события Подключение обработчика события Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |