Разработка, производство и продажа радиоэлектронной аппаратуры
|
Требуется программист в Зеленограде - обработка данных с датчиков; 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;
}
Составить ответ | Вернуться на конференцию
Ответы
- Нашел ошибку. Обработчик в WINAVR для MEGA128 для INT0 - ISR(INT0_vect){ ...... } - audioremont (27.10.2008 15:03:57 212.114.22.198, 153 байт)
- Как правильно написать обработчик? - audioremont (24.10.2008 15:49:10 212.114.22.198, 489 байт)
- Ответ: - audioremont (23.10.2008 18:34:47 212.114.22.198, 1635 байт)
- А куска рабочего кода нет ни у кого? - audioremont (23.10.2008 16:49:19 212.114.22.198, 92 байт)
- Нехорошо разрешать прерывания, для которых нет обработчика. Запрерите всё, кроме INT0. - Леонид Иванович (23.10.2008 15:55:39 87.252.227.58, пустое)
- Беру свои слова назад... Вроде, должно работать... Бит совместимости с m103 - сняли? - Палыч (23.10.2008 15:47:36 192.168.21.4,87.117.3.1, пустое)
- Ответ: - audioremont (23.10.2008 15:50:2 212.114.22.198, 60 байт)
- Ответ: - audioremont (23.10.2008 14:51:18 212.114.22.198, 384 байт)
- Не понял: Вы флаг фронтового прерывания int0 ищете после (+) - Quasy (23.10.2008 14:48:15 192.168.0.207,80.243.9.34, 93 байт)
- Ответ: - audioremont (23.10.2008 14:53:49 212.114.22.198, 167 байт)
- Посмотрите внимательно на рисунок 33 в DS - Палыч (23.10.2008 12:42:8 192.168.21.4,87.117.3.1, 65 байт)
- Ответ: - audioremont (23.10.2008 15:15:16 212.114.22.198, 384 байт)