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