www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 16 Timer Interrupt


Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich kenne mich mit dem 8 Bit Timer des ATmega aus, leider nicht mit dem 
16 Bit Timer - denn diesen bekomme ich nicht wunschgemäss zum "Laufen".

Ich möchte 200 mal in der Sekunde einen Interrupt auslösen, mein ATmega 
ist mit 8 MHz getaktet. Meine Berechnung ist wie folgt: 8.000.000 Hz 
(Quarz) / 8 (Presacler) sind 1.000.000 Takte für den Timer. ALso muss 
der Timer bei dem Wert 5000 (deshalb auch der 16 Timer) einen Interrupt 
auslösen.

Mit den vielen Konfigurationsmöglichkeiten des 16 Bit Timer schaff ich 
es nicht. Vielleicht kann mir jemand behilflich sein. - Vielen Dank 
schon einmal.

Sven

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CTC Modus
Und da trägt man dann 4999 als Vergleichswert ein.

Autor: Fritz123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich würde den freien (Evaluation/eingeschränkt) C Compiler CodeVison
herunterladen, der unter
http://www.hpinfotech.ro/html/download.htm
erhältlich ist.
Die Installation geht wirklich sehr einfach, ohne dass man ein Manual 
lesen muss und der Compiler hat eine Wizzard. Damit kann man den Timer 
durch ausfüllen einer Bildschirmseite konfigurieren und im erzeugten 
Code die Timereinstellungen nachlesen.
Für knifflige Fälle wird man zwar das Datenblatt lesen müssen, aber 
dieser Weg ist m.E. der relativ einfachste.

Gruß
Fritz

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Fritz123 wrote:
> Damit kann man den Timer
> durch ausfüllen einer Bildschirmseite konfigurieren und im erzeugten
> Code die Timereinstellungen nachlesen.
Und da der Wizard freundlicherweise alle Werte als Hexadezimalzahlen 
schreibt, muss man spätestens wenn man was ändern will, doch im 
Datenblatt nachsehen (abgesehen davon, dass man ohne Datenblatt-Lektüre 
überhaupt nicht mehr nachvollziehen kann, wie der Timer überhaupt 
konfiguriert ist).

Außerdem hat der OP nix von einer bestimmten Programmiersprache erzählt. 
Mit Assembler z.B. wird er mit CodeVision nicht viel anfangen können.

> Für knifflige Fälle wird man zwar das Datenblatt lesen müssen, aber
> dieser Weg ist m.E. der relativ einfachste.
Klar, einfach, aber man hat nix davon.

Erzähle keinem, man könne einen µC sinnvoll programmieren, ohne das 
Datenblatt zu konsultieren...

Wenn schon in C programmiert werden soll: Schau lieber ins 
AVR-GCC-Tutorial. Da steht alles, was man wissen muss, auf deutsch. 
Und sinnvollerweise gewöhnt man sich auch gleich am Anfang die Syntax 
mit Bitschiebe-Operatoren an. Dann kann man das Programm später auch 
lesen und v.a. ändern, ohne jedes einzelne Bit aus dem Datenblatt 
rauszuklamüsern.

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

AVR-GCC ist auch meine 1. Wahl. leider löst folgender code keinen 
Interrupt aus:

TCCR1A |= (1<<CS11)|(1<<WGM12);  // Prescaler 8 / CTC
OCR1AH=1; // timer laden
OCR1AL=1;
TIMSK |= (1<<OCIE1A); // Interrupt

Die Sache mit dem A und B Channel verwirrt mich ein wenig.

Autor: Kai Franke (kai-) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich kann dir auch nur zu Codevision raten, aber da gehen die Meinungen 
auseinander...
das A und B sind nur zwei unterschiedliche Compare Match Interrups. Den 
einen setzt du mit OCR1A, den anderen mit OCR1B. Das H und das L sind 
nur High und Low Byte. brauchst du aber nicht benutzen (zumindest bei 
Codevision). Was du in deinem Code gamacht hast ist, dass du den Compare 
A Match auf 0x0101 gesetzt hast, was umgerechnet 257 sind.
Zum Rest kann ich wenig sagen, weil ich mit den >> Befehlen nicht 
umgehen kann...

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> AVR-GCC ist auch meine 1. Wahl. leider löst folgender code keinen
> Interrupt aus:

> TCCR1A |= (1<<CS11)|(1<<WGM12);  // Prescaler 8 / CTC
> OCR1AH=1; // timer laden
> OCR1AL=1;
> TIMSK |= (1<<OCIE1A); // Interrupt
>
> Die Sache mit dem A und B Channel verwirrt mich ein wenig.
Für welchen Atmega ist denn das gedacht? Die CSxx Bits sind doch 
meistens in TCCR1B, nicht ~A (Die TCCRxx register gehören NICHT zu den 
Channels).
Die Bezeichnung 'Channel' steht nur für PWM-kanal (kann z.B. ein 
PWM-Signal auf bestimmten Pins ausgeben).
Es gibt im Datenblatt eine schöne Tabelle mit allen (15?) Modi, die der 
Timer beherrscht.

hth. Jörg
ps.: Poste (bitte) kompilierbare Beispiele

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.