Спасибо, нашёл в чем дело, это моя не внимательность.
Но после того как программа заработала правильно, возникли другие вопросы. 1. При уменьшении времен характеризующих импульсы происходит не прореживание, а уменьшение их количества. 2. Как понять по фронту или спаду возникло прерывание на PCINT? Чтением значения соответствующего пина? Соответственно, если задействовано несколько PCINT, как понять с какого пина пришло прерывание? Так же? 3. Для того, что бы обработчик срабатывал не два раза на один импульс, а один делаю программный фильтр BitN++; if (BitN & 1) return; или BitN ^= 1; if (BitN & 1) return; Деление должно быть на два, а по факту делится на 4, без этого фрагмента на выходе 16 импульсов, с ним 4 (на входе всегда 8).
Код тестовой программы
#include <ioavr.h> #include <inavr.h>
#define CS PINB_Bit1 #define CLOCK PINB_Bit2 #define DATA PINB_Bit3 #define OUT_TIM PORTB_Bit0
unsigned char Nbit = 0; struct { unsigned SetBit : 1; unsigned WriteData : 1; unsigned ResetData : 1; };
#pragma vector = PCINT0_vect __interrupt void PCINT0_(void) { BitN++; if (BitN & 1) return; OUT_TIM = 1; OUT_TIM = 0; }
#pragma vector = INT0_vect __interrupt void INT0_(void) { BitN = 0; }
void main( void ) { CLKPR = (1 << CLKPCE); CLKPR = (1 << CLKPS2);
SetBit = 1; WriteData = 0; ResetData = 1;
GIMSK |= (1 << INT0) | (1 << PCIE); PCMSK |= (1 << PCINT2); MCUCR |= (1 << ISC00) | (1 << ISC01);
DDRB = 0x11; // 01 0001 PORTB = 0x2E; // 10 1110 __enable_interrupt();
OUT_TIM = 1; while (1) { } }
|