Arduino Attiny85 PWM verdoppeln; Prescaler

Gast #4711885
Hallo,

ich habe mich jetzt ein wenig belesen und bin zu dem Entschluss 
gekommen, das für den Port PB0 der Timer0 zuständig ist.
Genauso wie für die delay zeiten.

Desweiteren habe ich gelesen, das der Register FOC0B im Clock Select 
(CS02,CS01,CS00) mit 64 eingestellt ist.

Wenn ich diesen Clock Select nun auf 8 setze, müsste ich doch auch 8x so 
schnelles PWM bekommen (von ~491Hz auf ~3928Hz) oder habe ich hier einen 
Denkfehler?

Natürlich ist mir bewusst, das die Pausen dann auch nicht meh passen, da 
dies über den gleichen Timer laufen, das wäre für mich aber nicht 
schlimm.

Vorgestellt habe ich es mir mit dem Befehl:
TCCR0B |= (0 << CS02);
TCCR0B |= (1 << CS01);
TCCR0B |= (0 << CS00);

gibt bestimmt auch eine elegantere Lösung diese drei Bits zu setzen.

Kann das so funktionieren oder nicht?
Das Datenblatt habe ich auch versucht zu verstehen:
http://www.atmel.com/images/atmel-2586-avr-8-bit-microcontroller-attiny25-attiny45-attiny85_datasheet.pdf

Seite 80

Vielen Dank
Daniel S. schrieb:
> Wenn ich diesen Clock Select nun auf 8 setze, müsste ich doch auch 8x so
> schnelles PWM bekommen (von ~491Hz auf ~3928Hz) oder habe ich hier einen
> Denkfehler?

Nein, hast du nicht. Das Ding wird dir nicht um die Ohren fliegen, also 
probiers doch einfach aus.

Aber nicht damit:

Daniel S. schrieb:
> TCCR0B |= (0 << CS02);
> TCCR0B |= (1 << CS01);
> TCCR0B |= (0 << CS00);

Daniel S. schrieb:
> gibt bestimmt auch eine elegantere Lösung diese drei Bits zu setzen.

Vor allen Dingen gibt es eine, die auch funktioniert.
Auf 64 steht er ja schon. Da muß nur das CS00-Bit gelöscht werden:

1
 TCCR0B &= (~1 << CS00);


Um ganz sicher zu gehen, kannst du auch alle Bits löschen und das CS01 
neu setzen:
1
TCCR0B &= ~((1 << CS02) | (1 << CS01) | (1 << CS00));
2
TCCR0B |= (1 << CS01);


Und ganz korrekt, hälst du den Timer an und setzt den Prescaler und den 
Counter zurück:
1
GTCCR |= (1 << TSM) | (1 << PSRSYNC);
2
TCCR0B &= ~((1 << CS02) | (1 << CS01) | (1 << CS00));
3
TCCR0B |= (1 << CS01);
4
TCNT0 = 0;
5
GTCCR &= ~(1 << TSM);

Dabei wird allerdings Timer1 ebenfalls angehalten.
Moderator (Firma: Titel) Persönliche Seite
Thomas E. schrieb:
> Da muß nur das CS00-Bit gelöscht werden: TCCR0B &= (~1 << CS00);
Da muss die Klammer aber anders hin, sonst geht das schief, wenn CS00 
größer als 0 ist. Denn wenn z.B. CS00=2 ist, dann kommt das dabei raus:
1 ist  0000000000000001
~1 ist 1111111111111110
Und das 2 mal nach links geschoben ist 1111111111111000
Und damit werden dann beim VerUNDden schon 3 Bits manipuliert...  :-o

Mit TCCR0B &= ~(1 << CS00); wird dann erwartungsgemäß nur das gewünschte 
bit verbogen:
1 ist  0000000000000001
das zweimal nach links ist 0000000000000100
und das invertiert ergibt 1111111111111011
womit letztlich nach dem VerUNDen nur 1 Bit manipuliert wird.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.