Страница 3 из 3

Re: Прерывания

СообщениеДобавлено: 19 май 2017, 08:52
Андрей
ничего не узнал :(

Re: Прерывания

СообщениеДобавлено: 19 май 2017, 10:18
mim
andrewproffi писал(а):ничего не узнал :(

:o Читать и думать, смотреть все примеры и разбираться, почему так и не иначе...

Я знаю что все кто торопится они слепы...
Цитирую "На графике видно, что периодичность сигнала исчезла, значит, в работе прерывания происходят сбои. Но, почему? Что же произошло?Ведь оставалось еще 8,6 мкс, а увеличили паузу мы всего на 2 мкс.
Происходит это по двум причинам, из-за того что так написано прерывание в ФК (но мы попытаемся это исправить) и из-за работы компилятора который сохраняет (а затем восстанавливает) очень большой стек при уходе на подпрограмму (вот здесь мы ничего не сможем сделать, но в дальнейшем мы это попытаемся обойти, но только на AVR).
Таким образом, эти причины нужно всегда учитывать.
"

Читать и думать, смотреть все примеры и разбираться, почему так и не иначе...

Код: выделить все
0000007c <__vector_3>:

  7c:   1f 92          push   r1
  7e:   0f 92          push   r0
  80:   0f b6          in   r0, 0x3f   ; 63
  82:   0f 92          push   r0
  84:   11 24          eor   r1, r1
  86:   b8 9a          sbi   0x17, 0   ; 23
  88:   c0 9a          sbi   0x18, 0   ; 24
  8a:   b8 9a          sbi   0x17, 0   ; 23
  8c:   c0 98          cbi   0x18, 0   ; 24
  8e:   0f 90          pop   r0
  90:   0f be          out   0x3f, r0   ; 63
  92:   0f 90          pop   r0
  94:   1f 90          pop   r1
  96:   18 95          reti

Это то что будет выполняться в прерывании - тепрь берем умную книжку и делаем подсчет времени выполнения каждой команды ассемблера... суммируем и получаем минимальный период прерывания... чем больше переменных в прерывании тем больше период -> меньше частота...

Re: Прерывания

СообщениеДобавлено: 19 май 2017, 11:17
Андрей
ну а вообще чего я сюда полез: реально ли сделать два независимых генератора, на два выхода МК, один из которых дает 20кгц и хотябы 10 шагов регулировки скважности от 0 до 100%, а второй генерирует частоту от 20 до 60кгц?
я хотел попробовать сделать его на прерывании, но если в подпрограмму прерывания засунуть пару условий IF и увеличение переменной, то уже частота прерываний будет в районе 100кгц...
подскажите, можно ли выполнить такую задачу?

Re: Прерывания

СообщениеДобавлено: 19 май 2017, 12:24
mim
andrewproffi писал(а):реально ли сделать два независимых генератора
на 20кгц и 10 шагов скважности
второй генерирует частоту от 20 до 60кгц

Ты упорно не хочешь читать то где это проанализировали... тебе тупо хочется ответ...
Почему бы тебе самому не подсчитать сколько времени будет выполнять вот этот кусок кода...
if.jpg

Код: выделить все
00000104 <__vector_3>:
   {
 104:   1f 92          push   r1
 106:   0f 92          push   r0
 108:   0f b6          in   r0, 0x3f   ; 63
 10a:   0f 92          push   r0
 10c:   11 24          eor   r1, r1
 10e:   2f 93          push   r18
 110:   3f 93          push   r19
 112:   4f 93          push   r20
 114:   5f 93          push   r21
 116:   6f 93          push   r22
 118:   7f 93          push   r23
 11a:   8f 93          push   r24
 11c:   9f 93          push   r25
 11e:   af 93          push   r26
 120:   bf 93          push   r27
 122:   ef 93          push   r30
 124:   ff 93          push   r31
      FCM_mim();
 126:   90 df          rcall   .-224       ; 0x48 <FCM_mim>
 48:   80 91 60 00    lds   r24, 0x0060
  4c:   90 e0          ldi   r25, 0x00   ; 0
  4e:   88 23          and   r24, r24
  50:   09 f4          brne   .+2         ; 0x54 <FCM_mim+0xc>
  52:   91 e0          ldi   r25, 0x01   ; 1
  54:   90 93 60 00    sts   0x0060, r25
  58:   80 91 60 00    lds   r24, 0x0060
  5c:   88 23          and   r24, r24
  5e:   39 f0          breq   .+14        ; 0x6e <FCM_mim+0x26>
  60:   b8 9a          sbi   0x17, 0   ; 23
  62:   c0 9a          sbi   0x18, 0   ; 24
  64:   90 91 62 00    lds   r25, 0x0062
  68:   87 ec          ldi   r24, 0xC7   ; 199
  6a:   89 1b          sub   r24, r25
  6c:   04 c0          rjmp   .+8         ; 0x76 <FCM_mim+0x2e>
  6e:   b8 9a          sbi   0x17, 0   ; 23
  70:   c0 98          cbi   0x18, 0   ; 24
  72:   80 91 62 00    lds   r24, 0x0062
  76:   83 bd          out   0x23, r24   ; 35
  78:   08 95          ret
    }
 128:   ff 91          pop   r31
 12a:   ef 91          pop   r30
 12c:   bf 91          pop   r27
 12e:   af 91          pop   r26
 130:   9f 91          pop   r25
 132:   8f 91          pop   r24
 134:   7f 91          pop   r23
 136:   6f 91          pop   r22
 138:   5f 91          pop   r21
 13a:   4f 91          pop   r20
 13c:   3f 91          pop   r19
 13e:   2f 91          pop   r18
 140:   0f 90          pop   r0
 142:   0f be          out   0x3f, r0   ; 63
 144:   0f 90          pop   r0
 146:   1f 90          pop   r1
 148:   18 95          reti

andrewproffi писал(а):подскажите, можно ли выполнить такую задачу?
Нет... кроме того одно прерывание будет влиять на другое...

Re: Прерывания

СообщениеДобавлено: 19 май 2017, 12:50
Андрей
Я читаю, и эта информация будет полезна, я просто спросил: реально ли это сделать.
в приведенном коде примерно 55 ассемблерных операций, что для кварца 16Мгц займет примерно 3.5мкс времени.

Re: Прерывания

СообщениеДобавлено: 19 май 2017, 13:10
mim
Ты конечно же учел что команды могут выполняться 1,2 и 3 цикла?

Re: Прерывания

СообщениеДобавлено: 19 май 2017, 13:28
Андрей
я это понимаю, в данном расчете не учитывал. Спасибо.