0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 22
1

Внешние прерывания ATMega128

13.02.2012, 18:09. Показов 9222. Ответов 14
Метки нет (Все метки)

Всем привет. У меня задача такая: есть меиндр с изменяющейся частой и надо замерять время между фронтами. Надо сказать, что в МК я дилетант так что если путь решения некорректный прошу не бить). А делаю я так: вешаю сигнал на ногу с внешними прерываниями и по первому фронту обнуляю таймер, а по второму считываю сколько он там натикал. И вот тут для меня возникает интересный вопрос! Если пользоваться INT7:4, то все работает замечательно, а если INT3:0, то все...приплыли. После считывания таймера всегда вылазят разные числа (частота не меняется), откуда они берутся я даже представить не могу.
Мануал по настройке внешних прерываний говорит след:
для INT7:4 - Нарастающий фронт, выявленный по двум выборкам на INTn, генерирует запрос на прерывание.
для INT3:0 - Нарастающий фронт на INTn генерирует асинхронно запрос на прерывание
В чем разница? И может ли это как раз влиять на результат? Что-то подробнее про "этот" асинхронный запрос я не нашел чтоб понять суть.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2012, 18:09
Ответы с готовыми решениями:

Внешние прерывания
Всем привет! пытаюсь осуществить светодиодную подсветку лестницы. Вверху и внизу стоят датчики...

Внешние прерывания
Добрый вечер, у меня на меге 8 работает ацп + необходимо обрадатывать внешнее прерывание от пина...

Внешние прерывания
нужно что бы при нажатии на кнопку отрабатывало прерывание. Я сделал так (все на мегае16, на...

мега48, внешние прерывания
всем здрасти) ситуация такова: планируется устройство с емкостной сенсорной клавиатурой, каждый...

14
0 / 0 / 0
Регистрация: 10.08.2010
Сообщений: 1,264
13.02.2012, 18:33 2
Глянь раздел по менеджеру питания. Если там не указанно, что INT7:4 могут выводить МК из глубокого сна, то это означает что эти прерывания зависят от частоты тактирования.
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
13.02.2012, 18:38 3
Цитата Сообщение от fatotysk
по первому фронту обнуляю таймер, а по второму считываю сколько он там натикал.
Для замера это в корне неправильно, поскольку есть нехилый джиттер по входу в прерывание. Нужно использовать ICP входы.
0
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 22
13.02.2012, 18:51 4
Цитата Сообщение от o9d
Глянь раздел по менеджеру питания. Если там не указанно, что INT7:4 могут выводить МК из глубокого сна, то это означает что эти прерывания зависят от частоты тактирования.
А, во: Прерывания по низкому уровню и фронтам на INT3:0 определяются асинхронно. Это означает, что данные прерывания могут использоваться для пробуждения микроконтроллера из режимов глубокого сна. Синхронизация ввода-вывода останавливается во всех режимах сна за исключением режима холостого хода (Idle).
Только это...а что это значит? Как это завязано с некорректной работой?

Цитата Сообщение от THI BIOST
Цитата Сообщение от fatotysk
по первому фронту обнуляю таймер, а по второму считываю сколько он там натикал.
Для замера это в корне неправильно, поскольку есть нехилый джиттер по входу в прерывание. Нужно использовать ICP входы.
Хм, спасибо, прочитал, попробую сразу же как будет победа над внешними прерываниями

