пишу на СИ для пик
За раннее благодарен за оказанную помощ
Как-то уж больно часто показалось. Не вызывает ли так часто возникающее прерывание тормоза в основной программе и глюки различных интерфейсов со строго ограниченными таймингами (тот же 1-wire)?Smirnov писал(а):1. я сделал прерывание, 1000 раз в сек.
Код: Выделить всё
temp1=PORT&0x03; // Читаем энкодер, берём 2 бита
temp2=temp1; //запоминаем новое состояние енкодера
temp1=temp1 | old_encoder; // формируем из старого и нового состояние 4 бита
old_encoder=temp2<<2; // запоминаем старое состояние энкодра
temp1=enc_table[temp1]; // адресуемся по таблице, извлекаем из неё код события если есть
if (temp1!=0) event=temp1; //если извлекли не нулевой код события то записываем его в переменную нового события, сюда можно поставить добавление события в очередь событий.а можно посмотреть на этот проект? он уже реализовал аппаратно? если да, то видео может?Smirnov писал(а):Во первых задача была не сложная, это управление кучей лазеров, измерение их параметров, регулирование мощности по этим параметрам, применение цифровых фильтров и как результат адаптивной подстройки мощности по множеству параметров. А так же отработка менюшек на графическом дисплейчике 640х200.
Видео нет, ибо часть приборов шло воякам с соответствующими предостарожностями, это было 5 лет назад и я кое как выпросил видео для защиты диплома, до сегодняшнего дня оно не дожило и противоречит правилам форума ибо видео операции зрелище такое что даже если человек заверяет что ему безразлично то всё равно в лучшем случае отворачивается.ibiza11 писал(а):а можно посмотреть на этот проект? он уже реализовал аппаратно? если да, то видео может?
Может, и такие есть, но если имеется в виду инкрементирующий энкодер контактного типа как в регуляторах музыкальных центров/микроволновок, то мне попадались только такие у которых "импульс" короче чем "полпериода", а в равновесном положении оба контакта разомкнуты. Такой энкодер опрашивается так же, как если бы было просто две кнопки (плюс и минус) по принципу - кто первый тот и прав, т.е. какая первая кнопка нажата, та и обрабатывается, затем запрещается обработка до тех пор, пока обе кнопки не будут отпущены. На асме я сделал так:Meteor писал(а):Про энкодер.
.. Там формируется 2 импульса, один относительно другого сдвинут на "пол периода"...
Код: Выделить всё
_mainloop:
.
.
.
in r16,pinc ;разрешать ли прерывания по пинам?
andi r16,0x03
cpi r16,0x03
brne _mainloop
ldi r16,0
out pcifr,r16 ;очистка флагов
ldi r16,2
sts pcicr,r16 ;разрешить прерывания от энкодера
rjmp _mainloop
_pci1_int:
push r16
in r16,sreg
push r16
ldi r16,0
sts pcicr,r16 ;запрет pci1_int до особого распоряжения
in r16,pinc
andi r16,0x03 ;маска для PC0,PC1
cpi r16,0x01
breq _minus
cpi r16,0x02
breq _plus
rjmp _eoi2
_plus:
lds r16,T
cpi r16,250 ;правый упор
brsh _eoi2
inc r16
sts T,r16
rjmp _eoi2
_minus:
lds r16,T
cpi r16,30 ;левый упор
brlo _eoi2
dec r16
sts T,r16
rjmp _eoi2
_eoi2:
pop r16
out sreg,r16
pop r16
retiКод: Выделить всё
interrupt [EXT_INT0] encoder(void)
{
if(PIN*.*){delay_ms(2); temp=1;}
else {delay_ms(2);temp=0;};
}
задержка для защиты от дребезга (может у меня такой энкодер разболтаный, что сильный дребезг, но без задержки часто были ложные срабатывания).ooogo писал(а):ZUB а зачем делать пауза 2 мс ? впринципе можно и вприрывание необходимый код запихнуть.что конкретно нужно?а как быть со счетчиком нажатий на кнопку?