|
Töne + Blinken mit Atxmega128A1 / halvedDisc2®
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
}
}
Links:
Hochschule Mittweida
halvedDisc
halvedDisc2
Datenblatt
des ATxMega128A1
|