Timerinterrupts am Uno: Timer 2

Funktionierendes Script, um Timer-Register Nr. 2 am Atmel AVR 328P zu schalten. Besonderheiten: im CTC-Modus bleiben die Pins 3 und 11 passiv, es müssen aktiv die Timer-Interrupts gesetzt werden. Im 011-Fast-PWM werden automatisch die Pins 3 und 11 angesteuert. Achtung: die ‚tone()‘-Funktion läuft nicht mehr bei Nutzung de Timer2-Registers.

<span style="color: #00979c;">void</span> <span style="color: #5e6d03;">setup</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span> <span style="color: #000000;">{</span>
  <span style="color: #434f54;">//Disable Interrupts, damit man die Register setzen kann.</span>
  <span style="color: #000000;">cli</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #434f54;">/////////////////////////////////////////////////</span>
  <span style="color: #434f54;">// BIT Nr.      1        2        3        4         5       6        7       8</span>
  <span style="color: #434f54;">// TCCR2A = [ COM2A1 | COM2A0 | COM2B1 | COM2B0 |   --   |   --   |  WGM21 | WGM20 ]</span>
  <span style="color: #434f54;">// TCCR2B = [ FOC2A  | FOC2B  |   --   |   --   |  WGM22 |  CS22  |  CS21  | CS20  ]</span>
  <span style="color: #434f54;">/////////////////////////////////////////////////</span>
  <span style="color: #434f54;">//Register 2A und 2B löschen.</span>
  <span style="color: #000000;">TCCR2A</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">0</span><span style="color: #000000;">;</span>
  <span style="color: #000000;">TCCR2B</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">0</span><span style="color: #000000;">;</span>
  <span style="color: #434f54;">//Counter auf 0 zurücksetzen</span>
  <span style="color: #000000;">TCNT2</span>  <span style="color: #434f54;">=</span> <span style="color: #000000;">0</span><span style="color: #000000;">;</span>
  <span style="color: #434f54;">/////////////////////////////////////////////////</span>
  <span style="color: #434f54;">//Compare Match Output, Funktionsmodus setzen</span>
  <span style="color: #434f54;">// 00: OC2A aus | 10: NichtInvertiert | 11: Invertiert</span>
  <span style="color: #000000;">TCCR2A</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">1</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">COM2A1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #000000;">TCCR2A</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">0</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">COM2A0</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #434f54;">// 00: OC2B aus | 10: NichtInvertiert | 11: Invertiert</span>
  <span style="color: #000000;">TCCR2A</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">1</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">COM2B1</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #000000;">TCCR2A</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">0</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">COM2B0</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>

  <span style="color: #434f54;">//WGM: Waveform Generation Bits</span>
  <span style="color: #434f54;">//100: PWM Phasenkorrigiert bei 255   | 010: CTC Clear Timer on Compare  !!!!</span>
  <span style="color: #434f54;">//101: PWM Phasenkorrigiert bei OCR0A | 011: Fast-PWM bei OCR2A und OCR2B!!!!</span>
  <span style="color: #000000;">TCCR2B</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">0</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">WGM22</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #000000;">TCCR2A</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">1</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">WGM21</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #000000;">TCCR2A</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">0</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">WGM20</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>

  <span style="color: #434f54;">// Prescaler Values, Basis ist 16 MHz;  000: "Disabled" Timer ist ausgeschaltet</span>
  <span style="color: #434f54;">// 001: /1 | 010: /8 | 011: /32 | 100: /64 DEFAULT | 101: /128 | 110: /256 | 111: /1024</span>
  <span style="color: #000000;">TCCR2B</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">1</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">CS22</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #000000;">TCCR2B</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">0</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">CS21</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #000000;">TCCR2B</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">1</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">CS20</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #434f54;">/////////////////////////////////////////////////</span>
  <span style="color: #434f54;">//Duty Cyles für die Pins: Output Compare Register</span>
  <span style="color: #000000;">OCR2A</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">255</span><span style="color: #000000;">;</span> <span style="color: #434f54;">// Pin 11 für 011-Fast-PWM-Modus und beliebigem Pin bei 010-CTC-Modus</span>
  <span style="color: #000000;">OCR2B</span> <span style="color: #434f54;">=</span> <span style="color: #000000;">1</span><span style="color: #000000;">;</span> <span style="color: #434f54;">// Pin 3</span>
  <span style="color: #434f54;">/////////////////////////////////////////////////</span>
  <span style="color: #434f54;">// Nur relevant bei CTC-Modus</span>
  <span style="color: #000000;">TIMSK2</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">1</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">OCIE2A</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span> <span style="color: #434f54;">// Für Interrupt-Einschalten für OCR2A bei CTC-Modus an beliebigem Pin.</span>
  <span style="color: #000000;">TIMSK2</span> <span style="color: #434f54;">|=</span> <span style="color: #000000;">(</span><span style="color: #000000;">1</span> <span style="color: #434f54;">&lt;&lt;</span> <span style="color: #000000;">OCIE2B</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span> <span style="color: #434f54;">// Für Interrupt-Einschalten für OCR2A bei CTC-Modus an beliebigem Pin.</span>
  <span style="color: #434f54;">//Enable interrupts</span>
  <span style="color: #000000;">sei</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #434f54;">/////////////////////////////////////////////////</span>
  <span style="color: #434f54;">//Für Fast-PWM-Modus 011</span>
  <span style="color: #d35400;">pinMode</span><span style="color: #000000;">(</span><span style="color: #000000;">3</span><span style="color: #434f54;">,</span> <span style="color: #00979c;">OUTPUT</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #d35400;">pinMode</span><span style="color: #000000;">(</span><span style="color: #000000;">11</span><span style="color: #434f54;">,</span> <span style="color: #00979c;">OUTPUT</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  
  <span style="color: #434f54;">//Für CTC-Modus an beliebigem Pin, hier 12:</span>
  <span style="color: #d35400;">pinMode</span><span style="color: #000000;">(</span><span style="color: #000000;">12</span><span style="color: #434f54;">,</span> <span style="color: #00979c;">OUTPUT</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
  <span style="color: #d35400;">pinMode</span><span style="color: #000000;">(</span><span style="color: #000000;">13</span><span style="color: #434f54;">,</span> <span style="color: #00979c;">OUTPUT</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
<span style="color: #000000;">}</span>

<span style="color: #00979c;">void</span> <span style="color: #5e6d03;">loop</span><span style="color: #000000;">(</span><span style="color: #000000;">)</span> <span style="color: #000000;">{</span>
<span style="color: #000000;">}</span>

<span style="color: #000000;">ISR</span><span style="color: #000000;">(</span><span style="color: #000000;">TIMER2_COMPA_vect</span><span style="color: #000000;">)</span> <span style="color: #000000;">{</span>
  <span style="color: #d35400;">digitalWrite</span><span style="color: #000000;">(</span><span style="color: #000000;">12</span><span style="color: #434f54;">,</span><span style="color: #434f54;">!</span><span style="color: #d35400;">digitalRead</span><span style="color: #000000;">(</span><span style="color: #000000;">12</span><span style="color: #000000;">)</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
<span style="color: #000000;">}</span>
<span style="color: #434f54;">///////////////////////////////////</span>
<span style="color: #000000;">ISR</span><span style="color: #000000;">(</span><span style="color: #000000;">TIMER2_COMPB_vect</span><span style="color: #000000;">)</span> <span style="color: #000000;">{</span>
  <span style="color: #d35400;">digitalWrite</span><span style="color: #000000;">(</span><span style="color: #000000;">13</span><span style="color: #434f54;">,</span><span style="color: #434f54;">!</span><span style="color: #d35400;">digitalRead</span><span style="color: #000000;">(</span><span style="color: #000000;">13</span><span style="color: #000000;">)</span><span style="color: #000000;">)</span><span style="color: #000000;">;</span>
<span style="color: #000000;">}</span>