www.mikrocontroller.net

Forum: Compiler & IDEs Timer aktivieren


Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
um irgend einen Timer zu aktivieren liest man oft, z.B. Timer0:
TCCR0 = (1<<CS00)|(1<<CS02);
müsste es abeer nicht so aussehen:
TCCR0 |= (1<<CS00)|(1<<CS02);

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

Bewertung
0 lesenswert
nicht lesenswert
Sehr oft ist das Setzen des Vorteilers die erste Aktion, die
in diesem Steuerregister gemacht wird.
Dadurch dass man keine Oder Verknüpfung macht, hat man dann die
Gewissheit, dass die restlichen Bits in einer definierten Stellung
(nämlich 0) sind.

Aber im Prinzip hast du recht.
Will man nur den Timer Einschalten, dann ist es sicherer dies
so zu machen, dass nur die Vorteiler Bits verändert werden.
Wobei. Um es ganz exakt zu machen, müsste man es so machen:

  TCCR0 & = ~( 1 << CS01 );
  TCCR0 |=   ( 1 << CS00 ) | ( 1 << CS02 );

weil du ja mit einem | Bits nur setzen kannst.

Aber wie gesagt: Wenn das die erste Operation auf diesem Register
ist, spielt es in der Praxis keine wirkliche Rolle und man nimmt
die einfachere Variante.

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

Bewertung
0 lesenswert
nicht lesenswert
Gast wrote:
> um irgend einen Timer zu aktivieren liest man oft, z.B. Timer0:
>
TCCR0 = (1<<CS00)|(1<<CS02);
> müsste es abeer nicht so aussehen:
>
TCCR0 |= (1<<CS00)|(1<<CS02);
Nö, das hängt ganz davon ab, was man machen will. Wenn man nur CS00 und 
CS02 setzen will und alle anderen Bits Null sein sollen, dann ist die 
erste Version völlig korrekt. Wenn man will, dass die anderen Bits 
unverändert bleiben, dann ist die zweite Variante angesagt. Außerdem 
muss beachtet werden, dass "|=" ausschließlich Bits setzt. Alle Bits, 
die vorher schon gesetzt sind, bleiben das auch.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also lieber immer
 TCCR0 = (1<<CS00)|(1<<CS02);
verwenden um einen Timer oder ähnliches zu konfigurieren
(im Tutorial ist es ja auch mal so und mal so erklärt, hat mich dann ein 
wenig irritiert)
oder halt umständlicher
TCCR0 = 0x00;
TCCR0 |= (1<<CS00)|(1<<CS02);

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Gast (Gast)

>oder halt umständlicher

>TCCR0 = 0x00;
>TCCR0 |= (1<<CS00)|(1<<CS02);

Das ist nicht umständlicher, das ist einfach Unsinn. Am Ende ist es doch 
recht einfach.

Zum Beginn des Programms werden die Register einmal komplett gesetzt

TCCR0 = (1<<CS00)|(1<<CS02);

Im laufenden Programm werden nur individuelle Bits angesprochen, um den 
Rest der Konfiguration nicht zu zerstören. Das gilt praktisch für alle 
Register.

TCCR0 |= (1<<CS00)|(1<<CS02);

Wobei man beim Wechsel des Vorteilers erstmal alle Bits löschen muss, 
da man ja nicht weiss, welche nun gesetzt sind

//                 alle Prescalerbits löschen      nur einzelne setzen
TCCR0 = TCCR0 & ~((1<<CS00)|(1<<CS01)|(1<<CS02)) | (1<<CS00)|(1<<CS02);
// oder so, besser lesbar,
// verwendet die Nummerierung der Prescalercodierung gemäss Datenblatt
//                clear         set
TCCR0 = TCCR0 & ~(7<<CS00) | (5<<CS00);

MFG
Falk

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

Bewertung
0 lesenswert
nicht lesenswert
@Falk:
Dann bleib aber auch bei einer Schreibweise. Also anstatt
TCCR0 = TCCR0 & ~((1<<CS00)|(1<<CS01)|(1<<CS02)) | (1<<CS00)|(1<<CS02);
einfach
TCCR0 &= ~((1<<CS00)|(1<<CS01)|(1<<CS02)) | (1<<CS00)|(1<<CS02);

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Johannes M. (johnny-m)

>Dann bleib aber auch bei einer Schreibweise. Also anstatt

>TCCR0 = TCCR0 & ~((1<<CS00)|(1<<CS01)|(1<<CS02)) | (1<<CS00)|(1<<CS02);

>einfach

>TCCR0 &= ~((1<<CS00)|(1<<CS01)|(1<<CS02)) | (1<<CS00)|(1<<CS02);

OHHHHH, VORSICHT. DAS geht schief! Was passiert, wenn CS02 in TCCR0 
vorher nicht gesetzt ist? :-0
Manchmal darf man nicht zuuuu tippfaul sein.

MFG
Falk

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

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:
> OHHHHH, VORSICHT. DAS geht schief! Was passiert, wenn CS02 in TCCR0
> vorher nicht gesetzt ist? :-0
> Manchmal darf man nicht zuuuu tippfaul sein.
Ja, hab grad auch gesehen, dass in der Zeile hinten noch was steht... 
Ist natürlich korrekt. Ich hatte nicht gesehen, dass Du den Vorteiler in 
einem Rutsch umschalten (und nicht nur die CS-Bits löschen) wolltest, 
weshalb mir die Klammerung entgangen ist...

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Falk Brunner wrote:

> Im laufenden Programm werden nur individuelle Bits angesprochen, um den
> Rest der Konfiguration nicht zu zerstören. Das gilt praktisch für alle
> Register.

Naja, wenn die Applikation hinreichend klein bzw. gut genug gekapselt
ist, dass es sowieso klar ist, welche Bits ggf. außer dem Vorteiler
da noch alles gesetzt sind, dann ist es einfacher (und schneller),
das Register komplett neu zu beschreiben, statt des umständlichen
read/modify/write-Codes.  Wenn man bspw. den Timer immer nur eine
Zeit lang laufen lassen möchte und danach wieder anhalten, ist es
völlig legitim, beim Anhalten einfach komplett 0 drauf zu schreiben
und beim nächsten Start dann wieder alle gewünschten Bits zu setzen.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Jörg Wunsch (dl8dtl)

>Naja, wenn die Applikation hinreichend klein bzw. gut genug gekapselt
>ist, dass es sowieso klar ist, welche Bits ggf. außer dem Vorteiler

Jaja, WENN. Aber die Erfahrung zeigt, dass selbst kleine Programme 
immer wieder gern komlexer werden als man denkt. Und die 
Wiederverwertbarkeit leidet auch. Im Übrigen spricht eben gerade 
Kapselung GEGEN das komplette Überschreiben.

MfG
Falk

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.