Автор Тема: Исходники, алгоритмы.  (Прочитано 12726 раз)

0 Пользователей и 1 Гость просматривают эту тему.

lizard66

  • .
  • *
  • Сообщений: 147
  • Карма: +0/-0
(Нет темы)
« Ответ #30 : 31 Июль 2017, 22:24:13 »
Цитата: "slav0n"
вставляется в тело прерывания
Может лучше old сделать volatile?

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
(Нет темы)
« Ответ #31 : 01 Август 2017, 02:48:54 »
зачем? мой компилятор тут совершенно не реагирует на этот модификатор
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
(Нет темы)
« Ответ #32 : 01 Август 2017, 11:39:58 »
кстати, очевидно, что сигнальные ноги энкодера совершенно равнозначны
вот код-эквивалент:
Код
   static u8 old;
   u8 clk=PINC&(1<<4),dir=PINC&(1<<5);//смотрим ноги
   if(old&&!clk){//ловим задний фронт, здесь монопенисуально old&&clk==0
      if(!dir)DATA++;//тудом
      else   DATA--;//сюдом
   }
   old=clk;
while(1||!1);
зберігай спокій

lizard66

  • .
  • *
  • Сообщений: 147
  • Карма: +0/-0
(Нет темы)
« Ответ #33 : 01 Август 2017, 20:26:40 »
Цитата: "slav0n"
зачем? мой компилятор тут совершенно не реагирует на этот модификатор
В случае иcпользования приведенного кода в прерьівании, каждьій раз когда old будет задействована в конструкции, ее значение будет обновляться в регистре из рамьі.

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
(Нет темы)
« Ответ #34 : 01 Август 2017, 21:37:06 »
хм... кто-нибудь разницу видит? я нет

Код
	static u8 old;	
u8 clk=PINC&(1<<4),dir=PINC&(1<<5);
    2228: a3 b3       in r26, 0x13 ; 19
    222a: a0 71       andi r26, 0x10 ; 16
    222c: 33 b3       in r19, 0x13 ; 19
