mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Mega16 Timer0 und Timer2 gleichzeitig nicht möglich


Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Einen schönen guten Abend,

ich programmiere gerade ein Programm, bei dem es notwendig wird, 2 8 Bit 
Timer zu benutzen. Nur leider wird der Timer 0 immer ignoriert, wenn 
Timer 2 im Programm implementiert ist. Sobald ich die 
Initialisierungszeilen von einem der beiden Timer auskommentiere, 
fünktioniert der jeweilige Timer einwandfrei. Nur zusammen funktionieren 
sie nicht. Mir scheint so, als wenn Timer2 eine höhere Priorität als 
Timer0 aufweist oder dessen Overflow irgendwie überschreibt. Jedenfalls 
löst Timer0 nie einen Overflow aus, wenn Timer 2 mit im Programm ist.

Woran kann das liegen? Hab im Forum schon überall gesucht, aber nichts 
gefunden.

Der Quellcode liegt im Anhang.

Vielen Danke!

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TIMSK = 1;
TIMSK = 64;

Abgesehen von den "magic numbers" - überleg doch mal genau, was diese 
Instruktionen bewirken.
Nicht stur reinschreiben, sondern mit oder/und arbeiten.

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heieiei... Sag mal, welchen Compiler benutzt du denn? Meiner (WinAVR) 
haut mir da so einige Warnungen um die Ohren.

Gruß,
Magnetus

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TIMSK = 1 bewirkt, dass der Timer0 Overflow aktiviert wird und TIMSK = 
64 das Gleiche beim Timer2 Overflow. Was ist denn daran nicht richtig?

Ich benutze auch WinAVR als Compiler und AVR-Studio zum Programmieren, 
aber bei mir kommt lediglich eine Warnung: „control reaches end of 
non-void function“. Das dürfte eigentlich nicht das Problem sein.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@crazy horse, jetzt weis ich, was du meinst. Hups, mir ging grad ein 
Licht auf. Statt 1 und 64 TIMSK = 65 hinschreiben. Manchmal kommt man 
auch echt nicht auf die einfachsten Sachen. Jetzt funktionierts!

Vielen Dank nochmal!

Grüße Thomas

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
TIMSK ist aber nur ein Register, wenn du 64 reinschreibst, steht auch 64 
drin. Deine ehemalige 1 ist hinfällig...

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Thomas wrote:
> TIMSK = 1 bewirkt, dass der Timer0 Overflow aktiviert wird und TIMSK =
> 64 das Gleiche beim Timer2 Overflow. Was ist denn daran nicht richtig?

Jein.

TIMSK = 1 bewirkt, dass ausschliesslich_ der _Timer0 Overflow 
aktiviert wird.

TIMSK = 64 bewirkt, dass ausschliesslich_ der _Timer2 Overflow 
aktiviert wird.

Was du brauchst, ist TIMSK = 65 oder besser:

TIMSK = (1<<TOIE2)|(1<<TOIE0);

Gruß,
Magnetus

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder, um in deinem alten Stil zu bleiben:

Timer0:
TIMSK = (1<<TOIE0);
.
.
Timer2:
TIMSK = TIMSK |(1<<TOIE2);

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ganz genau. Frag mich, warum ich darauf nicht selbst gekommen bin. 
Aber nochmal eine Fragen, was ist an "TIMSK = (1<<TOIE2)|(1<<TOIE0);" 
besser, als an der einfachen Schreibweise?

Vielen Dank!

Grüße Thomas

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber nochmal eine Fragen, was ist an "TIMSK = (1<<TOIE2)|(1<<TOIE0);"
> besser, als an der einfachen Schreibweise?

Weil es unmissverständlich ist.

Wenn ich "TIMSK = 65;" schreibe, weiss ich zwar, dass das Register mit 
dem Wert 65 beschrieben wird, aber es ist nicht klar, was das bewirkt.

Wenn ich "TIMSK = (1<<TOIE2)|(1<<TOIE0);" schreibe, weiss ich dass die 
Bits "TOIE2" und "TOIE0" gesetzt (und die restlichen gelöscht) werden.

Gruß,
Magnetus

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ausserdem funktioniert das dann auch garantiert bei einem anderen AVR, 
obwohl dort evtl. die Bits an einer anderen Stelle sitzen. Dann sitz du 
mit deinen 65 auf dem Schlauch. Zu einem anderen AVR gibts ne neue 
.def-Datei, und schon passt der Kram wieder.
Für mich ist aber auch der Hauptgrund die bessere Lesbarkeit.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gut, überzeugt. Ich werd es abändern, zumal die Sache mit dem Anderen 
AVR schon wichtig ist, da ich den Mega16 nur zum Testen nehme. In der 
Schaltung, die ich dazu erstellt hab, nehm ich nur den Mega8, der für 
diese Anwendung völlig ausreicht.
Vielleicht noch kurz zur Erläuterung: Den Timer2 brauch ich zum Zählen 
der Schleife im Unterprogramm (7-Segment Multiplexer) und den Timer0 zum 
Abtasten eines Drehimpulsgebers. Muss ich aber alles noch programmieren. 
Mit Hilfe des Drehimpulsgebers wird dann die Zahl erhöht/verringert. Das 
ganze soll nach Möglichkeit so geschehen, dass bei langsamen Drehen die 
Werte um jeweis eine Stelle erhöht werden und beim schnellen Drehen des 
Drehimpulsgebers mehrere Schritte auf einmal gemacht werden.

Grüße Thomas

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.