atmega382p 2 Timer

Gast #5240971
Lesenswert?

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
Gast #5240983
Lesenswert?

Lukas schrieb:
> Frage 1:
> Weshalb brauche ich TIMSK1 im PWM Modus nicht (das habe ich durch
> rumprobieren gemerkt )?
>

für PWM ist keine Interrupt Routine nötig

> Frage 2:
> Wenn ich nun einen zweiten Timer bräuchte der etwas zählt (wie Timer 0)
> was wäre die Lösung?

Eine ISR Funktion. So wie bei Timer 0
Gast #5240985
Lesenswert?

> Weshalb brauche ich TIMSK1 im PWM Modus nicht

Wozu sollte es benötigt werden? Oder anders gefragt, was steht in der 
dazu gehörenden, nicht gezeigten ISR? Falls diese aber fehlen sollte, so 
ist genau das das Problem.
Gast #5240989
Lesenswert?

Hallo,

wichtig ist doch das: um was geht es überhaupt?

Bitte mehr Input.

Ich kann deshalb nur etwas zum Timer0 schreiben.
1
TCCR0B |= (1<<CS00); // Prescaler 64 -> ((8000000/64)/1000) = 125
2
OCR0A = 125;
Der Timer0 läuft nicht mit 1ms, sondern mit 992,06Hz.

Warum ? OCR0A wird nicht richtig gesetzt.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren