Телесистемы
 Разработка, производство и продажа радиоэлектронной аппаратуры
На главную   | Карта сайта | Пишите нам | В избранное
Требуется программист в Зеленограде
- обработка данных с датчиков; ColdFire; 40 тыс.
e-mail:jobsmp@pochta.ru

Телесистемы | Электроника | Конференция «Микроконтроллеры и их применение»

AtMega128 прерывания.

Отправлено audioremont 23 октября 2008 г. 12:21


Помогите. Не могу разобраться с прерываниями AtMega128.

Флаг прерываний не устанавливается. Значит, собака зарыта где-то в конфигурации прерываний. В данном случае прерывание пытаюсь вызвать программно, переключая вывод INT0.

В чем ошибка? есть у кого работающий кусок кода для ATMEGA128?
Проверяю на реальной микросхеме

ПО WINAVR, понипрог

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h> //Для доступа к функции sei ()
//#include <avr/signal.h> //Для доступа к макроссу INTERRUPT //Является частью interrupt/h

//#define Freq 4000000 // Частота системной синхронизации в ГЦ
#define SETBIT(ADDRESS,BIT) (ADDRESS |= (1<<BIT))
#define CLEARBIT(ADDRESS,BIT) (ADDRESS &= ~(1<<BIT))

SIGNAL(__vector_default){} // Предотвращение сброса микроконтроллера при возникновении непридвиденных прерываний

int INTERRUPT(int SIG_INTERRUPT0) //Прерывание по К1
{
PORTG ^= 0x01; //Переключаем состояние порта G, гасим/зажигаем светодиоды
PORTA = EIFR; //Вывод флагов прерываний на светодиоды
_delay_ms(500);
}


int main(void)
{
//Определить все порты
DDRA = 0XFF; PORTA = 0XFF; // ВЫХОД ЛЕВЫЙ
DDRB = 0XFF; PORTB = 0xFF; // ВЫХОД, РЕЛЕ, ПРОГР.
DDRC = 0XFF; PORTC = 0; // ВЫХОД ПРАВЫЙ
DDRD = 0b00000001; PORTD = 0XFF; // 4 INT - КНОПКИ, PULL UP
DDRE = 0X00; PORTE = 0XFF; // 4 INT
DDRF = 0X00; PORTF = 0XFF; // 8 ADC
DDRG = 0XFF; PORTG = 0XFF; // ВЫХОД, РЕЛЕ

//Задать режим работы прерываний
EIMSK = 0b00000000; // EIMSK Запрет прерываний INT0-INT7
EICRA = 0b11111111; // По нарастающему фронту
EIMSK = 0b00001111; // EIMSK Разрешаем прерывания INT0-INT3
SETBIT (SREG, 7); // Общее разрешение прерываний SREG - регистр состояний
//sei(); //разрешить все прерывания

while(1)
{
PORTA = EIFR; //Вывод флагов прерываний на светодиоды
_delay_ms(500);
PORTD = 0b11111111; //Вызываем прерывание на INT0
_delay_ms(500);
PORTA = EIFR;
PORTD = 0b11111110; //Обнуляем INT0
_delay_ms(500);

}
return 0;
}


Составить ответ | Вернуться на конференцию

Ответы


Отправка ответа
Имя*: 
Пароль: 
E-mail: 
Тема*:

Сообщение:

Ссылка на URL: 
URL изображения: 

если вы незарегистрированный на форуме пользователь, то
для успешного добавления сообщения заполните поле, как указано ниже:
умножьте 2 на три:

Перейти к списку ответов | Конференция | Раздел "Электроника" | Главная страница | Карта сайта

Rambler's Top100 Рейтинг@Mail.ru
 
Web telesys.ru