Forum: Mikrocontroller und Digitale Elektronik atmega382p 2 Timer


von Lukas (Gast)


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

von Werner P. (Gast)


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

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

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

Weil das Ausgeben der PWM rein in Hardware läuft und keine ISR braucht, 
um z.B. an den Pins zu wackeln.

von S. Landolt (Gast)


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.

von Karl M. (Gast)


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.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

Lukas schrieb:
> TCCR0B |= (1<<CS00); // Prescaler 64 -> ((8000000/64)/1000) = 125
>     OCR0A = 125;

Hier hast du einen unbedeutenden Rundungsfehler eingebaut. Wenn du bis 
124 zählen lässt, sollte es genau 1 ms sein. (denn die 0 des Zählers 
zählt ja mit)

von S. Landolt (Gast)


Lesenswert?

> In meinen Programm benötige ich 2 Timer.
> Timer 0 um Millisekunden zu zählen
> und Timer 1 um ein PWM Signal auszugeben

Das geht sicher auch mit nur einem Timer, mit etwas Überlegung.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.