|
|
  |
Изменение текста программы при смене компилятора и чипа |
|
|
|
Apr 7 2011, 11:45
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Да, наверно я немного не так выразился.Используется оптический энкодер, по коду всё считает, но в железе идёт проскок в индикации на 10-15 позиций. Похоже на дребезг, но установка задержек результатов не даёт(( И может подскажите, что я упускаю при инициализации прерываний по изменению состояния выводов(не INTn) Код GIMSK = (1 << PCIE); //инициализация внешнего прерывания по изменению состояния PCMSK = (1 << PCINT1); //вывода PB1 который сконвигурирован на вывод ...................... ISR(PCINT_vect) {//обработчик прерывания по изменению состояния на выводе ............... } Вроде весь даташит перелопатил, всё перепробовал, а компилятор ругается.
|
|
|
|
|
Apr 9 2011, 08:25
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата(sigmaN @ Apr 8 2011, 09:58)  что конкретно говорит компилятор?
нет, ну если задержка вставлена в нужном месте - должна помогать по идее.
корденсатор не помогает? Компилятор поглючил и успокоился, всё компилится без проблем. Но вот дребезг лечится не до конца,нет-нет и скакнет на 1-2 позиции.Может мне в обработчике сбрасывать флаг следующего прерывания если он установится? Вот обработчик прерываний Код ISR(PCINT_vect) { if (!(PINB & 1 << InValcoder)) { //если смена 1 на 0 то этот импульс не считаем _delay_ms(300); return; } else {
if (!(PIND & 1 << Button_R)) { //если нажата кнопка S1 _delay_ms(300); Impuls++; //счётчик импульсов увеличиваем на 1 } if (!(PIND & 1 << Button_L)) { //если нажата кнопка S2 _delay_ms(300); Impuls--; //счётчик импульсов уменьшаем на 1 } } } Если помните схему, там по входу два кондёра и дроссель(сопротивления я убрал), я думаю этого достаточно. Цитата(MaslovVG @ Apr 8 2011, 10:38)  А аппаратно прерывание на каждом из фронтов входных сигналов (обоих)? Не понял, это как, объясните новичку. Кстати энкодер с одинарной оптопарой т.к. знать направление вращения мне не надо. И вопросик по Протеусу. Не пойму как заставить читать его eeprom?
Сообщение отредактировал RW6MKA - Apr 10 2011, 05:17
|
|
|
|
|
Nov 26 2011, 12:36
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата(Палыч @ Nov 26 2011, 16:21)  Как же тогда Ваш прибор определит: 1) это Вы выдернули вилку из розетки, потому что прибор нужно выключить и идти отдыхать или 2) "эти козлы" вырубили электричество? Стоп, так это ж мой вопрос! Как это сделать?(я так думаю нужно чтобы во время вращения в EEPROM сохранялась какая нибудь метка, а при остановке она удалялась) Да, и попутно тогда ещё вопросик. Как сделать чтобы запись в EEPROM происходила каждый раз в новую ячейку ( в целях увеличения циклов записи в EEPROM)?
|
|
|
|
|
Nov 29 2011, 14:03
|
Частый гость
 
Группа: Участник
Сообщений: 163
Регистрация: 25-10-10
Из: Ростовская обл.
Пользователь №: 60 401

|
Цитата(sigmaN @ Nov 28 2011, 15:51)  Приветствую )) А индикатор положения у нас сейачс уже не резистор, а энкодер с мышки, да? Просто если всё ещё резистор - то проблема решается очень просто: при включении прибора он считывает последнее значение из EEPROM и вертит антену до совпадения её положения с этим значением. Ну а если не резистор, то крутить до упора, а потом возвращаться на известное кол-во шагов... Потому что как ни крути, а вариант с постоянной записью во время вращения всё равно не даёт 100% гарантии запоминания истинного положения + EEPROM заездить так можно значительно быстрее. Да и если вдруг антена изменила своё положение, пока прибор был выключен - при включении вся ваша индикация собъётся. Да, идикатором сейчас энкодер. Выставить в правильное положение не проблема, но при этом нужно что бы при включении что то напомнило что было отключение эл-гии. Вот простая напоминалка при включении и нужна (хотя это я представляю уже как исполнить) Вот поочерёдная запись ячеек EEPROM интересует. Я так понимаю нужно при записи всё время к адресу добавлять 1?
|
|
|
|
|
Nov 29 2011, 20:06
|

I WANT TO BELIEVE
     
Группа: Свой
Сообщений: 2 617
Регистрация: 9-03-08
Пользователь №: 35 751

|
toweroff, я так понимаю у вас стоит что-то вроде переменного резистора и таким образом моторчик в любой момент времени знает своё абсолютное положение относительно нуля. И это не зависит от питания! Крутим двигатель руками, резистор просто меняет своё сопротивление и в любой момент можно подать питание и узнать в каком положении сейчас вал. Но если же в качестве индикатора положения используется датчик относительного перемещения(а именно так оно и есть у автора), то тут и приходится при включении питания искать 0. Потому что энкодер ничего кроме информации о том на соклько "щелчков" и в какую сторону переместился вал - дать не может. Собственно по этой причине и нужно после включения отматываться до нуля и уже от него считать нужное кол-во щелчков. Любые другие алгоритмы управления в той или иной степени обречены на провал(при разных обстоятельствах). К этому можно прийти путём не сложных логических рассуждений  Но топикстартер всё равно сделает по-своему, записывая положение в ЕЕПРОМ каждую миллисекунду прямо во время вращения вала и будет изобретать как же эту самую ЕЕПРОМ не протереть за пол года работы девайса ) А ещё скажет, что перемещение антенны, пока девайс выключен - крайне маловероятно и это не аргумент. Но через те самые пол года эксплуатации таки накопится ошибка и индикация положения начнет портачить. Тогда и начнем следующую доработку ))
--------------------
The truth is out there...
|
|
|
|
|
  |
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0
|
|
|