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?

: Bearbeitet durch User
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.