xmega_tutorial.jpg

Bewertung:  / 3
SchwachSuper 
  • xmega_eventsystem

Bei den Xmega Controllern hat sich auch am Interruptsystem so einiges geändert. Das System ist im Vergleich zu den Atmegas viel komplexer geworden und bietet nun viel mehr Möglichkeiten um auf spezielle Ereignisse (Events) zu reagieren.

Weiterhin kann man in diesem System jeder Interruptquelle einen von 3 Interruptleveln zuordnen um somit die Ereignisse untereinander zu priorisieren. Speziell bedeutet es, dass man zwischen den Prioritäten High, Medium oder Low wählen kann. Dadurch erreicht man, dass die Interrupts in einer bestimmten Reihenfolge abgearbeitet werden.

Interrupts sind grundsätzlich Reaktionen des Controllers, mit welchen er auf festgelegte interne oder externe Ereignisse reagiert und dadurch den eigentlichen Programmfluss unterbricht. Jeder PORT des ATxmega besitzt zwei unabhängige Interruptvektoren (INT0 und INT1). Diese werden beim Auslösen eines I/O-Interrupts angesprochen.

Die I/Os, bzw. die Pins der Xmega Controller können als I/O-Port-Interrupts verwendet werden, um einen Interrupt bei Änderung eines einzelnen Pin oder einer Pin-Gruppe zu erzeugen. An dieses Ereignis kann eine Interrupt Serviceroutine und oder über das interne event System eine andere Aktion ausgeführt werden. Zum Beispiel kann man den Controller über einen externen Pin Interrupt aus dem Schlaf-Modus aufwecken. Der folgende Abschnitt gibt einen Überblick über die Verwendung der I/O-Interrupts der Xmega Controller.

Das folgende Beispiel konfiguriert den Pin 2 an Port D als externen Interrupt, welcher bei fallender Signalflanke einen Interrupt auslöst und in die zugehörige Serviceroutine springt, um dort den entsprechenden Code auszuführen. In dem Beispiel wird bei dem Interrupt die LED an Pin D1 getoggelt. Als Interrupt wurde der Interrupt 0 des Port D gewählt welcher bei dem Ereignis einen Lowlevel Interrupt auslöst.

Xmega External Interrupt Example
#include <avr/interrupt.h>
 
#define sbi(ADDRESS,BIT) 	ADDRESS |= (1<<BIT)	// set Bit
#define cbi(ADDRESS,BIT) 	ADDRESS &= ~(1<<BIT)	// clear Bit
#define	toggle(ADDRESS,BIT)	ADDRESS ^= (1<<BIT)	// Bit umschalten
 
//####################################### initialisierung
void initialisierung(void)
{ 
cli();
init_clock(); 
 
//############### Externe Interrupt PortD 
// Pin als Eingang
cbi(PORTD.DIR,2);		
// in der Iterruptmaske 0 Pin 3 freigeben				
sbi(PORTD.INT0MASK,2);						
// Pin 3 PullUp aktivieren, fallende Flanke aktivieren
PORTD.PIN2CTRL	= PORT_OPC_WIREDORPULL_gc | PORT_ISC_FALLING_gc;
// Interrupt LoLevel für PORTD und INT0MASK freigeben	
PORTD.INTCTRL	= PORT_INT0LVL_LO_gc;						 
 
//############### enable Interrupts global
PMIC.CTRL|=PMIC_HILVLEN_bm|PMIC_MEDLVLEN_bm|PMIC_LOLVLEN_bm; //Intrrupts
 
sei();
}
//####################################### Int PinD2 
ISR(PORTD_INT0_vect)
{
toggle(PORTD.OUT,1); // LED toggeln
} 
//####################################### main
int main (void)
{
initialisierung();   // Load controller setup 
 
while(1)
 {  
 } 
}
 

Ein ausführliches Beispiel zum Testen der vorgestellten Funktionen findet ihr unter Downloads. Weiterhin findet ihr die von Atmel zu dem Thema zur Verfügung gestellte Appnote im Anhang des Artikels unter Links.

Viel Spass beim Testen.

Hinweis:
Das Tutorial wird nach und nach von mir ergänzt. Wenn ihr Fehler in dem Tutorial findet würde ich mich freuen wenn ihr mir diese mitteilt, damit ich diese korrigieren kann. Wenn jemand eigene Tips, Informationen oder Code-Schnipsel hat kann er mir diese gern zusenden damit ich sie anschließend in das Tutorial einbinden kann.

Links

 
Atmel Appnote
Xmega External Interrupts
AVR1313: Using the XMEGA IO Pins and External Interrupts (pdf)
AVR1313: Using the XMEGA IO Pin and External Interrupts (Software)

Downloads

Kommentar hinzufügen
  • Keine Kommentare gefunden

Neuste Beiträge

30/08/2016
Es gibt nun endlich ein Update für die Tinyg CNC Controller Hardware und der dazu gehörenden PC Software...
03/09/2015
In den letzten Monaten habe ich lange das CAD Programm und meinen kleinen Ultimaker 3D Drucker gequält....
15/05/2015
Zuerst wurde eine kleine Katze am Computer konstruiert. Der erste Druck mit 0,3mm Schichtstärke war...
06/05/2015
Da beim Ultimaker keine Beleuchtung des Arbeitstisches vorgesehen ist, muss ich mir hier selber eine...