Нельзя просто взять и создать прерывание! Почему?
- Войдите на сайт для отправки комментариев
Ср, 22/07/2015 - 17:11
Добрый!
Начал работать с прерываниями. Все по-сути понятно. Но как только увидел комманды , типа
EICRA &= ~3; EICRA |= 2; EIMSK |= 1;
- ощутил явный разрыв мозга.
Полез в мануалы - вообще закипел!
Есть attachInterrupt() , кот управляет работой прерываний 1-5 (в зав от платы).
Но это не управляет прочими прерываниями , например таймеры, АЦП и пр.
Есть ли библиотека, которая управляет работой прерываний в человекочитаемом формате.
ПС: понимаю, что любой гик начнет тыкать в матчасть и говорить, что битовые операции - наше все, но хочется что-то доступнее и удобнее. Ибо нет дикой требовательности к производительности камня.
ISR (INT0_vect) { digitalWrite (13, LOW); } void setup() { EICRA &= ~3; EICRA |= 2; EIMSK |= 1; pinMode (2,INPUT_PULLUP); digitalWrite (2, HIGH); pinMode (13,OUTPUT); digitalWrite (13, HIGH); } void loop() {}
Для PCI есть либа: http://playground.arduino.cc/Main/PinChangeInt
Для таймера, вроде тоже есть либа, что-то вроде Timer1 называется или как-то так. Погуглите для каких именно прерываний Вам нужна либа и все найдется.
saer, битовые операции -наше всё :) Потратьте один день на изучение, избавите себя от лишних проблем на многие дальнейшие годы!
dimax, битовые операции, конечно, это наше все. Но то, что у ТС в коде, это совсем не битовые операции. (что это такое, - не знаю, подозреваю, настройка регистров. Но битовуе операции выглядят совсем по-другому)
andriano, вам бы тоже не мешало заняться :) У ТС в примере классические битовые операции & (И) и | (ИЛИ). Именно они и есть "наше всё". Выглядят как десятичные, но это такая форма записи. Просто одно и тоже битовое выражение можно записать по-разному, например EICRA &= ~3; эквивалентно EICRA = EICRA & 0B11111100; или что б совсем запутать полный эквивалент: EICRA = EICRA& ~((1<<1)|(1<<0)) ;
Ну ладно, сказали А говорите и Б. Как работает полный эквивалент EICRA = EICRA& ~((1<<1)|(1<<0)); ?
nevkon, я не мастер понятных формулировок) Начнём с конца ~((1<<1)|(1<<0)) это создание маски с помощью операций сдвига. т.е. примерно так преобразовывается: (1<<1)|(1<<0) расшифровка- B00000010 "ИЛИ" B00000001 = B00000011; далее вся маска инвертируется ~B00000011 = B11111100 ; затем финишная операция "И" EICRA "И" B11111100.
andriano, вам бы тоже не мешало заняться :) У ТС в примере классические битовые операции & (И) и | (ИЛИ). Именно они и есть "наше всё". Выглядят как десятичные, но это такая форма записи. Просто одно и тоже битовое выражение можно записать по-разному, например EICRA &= ~3; эквивалентно EICRA = EICRA & 0B11111100; или что б совсем запутать полный эквивалент: EICRA = EICRA& ~((1<<1)|(1<<0)) ;
Я обычно записываю такие выражения EICRA &= 0xfc;, и ТОЛЬКО так, т.к. вариативность здесь ведет к ухудшенпию читаемости кода. А EICRA к битовым операциям никакого отношения не имеет, это - специфические особенности ATmegaX28, которыми я (по крайней мере, пока) заниматься не имею желания.
Вообще, непереносимый код - это зло, а использование низкоуровневых средств без настоятельной необходимости - дурной тон в программировании. Вы пишете, что Ваш код работает быстрее, и тут же вставляете в него временную задержку. И какой в этом смысл?
Когда я писал для 8080, использовал Ассемблер и считал такты, но ATmega в десятки раз производительне, да и задачи у нее, как правило, попроще. И время в основном тратится на обмен с периферией. Так что нужно изучать дейташиты не на Атмегу, пытаясь выиграть единицы тактов, а на периферию, которая за счет неоптимального программитрования может отнять сотни мс, т е. более миллиона тактов самой АТмеги.
Как в анекдоте: искать потерянные чаы нужно там, где потерял, а не там, где светлее, так и оптимизировать по скорости нужно только те фрагменты, которые являются критичными с точки зрения производительности, а не все подряд.
Нет, какждый сам выбирает, чем ему заняться, но Вы, насколько я обратил внимание, говоря правильные слова о необходимости изучения матчасти, пытаетесь склонить новичков во-первых, к изучению не слишком актуального для них материала (а кому они должны еще верить - Вы для них авторитет), а во-вторых, к порочному стилю программирования с применением без надобности низкоуровневых средств.
Занаться чем? Битовыми операциями?
Я обычно записываю такие выражения EICRA &= 0xfc;, и ТОЛЬКО так, т.к. вариативность здесь ведет к ухудшенпию читаемости кода. А EICRA к битовым операциям никакого отношения не имеет, это - специфические особенности ATmegaX28, которыми я (по крайней мере, пока) заниматься не имею желания.
Не несите чушь. Пожалуйста :)
Вы пишете, что Ваш код работает быстрее, и тут же вставляете в него временную задержку. И какой в этом смысл?
Я написал в чём смысл, перечитайте.
dimax, здравствуйте!
Вы оказались правы, не нашлось библиотеки по человекоудобному управлению прерываниями, таймерами и пр.
Но и источника с понятным и доступным описанием работы с регистрами тоже нет.
Можете что-нить посоветовать?
Наверняка у многих новичков, которые вроде ориентируются в Ардуино.ИДЕ при переходе на работу с регистрами есть проблемы. Может стоит на форуме создать раздел "Книги и все такое.."? К кому можно выйти с таким предложением?
saer, по-моему нет в природе таких книг по атмеговским контроллерам, что б всё было доступно. Обычно это просто перевод даташита, в лучшем случае с незначительными комментариями. А даташиты, понятное дело, не пишут для начинающих. Но тем не менее вам будет сильно легче, если заранее битовые операции выучите до автоматического понимания. И только потом начинайте что-то изучать по нужной теме. Ещё раз подчеркну, без битовых операций нет смысла начинать разбираться не с прерываниями, не с таймерами, не с ацп, ибо все они программируются именно с помощью битовых операций. Сам я информацию по таймерам и ацп черпал из книжки "А.В. Евстифеев Микроконтроллеры AVR семейства MEGA" не могу сказать, что прям всё лёгко и доступно, но по крайней мере на русском и более-менее понятно. Ну и конечно спрашивайте на форуме, если что совсем не понятно)