Arduino код на Attiny13
- Войдите на сайт для отправки комментариев
Чт, 03/05/2018 - 01:40
volatile int length = 0;
volatile int start_time = 0;
void setup() {
Serial.begin(9600);
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
}
void loop() { }
//Обработчик прерывания на возрастание сигнала
void rising() {
// Привязываем к Pin2 прерывание по срезу сигнала
attachInterrupt(0, falling, FALLING);
//сохраняем значение времени начала импульса
start_time = micros();
}
//Обработчик прерывания по срезу сигнала
void falling() {
// Привязываем к Pin2 прерывание по фронту сигнала
attachInterrupt(0, rising, RISING);
//сохраняем значение длительности импульса
length = micros() - start_time;
if (length<1000) Serial.println("werty");
else Serial.println(length);
}
Подскажите пожалуйста. как можно этот код подогнать под Attiny13. Пин Attiny13 на внешнее прерывание PB1. Не пойму как в Attiny13 сделать прерывание по спаду.По фронту вызываем вектор прерывания ISR(INT0_vect) где выполняем start_time = micros();, а как прописать прерывание по спаду не понимаю.
Тут целая тема есть про attiny и там же масса примеров в том числе и по прерыванию
#define F_CPU 1200000UL #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> volatile int length = 0; volatile int start_time = 0; ISR(INT0_vect) { while (PINB & (1<<PB1)) //пока высокий уровень { length = micros() - start_time;//считаем длительность импульса до спада } if (length<1200) PORTB |= (1 << PB4); if (length>1500) PORTB &= ~ (1 << PB4); } int main() { DDRB |= (1 << PB4); // OUTPUT PORTB &= ~ (1 << PB4); DDRB &= ~(1 << PB1); // INPUT PORTB |= (1 << PB1); rising(); while (1) { } } void rising() { MCUCR |= (1 << ISC01) | (1 << ISC00); //включаем прерывание по нарастающему фронту GIMSK |= (1 << INT0); //разрешаем прерывание start_time = micros(); sei(); } }Не понимаю, почему этот код не работает? Посмотрите пожалуйста в чем ошибка?