Выбрал atmega325 из-за дешевизны и уже кусаю локти..
Завел сигнал (прямоугольные импульсы) на вход PE2 (PCINT2). Понятно, что на входе есть 0 и 5В.
Инициализирую: DDRE = BIT1; // TXD PORTE = BIT2; // PullUp for PE2
EICRA = (1<<ISC01); EIMSK = (1<<INT0)|(1<<PCIE0); // INT0 + PCIE0 PCMSK0 = PCINT2; // RPM interrupt;
sei(); /* enable interrupts */ bla..bla
Обработчик: ISR(PCINT0_vect) { /* signal handler for external interrupt pcint2 */ rpm1++; }
По таймеру считываю значение переменной rpm и сбрасываю её в 0, значение передаю по UART. В состоянии покоя линии PE2 (смотрю осциллографом) обработчик PCINT0_vect успевает насчитать 90-96 импульсов за 100мс. Интересный эффект. Делаю проверку на состояние линии, чтобы считать только перепады по одной линии: считает всего 2-3 импульса за 100мс (реально порядка 40 имп/100мс). Пробовал очищать флаг EIFR |= 1<<PCIF0; - опять 2 импульса считает вместо 40.
Кто-нибудь может объяснить где я накосячил?
P.S. Завел тот же сигнал на INT0 - считает всё четко и как надо!
|