www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik XMega Timer Interrupt


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe mal ne Verständnis-Frage zu Interrupts (XMega) welche von 
Timern ausgelöst werden.
Ist es möglich von einem Timer mehrere Interrupts auslösen zu lassen. 
Also z.B. folgendes Szenario:

Timer1 soll immer bis 1000 zählen.
Dann soll eine ISR beim Timer1-Wert 200 ausgelöst werden, dann nochmal 
bei 400 und dann nochmal bei Überlauf.

Ist das möglich, oder kann ein Timer immer nur einen Interrupt auslösen?

mfg Bernd

Autor: Analog (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, das geht.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und warum läuft das hier dann nicht?

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

int main(void)
{
  // internen Oszillator auf 32MHZ einstellen
  OSC.CTRL = 3;
  while(OSC.STATUS != 3)
  {
  }
  CCP = 0xD8;
  CLK.CTRL = 1;

  // Interrupts aktivieren und alle Level freigeben
  sei();
  PMIC.CTRL=0x07;

  // Timer 0 initialisieren
  TCC0.CTRLA = 0x00;
  TCC0.INTCTRLA = 0x03;    //Overflow-Interrupt aktivieren als 
high-Level
  TCC0.INTCTRLB = 0x3F;    //Compare-Interrupts A,B,C aktivieren als 
high-Level
  TCC0.CCA = 100;        //Vergleichswert A = 100
  TCC0.PER = 250;        //Maximalwert = 250

  TCC0.CTRLA = 0x04;      //Prescaler auf 8 --> 4MHz, T=250ns

  PORTB.DIR = 0xFF;
  PORTB.OUT = 0xFF;

  while(1)
  {
    PORTB.OUT = 0x66;
    PORTB.OUT = 0x55;
  }
}

ISR (TCC0_OVF_vect)
{
  PORTB.OUT = 0x33;
  PORTB.OUT = 0x44;
}
ISR (TCC0_CCA_vect)
{
  PORTB.OUT = 0xAA;
  PORTB.OUT = 0xBB;
}

Autor: Knut Ballhause (Firma: TravelRec.) (travelrec) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn die Timer-Periode bei 250 liegt, wie soll der Timer dann bis 1000 
zählen? Und ich meine mich erinnern zu können, daß der 
Interrupt-Controller vor dem 'sei' initialisiert werden muß.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich schon erledigt, läuft also. Problem war, das ich den Compare 
Interrupt A, B & C aktiviert habe, aber nur den Schwellwert für A 
festgelegt hab. Das mag der xmega wohl nicht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.