Цитата(otrog @ Jun 7 2008, 11:47)

Для работы с временами порядка микросекунд просто необходимо писать на ассемблере, и размещать все переменные в регистрах.
Если с асмом туго, рекомендую Algorithm Builder - графический ассемблер. Осваивается буквально за часы.
Успехов.
После компиляции программы посмотрел я lss-файл:
Код
ISR(TIMER1_COMPA_vect) //Прерывание по сравнению сигнала
{
190: 1f 92 push r1
192: 0f 92 push r0
194: 0f b6 in r0, 0x3f; 63
196: 0f 92 push r0
198: 11 24 eor r1, r1
19a: 8f 93 push r24
19c: 9f 93 push r25
19e: ef 93 push r30
1a0: ff 93 push r31
OCR1A = bound[count];
1a2: e0 91 68 00 lds r30, 0x0068
1a6: ff 27 eor r31, r31
1a8: ee 0f add r30, r30
1aa: ff 1f adc r31, r31
1ac: e0 5a subi r30, 0xA0; 160
1ae: ff 4f sbci r31, 0xFF; 255
1b0: 80 81 ld r24, Z
1b2: 91 81 ldd r25, Z+1; 0x01
1b4: 9b bd out 0x2b, r25; 43
1b6: 8a bd out 0x2a, r24; 42
count++;
1b8: 80 91 68 00 lds r24, 0x0068
1bc: 8f 5f subi r24, 0xFF; 255
1be: 80 93 68 00 sts 0x0068, r24
//Режим TOGGLE (инвертирование состояния вывода OC1A в последующем прерывании по сравнению)
TCCR1A|=_BV(COM1A0);
1c2: 8f b5 in r24, 0x2f; 47
1c4: 80 64 ori r24, 0x40; 64
1c6: 8f bd out 0x2f, r24; 47
TCCR1A&=~_BV(COM1A1);
1c8: 8f b5 in r24, 0x2f; 47
1ca: 8f 77 andi r24, 0x7F; 127
1cc: 8f bd out 0x2f, r24; 47
1ce: ff 91 pop r31
1d0: ef 91 pop r30
1d2: 9f 91 pop r25
1d4: 8f 91 pop r24
1d6: 0f 90 pop r0
1d8: 0f be out 0x3f, r0; 63
1da: 0f 90 pop r0
1dc: 1f 90 pop r1
1de: 18 95 reti
И понял, что получается полная лажа

Всего выполняется 37 asm-операций, а максимум должно быть 24. Как быть?
Может лучше такой вариант?:
1) Вызывать прерывания по захвату два раза в период (т.е. по возрастающему и ниспадающему фронтам).
2) При захвате каждого фронта определять прерывания по сравнению
3) В прерывании по сравнению делать задержку на 24 такта (т.е. 24 команды "nop")