Blinkende LED mit Atxmega128A1 / halvedDisc2®



Die LED der halvedDisc2® (im Bild links oben) ist an PORTF1 angeschlossen.

halvedDisc2


Experiment 1 - einfaches Toggeln des Bits 1 an Port F:

/*
*  Program: LED.c (LED blinkt)
*  Author: tux@mikrocontrollerspielwiese.de
*/


#include <avr/io.h>         // Bibliothek mit Befehlen für Mikrocontroller Ein- und Ausgaben
#define F_CPU 2000000UL    // Taktfrequenz 2 MHz
#include <util/delay.h>     // enthält den Befehl: _delay_ms();


int main (void) {

    PORTF_DIR = 0b00000010; // Datenrichtungsregister: Pin der LED ist nun Ausgang

    while(1) {
        PORTF.OUT = 0b00000010; // LED aus
        _delay_ms(500);         // 500ms
       
        PORTF.OUT=0b00000000;   // LED an
        _delay_ms(500);         // 500ms
    }
   
    return 0;
}


Experiment 2 - Benutzen eines Timers:

/*
*  LedMitTimer.c (LED blinkt)
*  Author: tux@mikrocontrollerspielwiese.de
*/


#include <avr/io.h>
#include <avr/interrupt.h>



// Interrupt Service Routine des Timers F1
ISR(TCF1_OVF_vect) {
    PORTF.OUT ^= 0b00000010; // Toggeln des Led-Pins
}



int main (void) {
   
    PORTF_DIR = 0b00000010; //Datenrichtungsregister: Pin von Led ist nun Ausgang
   
    cli(); //Interrupts deaktivieren, um in Ruhe den Timerinterrupt zu konfigurieren
   
    // 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