mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATmega Timer CompareMatch


Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich arbeite mit einem ATmega64A und will zwei unterschiedliche 
Interrupttaktquellen definieren. Die Initialisierung habe ich so 
gemacht:
TCCR1B = (1<<CS10) + (1<<CS12) + (1<<WGM12);  // /1024 CTC-Mode
OCR1A = 39;    // 8MHZ/1024/39=200Hz
OCR1B = 2;    // 8MHz/1024/2=3906Hz
TIMSK |= (1<<OCIE1B) + (1<<OCIE1A); //Compare Match A&B

Die Interrupt handle ich mit
ISR(TIMER1_COMPA_vect)
und
ISR(TIMER1_COMPB_vect)

Beide ISR´s werden jedoch im 200Hz Takt aufgerufen. Woran könnte das 
liegen. Wenn mehr Infos benötigt bitte fragen.

Gruß

Maddin

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

> Woran könnte das liegen.

An der Tatsache, das das nicht funktionieren kann.

Angenommen der Timer läuft bei 0 los, erreicht er irgenwann OCR1B und 
löst den Interrupt aus. Dann zählt er weiter bis er bei OCR1A angelangt 
ist. Der passende Interrupt wird ausgelöst und bei Null wieder 
angefangen.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maddin schrieb:

> Beide ISR´s werden jedoch im 200Hz Takt aufgerufen. Woran könnte das
> liegen. Wenn mehr Infos benötigt bitte fragen.

Die Aufruffrequenz wird so wie du das machst immer dadurch festgelegt, 
wie weit der Zähler zählt.
Mit dem OCR1B Wert bestimmts du nur die 'Phasenlage' der Interrupts 
innerhalb eines Zählzykluses.

Anders ausgedrückt:
Wenn dein einer 'Wecker' immer dann klingelt, wenn der Sekundenzeiger 
auf 10 steht, und der andere dann, wenn der Sekundenzeiger auf 25, dann 
werden beide Wecker trotzdem jede Minute nur 1 mal klingeln. Allerdings 
zu unterschiedlichen Zeitpunkten innerhalb dieser Minute.

(Bei dir ist es dann halt so, dass der Wecker nach 25 Sekunden wieder 
bei 0 anfängt, das ändert aber nichts daran, dass der 10 Sekunden 
Klingler innerhalb der 25 Sekunden nur 1 mal kommt)

Allerdings:
Es spricht nichts dagegen, in einer ISR sich den nächsten OCR Wert 
auszurechnen und zu setzen. Dann kann man tatsächlich unterschiedliche 
Frequenzen erreichen.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sie werden aber nicht zum gleichen Zeitpunkt aufgerufen?

TIMER1_COMPB_vect wird wesentlich früher aufgerufen und erst wieder, 
nachdem TIMER1_COMPA_vect aufgerufen wurde.

Ein Match TCNT1 mit OCR1B kann erst wieder treffen, nachdem TCNT1 
zurückgesetzt wurde, d.h. nach dem Match TCNT1 mit OCR1A.

Du könntest in der schnelleren ISR den Matchwert erhöhen

ISR(TIMER1_COMPB_vect)
{
  OCR1B += 2;    // 8MHz/1024/2=3906Hz
}

Und in der langsameren ISR resetten

ISR(TIMER1_COMPA_vect)
{
  OCR1B = 2;    // 8MHz/1024/2=3906Hz
}

Der ISR-Overhead in Verbindung mit dem Prescalerwert entscheidet, ob das 
funktioniert. Schwierig (unmöglich?) wird es, wenn beide Frequenzen 
keine Teiler voneinander sind, so wie in deinem Fall.

Autor: Maddin (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich muss mir das jetz erstmal alles durch den Kopp gehen lassen was ihr 
so geschrieben habt. Danke euch.


Stefan B. schrieb:
> Sie werden aber nicht zum gleichen Zeitpunkt aufgerufen?

Nein nein, beide haben gleiche Periode, werden aber zu deutlich (ca 
0.5ms) unterschiedlichen Zeiten aufgerufen. So wie ichs beim Überfliegen 
eurer Antworten bis jetz verstanden habe macht das auch Sinn.

Nun werd ich mir das mal genauer anschauen, ich denke ihr seit meinem 
Wochen-Problem auf die Spur gekommen.

Gruß

Maddin

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.