Технический форум по робототехнике.
loid » 18 ноя 2007, 07:30
Как работают прерывания я конечно понял, но с чем их едят в программе - так и не понял.
К примеру если еть такой код:
- Код: Выделить всё • Развернуть
void(main) {
while(1){
if(PINA.0=1){PORTC.0=1} else {PORTC.0=0}
};
Мне нужно отследивать например есть ли изменения на ножке 0 порта А. Это я опрашиваю в цикле тут всё понятно. Как опрашивать прерывания? Тоже опрашивать в цикле или каким то другим способом?

Последний раз редактировалось
Digit 03 дек 2007, 11:44, всего редактировалось 1 раз.
Причина: не забывляем оформлять код соответствующим тегом
Master » 18 ноя 2007, 16:36
Прерывания не нада опрашивать программно, на то они и прерывания. Когда прерывание возникает МК автоматически передает управление другому сегменту кода, который нада выполнить, и после его выполнения вновь возвращается с прерванного места.
loid » 19 ноя 2007, 11:58
Если я правильно понял, то это выглядит примерно так: Создаю вне функции main() прерывание и там всё описываю что будет происходить когда будет прерывание. Это понятно. А где само условие срабатывания прерывания то писать?
Digit » 19 ноя 2007, 12:08
условие в регистрах настройки прерываний. у каждого прерывания свой регистр, который залает его работу. В даташите на контроллеры есть раздел по прерываниям, где таблички с регистрами и описание...
loid » 19 ноя 2007, 12:29
Смотрел щас datasheet на atmega16 и не нашел где было бы написано про прерывания. Расскажите на "пальцах", а то что то не доходит до меня. А лучше кусок кода с хорошим пояснением. Заранее благодарен!

Digit » 19 ноя 2007, 13:07
У меня даташит версия
2466N-AVR-10/06, возможно, есть и новее. Так вот.
Страница 45 - глава "Interrupts". Там таблица адресов, по которым записываются вектора прерываний.
Страница 68 - глава "External Interrupts". Там про регистры.
И по моему в главах по каждой периферии есть что-то про прерывания (смотреть времени нет). Например, в главе про таймер 0 должна бытть инфа по прерываниям от таймера...
Так что ты лукавишь, что в даташите нет ничего!

В документе почти на 360 страниц есть все!

EdGull » 19 ноя 2007, 16:00
да я так понимаю ему даже книжку на русском лень прочесть!!!
Digit » 19 ноя 2007, 16:11
EdGull, ну чего ты так!

Я ж вижу все

Поэтому даю только ссылки...
А ты вот так - с плеча... Не педагогично!

SSG » 19 ноя 2007, 17:23
Посмотрите в книжке Евстифеева по МК Атмега. Там про регистры очень хорошо рассусолено.
А в чем программа писается? В Code Vision-е достаточно в КодВизаде на закладке внешних прерываний поставить галочки и выбрать при возникновении какого события прерыванию будет возникать - по спаду, по нарастающему фронту и пр. После генерации кода в нем уже будет сгенерирована пустая заготовка обработчика прерываний, типа:
- Код: Выделить всё • Развернуть
interrupt [EXT_INT0] void ext_int0_isr(void) //Обработчик внешнего прерывания 0
{
// Сюда пишем код, который должен выполняться при возникновении прерывания
}
Ничего опрашивать не надо, эта процедура будет выполняться автоматически при возникновении указанного в КодВизаде события.
loid » 23 ноя 2007, 10:53
Ну эти прерывания.

Поэкспериментировал с ними и датчиками мышыными. Получается одна фигня. Нужно на каждый датчик по контроллеру весить. Ну или один контроллер на 2 датчика, а то если напрямую чипом опрашивать - ... В замен прерываний - сдалаю скорость шасси не высокую (при уборке реактивного движения не нужно), датчик движения будет посылать импульсы не с такой интенсивностью. Как сделаю - покажу.
... если конечно трудностей не возникнет ...
Myp » 23 ноя 2007, 10:59
на 1 прерывание можно повесить стока датчиков скока есть свободных ног у МК
вешаем на каждую ногу по датчику и дублируем на ногу внешнего прерывания
тобишь на 1 ноге прерывания сходится полтора десятка выводов от датчиков
при срабатывании любого датчика входим в прерывание и проверяем какая из всех ног сработала.
Digit » 23 ноя 2007, 11:16
Myp писал(а):вешаем на каждую ногу по датчику и дублируем на ногу внешнего прерывания
тобишь на 1 ноге прерывания сходится полтора десятка выводов от датчиков
тока не просто дублируем, а через диод... а то это на всех ногах будет одно и то же

Myp » 23 ноя 2007, 12:43
ага
ну я в общих чертах описал
ато человек растроился чтото из за прерываний

loid » 23 ноя 2007, 13:01
Это понятно что на одно прерывание можно кучу устройств повесить. дело в другом. Если кто читал выше, то я упоминал что в качестве датчика перемещения использовал колёсико от опто-механической мышки.Вот теперь представьте когда оба эти датчика вращаются, как та одно прерывание это повесить. Даже если шасси будет передвигаться с медленной скоростью, то за одну секунду насчитывается не одна сотня изменений положения колёсика. Предположим что по великой случайности, сигналы от датчиков идут по-очереди. А если они будут идти враз. Тут то и загвоздка. Вот другой момент: рассмотрим как это буде работать поэтапно. Допустим колёсико стоит на месте, изменений никаких нет - прерывание не срабатывает. Дальше... Колёсико начало вращение, срабатывает прерывание, по этому прерыванию выполняется написаный ранее для него код. Все довольны и всё вроде бы хорошо. НО! В тот момент времени когда начало выполсяться прерывание, колёсико то не останавливается и продолжает своё вращения вокруг оси своя. И вот от датчика перемещения (колёсика) пришел сигнал об очередном изменении его положения. Будет хорошо, если прерывание закончило выполнять свой код и опять ждёт когда его вызовут снова. А если оно не успело вовремя отработать? От этого окажеться что не было зафиксировано очередное прокручивание колёсика. В результате чего - у нас будут ошибки, вернее не точная инвормация о пройденном растоянии.
Жутко интересно как работает опто-механическая мышь. Я имею ввиду как она за этим всем успевает. Конечно если её перемещать очень быстро - она тоже будет "подгонять". Вообще у меня такая идея - взять полностью плату контроллера мыши и соединить её с шасси робота. Вот только не знаю как принимать от неё сигналы перемещения.
Digit » 23 ноя 2007, 14:13
Ты в обработчике прерываний собрался высчитывать положения планет с точностью до тридцатого знака после запятой?!

Обычно по прерыванию пишут несколько строк кода, переменные инкрементируют и все такое... А с переменными можно основному коду работать между прерываниями. С какой скоростью работает твой МК? А сколько тактов генератора будет выполняться программа прерывания? С какой скоростью должно вращаться колесико, чтоб МК не успевал обрабатывать?
На ВСЕ эти вопросы ответить элементарно, подумай сам, почитай ДатаШит. В поисковике пошерсти в конце концов! Ты думаешь в мыши стоит военная разработка, работающая на космических скоростях и поэтому мышь успевает?
ЗЫ
Кстати, как ты думаешь, а почему у МК есть дивайс, называемый "таймер\
счетчик"?
