Робот-Пылесос

Обсуждаем рождающиеся мысли и результаты экспериментов.

Re: Робот-Пылесос

Сообщение loid » 18 ноя 2007, 07:30

Как работают прерывания я конечно понял, но с чем их едят в программе - так и не понял.
К примеру если еть такой код:

Код: Выделить всё
void(main) {
while(1){
if(PINA.0=1){PORTC.0=1} else {PORTC.0=0}
};


Мне нужно отследивать например есть ли изменения на ножке 0 порта А. Это я опрашиваю в цикле тут всё понятно. Как опрашивать прерывания? Тоже опрашивать в цикле или каким то другим способом? :RTFM:
Последний раз редактировалось Digit 03 дек 2007, 11:44, всего редактировалось 1 раз.
Причина: не забывляем оформлять код соответствующим тегом
Аватара пользователя
loid
 
Сообщения: 349
Зарегистрирован: 16 окт 2007, 11:57
Откуда: Минycинck

Re: Робот-Пылесос

Сообщение Master » 18 ноя 2007, 16:36

Прерывания не нада опрашивать программно, на то они и прерывания. Когда прерывание возникает МК автоматически передает управление другому сегменту кода, который нада выполнить, и после его выполнения вновь возвращается с прерванного места.
Аватара пользователя
Master
 
Сообщения: 4468
Зарегистрирован: 21 дек 2006, 19:56
Откуда: Украина, г.Одесса
прог. языки: Delphi и С

Re: Робот-Пылесос

Сообщение loid » 19 ноя 2007, 11:58

Если я правильно понял, то это выглядит примерно так: Создаю вне функции main() прерывание и там всё описываю что будет происходить когда будет прерывание. Это понятно. А где само условие срабатывания прерывания то писать?
Аватара пользователя
loid
 
Сообщения: 349
Зарегистрирован: 16 окт 2007, 11:57
Откуда: Минycинck

Re: Робот-Пылесос

Сообщение Digit » 19 ноя 2007, 12:08

условие в регистрах настройки прерываний. у каждого прерывания свой регистр, который залает его работу. В даташите на контроллеры есть раздел по прерываниям, где таблички с регистрами и описание...
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Робот-Пылесос

Сообщение loid » 19 ноя 2007, 12:29

Смотрел щас datasheet на atmega16 и не нашел где было бы написано про прерывания. Расскажите на "пальцах", а то что то не доходит до меня. А лучше кусок кода с хорошим пояснением. Заранее благодарен! :)
Аватара пользователя
loid
 
Сообщения: 349
Зарегистрирован: 16 окт 2007, 11:57
Откуда: Минycинck

Re: Робот-Пылесос

Сообщение Digit » 19 ноя 2007, 13:07

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

Так что ты лукавишь, что в даташите нет ничего! ;) В документе почти на 360 страниц есть все! 8)
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Робот-Пылесос

Сообщение EdGull » 19 ноя 2007, 16:00

да я так понимаю ему даже книжку на русском лень прочесть!!!
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Робот-Пылесос

Сообщение Digit » 19 ноя 2007, 16:11

EdGull, ну чего ты так! :) Я ж вижу все :) Поэтому даю только ссылки...
А ты вот так - с плеча... Не педагогично! :no:
:D
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Робот-Пылесос

Сообщение SSG » 19 ноя 2007, 17:23

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

Ничего опрашивать не надо, эта процедура будет выполняться автоматически при возникновении указанного в КодВизаде события.
I live My life!
Аватара пользователя
SSG
 
Сообщения: 1058
Зарегистрирован: 15 янв 2007, 19:23
Откуда: Беларусь, Барановичи
прог. языки: С для МК, Delphi для ПК

Re: Робот-Пылесос

Сообщение loid » 23 ноя 2007, 10:53

Ну эти прерывания. :bad: Поэкспериментировал с ними и датчиками мышыными. Получается одна фигня. Нужно на каждый датчик по контроллеру весить. Ну или один контроллер на 2 датчика, а то если напрямую чипом опрашивать - ... В замен прерываний - сдалаю скорость шасси не высокую (при уборке реактивного движения не нужно), датчик движения будет посылать импульсы не с такой интенсивностью. Как сделаю - покажу. :roll:
... если конечно трудностей не возникнет ...
Аватара пользователя
loid
 
Сообщения: 349
Зарегистрирован: 16 окт 2007, 11:57
Откуда: Минycинck

Re: Робот-Пылесос

Сообщение Myp » 23 ноя 2007, 10:59

на 1 прерывание можно повесить стока датчиков скока есть свободных ног у МК

вешаем на каждую ногу по датчику и дублируем на ногу внешнего прерывания
тобишь на 1 ноге прерывания сходится полтора десятка выводов от датчиков

при срабатывании любого датчика входим в прерывание и проверяем какая из всех ног сработала.
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Робот-Пылесос

Сообщение Digit » 23 ноя 2007, 11:16

Myp писал(а):вешаем на каждую ногу по датчику и дублируем на ногу внешнего прерывания
тобишь на 1 ноге прерывания сходится полтора десятка выводов от датчиков


тока не просто дублируем, а через диод... а то это на всех ногах будет одно и то же :)
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Re: Робот-Пылесос

Сообщение Myp » 23 ноя 2007, 12:43

ага
ну я в общих чертах описал

ато человек растроился чтото из за прерываний :cry:
Аватара пользователя
Myp
скрытый хозяин вселенной :)
 
Сообщения: 18018
Зарегистрирован: 18 сен 2006, 12:26
Откуда: Тверь по прозвищу Дверь
прог. языки: псевдокод =) сила в алгоритме!
ФИО: глубокоуважаемый Фёдор Анатольевич

Re: Робот-Пылесос

Сообщение loid » 23 ноя 2007, 13:01

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

Жутко интересно как работает опто-механическая мышь. Я имею ввиду как она за этим всем успевает. Конечно если её перемещать очень быстро - она тоже будет "подгонять". Вообще у меня такая идея - взять полностью плату контроллера мыши и соединить её с шасси робота. Вот только не знаю как принимать от неё сигналы перемещения.
Аватара пользователя
loid
 
Сообщения: 349
Зарегистрирован: 16 окт 2007, 11:57
Откуда: Минycинck

Re: Робот-Пылесос

Сообщение Digit » 23 ноя 2007, 14:13

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

ЗЫ
Кстати, как ты думаешь, а почему у МК есть дивайс, называемый "таймер\счетчик"? :roll:
злой полицейский
Аватара пользователя
Digit
 
Сообщения: 3339
Зарегистрирован: 27 ноя 2004, 00:42
Откуда: совсем Москва
ФИО: Григорий

Пред.След.

Вернуться в Идеи

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 37