Grüß euch,
Ich versuche gerade den Timer 1 zu konfigurieren.
Die Aufgabenstellung:
Auf einer Welle sitzt ein Hallgeber, und ich bekomme je Umdrehung einen Impuls am
(PCINT0/CLKO/ICP1) PB0 auf dem Pin möchte ich auch noise Canceler enablen
Bei jedem Impuls soll der Timer die ISR(TIMER1_CAPT_vect) anspringen dort lese ich den Counter aus und berechene ..
und setze die Compare Register OCR1A und OCR1B
Wenn OCR1A oder OCR1B gleich TCNT1 soll die jeweilige ISR angsprungen werden.
ISR(TIMER1_COMPA_vect)
ISR(TIMER1_COMPB_vect)
und wenn ein Timer1 Overflow passiert, soll natürlich ISR(TIMER1_OVF_vect) ausgelöst werden.
Ich kenn mich ned gut aus, und habe viele Beiträge im I-Net durchsucht und das ATMEL-Datasheet gewälzt, aber mir sagt das zu wenig um wirklich Code rauslesen zu können.
Wenn einer von euch da fitt ist und nur mal drüberschauen könnte ob ich was wichtiges vergessen habe, oder ob ich Blödsinn geschrieben habe, wäre ich sehr dankbar!!
Ich hab das in einer anderen Sprach schon mal geschrieben, aber da sind das 3 Zeilen, und man hat keine Ahnung was sich im Hintergrund tut. Ich würde das gerne nach Arduino übertragen.
So und nun mein Code
/*
Test mit Timer 1
*/
// the setup function runs once when you press reset or power the board
// avr.clock 20000000 = 20MHz
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
// Initialisieren Timer1 16Bit
noInterrupts(); // Alle Interrupts temporär abschalten
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0; // Timer auf 0 Setzen
TCCR1B |= (1 << CS10)|(1 << CS11); // 64 als Prescale-Wert spezifizieren
TCCR1B |= (1<<ICES1); // PB0 - reagiert bei steigender Flanke
TIMSK1 |= (1 << TOIE1)| (1 << ICIE1); // Timer Overflow Interrupt aktivieren (1 << TOIE1) , PB0 als externer Interrupt (1 << ICIE1) Interrupt bei Signal an ICP1
TIFR1 |= (1<<ICF1); // Enable noise Canceler
// Compare Interrupt erlauben
TIMSK1 |= (1<<OCIE1A)|(1<<OCIE1B); // Interrupt für Timer1 freischalten gilt das damit für OCR1A und OCR1B ??
interrupts(); // alle Interrupts scharf schalten
}
// the loop function runs over and over again forever
void loop() {
/*
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
*/
}
// für den Timer Overflow
ISR(TIMER1_OVF_vect)
{
// Aktion ...........
TCNT1 = 0; // Zähler erneut vorbelegen -- TCNT1 (Timer/Counter Register): d.h. der eigentliche Zähler.
digitalWrite(LED_BUILTIN, digitalRead(LED_BUILTIN) ^ 1); // LED ein und aus
}
// für den Timer Capture Event - Hallsensor
ISR(TIMER1_CAPT_vect)
{
// TCNT1 = Variable mit dem Wert mit dem gerechnet wird.
// Setzen der Compare Register
OCR1A = 21250;; // Output Compare Register vorbelegen -- OCR1 (Output Compare Register): Ist der Zähler in TCNT1 gleich dem Inhalt des OCR1, erfolgt ein Timer Compare Interrupt.
OCR1B = 45000;; // Output Compare Register vorbelegen -- OCR1 (Output Compare Register): Ist der Zähler in TCNT1 gleich dem Inhalt des OCR1, erfolgt ein Timer Compare Interrupt.
// Das Zählen beginnt von neuem
TCNT1 = 0 // löschen des Zählers damit er von 0 wiede beginnt.
}
// für den Timer CompareA Interrupt
ISR(TIMER1_COMPA_vect)
{
digitalWrite(LED_BUILTIN, digitalRead(LED_BUILTIN) ^ 1); // LED ein und aus
}
// für den Timer CompareB Interrupt
ISR(TIMER1_COMPB_vect)
{
digitalWrite(LED_BUILTIN, digitalRead(LED_BUILTIN) ^ 1); // LED ein und aus
}