if(old&&!clk){//ловим задний фронт
    222e: 80 91 0b 01 lds r24, 0x010B
    2232: 88 23       and r24, r24
    2234: 09 f4       brne .+2       ; 0x2238 <__vector_11+0x10e>
    2236: 46 c0       rjmp .+140     ; 0x22c4 <__vector_11+0x19a>
    2238: aa 23       and r26, r26
    223a: 09 f0       breq .+2       ; 0x223e <__vector_11+0x114>
    223c: 43 c0       rjmp .+134     ; 0x22c4 <__vector_11+0x19a>
...........
old=clk;
    22c4: a0 93 0b 01 sts 0x010B, r26
Код
	volatile static u8 old;	
u8 clk=PINC&(1<<4),dir=PINC&(1<<5);
    2228: a3 b3       in r26, 0x13 ; 19
    222a: a0 71       andi r26, 0x10 ; 16
    222c: 33 b3       in r19, 0x13 ; 19
if(old&&!clk){//ловим задний фронт
    222e: 80 91 0b 01 lds r24, 0x010B
    2232: 88 23       and r24, r24
    2234: 09 f4       brne .+2       ; 0x2238 <__vector_11+0x10e>
    2236: 46 c0       rjmp .+140     ; 0x22c4 <__vector_11+0x19a>
    2238: aa 23       and r26, r26
    223a: 09 f0       breq .+2       ; 0x223e <__vector_11+0x114>
    223c: 43 c0       rjmp .+134     ; 0x22c4 <__vector_11+0x19a>
...........
old=clk;
    22c4: a0 93 0b 01 sts 0x010B, r26
while(1||!1);
зберігай спокій

lizard66

  • .
  • *
  • Сообщений: 147
  • Карма: +0/-0
(Нет темы)
« Ответ #35 : 01 Август 2017, 22:41:01 »
Цитата: "slav0n"
хм... кто-нибудь разницу видит? я нет

Код
	static u8 old;	
u8 clk=PINC&(1<<4),dir=PINC&(1<<5);
    2228: a3 b3       in r26, 0x13 ; 19
    222a: a0 71       andi r26, 0x10 ; 16
    222c: 33 b3       in r19, 0x13 ; 19
if(old&&!clk){//ловим задний фронт
    222e: 80 91 0b 01 lds r24, 0x010B
    2232: 88 23       and r24, r24
    2234: 09 f4       brne .+2       ; 0x2238 <__vector_11+0x10e>
    2236: 46 c0       rjmp .+140     ; 0x22c4 <__vector_11+0x19a>
    2238: aa 23       and r26, r26
    223a: 09 f0       breq .+2       ; 0x223e <__vector_11+0x114>
    223c: 43 c0       rjmp .+134     ; 0x22c4 <__vector_11+0x19a>
...........
old=clk;
    22c4: a0 93 0b 01 sts 0x010B, r26
Код
	volatile static u8 old;	
u8 clk=PINC&(1<<4),dir=PINC&(1<<5);
    2228: a3 b3       in r26, 0x13 ; 19
    222a: a0 71       andi r26, 0x10 ; 16
    222c: 33 b3       in r19, 0x13 ; 19
if(old&&!clk){//ловим задний фронт
    222e: 80 91 0b 01 lds r24, 0x010B
    2232: 88 23       and r24, r24
    2234: 09 f4       brne .+2       ; 0x2238 <__vector_11+0x10e>
    2236: 46 c0       rjmp .+140     ; 0x22c4 <__vector_11+0x19a>
    2238: aa 23       and r26, r26
    223a: 09 f0       breq .+2       ; 0x223e <__vector_11+0x114>
    223c: 43 c0       rjmp .+134     ; 0x22c4 <__vector_11+0x19a>
...........
old=clk;
    22c4: a0 93 0b 01 sts 0x010B, r26
Не в обработчике, а в основном приложении, где анализируется состояние old.

Мля, я гоню, DATA должен бьіть volatile :)

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
(Нет темы)
« Ответ #36 : 02 Август 2017, 04:13:17 »
Цитата: "lizard66"
я гоню, DATA должен бьіть volatile :)
про DATA отдельный разговор. Здесь я ее написал чисто условно, чтобы изобразить какое-то действие.
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
Re: Исходники, алгоритмы.
« Ответ #37 : 25 Декабрь 2017, 13:02:43 »
Цитата: "lizard66"
Не в обработчике, а в основном приложении, где анализируется состояние old.

Мля, я гоню, DATA должен бьіть volatile :)

lizard66 быстренько понял свою ошибку, а я объясню для всех:
переменная old просто физически не может анализироваться в основном приложении, т.к. она объявлена в обработчике
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
Win10 и WinAVR
« Ответ #38 : 24 Июнь 2018, 09:29:19 »
в связи с заменой жесткого диска поставил десятку вместо семерки, а компилятор WinAVR на десятке сходу и не заработал.
Для исправления ситуации заменяем старую этой dll  в utilsbin директории.
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
алгоритм Б
« Ответ #39 : 16 Декабрь 2018, 19:29:31 »
на днях попалось мне в неких обсуждениях упоминание алгоритма Брезенхема применительно к  управлению мощностью.
Я резонно спросил - а нафига оно тут?
Мне ответили - "алгоритм Б" используют что-бы равномерно распределить импульсы по времени.
я спросил - а почему-бы просто время не разделить на количество импульсов?
в ответ мне задали встречный вопрос - а дальше?

а дальше, вместо пространных измышлений, я по-быстрому написал следующий код, равномерно распределяющий pwr по периоду Т, безо всяких "алгоритмов Б":
Код
if(--cnt_T==0){
if(pwr>T/2){
pwr=T-pwr;
sig=0;
}else sig=1;
cnt_T=T;
cnt_p=pwr;
dt=T/pwr;
cnt_dt=dt;
}
PORT_out=~sig;
if(cnt_p--)
if(--cnt_dt==0){
cnt_dt=dt;
PORT_out=sig;
}
« Последнее редактирование: 16 Декабрь 2018, 19:49:41 от slav0n »
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
Re: Исходники, алгоритмы.
« Ответ #40 : 26 Декабрь 2018, 05:00:59 »
скорость писания кода повлекла логическую ошибку.
фикс:
Код
if(--cnt_T==0){
if(pwr>T/2){
pwr=T-pwr;
sig=0;
}else sig=1;
cnt_T=T;
cnt_p=pwr;
dt=T/pwr;
cnt_dt=dt;
}
PORT_out=~sig;
if(cnt_p)
if(--cnt_dt==0){
cnt_dt=dt;
PORT_out=sig;
                cnt_p--;
}
while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
Re: Исходники, алгоритмы.
« Ответ #41 : 28 Январь 2019, 08:36:59 »


while(1||!1);
зберігай спокій

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 5251
  • Карма: +6/-0
снова про энкодер
« Ответ #42 : 15 Февраль 2020, 05:37:03 »
Покажу вам универсальную функцию, которая успешно работает как для энкодера, так и для двух кнопок.
Тело:
Код
void encoder_parameter_change(int* param, int limit, s8 step, u8 direct, u8* accelerator){

if(!direct) step = -step;

if(limit > 40){//ускоритель
if(++(*accelerator) > 10){
step *= 10;
if(*accelerator > 25) *accelerator = 25;
CNT_short_Beep = 5;
}
}

int dat = *param + step;
int min=0, max=limit;

if(dat > limit) dat = max;
else if(dat < 0)dat = min;
else
CNT_short_Beep = 1;

*param = dat;
}

Использование для енкодера:
Код
static u8 oldclk, olddir;
u8 direct = PINC&(1<<4), clk = PINC&(1<<5);
if((olddir==direct) and (oldclk && !clk)){
encoder_parameter_change(Enc.ptdat, Enc.lim, Enc.stp, direct, &accelerator);
}
oldclk = clk;
olddir = direct;

для батонов:
Код
if((FLAGS.key_first_pressed or CNT_btn_lngprs==0) and (BTN_COD==B_Up or BTN_COD==B_Down)){	
static u8 accelerator;
if(FLAGS.key_first_pressed) accelerator =0;

encoder_parameter_change(Enc.ptdat, Enc.lim, Enc.stp, (BTN_COD==B_Up), &accelerator);

wait50ms();//delay quick repeat
}
while(1||!1);
зберігай спокій