Forum: Mikrocontroller und Digitale Elektronik AT Mega8 Fast PWM 2 Frequenzen


von T. P. (led_pi)


Lesenswert?

Hallo,

Ich möchte gern über PB1 und PB2 vom AT Mega8 mittels Fast PWM 2 
verschiedene Frequenzen ausgeben. Leider sehe ich nicht ganz so durch 
aktuell bin ich so weit:
1
#include <avr/io.h>
2
#define F_CPU 7372800UL          // 7,37280 MHz
3
4
int timer_start(int);
5
6
int main(void)
7
{
8
while(1)
9
{
10
    int t=0;
11
    timer_start(t);       // t wird später vom Programm bestückt
12
    DDRB = (1 << PB1 );    
13
return 0;
14
}
15
16
int timer_start(int z)
17
{
18
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
19
20
  TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS12);   // Vorteiler 256 Takt 7,3728 Mhz
21
22
ICR1 = z;
23
24
OCR1A = 25;            // Anzeit 10%
25
return 0;
26
}

oder ist das über Fast PWM nicht möglich?

MFG
LED_PI

von Samuel C. (dragonsam)


Lesenswert?

Du kannst mit einem Timer nicht mehrere Frequenzen erzeugen. Das geht 
nur mit mehreren Timern oder ausgeklügelten Software-Timern.

von T. P. (led_pi)


Lesenswert?

Moin,

Ist es möglich mit dem Timer 2 einen Fast PWM auf PB2 auszugeben, mit 
dem Topwert in OCR2 oder ist das dann nur an PB3 möglich?

Mit freundlichen Grüßen
LED_PI

von Karl H. (kbuchegg)


Lesenswert?

Du kannst auf allen Pins eine Timer generierte PWM erzeugen, die in der 
Pinübersicht bei den alterntiven Funktionen ein OCx stehen haben. Das x 
ist dann die Nummer des Timers, der diesen Pin bedienen kann. (und 
gegebenenfalls kommt noch ein Buchstabe dazu, wenn es bei diesem Timer 
mehrere COmpare Match Register gibt)

Beim Mega 8 sind das

PB1    OC1A
PB2    OC1B
PB3    OC2


That's it. Mehr geht nicht. Timer 2 kann also maximal an PB3 eine PWM 
erzeugen.

von T. P. (led_pi)


Lesenswert?

Moin,

Wenn ich den PB3 nutze kann ich den mega8 noch mit ISP programmieren?

MFG
LED_PI

von T. P. (led_pi)


Lesenswert?

Moin,

Ich habe jetzt Timer1 und Timer2 wie folgt konfiguriert :
1
TCCR1A = (1<<COM1A1) | (1<<WGM11);
2
TCCR1B = (1<<WGM13) | (1<<WGM12) | (1<<CS12);
3
TCCR2 |= (1<<WGM21)|(1<<COM20)|(1<<CS22)|(1<<CS21)|(1<<CS20);
Funktion:
1
int timer1(int z)
2
{
3
4
ICR1 = z;
5
6
OCR1A = 25;
7
8
return 0;
9
}
10
11
int Timer2(int y)
12
{
13
OCR2 = y;
14
return 0;
15
}

Leider läuft immer nur einer von beiden aber nicht beide gleichzeitig.
Was mach ich falsch?

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.