ATMega 8 / 32 / 128 Timer / PWM

#3839811
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.
Gast #3839827
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.
#3839833
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.

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