Files
metronom/buzzer.ino
2022-10-09 21:36:40 +02:00

47 lines
935 B
C++

#include <Arduino.h>
SAMDTimer BuzzerTimer(TIMER_TC5);
bool attached = false;
void initBuzzer() {
pinMode(BUZZER_PIN, OUTPUT);
}
volatile bool buzzing = false;
void buzzerISR() {
digitalWrite(BUZZER_PIN, buzzing ? LOW : HIGH);
buzzing = !buzzing;
//digitalToggle(BUZZER_PIN);
}
void buzz() {
if (attached)
BuzzerTimer.enableTimer();
else
BuzzerTimer.attachInterrupt(BUZZER_FREQ *2, buzzerISR);
}
void noBuzz() {
BuzzerTimer.disableTimer();
}
/*
// https://forum.arduino.cc/t/adding-a-toggle-function-to-wiring-digital-c/975608
void digitalToggle(uint8_t pin) {
uint8_t timer = digitalPinToTimer(pin);
uint8_t bit = digitalPinToBitMask(pin);
uint8_t port = digitalPinToPort(pin);
volatile uint8_t *out;
if (port == NOT_A_PIN) return;
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
out = portOutputRegister(port);
uint8_t oldSREG = SREG;
cli();
*out ^= bit;
SREG = oldSREG;
}
*/