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

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

lizard66

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

slav0n

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

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4680
(Нет темы)
« Ответ #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

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

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4680
(Нет темы)
« Ответ #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

  • .
  • *
  • Сообщений: 145
(Нет темы)
« Ответ #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

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

slav0n

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

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

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

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4680
код энкодера с антидребезгом
« Ответ #38 : 13 Январь 2018, 13:54:00 »
мне тут на одной тусовке загоняли что дескать мой код 100% ловит дребезг, а конденсаторы параллельно контактам ставить низзя ("ток через них будет 30А и они быстро выйдут из строя"). От смешные, ей богу.
 Ну ладно, вот мод кода, уже с антидребезгом:
static u8 old, olddir;
u8 clk=PINC&(1<<4),dir=PINC&(1<<5);//смотрим ноги
 if(olddir==dir)
 if(old&&!clk){//ловим задний фронт, здесь монопенисуально old&&clk==0
      if(!dir)DATA++;//тудом
      else   DATA--;//сюдом
 }
old=clk;
olddir=dir;
while(1||!1);
зберігай спокій

slav0n

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

slav0n

  • Администратор
  • .
  • *****
  • Сообщений: 4680
алгоритм Б
« Ответ #40 : 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

  • Администратор
  • .
  • *****
  • Сообщений: 4680
Re: Исходники, алгоритмы.
« Ответ #41 : 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

  • Администратор
  • .
  • *****
  • Сообщений: 4680
Re: Исходники, алгоритмы.
« Ответ #42 : 28 Январь 2019, 08:36:59 »


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