upd спустя пар минут: ICP входов как я понял три штуки, а если надо 6 сигналов повесить?:(
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
13.02.2012, 19:44 5
Цитата Сообщение от fatotysk
ICP входов как я понял три штуки, а если надо 6 сигналов повесить?:(
1. Поставить 2 штуки 128.
2. xmegaA3
4. Перейти на другую платформу.
3. Смириться с джиттером, особенно, если фронты придут одновременно.
0
0 / 0 / 0
Регистрация: 10.08.2010
Сообщений: 1,264
13.02.2012, 20:27 6
А, во: Прерывания по низкому уровню и фронтам на INT3:0 определяются асинхронно. Это означает, что данные прерывания могут использоваться для пробуждения микроконтроллера из режимов глубокого сна. Синхронизация ввода-вывода останавливается во всех режимах сна за исключением режима холостого хода (Idle).
Только это...а что это значит? Как это завязано с некорректной работой?
По простому. То это означает, что эти прерывания не такие шустрые как асинхронные. При замере нужно учитывать эту задержку. И эта задержка зависит от частоты кварца.

ICP можно и не использовать, если частота небольшая и погрешность это допускает.
0
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 22
13.02.2012, 22:17 7
Эх, хорошо, будем ломать), спасибо.
0
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 22
15.02.2012, 12:50 8
Цитата Сообщение от fatotysk
Эх, хорошо, будем ломать), спасибо.
Ребят, ну ниикак не хотят работать прерывания INT3:0 (((
Прерывание происходит именно по фронту, это я проверил, тоесть он входит в обработчик и выполняет команды, но в итоге бред. Таймер проверил (не сбрасывается, не изменяется, считает себе как по рельсам). Проверил эти выходы их режима сна, хотя МК и не входит в сон. При прерывании мк сразу прыгает на обработку... У меня идеи уже только в различии типов внешних прерываний. В чем беда то?

upd: если этот же датчик повесить на INT7:4, то все прекрасно. код обработки прерывания одинаковый
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
15.02.2012, 13:30 9
Код - в студию
0
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 22
15.02.2012, 13:41 10
Цитата Сообщение от THI BIOST
Код - в студию
так работает:
Код
ISR(INT4_vect)
{
if(edge_counter ==1)
{
value_timer = TCNT0;
edge_counter = 0;
enable_input_temp = 1;
}
else
{
TCNT0 = 0x00;
edge_counter++;
}
}
int main(void)
// настройка портов и прочего. настройка срабатывание по фронту
while(1)
{
if(enable_input_temp ==1)
{
//выводим на экранчик
}
}
так не работает:
Код
ISR(INT3_vect)
{
if(edge_counter ==1)
{
value_timer = TCNT0;
edge_counter = 0;
enable_input_temp = 1;
}
else
{
TCNT0 = 0x00;
edge_counter++;
}
}
int main(void)
// настройка портов и прочего. настройка срабатывания по фронту
while(1)
{
if(enable_input_temp ==1)
{
//выводим на экранчик
}
}
коротко написал, но не выкладывать же портянку из 500строк ))
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
15.02.2012, 13:46 11
Самого интересного то и нет - настройки всего этого хозяйства. Кстати, обнуление таймера... только один канал работать и будет.
0
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 22
15.02.2012, 13:57 12
Цитата Сообщение от THI BIOST
Самого интересного то и нет - настройки всего этого хозяйства. Кстати, обнуление таймера... только один канал работать и будет.
Код
int main(void)
{
DDRA  |= 0x80;
PORTA |= 0x80;
//DDRB iaaa?iia ii?ii ia iano?aeaaou
DDRC  = 0x00;
PORTC = 0xFF;
DDRE = 0x00;
PORTE = 0b11111111;

DDRD = 0b11000000;
PORTD = 0b11111111;

//=======================
TCCR0 = 0b00000111;
TCCR2 = 0b00000101;

//========================
TCCR1B = 0b00000011; //aaeaiea ia 256
TIMSK = (1<<TOIE1);  //i?a?uaaiea ii ia?aiieiaie?

//========================
TCCR3B = 0b00000100;

EICRA = 0x00;
EICRB = 0xC0; //0b11000000
EIMSK = 0x80;//0b10000000

TWI_Master_Initiotyse();
_SEI();

while(1)
{
}
и ладно, что только один канал будет работать, понять бы разницу в этих прерываниях, а там уж и больше каналов можно сделать
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
15.02.2012, 14:12 13
Я вижу включение INT7, причём тут INT3 и INT4?

PS. А вообще очень лениво разбираться с битами, записанными цифрами.
0
0 / 0 / 0
Регистрация: 05.05.2011
Сообщений: 22
15.02.2012, 14:41 14
Цитата Сообщение от THI BIOST
Я вижу включение INT7, причём тут INT3 и INT4?

PS. А вообще очень лениво разбираться с битами, записанными цифрами.
Да, сюда вставилось INT7, в своем коде я то iNT3 то INT4 включаю

а цифрами мне вроде как проще и быстрее
0
0 / 0 / 0
Регистрация: 23.01.2010
Сообщений: 1,142
15.02.2012, 15:05 15
Цитата Сообщение от fatotysk
Да, сюда вставилось INT7, в своем коде я то iNT3 то INT4 включаю
Проблема может быть в самом неожиданном месте, а не в выложенном коде, особенно, если это не тот код, который на самом деле работает. Например, включён 2 уарт.

Цитата Сообщение от fatotysk
а цифрами мне вроде как проще и быстрее
Хозяин - барин, мне лениво по даташитам лазить.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.02.2012, 15:05

Внешние прерывания МК ATmega8535
Народ, кто-нибудь поможет решить задачу или хотя бы подсказать с чего начать? Просто знания...

Внешние прерывания для AtMega16
Всем ,привет!)Подскажите пожалуйста:как правильно написать код программы для внешнего прерывания?Ну...

внешние прерывания tiny85 - растолкуйте даташит!
я тут типа пытаюсь мелким шаговиком управлять напрямую. ловлю внешние импульсы и по их частоте -...

Нужен совет. Atmega88 + DS1307 + внешние прерывания
Собрался тут сделать один проектик, не знаю как пойдет, но если все будет ок, то будет и раздел в...

Не срабатывают внешние прерывания INT0/INT1 в Atmega8
Помогите разобраться новичку в МК, в чем может быть проблема. Пытаюсь освоить самостоятельно...

Внешние прерывания
Доброе время суток! Подскажите пожалуйста как настроить внешнее прерывание на еще одном порте. Я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.