Модели
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.