Forum: Mikrocontroller und Digitale Elektronik ATMega 8 / 32 / 128 Timer / PWM


von Tobias N. (silberkristall)


Lesenswert?

Hallo,

der ATMega8 hat 3 PWMs, der ATMega32 hat 4 PWMs und der ATMega128 sogar 
8 PWMs g.

Wie kriege ich alle Timer/PWMs gleich? Also ich brauche die PWMs auf 
allen ATmegas gleich.

Als Beispiel beim ATMega8

PWM_WERT = 128;

OCR1A = PWM_WERT;
OCR1B = PWM_WERT;
OC2 = PWM_WERT;

Ich kriege bei den oben genannten Megas lediglich die PWM unter OCR1A 
und OCR1B zum laufen. Die andere garnicht.

Ich habe gesetzt, gemacht getan, nichts. Entweder läuft die PWM unter 
OCR1A und OCR1B oder es geht garnicht.

Ich könnte mir natürlich auch einfach einen PWM Controller kaufen. Da 
ich hier aber noch hunderte ATMegas rumliegen habe kann ich diese noch 
als PWM Controller einsetzten. Haben zwar dann mehr unbenutzte PINs und 
werden sich mehr als alles andere langweilen aber so kriege ich die 
wenigstens Weg ;)

Da ich 12 PWMs brauche und am besten per I2C ansprechbar bietet sich das 
nunmehr an.

Allerdings kriege ich nicht alle PWMs auf den AVRs zum laufen.


Also es müssen einfach alle Timer auf der höchsten, vom kleinsten WErt 
möglichen BIT laufen. Also ich glaube 8Bit können alle Timer der AVRs 
somit müsste dann jede PWM mit 8Bit Phase Korrekt laufen.


Beim ATMega128 kommt noch dazu das da 2 PWMs auf einem PIN liegen, und 
zwar auf PIN PB7. Daraus würde ich jetzt schließen das dieser nur 
"nutzbare" 7 PWMs hat. Richtig?

Danke euch schonmal.

von spess53 (Gast)


Lesenswert?

Hi

>und der ATMega128 sogar 8 PWMs g.

Damm musst du ein anderes Datenblatt haben. In meinem steht:

6 PWM Channels with Programmable Resolution from 2 to 16 Bits

MfG Spess

von Wurscht (Gast)


Lesenswert?

Tobias N. schrieb:
> Als Beispiel beim ATMega8
>
> PWM_WERT = 128;
>
> OCR1A = PWM_WERT;
> OCR1B = PWM_WERT;
> OC2 = PWM_WERT;
>
> Ich kriege bei den oben genannten Megas lediglich die PWM unter OCR1A
> und OCR1B zum laufen. Die andere garnicht.

Wenn das alles an Programm ist reicht es ja auch nicht um PWMs zum 
Laufen zu kriegen.

von Tobias N. (silberkristall)


Lesenswert?

In meinem steht

Two 8-Bit PWM Channels

6 PWM Channels with Programmable Resolution from 2 to 16 Bits

das macht bei mir ingesammt 8. Und wenn ich auf dem Datenblatt mir die 
PINs ansehe dann zähle ich 7 PWMs mit einem eigenen PIN und zwei PWMs 
auf einem PIN.

Das ist mein DB:

http://www.atmel.com/images/doc2467.pdf

von Oliver (Gast)


Lesenswert?

Vermutlich hat er gar kein Datenblatt. Denn da stünde drinn, wie man die 
PWMs an laufen bekommt.

Oliver

von Tobias N. (silberkristall)


Lesenswert?

Das ist mir schon klar. Das war nur die erklärung dazu.
1
#include <avr/io.h>
2
#include <util/delay.h>
3
#include <util/twi.h>       //enthält z.B. die Bezeichnungen für die Statuscodes in TWSR
4
#include <avr/interrupt.h>  //dient zur Behandlung der Interrupts
5
#include <stdint.h>       //definiert den Datentyp uint8_t
6
#include "twislave.h"
7
#include <stdlib.h>         //nötig für Zahlumwandlung mit itoa
8
9
#define SLAVE_ADRESSE 0x50
10
11
uint8_t byte1 = 42;
12
13
int main(void)
14
{
15
  // PWM
16
    DDRB = 0x06;                      // Set Port PB1 and PB2 as Output
17
    TCCR1A = (1<<WGM10)|(1<<COM1A1)   // Set up the two Control registers of Timer1.
18
            |(1<<COM1B1);             // Wave Form Generation is Fast PWM 8 Bit,
19
    TCCR1B = (1<<WGM12)     // OC1A and OC1B are cleared on compare match
20
            |(1<<CS10);               // and set at BOTTOM. Clock Prescaler is 1024.
21
22
  OCR1A = 0;
23
24
  // PWM Ende
25
  
26
  // TWI
27
  
28
    //TWI als Slave mit Adresse slaveadr starten
29
    init_twi_slave(SLAVE_ADRESSE);
30
    
31
    //i2cdatamit Werten füllen, die der Master auslesen und ändern kann
32
    for(uint8_t i=0;i<i2c_buffer_size;i++)
33
      {
34
        i2cdata[i]=0+i;
35
      }
36
      
37
  // TWI Ende
38
39
    while(1)
40
  {
41
  
42
    OCR1A = i2cdata[0];
43
  
44
  }
45
}

das Klappt mit OCR1A und OCR1B aber nicht mit OC2. Sobald ich den OC2 in 
den registern einstelle geht garkeine PWM mehr.

von Tobias N. (silberkristall)


Lesenswert?

Oliver schrieb:
> Vermutlich hat er gar kein Datenblatt. Denn da stünde drinn, wie man die
> PWMs an laufen bekommt.
>
> Oliver

Schieb dir deinen Kommentar sonst wo hin.

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


Lesenswert?

Tobias N. schrieb:
> aber nicht mit OC2. Sobald ich den OC2 in
> den registern einstelle geht garkeine PWM mehr.

Wenn du Timer 2 nicht initalisierst, wird aus OC2 bis zum Ende der Zeit 
auch nichts rauskommen.

> DDRB = 0x06;                      // Set Port PB1 and PB2 as Output

Du solltest dann noch PB3 als Ausgang konfigurieren.

: Bearbeitet durch User
von Wurscht (Gast)


Lesenswert?

Tobias N. schrieb:
> .
> .
> .
> das Klappt mit OCR1A und OCR1B aber nicht mit OC2. Sobald ich den OC2 in
> den registern einstelle geht garkeine PWM mehr.

Schade. Kann leider nix dazu sagen :(

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.