Forum: Mikrocontroller und Digitale Elektronik Attiny45 Timer1 PWM funktioniert nicht


von Richi (Gast)


Lesenswert?

Ich habe hier einen Attiny45 und wollte eine RGB Led damit ansteuern.
Zurzeit hab ich es noch in meinem STK500 Dadurch sind die Signale 
Invertiert.

Den Timer eins hab ich eigentlich so Eingestellt das er funktioniern 
müsste aber es kommt nichts an.

Kennt jemand das Problem oder sogar eine Lösung ?
1
#define F_CPU 3686400UL
2
3
#include <avr/io.h>
4
#include <util/delay.h>
5
6
char zaehler = 0;
7
char up = 1;
8
9
int main()
10
{
11
  DDRB = 0xFF;
12
  PORTB = 0xFF;
13
  TCCR0A = ((1<<WGM00) | (1<<COM0A1) | (1<<COM0B1) | (1<<COM0A0) | (1<<COM0B0));
14
  TCCR0B = (1<<CS00);
15
  TCCR1 = ((1<<PWM1A) | (1<<COM1A1) | (1<<COM1A0) | (1<<CS10));
16
  while(1)
17
  {
18
    if(up)
19
    {
20
      zaehler++;
21
    }
22
    else
23
    {
24
      zaehler--;
25
    }
26
    if(zaehler == 255)
27
    up = 0;
28
    if(zaehler == 0)
29
    up = 1;
30
    OCR0B = zaehler;
31
    OCR0A = 255 - zaehler;
32
    OCR1A = 255;
33
    _delay_ms(100);
34
  }
35
}

von Uwe (de0508)


Angehängte Dateien:

Lesenswert?

Hallo,

ia das geht nur dein code stimmt nicht, OCR1C ist das 
Vergleichsregister.
1
#define PWM_PRESCALER  1UL
2
#define PWM_CLOCK  64000000UL
3
#define PWM_FREQ  500000UL      // 500.000kHz
4
5
void Setup_Timer1(void)
6
{
7
  // PLL Starten
8
  PLLCSR |=  _BV(PLLE) ;        // PLL Starten
9
  delay_us(100);          // warte >=100µS
10
  while ( ! ( PLLCSR & _BV(PLOCK)) ) ;      // warte auf PLL Lock
11
12
  PLLCSR |= _BV(PCKE);          // Timer1 PLL Clock Source
13
14
  SET_BIT_PSR1();          // Prescaler Timer1 auf 0 setzen
15
16
  SET_TCNT1(0);
17
  SET_OCR(1A, SIN_SHIFT);        // OC1A pin (PB1)
18
  SET_OCR(1B, SIN_SHIFT);        // OC1B pin (PB4)
19
20
  // PWM Frequency
21
  SET_OCR(1C, (uint8_t)((PWM_CLOCK / PWM_PRESCALER / PWM_FREQ + 0.5) -1) );
22
23
  SET_PWM_T1_A();
24
  SET_PWM_T1_B();
25
  SET_PRESCALE_T1(_T1_PRESCALE_1);
26
27
}

Im Bild siehst Du wie alles Zusammenspielt.

Ich verwende die PLL mit 64MHz als Takt für die PWM und die Macros im 
obigen Vode sollen ihr lesbarer machen und sorgen auch dafür dass ich 
ihn einfach auf einen anderen µP, z.B. dem atTiny861, portieren kann.

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.