Я хочу сделать очень короткий импульс после входного сигнала нарастающего фронта.
Сложность здесь в том, что я хотел бы контролировать (с высоким разрешением) время задержки перед моим импульсом и продолжительность моего импульса. Я могу легко контролировать это, просто соединяя вместе nops, жестко кодируя задержки, но я не уверен, как это сделать для какой-то произвольной задержки с тем же уровнем точности.
После многих головных болей в погоне за таймерами, а затем, в конце концов, осознания того, что я в конечном итоге ограничен временем входа/выхода подпрограммы прерывания, теперь я пытаюсь контролировать свою задержку с помощью nops.
Я предполагал, что этот оператор переключения C будет тем, что я хотел (после компиляции, надеясь, что он станет эффективным и просто изменит счетчик программ на нужное место), но он приводит к очень странному поведению...
switch(delayTime){
case 10:
__asm__ __volatile__("nop");
case 9:
__asm__ __volatile__("nop");
case 8:
__asm__ __volatile__("nop");
case 7:
__asm__ __volatile__("nop");
case 6:
__asm__ __volatile__("nop");
case 5:
__asm__ __volatile__("nop");
case 4:
__asm__ __volatile__("nop");
case 3:
__asm__ __volatile__("nop");
case 2:
__asm__ __volatile__("nop");
case 1:
__asm__ __volatile__("nop");
}
PORTD = 0x10;
...
В идеале я хотел бы, по сути, запустить какой-то код, который скомпилируется в это: (это какой-то странный псевдокод C и ассемблера, но я все еще не уверен, как это сделать на ассемблере)
0x005 Reg1 = 0xFF-val1 %(where somehow 0xFF is known? / found out?)
0x006 Reg2 =0x1FF-val2
0x007 IJMP Reg1
0x008 NOP
0x009 NOP
0x00A NOP
...
0x0FF MOV 0x40, PORTD % assign the value 0x40 to the static variable "PORTD"
0x100 IJMP Reg2
0x101 NOP
0x102 NOP
0x103 NOP
0x104 NOP
...
0x1FF MOV 0x00, PORTD % assign the value 0x00 to the static variable "PORTD"
Я просто в целом не уверен, как найти место в памяти для кода после/во время выполнения, чтобы аспекты «0xFF» и «0x1FF» этой программы не были такими уж плохими (похоже, это очень опасно просто, получить сборку кода, а затем жесткий код, который в... Я бы предпочел этого не делать). Кроме того, хотя легко просто залить его более чем 200 nops, как заставить команду IJMP вести себя так, как я хочу? (Честно говоря, я даже не знаю, нужна ли мне эта команда).
Думаю, в целом я ищу какую-то команду сборки (которую я не могу найти), которая позволяет мне «добавить N в счетчик программ», и я могу просто убедиться, что эта команда выполняется в сборке с по крайней мере N +1 команды сборки перед ним, жестко запрограммированные.
В качестве примечания, все это выполняется внутри процедуры прерывания, поэтому я не чувствую себя так плохо, играя с ПК... Кроме того, я знаю, что это довольно плохая блокировка до 500 операций, но для задача под рукой, время важнее, чем то, насколько сильно это блокирует как рутину.