keine Ahnung ob meine Posts einen Mehrwert bieten, aber ich will noch kurz den Code für einen Arduino UNO posten. Damit habe ich vorhin erfolgreich den Drehzahlmesser an der XT betrieben. Für einen ATTiny85 müsste man den noch auf TIMER1 umstellen. Da ein ATTiny85 mit einer anderen Taktfrequenz arbeitet, müssen auch noch prescaler und OCRx angepasst werden.
Code: Alles auswählen
#include <avr/sleep.h>
const uint8_t INPUT_PIN = 2; // INT0
const uint8_t OUTPUT_PIN = LED_BUILTIN; // Pin 13
enum TimerState {
OUTPUT_PULSE,
IGNORE_PULSES
};
volatile TimerState timerState = OUTPUT_PULSE;
void isrInt0() {
EIMSK &= ~(1 << INT0); // INT0 off
TCNT2 = 0; // Reset TIMER2
TIFR2 = (1 << OCF2A); // Clear compare flag
OCR2A = 187; // ~3 ms
TIMSK2 |= (1 << OCIE2A); // Activate TIMER2 compare interrupt
TCCR2B = (1 << CS22) | (1 << CS21); // Set prescaler to 256
digitalWrite(OUTPUT_PIN, HIGH);
}
ISR(TIMER2_COMPA_vect) {
TCCR2B = 0; // Stop TIMER2
TIMSK2 &= ~(1 << OCIE2A); // Compare interrupt off
switch(timerState) {
case OUTPUT_PULSE: {
timerState = IGNORE_PULSES;
digitalWrite(OUTPUT_PIN, LOW);
TCNT2 = 0; // Reset TIMER2
TIFR2 = (1 << OCF2A); // Clear compare flag
OCR2A = 250; // ~4 ms
TIMSK2 |= (1 << OCIE2A); // Activate TIMER2 compare interrupt
TCCR2B = (1 << CS22) | (1 << CS21); // Set prescaler to 256
break;
}
case IGNORE_PULSES: {
timerState = OUTPUT_PULSE;
EIFR = bit(INTF0); // Clear pending INT0 flag
EIMSK |= (1 << INT0); // INT0 on
break;
}
}
}
void setup() {
pinMode(OUTPUT_PIN, OUTPUT);
digitalWrite(OUTPUT_PIN, LOW);
pinMode(INPUT_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(INPUT_PIN), isrInt0, RISING);
// Set TIMER2 to CTC mode
TCCR2A = (1 << WGM21);
TCCR2B = 0;
TCNT2 = 0;
set_sleep_mode(SLEEP_MODE_IDLE);
}
void loop() {
sleep_mode();
}