Да чтож такое. Пытаюсь использовать Input Capture на меге16а, а оно беспрерывно генерит Input Capture прерывания, хотя не должно. Уже вроде все что можно попробовал. На ICP1 включил внутреннюю подтяжку, оставлял пин без провода, снаружи к плюсу подтягивал. Noise canceler включил, выключил на всякий пожарный компаратор и даже AIN1 к плюсу подтянул, менял фронт срабатывания. Ну никак.
В гугле нашел несколько случаев такой проблемы, но без решений. Бывало у кого-нибудь так?
UPD: Выяснил, что начинает спамить прерыванием после первого переполнения счетчика. Что это значит пока не понял.
В ходе выяснения обнаружил баг студии. В режиме WGM = 12 в студии таймер не считает, если OCR1A = 0, т.к. срабатывает флаг прерывания по сравнению на первом же счете. Сразу показалось, что это не правильно, так оно и вышло. В МК в этом режиме таймер как минимум не обращает внимания на флаг по сравнению. Непонятно пока до куда считает. По даташиту вроде должен обнуляться при Input Capture Flag.
UPD1: Так... не может же оно обнуляться на первом же такте после переполнения из-за того, что ICR1 = 0? И ставить флаг ICF1. Это же нелогично?
До первого переполнения вроде никак на уровень на ноге ICP1 не реагирует.
Код инициализации и прерывания:
OUTI - макрос, пишет константу в I/O через регистр R17 (OSRG).
- Код: Выделить всё • Развернуть
OUTI DDRB, 1<<PB0
OUTI ACSR, 1<<ACD
OUTI PORTD, 1<<PD6
OUTI TCCR1B, 1<<WGM12|1<<WGM13|1<<CS10|1<<CS12
IN OSRG, TIMSK
ORI OSRG, 1<<TICIE1
OUT TIMSK, OSRG
- Код: Выделить всё • Развернуть
TIMER1_CAPT: CLI
PUSH OSRG
SBI PORTB, 0 ; моргаем
SBIC PINB, 0
CBI PORTB, 0
OUTI UDR, 111
POP OSRG
SEI
RETI