Black D. schrieb:
> Moin, ich versuche grad die eingestellte Frequenz meines Timer1 zu
> messen. Meine erste Idee war den Pin 8 bei jedem Durchlauf des
> Interrputs high und low zu setzten.
Kann man so machen, wenn gleich die Funktion digitalWrite() ein wenig
lahm ist. Die dauert ca. 8us.
Du musst die Register nicht vorher auf Null setzen. Erstens sind die
nach dem Reset definiert auf Null, zweitens man einen kompletten, neuen
Wert rein. Nur beim Interrupt-Enable setzt man ein einzelnes Bit, weil
man dort andere Bits nicht verändern will udn auch nicht weiß, was dort
drin steht.
Warum meinst du, einen Vorteiler von 1024 zu brauchen, um 80kHz zu
erzeugen? Schon mal gerechnet?
F_PWM = F_CPU / (PRESCALER * OCR1A + 1) = 16e6 / (1024 * 199 +1) =
78,125
Man rechnet das so. Bei gewünschten 80kHz sind das 200, aber mit
Prescaler 1!
Wie mißt du denn das SIignal? Mit einem Oszi? Oder einem billigen
Multimeter mit Frequenzmeßfunktion? Man kann es auch leichter machen,
indem man im Interrupt das IO-Pin umschaltet (neudeutsch, toggeln). Dann
hat man zwar nur die halbe Frequenz, die aber mit entspannten 50%
Tastverhältnis. Das kann man einfacher messen. F_CPU wird schon von der
Arduino IDE definiert.
1 | #define F_TIMER 80000L
|
2 | #define PRESCALER 1
|
3 | #define RELOAD (F_CPU / ( F_TIMER * PRESCALER) - 1)
|
4 |
|
5 | pinMode(8,OUTPUT);
|
6 | //Timer1 einstellen
|
7 | OCR1A = RELOAD;
|
8 | TCCR1A = 0;
|
9 | TCCR1B = (1 << WGM12) | (1<<CS10); //CTC mode, prescaler 1
|
10 | TIMSK1 |= (1 << OCIE1A); //Aktivieren des Timer-Vergleichs-Interrupt
|
11 | }
|
12 |
|
13 | ISR(TIMER1_COMPA_vect) { //Interrupt
|
14 | digitalWrite(!digitalRead(8)); // umschalten, -> halbe ISR-Frequenz am IO-Pin
|
15 | }
|