Итак, я использую ATMega168 с NerdKits и подключите к нему ЖК-дисплей, используя два прерывания INT0 и INT1. Я хочу подключить монитор сердечного ритма Grove, который я подключил к PCINT1 и попытался включить и использовать
void hrm_init()
{
//clear pin
DDRB &= ~(1<<DDB0);
PORTB |= (1<<PORTB0);
//turn on pull up
PCICR |= (1<<PCIE0); //enable pcint 1
PCMSK0 |= (1<<PCINT1); //Trigger on change of PCINT1 (PB1)
sei();
}
ISR(PCINT0_vect)
{
uint8_t changedBits;
changedBits = PINB ^ porthistory;
porthistory = PINB;
//pin has changed
if (changedBits & (1<<PB1))
{
beats += ((PINB & _BV(PB1)) ? 1 : 0); //add a beat on the rising edge
}
}
(Код счетчика ударов украден у кого-то в сети, отсюда и использование макроса.)
Это работает в большинстве случаев, но может добавить дополнительные удары здесь и там, я видел целых 10, в то время как у меня также есть прерывание по таймеру (которое я буду использовать для расчета ударов в минуту).
void clock_init()
{
TCCR0A |= (1<<WGM01);
TCCR0B |= (1<<CS02) | (1<<CS00);
OCR0A = 143;
TIMSK0 |= (1<<OCIE0A);
}
SIGNAL(SIG_OUTPUT_COMPARE0A) {
the_time++;
if (the_time > 500)
{
bpm = beats;
bpm *= 12; //60 seconds divided by 5
the_time = 0;
beats = 0;
}
}