Michael_K писал(а):Не нужно заниматься шапкозакидательством. Представьте, что в проце есть еще пара прерывний и задач, помимо чтения энкодеров, и радужные картинки тут же исчезнут.
Я могу ошибаться и, к сожалению, часто это случается, но я стараюсь думать башкой, когда я что-то делаю. И вот пока в том, чтобы этот энкодер завести на любом пике в рамках условий, обозначенных ТС в этой теме, я не вижу никаких проблем.
dccharacter писал(а):чтобы этот энкодер завести на любом пике в рамках условий, обозначенных ТС в этой теме, я не вижу никаких проблем.
Пожалуйста, скомпилируйте приведенный вами пример кода дла энкодера под "любой" ПИК и оцените, за какое время выполняется обработчик прерывания (в симуляторе например) от момента возникновения события, до выхода из обработчика. Если не лень, конечно. Просто интересно.
Сначала i2c. Потом - обязательно. Самому интересно.
Добавлено спустя 1 минуту 5 секунд: Хотя если знаете и подскажете как сделать в MPLab эту оценку, то, вероятно, сегодня вечером сделаю.
Добавлено спустя 2 минуты 29 секунд: Ну что, попробуем Simulator Stopwatch
The Stopwatch dialog can time a section of code as it run in the simulator. The Stopwatch calculations are based upon the instructions executed and the setting entered for the Processor Frequency. The processor frequency is set to 20 Mhz in this example. From the number of instruction cycles executed, the total time is calculated. This is the time it would take to run on a real chip.
The stopwatch has two pairs of readouts, one displays the total simulated clock cycles and the corresponding execution time, and the other can be zeroed out, to make a measurement from one breakpoint to the next. The stopwatch is one way to measure time in the simulator, but there is another:
Добавлено спустя 8 минут 40 секунд: Такое пойдет???
Ну вообще на моторе всего 5000 об максимум (мотор китайский, так что ссылки на него нет). Я пока еще управление не разработал. Те мотор запитан напрямую и крутится на максимум. Сделал вывод положения через последовательный порт - вообще перестало работать. Попробовал хотя бы несколько операций добавить - то же фигня выходит. Т.е. контроллер вообще ничего кроме подсчета с энкодера считать не может. Так что я даже и не знаю - как проверить успевает или нет ) Код вот от сюда брал http://www.arduino.cc/playground/Main/RotaryEncoders. Если самому вал мотора крутить, то всё ОК )) Спасибо за XMEGA вот примерно то, о чем я спрашивал. Подключил и прочитал. Только вот интересно - на STM32 такое есть? Нельзя же все контроллеры выучить. Я пока только PIC16 и Arduino умею. Хотел вот еще STM32 изучить. Впечатлила его цена и некоторые примеры.
че-то я не понял, где в приведенном коде прерывания. А вот сериал на 9600 я там вижу. И отправку по сериалу две телеги с отчетами вижу. Конечно оно только при вращении рукой работает...
Добавлено спустя 1 минуту 1 секунду: а, туплю, ниже еще есть код
Добавлено спустя 47 секунд: И, кстати, спасибо, хоть посмотрю как интеррапты на ардуине прикручиваются ))
Че-то крутовато. Один pic16f1827 придется полностью выделить под три энкодера без возможности считать с него эти данные. Или я чего опять не так насчитал?
Добавлено спустя 2 минуты 59 секунд: Да нет, все, похоже, правильно... И это при частоте 32МГц...
Добавлено спустя 33 секунды: Michael_K, спасибо за науку
Дергайте прерывание только если поменялся один бит, подозреваю, что точность в 4000 кликов на оборот нафиг не нужна при скорости 100 оборотов в секунду.
Дергайте прерывание только если поменялся один бит, подозреваю, что точность в 4000 кликов на оборот нафиг не нужна при скорости 100 оборотов в секунду.
ну цикл - это 4 такта же? а мы и дергаем 1024 раза за оборот.
АААААААААААА, я запутался. Такт - это 4 цикла!!!! Тьфу, все, я выбываю.
Последний раз редактировалось dccharacter 17 мар 2011, 18:18, всего редактировалось 1 раз.
Смотрите ниже - будут и прерывания. Если Serial.print (encoder0Pos); убрать, то оно может и работает, только как это понять? У меня индикатора на Arduino нет. Делал скорость COM-порта выше - не помогло. Пробовал, чтоб вместе с прерыванием выполнялся другой код - выполняется, но очень медленно. прерывание большую часть времени активно. Нашел в STM32 поддержку энкодера. Я искал по слову encoder, а в документации эта функция как decoder описана. Осталось теперь примерчик добыть. Может есть у кого?