Die meisten AVR-Mikrocontroller haben drei dedizierte Pins für jeden Timer (z. B. OC1A, OC1B und OC1C), die automatisch umgeschaltet werden können, wenn der Zähler den sogenannten Höchstwert in den entsprechenden drei Registern (OCR1A, OCR1B und OCR1C) erreicht.
Ich bin mir nicht sicher, wie diese drei dedizierten Pins / Register im CTC-Modus für verschiedene unabhängige Spitzenwerte arbeiten können, und das möchte ich erreichen. Ich möchte OC1A, OC1B und OC1C (obwohl "Ausgangsvergleich", nicht durch Interrupt oder ähnliches) in unterschiedlichen Intervallen umschalten (um zu sehen, dass drei dedizierte Register und Pins vorhanden sind).
Nehmen wir an, ich möchte den AVR-Timer so programmieren, dass er die Pins OC1A, OC1B und OC1C in unterschiedlichen Intervallen umschaltet (z. B. 1 Sekunde, halbe Sekunde, Viertelsekunde), aber es funktioniert nicht wie erwartet. Ich setze Vergleichsregister A und B und C mit den drei unterschiedlichen Werten, die den größten Wert auf A haben (ich habe auch versucht, ihn auf C zu haben).
Nur OC1A wird bei der benötigten Frequenz umgeschaltet.
Mir scheint, dass es möglich wäre, wenn sie nur OC1A-Top-Löschungen des Zählers vornehmen würden, dass die drei Pins mit drei verschiedenen unabhängigen Werten arbeiten könnten. Ist das richtig?
Hier ist das Segment, das ich in das Setup meines Arduino Lenoardo (basierend auf ATmega32U4 ) eingefügt habe. Ich bin loop()
leer gegangen.
// Initialize timer1
noInterrupts(); // Disable all interrupts
TCCR1A = 0;
TCCR1B = 0;
TCCR1C = 0;
TCNT1 = 0;
OCR1A = 62500; // Compare match register 16 MHz/256/1 Hz
OCR1B = 31250; // Compare match register 16 MHz/256/2 Hz
OCR1C = 15625; // compare match register 16 MHz/256/4 Hz
// Toggle OC1A, OC1B and OC1C => (on Lenoardo) PB5, PB6 and PB7 => digital 9, 10, 11
// TCCR1A = 0b01010100;
TCCR1A |= (1 << COM1C0) | (1 << COM1B0) | (1 << COM1A0);
// TCCR1B = 0b1100
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12); // 256 prescaler
interrupts(); // Enable all interrupts
Ein Timer im Normal-, Fast PWM- oder CTC-Modus zählt direkt von UNTEN nach OBEN, wenn kein externer Einfluss ausgeübt wird. Wenn es jeden OC-Wert passiert, gibt es einen Interrupt aus und/oder frobs einen Pin, wie es konfiguriert ist. Jeder OC-Wert wird nur einmal gekreuzt , was bedeutet, dass alle OCs für den gleichen Timer alle mit der gleichen Frequenz laufen .
Sie können so konfiguriert werden, dass sie unterschiedliche Phasen haben oder basierend auf den Werten von OCRnr- und COMnrb-Bits in differentiellen Paaren arbeiten, aber die einzige Möglichkeit, sie direkt unterschiedliche Frequenzen verwenden zu lassen, besteht darin, ihre OCR-Werte bei jedem Aufruf ihrer ISR zu manipulieren.
Der einfachste Weg, die Pins mit unterschiedlichen Frequenzen wechseln zu lassen, wäre, den Timer auf den GCF/LCM der verschiedenen gewünschten Perioden/Frequenzen einzustellen, eine Zählung der verstrichenen Zyklen aufrechtzuerhalten und dann die Pins zu schlagen, wenn die entsprechende Anzahl von Zyklen vergangen ist .
Mit dem Timer-Modul können Sie mehrere Ausgänge mit unterschiedlichen Arbeitszyklen erzeugen, aber alle haben dieselbe Grundfrequenz. Wenn Sie andere Frequenzen erzeugen möchten, müssen Sie eine andere Methode verwenden. Es gibt zwei Hauptwege, dies zu tun. Die erste Methode besteht darin, drei Timer zu verwenden, die jeweils mit einer anderen Frequenz arbeiten. Wenn Sie versuchen, relativ niederfrequente Ausgänge (1 kHz oder weniger) zu erzeugen, können Sie einen angemessenen Timer-Tick und eine Interrupt-Routine verwenden. Wenn Sie 1 Hz, 2 Hz und 4 Hz erzeugen möchten, können Sie einen Timer-Tick von mindestens 8 Hz einstellen und dann Ticks zählen und die Pins zum richtigen Zeitpunkt ein- und ausschalten. Bei einem 8-Hz-Timer-Tick würde die Erzeugung eines 4-Hz-Ausgangs das Umschalten des Pins bei jedem Zyklus erfordern, 2 Hz wäre jeder zweite Zyklus und 1 Hz wäre alle 4 Zyklen.
Ignacio Vazquez-Abrams
Jippie
Muayyad Alsadi
Ignacio Vazquez-Abrams
Muayyad Alsadi
Ignacio Vazquez-Abrams
Muayyad Alsadi