Нельзя просто взять и создать прерывание! Почему?

saer
Offline
Зарегистрирован: 12.05.2014

Добрый!

Начал работать с прерываниями. Все по-сути понятно. Но как только увидел комманды , типа 

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() {}

 

SunX
SunX аватар
Offline
Зарегистрирован: 04.10.2014

Для PCI есть либа: http://playground.arduino.cc/Main/PinChangeInt

Для таймера, вроде тоже есть либа, что-то вроде Timer1 называется или как-то так. Погуглите для каких именно прерываний Вам нужна либа и все найдется.

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

saer, битовые операции -наше всё :) Потратьте один день на изучение, избавите себя от лишних проблем на многие дальнейшие годы!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dimax, битовые операции, конечно, это наше все. Но то, что у ТС в коде, это совсем не битовые операции. (что это такое, - не знаю, подозреваю, настройка регистров. Но битовуе операции выглядят совсем по-другому)

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

andriano, вам бы тоже не мешало заняться :) У ТС в примере классические битовые операции & (И)  и | (ИЛИ).  Именно они  и есть "наше всё". Выглядят как десятичные,  но это такая форма записи. Просто одно и тоже битовое выражение можно записать по-разному, например EICRA &= ~3;   эквивалентно EICRA = EICRA & 0B11111100;  или что б совсем запутать полный эквивалент:  EICRA =  EICRA&  ~((1<<1)|(1<<0)) ; 

nevkon
Offline
Зарегистрирован: 20.01.2015

Ну ладно, сказали А говорите и Б. Как работает полный эквивалент EICRA =  EICRA&  ~((1<<1)|(1<<0)); ?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

nevkon, я не мастер понятных формулировок) Начнём с конца  ~((1<<1)|(1<<0)) это создание маски с помощью операций сдвига.  т.е. примерно так преобразовывается:  (1<<1)|(1<<0)  расшифровка-   B00000010 "ИЛИ" B00000001 = B00000011; далее вся маска инвертируется ~B00000011 = B11111100 ; затем финишная операция "И"   EICRA "И" B11111100.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

dimax пишет:

andriano, вам бы тоже не мешало заняться :) У ТС в примере классические битовые операции & (И)  и | (ИЛИ).  Именно они  и есть "наше всё". Выглядят как десятичные,  но это такая форма записи. Просто одно и тоже битовое выражение можно записать по-разному, например EICRA &= ~3;   эквивалентно EICRA = EICRA & 0B11111100;  или что б совсем запутать полный эквивалент:  EICRA =  EICRA&  ~((1<<1)|(1<<0)) ; 

Занаться чем? Битовыми операциями?

Я обычно записываю такие выражения EICRA &= 0xfc;, и ТОЛЬКО так, т.к. вариативность здесь ведет к ухудшенпию читаемости кода. А EICRA к битовым операциям никакого отношения не имеет, это - специфические особенности ATmegaX28, которыми я (по крайней мере, пока) заниматься не имею желания.

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

Когда я писал для 8080, использовал Ассемблер и считал такты, но ATmega в десятки раз производительне, да и задачи у нее, как правило, попроще. И время в основном тратится на обмен с периферией. Так что нужно изучать дейташиты не на Атмегу, пытаясь выиграть единицы тактов, а на периферию, которая за счет неоптимального программитрования может отнять сотни мс, т е. более миллиона тактов самой АТмеги.

Как в анекдоте: искать потерянные чаы нужно там, где потерял, а не там, где светлее, так и оптимизировать по скорости нужно только те фрагменты, которые являются критичными с точки зрения производительности, а не все подряд.

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

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

andriano пишет:

Занаться чем? Битовыми операциями?

Я обычно записываю такие выражения EICRA &= 0xfc;, и ТОЛЬКО так, т.к. вариативность здесь ведет к ухудшенпию читаемости кода. А EICRA к битовым операциям никакого отношения не имеет, это - специфические особенности ATmegaX28, которыми я (по крайней мере, пока) заниматься не имею желания.

Не несите чушь. Пожалуйста :)

andriano пишет:

 Вы пишете, что Ваш код работает быстрее, и тут же вставляете в него временную задержку. И какой в этом смысл?

Я написал в чём смысл, перечитайте.

saer
Offline
Зарегистрирован: 12.05.2014

dimax, здравствуйте!

Вы оказались правы, не нашлось библиотеки по человекоудобному управлению прерываниями, таймерами и пр.

Но и источника с понятным и доступным описанием работы с регистрами тоже нет.

Можете что-нить посоветовать?

Наверняка у многих новичков, которые вроде ориентируются в Ардуино.ИДЕ при переходе на работу с регистрами есть проблемы. Может стоит на форуме создать раздел "Книги и все такое.."? К кому можно выйти с таким предложением?

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

saer, по-моему нет в природе таких книг по атмеговским контроллерам, что б всё было доступно. Обычно это просто перевод даташита, в лучшем случае с незначительными комментариями. А даташиты, понятное дело, не пишут для начинающих.  Но тем не менее  вам будет сильно легче, если заранее битовые операции выучите до автоматического понимания.  И только потом начинайте что-то изучать по нужной теме. Ещё раз подчеркну, без битовых операций нет смысла начинать разбираться не с прерываниями, не с таймерами, не с ацп, ибо все они программируются именно с помощью битовых операций.  Сам я информацию по таймерам и ацп черпал из книжки "А.В. Евстифеев Микроконтроллеры AVR семейства MEGA" не могу сказать, что прям всё лёгко и доступно, но по крайней мере на русском и более-менее понятно. Ну и конечно спрашивайте на форуме, если что совсем не понятно)