In Zusammenfassung der letzten beiden Experimente sollen nun gleichzeitig
Töne ausgegeben werden und die LED blinken.
/*
* Programm: SpeakerUndLedMitTimer.c
* Author: tux@mikrocontrollerspielwiese.de
*/
#include <avr/io.h>
#include <avr/interrupt.h>
// Variablen
volatile int foo=0, bar=0; //diese Hilfsvariablen merken sich den Zustand der Pins für Speaker (foo) und Led (bar)
// Interrupt Service Routine des Timers F0 (für Speaker)
ISR(TCF0_OVF_vect) {
if (foo==0)
{
foo=1;
PORTF.OUT |= 0b00000001;
} else {
foo=0;
PORTF.OUT &= ~0b00000001;
}
}
// Interrupt Service Routine des Timers F1 (für Led)
ISR(TCF1_OVF_vect) {
if (bar==0) {
bar=1;
PORTF.OUT |= 0b00000010;
} else {
bar=0;
PORTF.OUT &= ~0b00000010;
}
}
int main(void) {
PORTF_DIR = 0b00000011; //Datenrichtungsregister: Pin von Speaker und LED sind nun Ausgänge
cli(); //Interrupts deaktivieren, um in Ruhe die Timerinterrupts zu konfigurieren
// Timer F0 konfigurieren
TCF0.CTRLA = TC_CLKSEL_DIV64_gc; //Prescaler: 64
TCF0.CTRLB = 0; //select Modus: Normal
TCF0.PER = 50; //Zähler-Top-Wert, Werte: 1...65535
TCF0.CNT = 0; //Zähler zurücksetzen
TCF0.INTCTRLA = 0b00000011; //Interrupt Highlevel
// Timer F1 konfigurieren
TCF1.CTRLA = TC_CLKSEL_DIV64_gc; //Prescaler: 64
TCF1.CTRLB = 0; //select Modus: Normal
TCF1.PER = 10000; //Zähler-Top-Wert, Werte: 1...65535
TCF1.CNT = 0; //Zähler zurücksetzen
TCF1.INTCTRLA = 0b00000011; //Interrupt Highlevel
// Interrupts High-,Medium- und Lowlevel freigeben
PMIC.CTRL |= PMIC_HILVLEN_bm |PMIC_MEDLVLEN_bm|PMIC_LOLVLEN_bm;
sei(); //Interrupts aktivieren
while(1)
{
//derzeit nix drin hier
}
}