Модели 
Arduino в 
Proteus появились уже довольно-таки давно... где-то с версии 7.6 ... 7.7 или даже раньше.
Основаны они были на 
avr2.dll, ну различные глюки в них имели место быть.
Я тоже как-то делал на них проект с шахматами и помучиться мне пришлось.  
 
По ряду причин я вновь к моделям 
Arduino обратился с целью выяснить насколько корректно они обрабатывают
аппаратные прерывания. Не все модели микроконтроллеров в 
Proteus умеют это делать корректно...  
 
И вот тут выяснилось, что автор моделей 
Arduino в 
Proteus свои модели обновил!  
ArduinoAll.png
 Arduino Library for Proteus V2.0.
А также добавил к собственным моделям ряд демонстрационных проектов:
Arduino Projects - The Engineering Projects
Автор обещает, что новые модели стали более быстрыми (хотя в основе их всё та же  
avr2.dll).
Но вроде как он ушел от схематической модели 
Arduino и переписал всё на чистом 
С++ ...
Я скачал - попробовал модель 
Arduino Nano... что сказать, существенного приращения прямо-таки
сильно - не отметил.
Тем паче, на мой взгляд, автор перегружает свои модели графикой, а это тормозит симуляцию  в 
Proteus.
Я и его старые-то модели перекомпилировал в своё время, почистив от излишней графики:  
ArduinoN1.png
Ну а что касается прерываний, которые меня интересовали, и на старой и на новой моделях  
Arduino Nano
INT0 и 
INT1 вроде как работают вполне корректно...  
 
 Демонстрационный скетч обработки прерыванийCode: Select all
// РАБОТА ARDUINO ПО АППАРАТНЫМ ПРЕРЫВАНИЯМ
// ПРЕРЫВАНИЕ INT0 В МОДЕЛИ РАБОТАЕТ ВЕРНО
// ПРЕРЫВАНИЕ INT1 В МОДЕЛИ РАБОТАЕТ ВЕРНО
//
#define ledPin 13
#define interruptPin 3 // Кнопка между цифровым пином 3 (вход INT1) и GND
volatile byte state = LOW;
void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP); // Подтягиваем третий пин к питанию
//   EICRA &= ~(1 << ISC00); // Сбрасываем ISC00
//   EICRA |= (1 << ISC01);  // Устанавливаем ISC01 - отслеживаем FALLING на INT0
// Значения битов ISC00 и ISC01 определяют события какого типа приводят к генерации прерывания INTx:
// 00 - при наличии сигнала низкого уровня;
// 01 - при изменении сигнала от высокого уровня к низкому и наоборот;
// 10 - при изменении сигнала от высокого уровня к низкому;
// 11 - при изменении сигнала от низкого уровня к высокому.
// Назначение битов ISC10 и ISC11 аналогично ISC0x с той разницей,
// что они определяют тип событий для прерывания INT1.
// https://static.chipdip.ru/lib/549/DOC001549488.pdf
//
  EICRA &= ~(1 << ISC10); // Сбрасываем ISC10
  EICRA |= (1 << ISC11);  // Устанавливаем ISC11 - отслеживаем FALLING на INT1
//EIMSK &= ~(1 << 1); // Сбрасываем прерывание INT0
  EIMSK |= (1 << INT1);  // Разрешаем прерывание INT1(2) INT0(1)
}
void loop() {
  digitalWrite(ledPin, state);
}
ISR(INT1_vect) {
  state = !state;
}
Весьма толковое описание работы с прерываниями в среде 
Arduino есть здесь:
Прерывания в Ардуино. Часть 1
Прерывания в Ардуино. Часть 2
Если кто этим всем интересуется, может понадобиться 
Техническое руководство ATmega328/Р -
лежит здесь:  
https://static.chipdip.ru/lib/549/DOC001549488.pdf 
			
			
						You do not have the required permissions to view the files attached to this post.