Помогите освоить внешние прерывания

Обсуждаем контроллеры компании Atmel.
Ответить
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург

Сообщение zzontt »

В общем пытаюсь освоить внешние прерывания на меге16. Так как я только только начал изучать микроконтролеры то ставлю себе простейшие задачи и пытаюсь их решить. В этот раз хотел написать программу суть которой сводится к следущему. Моргаем диодом на ножке РВ0, когда на ножке PD2 фиксируем наростающий фронт останавливаем маргание, и на секунду зажигаем диод на ножке РВ1, и возвращаемся к основной програме моргания на РВ0.

Код: Выделить всё

#include <mega16.h>
#include <delay.h>
void main(void)
{
PORTB=0x00; 
DDRB=0xFF;  // PD выход

PORTD=0x00; 
DDRD=0x00; // PD вход
#asm("sei"); //разрешение глобальных прерываний 
GICR |= (1<<INT0); //внешнее прерывание с PD2
MCUCR |= (1<<ISC01)|(1<<ISC00); // условие прерывания (по нарастающему фронту)
while (1)
      {
      PORTB.0=!PORTB.0; //моргание диодиком на PB0
      delay_ms(50);     // с задержкой в 50 мс
      }  
interrupt [INT0] void buton(void) 
{
PORTB.1 = 1; //зажигаем диод
delay_ms(1000); //ждем секунду
}      
}


Я честно говоря уже себе мозг сломал как правильно обработку прерывания. Поэтому прошу помоши, не могли бы вы мне просто впревести премер кода который будет выполнять ту часть программы которая отвечает за зажигание лампочки на секунду. или привести поохожий пример.
очень желательно в синтаксе CVAVR, так как находил несколько похожие примеры для других компиляторов но так и не смог поянть как их адаптировать под тот в котором я пытаюсь это сделать.
Не бейте за глупости, я только учусь)
Контактная информация:
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Для начала, можно воспользоваться генератором кода в CV. Если внешние прерывания заработают, то Вы с уверенностью будете знать, что "железо" в полном порядке и Вы неправильно настроили прерывания.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Сообщение radio-kot »

zzontt писал(а): очень желательно в синтаксе CVAVR прерывания
Вот просто и доступно написано прерывания в AVR в CVAVR с примером с кнопочками с симуляцией www.proavr.narod.ru/03.htm
Будете проходить мимо- проходите!
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург

Сообщение zzontt »

Аlex писал(а):Для начала, можно воспользоваться генератором кода в CV. Если внешние прерывания заработают, то Вы с уверенностью будете знать, что "железо" в полном порядке и Вы неправильно настроили прерывания.
до железа еще не дошел, хочу сперва проверить в протеусе. А что именно не правильно в настройке прерываний?
Не бейте за глупости, я только учусь)
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Собутыльник Кота
Аватара пользователя
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Сообщение radio-kot »

генератором воспользуйтесь и сравните!
Будете проходить мимо- проходите!
Реклама
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

zzontt писал(а):А что именно не правильно в настройке прерываний?
А Вы уверены, что вся проблема в программе ?
Я же Вам сказал - отвяжитесь от "железа" и схемы и убедитесь в том, что именно в программе проблемы, используя генератор кода.
Реклама
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург

Сообщение zzontt »

ПО совету многих воспользовался генератором кода, однако программа так как надо так и не зароботала. Программа должна постоянно моргать диодиком на PA0, но при появлени растощего фронота на PD2, PA0 должен гаснуть, а вместо него должен зажигаться на 2секунды диод на PA1, после чего гаснуть, и возвращаться к соновной программе. Однако этого не происходит. Вместо этого постоянно моргает диод на PA0, и постоянно горит диод на PA1, а на изменение уровня на PD2 не как не реагирует. Подскажите в чем может быть проблема?

Код: Выделить всё

#include <mega16.h>
#include <delay.h>
interrupt [EXT_INT0] void ext_int0_isr(void)
{
PORTA.0=0;
PORTA.1=1;
delay_ms(2000);
PORTA.1=0;
}
void main(void)
{   
PORTA=0x00;
DDRA=0xFF;        
          
PORTD=0x00;
DDRD=0x00; 
         
// External Interrupt(s) initialization
// INT0: On
// INT0 Mode: Rising Edge
// INT1: Off
// INT2: Off

GICR = (1<<INT0);//0b01000000
MCUCR = (1<<ISC00) | (1<<ISC01);//0b00000011
MCUCSR=0x00;
GIFR=0x40;    

#asm("sei")   
       
while (1)
      {    
      PORTA.0=!PORTA.0;  
      delay_ms(100);      
      }
}
Не бейте за глупости, я только учусь)
Контактная информация:
Модератор
Аватара пользователя
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля

Сообщение Аlex »

Вот, с генератором кода, всё работает.
int0.rar
(34.68 КБ) 181 скачивание
Ваш код не компилится, ругается на INT0 и ISC00.
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург

Сообщение zzontt »

Аlex писал(а):Вот, с генератором кода, всё работает.
int0.rar
Ваш код не компилится, ругается на INT0 и ISC00.
Ваш код ведет себя точно так же как и мой, разницы в моделированиее в протеусе нету =( возможно это проблема протеуса.
Не бейте за глупости, я только учусь)
Контактная информация:
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург

Сообщение zzontt »

Аlex писал(а):Вот, с генератором кода, всё работает.
int0.rar
А как вы проверили что все работает?
Просто я и в протеусе попробовал, и в железо зашил, но увы логика программы не выполняется.
Не бейте за глупости, я только учусь)
Контактная информация:
Вымогатель припоя
Сообщения: 630
Зарегистрирован: Пн июн 14, 2010 13:07:29
Откуда: Жуковский

Сообщение a_skr »

в протеусе все работает. возможно, забыли резистор на землю.
Вложения
1.zip
(12.79 КБ) 172 скачивания
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург

Сообщение zzontt »

a_skr писал(а):в протеусе все работает. возможно, забыли резистор на землю.
нет резистор на месте по схемотехнике все в порядке.
Не бейте за глупости, я только учусь)
Контактная информация:
Открыл глаза
Сообщения: 54
Зарегистрирован: Чт дек 13, 2012 19:31:00
Откуда: Санкт-Петербург

Сообщение zzontt »

Всем спасибо, все заработало. Честно не знаю в чем была ошибка, переписал весь проект с нуля, и все стало нормально)
Не бейте за глупости, я только учусь)
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Сообщение radio-kot »

Слава богу! С наступающим Новым годом!
Будете проходить мимо- проходите!
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

radio-kot писал(а):Слава богу! С наступающим Новым годом!
И с так и не наступившим Кончиком Света !
Собутыльник Кота
Аватара пользователя
Сообщения: 2584
Зарегистрирован: Вт сен 14, 2010 10:27:19

Сообщение radio-kot »

Ёу :beer:
Будете проходить мимо- проходите!
Ответить

Вернуться в «AVR»