Guten Tag,
beim Programmieren eines ATmega328p sind bei mir folgende Fragen
aufgetaucht. In meinen Programm benötige ich 2 Timer.
Timer 0 um Millisekunden zu zählen:
1 | #include <avr/io.h>
|
2 |
|
3 | #define F_CPU 8000000UL
|
4 | #include <util/delay.h>
|
5 | #include <avr/interrupt.h>
|
6 |
|
7 | //--- global variables
|
8 | volatile unsigned int millis;
|
9 |
|
10 | int main(void)
|
11 | {
|
12 | //--- Timer 0 configure
|
13 | TCCR0A = (1<<WGM01); // CTC Modus
|
14 | TCCR0B |= (1<<CS01);
|
15 | TCCR0B |= (1<<CS00); // Prescaler 64 -> ((8000000/64)/1000) = 125
|
16 | OCR0A = 125;
|
17 | TIMSK0 |= (1<<OCIE0A); // allow Compare Interrupt
|
18 |
|
19 | sei(); // activate Global Interrupts
|
20 | }
|
21 |
|
22 | ISR (TIMER0_COMPA_vect)
|
23 | {
|
24 | millis++;
|
25 | }
|
und Timer 1 um ein PWM Signal auszugeben:
1 | #include <avr/io.h>
|
2 |
|
3 | #define F_CPU 8000000UL
|
4 | #include <util/delay.h>
|
5 | #include <avr/interrupt.h>
|
6 |
|
7 | //--- global variables
|
8 | volatile unsigned int millis;
|
9 |
|
10 | int main(void)
|
11 | {
|
12 | //--- Timer 1 configure (PWM)
|
13 | TCCR1A |= (1<<COM1A1);
|
14 | TCCR1A |= (1<<COM1A0);
|
15 | TCCR1B |= (1<<WGM13);
|
16 | TCCR1B |= (1<<CS11);
|
17 | ICR1 = 1000;
|
18 | TIMSK1 |= (1<<OCIE1A);
|
19 |
|
20 | sei(); // activate Global Interrupts
|
21 | }
|
Wenn ich nun beide Timer so im Programm habe, funktioniert nur Timer 1.
Es sei denn, mann lässt beim Timer 1 die Zeile 'TIMSK1 |= (1<<OCIE1A);'
aus.
Frage 1:
Weshalb brauche ich TIMSK1 im PWM Modus nicht (das habe ich durch
rumprobieren gemerkt )?
Frage 2:
Wenn ich nun einen zweiten Timer bräuchte der etwas zählt (wie Timer 0)
was wäre die Lösung?
Ich danke für alle Antworten
Gruss Lukas