#include <Arduino.h>
#define OUTPUT_PIN PB0
#define BUTTON_PLUS PB1
#define BUTTON_MINUS PB2
#define TRIGGER_PIN PB3
volatile uint8_t pulse_width = 10; // Startwert: 0,1ms (10 * 0,01ms)
const uint8_t min_pulse_width = 10; // 0,1ms
const uint8_t max_pulse_width = 25; // 0,25ms
volatile bool trigger_received = false;
void setup() {
// Pins als Input bzw. Output setzen
pinMode(OUTPUT_PIN, OUTPUT);
pinMode(BUTTON_PLUS, INPUT_PULLUP);
pinMode(BUTTON_MINUS, INPUT_PULLUP);
pinMode(TRIGGER_PIN, INPUT);
// Externen Interrupt auf dem Trigger-Pin aktivieren
GIMSK |= _BV(PCIE);
PCMSK |= _BV(PCINT3);
// Timer1 initialisieren
TCCR1 = 0; // Timer1 ausschalten
GTCCR |= _BV(PSR1); // Timer1 Prescaler zurücksetzen
// Timer1 im CTC-Modus (Clear Timer on Compare Match) konfigurieren
TCCR1 |= _BV(CTC1);
// Output-Compare-Interrupt aktivieren
TIMSK |= _BV(OCIE1A);
// Timer1 starten mit Prescaler 64
TCCR1 |= _BV(CS12) | _BV(CS11);
// Initialen Compare-Match-Wert setzen
updatePulseWidth();
}
void updatePulseWidth() {
// Berechne Compare-Match-Wert basierend auf der gewünschten Pulsweite (in 0,01ms Schritten)
OCR1C = pulse_width * 2; // 1 Takt = 0,005ms bei 8 MHz und Prescaler 64
}
ISR(TIMER1_COMPA_vect) {
// Umschalten des Ausgangs-Pins
digitalWrite(OUTPUT_PIN, !digitalRead(OUTPUT_PIN));
}
ISR(PCINT0_vect) {
// Trigger-Signal empfangen
if (digitalRead(TRIGGER_PIN) == HIGH) {
trigger_received = true;
}
}
void loop() {
// Taster-Eingaben verarbeiten
if (digitalRead(BUTTON_PLUS) == LOW) { // Taster gedrückt (auf Masse)
if (pulse_width < max_pulse_width) {
pulse_width++;
updatePulseWidth();
delay(200); // Debounce und Schutz vor zu schneller Änderung
}
}
if (digitalRead(BUTTON_MINUS) == LOW) { // Taster gedrückt (auf Masse)
if (pulse_width > min_pulse_width) {
pulse_width--;
updatePulseWidth();
delay(200); // Debounce und Schutz vor zu schneller Änderung
}
}
// Ausgangspuls erzeugen, wenn ein Trigger-Signal empfangen wurde
if (trigger_received) {
trigger_received = false;
// Setze den Ausgangspin für die Dauer des Pulses auf HIGH
digitalWrite(OUTPUT_PIN, HIGH);
delayMicroseconds(pulse_width * 10); // Dauer des Pulses in Mikrosekunden (0,01ms Schritte)
digitalWrite(OUTPUT_PIN, LOW);
}
}