реклама на сайте
подробности

 
 
> AVR-IAR и внешнее прерывание, обработка INT0
mr_ia
сообщение Feb 12 2009, 10:31
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 13-02-07
Пользователь №: 25 311



Добрый день уважаемые.
Имею очень простой вопрос, как в IAR обработать внешнее прерывание.
До этого програмил в CVAVR, но вот решил мигрировать.
Опишу задачу. Нужно обработать внешнее прерывание INT0, по нижнему уровню.
Посмотрел примеры, вопросы ответы, нашел более менее подходящий кусок по обработке прерывания при перемолнении таймера счетчика, кусок работает. Написал для обработки INT0- Не работает...

Привожу код.
CODE
#include <iom128.h>
#include <inavr.h>
#include <ina90.h>


//volatile char flag;

//Обработка прерывания INT0***
#pragma vector = 0x04
//#pragma type_attribute=__interrupt
//void my_handler(void)
__interrupt void INT0_ISR(void)
{
__disable_interrupt(); //отключаем глобальные прерывания
//flag=flag++;
PORTD_Bit6 = 0; //смотрим по состоянию ножки выполнилось ли прерывание
}

int main( void )
{
DDRD_Bit7 = 1; //конфигурируем биты
DDRD_Bit6 = 1;
PORTD_Bit6 = 1;

DDRE=0xFF; //конфигурируем порты
DDRF=0xFF;
DDRB=0xFF;


EIMSK|= 1<<0; //Разрешаем INT0
EICRA &= ~(1<<0); // по нижнему уровню
__enable_interrupt(); //разрешаем глобальные прерывания

while (1)
{
__delay_cycles(1000000);
PORTD_Bit7 = 1; //смотрим не виснет ли
__delay_cycles(1000000);
PORTD_Bit7 = 0;

PORTE=EIMSK; //смотрим текущее состояние
PORTF=SREG;
PORTB=EIFR;
}
}



Если закоментировать обработку прерывания, то:
Код
EIMSK=0x01;
SREG=0x82;
EIFR=0xF0;

P.S. Компилируется без ошибок. Моделирую в Proteuse, за неимением железа под рукой... Мб глюк протеуса, но врядли ибо аналогичное в CVAVR работает без проблем.
В чем я ошибся?
Причина редактирования: Уменьшение видимого размера цитаты исходника.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Палыч
сообщение Feb 12 2009, 11:33
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(mr_ia @ Feb 12 2009, 13:31) *
Моделирую в Proteuse, за неимением железа под рукой... Мб глюк протеуса, но врядли ибо аналогичное в CVAVR работает без проблем. В чем я ошибся?
В AVRStudio Ваш пример работает... Несколько замечаний по самой программе:
1. Запрешать прерывания в обработчике прерываний не имеет смысла: при входе в него - прерывания запрещены; при выходе - разрешаются вновь.
2. Устанавливать таким образом: EICRA &= ~(1<<0); уровень сигнала - несколько странно (уровень определяется двумя битами)
3. Если уровень ни INT0 стал низким и не меняется, то при выходе из прерывания - тут же произайдёт новое прерывание по INT0 (правда, успеет выполниться одна команда основного цикла). Т.е., обычно, в прерывании по уровню что-то делают с условием срабатывания.
4. Если меняете EICRA, то делают это до разрешения прерывания в EIMSK и очищают флаг прерывания (см. даташит).
Go to the top of the page
 
+Quote Post
mr_ia
сообщение Feb 12 2009, 12:05
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 13-02-07
Пользователь №: 25 311



Цитата(Палыч @ Feb 12 2009, 15:33) *
В AVRStudio Ваш пример работает... Несколько замечаний по самой программе:
1. Запрешать прерывания в обработчике прерываний не имеет смысла: при входе в него - прерывания запрещены; при выходе - разрешаются вновь.
2. Устанавливать таким образом: EICRA &= ~(1<<0); уровень сигнала - несколько странно (уровень определяется двумя битами)
3. Если уровень ни INT0 стал низким и не меняется, то при выходе из прерывания - тут же произайдёт новое прерывание по INT0 (правда, успеет выполниться одна команда основного цикла). Т.е., обычно, в прерывании по уровню что-то делают с условием срабатывания.
4. Если меняете EICRA, то делают это до разрешения прерывания в EIMSK и очищают флаг прерывания (см. даташит).



Спасибо что попробовали в AVRStudio, но хочется то что бы в IAR заработало...
По пункту 2 полностью согласен.
По пункту 3 попрошу уточнить.
Если EICRA=0x00 т.е. 0 и 1 биты в 0. Как только разрешены глобальные прерывания, происходит соответсвенно обработка INT0, в теле обработки я например устанавливаю EIMSK 0 бит в 0, и запрещаю прерывания для INT0, тогда зацикливаться не будет? я правильно думаю?

Вообщем то пока писал проверил.
Добавил в обработку прерывания запрет для всех INT EIMSK=0x00;
В CVAVR помогло. В IAR нет...sad.gif



Цитата(clpe @ Feb 12 2009, 15:56) *
DDRE=0xFF; //конфигурируем порты
DDRF=0xFF;
DDRB = 0xFF; - без этой строки работает


Простите а Вы в чем компилировали/проверяли?
у меня нет sad.gif

DDRB = 0xFF; - без этой строки работает

совершенно безобидная на мой взгляд строка...
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 12 2009, 12:53
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(mr_ia @ Feb 12 2009, 15:05) *
Спасибо что попробовали в AVRStudio, но хочется то что бы в IAR заработало...
Выше я говорил о том, что Ваша программа, оттранслированная IAR, нормально симулируется AVRStudio. Поскольку, аналогичная программа из CVAVR нормально симулируется в протеусе и Ваша программа, оттранслированная IAR у "чужих" тоже нормально симулируется, то, имхо, в настройках проекта IAR у Вас какая-то бяка...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- mr_ia   AVR-IAR и внешнее прерывание   Feb 12 2009, 10:31
- - clpe   Цитата(mr_ia @ Feb 12 2009, 13:31) __inte...   Feb 12 2009, 10:45
- - aspID   Как минимум, в том, что прерывание отработает толь...   Feb 12 2009, 10:48
- - mr_ia   если добавить __enable_interrupt(); в обработку п...   Feb 12 2009, 10:59
- - MrYuran   А ногу, на которой INT0, не забываете подёргать? М...   Feb 12 2009, 11:08
- - clpe   Цитата(mr_ia @ Feb 12 2009, 13:31) while ...   Feb 12 2009, 11:09
- - mr_ia   Ногу дергаю кнопкой(в протеусе). изначально INT0 о...   Feb 12 2009, 11:34
- - clpe   DDRE=0xFF; //конфигурируем порты DDRF=0xFF; DDRB =...   Feb 12 2009, 11:56
- - clpe   Нет всетаки виноват протеус... У меня работает: Pr...   Feb 12 2009, 12:17
- - zltigo   Цитата(mr_ia @ Feb 12 2009, 13:31) нашел ...   Feb 12 2009, 13:29
|- - Палыч   Цитата(zltigo @ Feb 12 2009, 16:29) А кто...   Feb 12 2009, 13:53
|- - zltigo   Цитата(Палыч @ Feb 12 2009, 16:53) Имхо, ...   Feb 12 2009, 14:02
- - Atashi   глянул на схему и чет задумался о дребезгах всяких...   Feb 12 2009, 23:10
|- - clpe   Цитата(Atashi @ Feb 13 2009, 02:10) гляну...   Feb 13 2009, 12:20
- - SysRq   Цитата(mr_ia @ Feb 12 2009, 13:31) Код#pr...   Feb 13 2009, 00:02
- - Палыч   Цитата(SysRq @ Feb 13 2009, 03:02) 0x04 -...   Feb 13 2009, 13:13


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 06:18
Рейтинг@Mail.ru


Страница сгенерированна за 0.01386 секунд с 7
ELECTRONIX ©2004-2016