Go Down

Topic: Welcher Timer für was? (Read 14699 times) previous topic - next topic

quad1

Hallo,
ermöglicht der Atmega 2560 im Timer0 den Compare- match und den Overflow- Match int. gleichzeitig?
 Gruß
Reinhard

Serenifly

Das kannst natürlich beide auswerten. Aber nicht wortwörtlich gleichzeitig. Der Compare Match Interrupt hat eine höhere Priorität als der Overflow Interrupt. Wobei es sowieso sehr unwahrscheinlich ist, dass die beiden zur gleichen Zeit auftreten.

Timer0 wird auf dem Arduino übrigens schon standardmäßig von der Software verwendet.

quad1

Danke für die Antwort. Hatte einen Fehler:  TIMSK0 |= (1<OCIE0A) statt:  TIMSK0 |= (1<<OCIE0A);
ein < zuwenig!

Doc_Arduino

Hallo,

hätte noch eine blöde Frage oder mehrere ;)
Die Timerausgänge sind doch an bestimmte Pins gekoppelt. Muß man diese Pins der benutzen Timer frei lassen?
Wenn nicht, warum nicht?

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Nein. Wenn du den Timer nur intern benutzt sind kannst du die Pins als I/Os verwenden. Die werden nur bei Bedarf mit dem Timer verbunden (d.h. wenn du das im Code so angibst).

Doc_Arduino

Hallo,

"mit im Code angeben" meinst Du in einem Timer Register?
Ich lese gerade tausende Seiten dazu, dazu schweigen sich aber alle aus.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Ja. z.B. das automatische Toggeln der Pins per Compare Match Interrupt. Das wird im TCCRnA Register über die COMnA/B Bits eingestellt. Siehe Atmega328 Datenblatt Seite 134. In den PWM Modi werden diese Bits auch verwendet um zu bestimmen wie die Ausgänge schalten.

Das ist doch bei anderen internen Baugruppen genauso. Die Serial Pins kannst du als I/Os verwenden wenn die serielle Schnittstelle deaktiviert ist (mal von der USB Verbindung auf einem Arduino Board abgesehen). Die analogen Eingängen kannst du als I/Os verwenden. Die Pins von der SPI Schnittstelle genauso. Manche Pins haben noch mehr Funktionen, z.B. I2C auf dem UNO. Auf den kleinen AtTinys haben Pins locker 7 verschiedene Funktionen.

Doc_Arduino

Hallo,

das hilft mir schon weiter. Hatte mal wieder gedanklich eine Blockade.
Danke für die Erklärung.

Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

#23
Jun 28, 2015, 11:28 pm Last Edit: Jun 29, 2015, 10:59 am by Doc_Arduino
Hallo,

hab mich mal hingesetzt und eine Excel zur Berechnung des Compare Match Registers erstellt.
Auf die vorhandenen Prescaler und max. Wert des CMR je nach verwendeten Timer muß man noch selbst aufpassen.

Es wird der größt möglichste CMR Wert rausgesucht, wegen geringster Abweichung.
Den dazugehörigen Prescaler wird jeder selbst ablesen können.
Daneben werden noch mögliche Abweichungen von der gewünschten Frequenz angezeigt.

Ich hoffe das es den einen oder anderen auch helfen wird.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,

hier noch ein Bsp. Code der die LED mit gewünschter Frequenz takten lässt.
Die Wunschfrequenz wird in setup der Funktion übergeben.
Die Funktion berechnet dazu den bestmöglichen Prescaler und Compare Match Register Wert.

mit digital.Write sind maximal 36kHz möglich, mit direkten Port-Registerzugrff sind maximal 170kHz möglich.
Dabei beachten ob man einen Uno oder Mega hat und entsprechend ganz unten im Sketch auskommentieren oder aktivieren.

Viel Spass!  :)


Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Doc_Arduino

Hallo,

es ist schon krass was 23 Takte mehr durch den Timer ISR Aufruf ausmachen.

Mit einem quasi nackten Sketch und das toggeln in einer while(1)  bringt 727kHz macht.
Im Vergleich mit Timer 1 ISR Aufruf "nur" noch 170kHz.
Dabei werden 1468ns benötigt, was 23 Takte sind
Nur ohne Timer ISR kann man keine Frequenz nach Wunsch einstellen.   :)

Ist nur der Vollständigkeit halber erwähnt.

Code: [Select]
void loop() { 
  while(1)  {
    _toggle_T1 =! _toggle_T1;
    PORTB = (_toggle_T1 << 7);   
  }
}
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Eine ISR ist wie ein Funktionsaufruf. Die sind teuer, da zig Register auf den Stack gesichert werden und wieder zurückgeschrieben werden.

Quote
Nur ohne Timer ISR kann man keine Frequenz nach Wunsch einstellen.
Doch. Auf den dazugehörigen Pins kannst du das automatisch Toggeln. Komplett in Hardware. Ohne dass Code ausgeführt wird. Du bist dann halt auf bestimmte Pins festgelegt.

Doc_Arduino

#27
Jun 29, 2015, 07:11 pm Last Edit: Jun 30, 2015, 03:08 pm by Doc_Arduino
Hallo,

ja okay, dass hatte ich in der Überlegung vorhin vergessen. Stimmt natürlich. Parallel dazu habe ich damit schon rumgespielt. Wenn man die direkten Pins der Timer-Register nimmt, sind max. 4MHz möglich. Kein Hertz mehr. :)

Dabei kommt mein Logic Analyzer auch so langsam aber sicher an seine Grenze.   :)
Manchmal gibts leichte Fehlmessungen im Tastverhältnis der Frequenz.
Oszi  wollte ich noch nicht rausholen.

Die ganze Sache ist übelst interessant wenn man damit so rumfummelt. Man verliert die Angst zu den Registern.
Ein Frequenzgenerator zubauen scheint in greifbarer Nähe. Wobei die max. mögliche Frequenz bei Sinusform rapide sinkt.

Ich häng das noch ran, wem das auch interessiert.

Edit:
weil die meisten hier doch einen Uno haben werden, habe ich das gleich dafür extra angepaßt, weils doch sehr hardware nah ist.

Edit 2:
hab den Code nochmal geändert und die Kommentare angepaßt

Edit 3:
siehe #34
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Serenifly

Wenn du Kanal B Toggeln willst musst du glaube ich auch das Compare Match B Register beschreiben. Die Pins schalten jeweils wenn ihr zugehöriges Register einen bestimmten Wert erreicht

Außerdem hast du auf dem Mega auf den 16 Bit Timern auch einen Kanal C. Also bis zu 3 Pins pro Timer.



Und das ist Blödsinn:
Code: [Select]

(0 << COM1A1)

Denke mal nach was du machst!

Ein Bit löschen geht so:
Code: [Select]

register &= ~(1 << COM1A1)

Und mit dem Inversen

Da du vorher das ganze Register auf 0 gesetzt hast, brauchst du das aber nicht

Doc_Arduino

Hallo,

Kanal B wird mit getoggelt.

Der Rest ist in dem Sinne kein Blödsinn, dass sind noch nicht gelöschte Reste vom Code während des programmierens. Am Anfang schreibe ich mehr als notwendig für den Überblick was passieren soll.
Vorallendingen wenn man mehrere Register nach dem Schema setzt.
Das macht aber auch kein Schaden.
Tschau
Doc Arduino '\0'

Messschieber auslesen: http://forum.arduino.cc/index.php?topic=273445
EA-DOGM Display - Demos: http://forum.arduino.cc/index.php?topic=378279

Go Up