mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Arduino Attiny85 PWM verdoppeln; Prescaler


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Daniel S. (Gast)


Bewertung
0 lesenswert
nicht lesenswert
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

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
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:

 TCCR0B &= (~1 << CS00);


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


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

Dabei wird allerdings Timer1 ebenfalls angehalten.

: Bearbeitet durch User
von lapsus (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Daniel S. schrieb:
> Desweiteren habe ich gelesen, das der Register FOC0B im Clock Select
> (CS02,CS01,CS00) mit 64 eingestellt ist.

Register FOC0B??? ;-)

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Thomas E. schrieb:
> GTCCR |= (1 << TSM) | (1 << PSRSYNC);

Das ist für Atmega328.

Für Attiny85:
GTCCR |= (1 << TSM) | (1 << PSR0);

von Lothar M. (lkmiller) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht lesenswert
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.

von Thomas E. (Firma: Thomas Eckmann Informationst.) (thomase)


Bewertung
0 lesenswert
nicht lesenswert
Lothar M. schrieb:
> Da muss die Klammer aber anders hin, sonst geht das schief, wenn CS00
> größer als 0 ist.

Kleiner Tippfehler. Gut aufgepasst. Danke.

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.