Преобразование кода ATTINY85 в ATMEGA2560. Прерывания смены контактов

У меня есть код, который правильно компилируется для платы ATTINY85 с использованием ARDUINO IDE, но у меня нет платы ATTINY85. У меня есть Arduino Mega ATMEGA2560, и когда я выбираю эту плату в Arduino IDE, код не компилируется и выдает это сообщение об ошибке

sketch_feb21a:216:3: error: 'GIMSK' was not declared in this scope

   GIMSK |= _BV(PCIE);                     // Включить прерывания по смене контактов

   ^

sketch_feb21a:216:16: error: 'PCIE' was not declared in this scope

   GIMSK |= _BV(PCIE);                     // Включить прерывания по смене контактов

                ^

sketch_feb21a:217:3: error: 'PCMSK' was not declared in this scope

   PCMSK |= _BV(PCINT2);                   // Используем PB3 в качестве контакта прерывания

   ^

exit status 1
'GIMSK' was not declared in this scope

Вот фрагмент кода, который выдает ошибку

void sleep()
{
  GIMSK |= _BV(PCIE);                     // Включить прерывания по смене контактов
  PCMSK |= _BV(PCINT2);                   // Используем PB3 в качестве контакта прерывания
  ADCSRA &= ~_BV(ADEN);                   // АЦП выключен
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);    // заменяет приведенный выше оператор

  MCUCR &= ~_BV(ISC01);
  MCUCR &= ~_BV(ISC00);       // Прерывание по нарастающему фронту
  sleep_enable();                         // Устанавливает бит включения режима сна в регистре MCUCR (SE BIT)
  sei();                                  // Разрешаем прерывания
  sleep_cpu();                            // спать

  cli();                                  // Запретить прерывания
  PCMSK &= ~_BV(PCINT2);                  // Выключаем PB3 как вывод прерывания
  sleep_disable();                        // Очистить бит SE
  ADCSRA |= _BV(ADEN);                    // АЦП включен

  sei();                                  // Разрешаем прерывания
}



ISR(PCINT0_vect) {
   /*noInterrupts();
   while (digitalRead(BUTTON_PIN) == LOW);

   delay(50);
   while (digitalRead(BUTTON_PIN) == LOW);
   playTrack(1 + (curTrack++ % 2));
   delay(400);

   interrupts();*/

}

, 👍0

Обсуждение

У вас есть плата Arduino Atmega 2560? почему ты хочешь перевести его в спящий режим?, @Jot


1 ответ


2

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

Вам нужно будет просмотреть таблицу данных Atmega2560 и посмотреть, как управлять прерываниями смены контактов.

,

Я просматривал таблицы данных для обоих, но мне просто трудно понять, что нужно изменить, чтобы все работало правильно., @flipbeatz