Например TDA7294

Форум РадиоКот • Просмотр темы - AVR, ATmega16, внешние прерывания
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн авг 25, 2025 01:34:23

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: AVR, ATmega16, внешние прерывания
СообщениеДобавлено: Пт ноя 09, 2012 12:57:52 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 2
Зарегистрирован: Чт июл 15, 2010 13:47:09
Сообщений: 317
Откуда: Лютый Питер
Рейтинг сообщения: 0
Всем доброго времени суток!

У меня возникла проблема - прерывание INT0 работает, но его код не выполняется. Программа просто останавливается.
Где косяк?
Пишу на С, AVR Studio 6.

Вместо этого:
Код:
{
   cli();
   PORTC = 0x01;
   for(int i = 0; i < 10; i++)
   {
      PORTC<<1;
   }
   sei();
}
можно пихать что угодно, результат один.
Проверял в Протеусе.

Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define forward 0b1010
#define backward 0b0101
#define left 0b1001
#define right 0b0110

SIGNAL(SIG_INTERRUPT0)
{
   cli();
   PORTC = 0x01;
   for(int i = 0; i < 10; i++)
   {
      PORTC<<1;
   }
   sei();
}   

int main(void)
{
   DDRC = 0x0F;
   PORTC = 0x00;
   GICR |= (1<<INT0);
   MCUCR |= (1<<ISC01)|(1<<ISC00);
   
   sei();
   
   for(;;)
   {      
      if(PINC & _BV(PC4))
      {
         PORTC = forward;
         _delay_ms(2500);
         PORTC = left;
         _delay_ms(1000);
         PORTC = backward;
         _delay_ms(2000);
         PORTC = 0x00;
      }
   }   
}

_________________
Господа, это - не стыдно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR, ATmega16, внешние прерывания
СообщениеДобавлено: Пт ноя 09, 2012 13:06:32 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 235
Зарегистрирован: Пт янв 29, 2010 10:27:40
Сообщений: 3863
Откуда: Москва
Рейтинг сообщения: 0
Зачем cli()/sei() внутри прерывания? I и так сбрасывается при возникновении прерывания и ставится во время возвращения из него...
А как она останавливается? На PC4 не реагирует? Или на INT0?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR, ATmega16, внешние прерывания
СообщениеДобавлено: Пт ноя 09, 2012 13:09:22 
Сверлит текстолит когтями
Аватар пользователя

Карма: 22
Рейтинг сообщений: 81
Зарегистрирован: Пн дек 08, 2008 10:58:48
Сообщений: 1262
Откуда: Винница
Рейтинг сообщения: 0
Я бы еще эту ... убрал, дабы не соблазнять оптимизатор..

for(int i

static int i=0;


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR, ATmega16, внешние прерывания
СообщениеДобавлено: Пт ноя 09, 2012 13:12:28 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 2
Зарегистрирован: Чт июл 15, 2010 13:47:09
Сообщений: 317
Откуда: Лютый Питер
Рейтинг сообщения: 0
Не останавливается, я ошибся.
Сбрасывается в начало и ждет PC3.

Решил проблему так - вместо SIGNAL() поставил ISR(INT0_vect).

Engineer_Keen, разве не нужно запрещать прерывания на протяжении исполнения достаточно длительного кода по прерыванию?
urry, это не пойдет в контроллер, просто кусок кода для проверки.

Теперь вся эта индусятина выглядит так.
Код:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>

#define forward 0b1010
#define backward 0b0101
#define left 0b1001
#define right 0b0110
#define stop 0b0000

ISR(INT0_vect)
{
   PORTC = 0x00;
   _delay_ms(50);
   PORTC = right;
   _delay_ms(400);
   PORTC = forward;
   _delay_ms(550);
   PORTC = stop;
}   

int main(void)
{
   DDRC = 0x0F;
   PORTC = 0x00;
   GICR |= (1<<INT0);
   MCUCR |= (0<<ISC01)|(0<<ISC00);
      
   sei();
   
   for(;;)
   {      
      if((PINC & _BV(PC4))==0)
      {
         PORTC = forward;
         _delay_ms(2500);
         PORTC = left;
         _delay_ms(1000);
         PORTC = backward;
         _delay_ms(2000);
         PORTC = 0x00;
      }
   }   
}

_________________
Господа, это - не стыдно.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR, ATmega16, внешние прерывания
СообщениеДобавлено: Пт ноя 09, 2012 13:17:37 
Друг Кота
Аватар пользователя

Карма: 32
Рейтинг сообщений: 235
Зарегистрирован: Пт янв 29, 2010 10:27:40
Сообщений: 3863
Откуда: Москва
Рейтинг сообщения: 0
dr.faust писал(а):
Engineer_Keen, разве не нужно запрещать прерывания на протяжении исполнения достаточно длительного кода по прерыванию?

Как только прерывание возникает, бит I сбрасывается, нет смысла его сбрасывать принудительно. А вот от запихивания в прерывание "достаточно длительного кода" лучше уходить, но если это не мешает остальной программе можно забить.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: AVR, ATmega16, внешние прерывания
СообщениеДобавлено: Пт ноя 09, 2012 13:19:36 
Потрогал лапой паяльник
Аватар пользователя

Карма: 1
Рейтинг сообщений: 2
Зарегистрирован: Чт июл 15, 2010 13:47:09
Сообщений: 317
Откуда: Лютый Питер
Рейтинг сообщения: 0
Благодарю.

_________________
Господа, это - не стыдно.


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 207


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y