Шаблон обработки прерывания от int0 для AtTiny2313
Вот простой и наглядный пример обработки прерывания int0 для микроконтроллера ATtiny2313, на прерывание int0 можно установить кнопку или например датчик с выходным напряжением до 5Вольт. Я в основном использую внешние прерывания int0 и int1 для установки на них кнопок, в основном "вешаю" на них выполнение уникальных и требующих немедленного исполнения программ.
#include <avr/io.h> //библиотека ввода/вывода #include <avr/interrupt.h> //библиотека прерываний #define nop() {asm("nop");} unsigned int ms,x; //декларирование переменных // функция задержки void delay_ms(int ms) { for (x=ms; x>0; x--) nop (); //задержка на один такт } //обработка прерываний SIGNAL(SIG_INTERRUPT0) { //Тут размещается текст программы //которую надо выполнить //при срабатывании прерывания INT0 } int main( void ) //главная программа { GIMSK=0b01000000; //разрешаем прерывание int0 - кнопка MCUCR=0x03; // срабатывание по нарастанию фронта - для кнопки sei(); //глобальное разрешение прерываний for(;;) //бесконечный цикл { //Тут размещают программу //которая выполняется/ //в свободное от выполнения //обработчика прерывания } }
Скачать пример обработки прерывания int0 в txt файле
»
Шаблон обработки прерывания от int0 для AtTiny2313
Подскажите пожалуйста, у меня ATtiny2313A принимает и передает данные по SPI(реализован программным путем на основе USI), В главной функции вот такой код:
Работает все норм.
Но я хочу переделать чтоб прием/передача происходило по внешнему прерыванию, т.е. на INT0 приходит логический ноль и после этого МК идет на обработку прерывания(прием данных). Хочу сделать через INT0 потому что будут еще задействованы прерывания INT1 и прерывание таймера, но прием данных является самым важным звеном.
Ну короче говоря настраиваю INT0:
А проблема в том что почему-то первый и второй байты меняются местами и вообще как-то непонятно работатет это прерывание. У меня возник вопрос: а как долго должен продержаться низкий уровень на INT0 чтоб сработало прерывание? или может в коде настройки прерывания ошибка? может чего то недопонимаю?
а вот уй!
в обработчике меняю глобальную переменную, которую вывожу в UART. смотрю UART, замыкаю int0 на землю или на Vcc - а в уарте ничего не меняется. что я делаю не так?
правда, я сделал
и обработчик прерывания у меня называется
ISR(INT0_vect)
еще заодно спрошу - чем отличается
от
Проще выложи код и сделай
Проще выложи код и сделай запись на форуме, я гляну код может что действителньо кривое написал.
По вопросам:
Отличия в записи никаких нет, так как задать конфигурацию регистра можно двумя способами с явным указанием его внутернних битов или же через указание номера бита, который отвечает за определенный, нужный тебе бит. Так что записи идентичны.
кстати, в этом шаблоне как
кстати, в этом шаблоне как минимум нету строчек, устанавливающих порт на вход.
подключил датчик холла на
подключил датчик холла на прерывание (как и замышлялось), проверил вольтметром - уровни на ножке изменяются. а вот в прерывание судя по всему не заходит. что там может быть? скомпилировал с оптимизацией?
просто в одном случае <, а в
просто в одном случае <, а в другом - <<
код в части прерываний:
1. нету разрешения прерываний
1. нету разрешения прерываний sei();
2. Зачем в обработчки прерывания пихать настройки регистра GIMSK?
1. уже понял 2. мне кажется,
1. уже понял
2. мне кажется, там таким образом просто запрещаются прерывания