Forum: Mikrocontroller und Digitale Elektronik PWM !OC1B auf ATtiny85 läuft nicht wie erwartet


von Florian W. (Firma: Pesch Marinescheinwerfer) (seematzfw)


Lesenswert?

Hallo liebe Forengemeinde,

ich versuche mich seit einiger Zeit in das Thema PWM auf dem ATtiny85 
einzufuchsen, bekomme es aber irgendwie nicht hin.

Ich bin immerhin soweit, dass am PB3 eine PWM erzeugt wird, sie hat auch 
in etwa die gewünschte Frequenz (4-5Hz Abweichung laut Oszi, für 
internen RC Oszillator also in Ordnung), allerdings bekomme ich das 
Tastverhältnis nicht eingestellt. Unabhängig davon, welchen Wert ich für 
OCR1B eintrage, liegt das Tastverhältnis bei geschätzt 25%.

Ich hab meinen Code, mit der ich den Timer initialisiere im folgenden 
notiert.
1
#include <avr/io.h>
2
FUSES =
3
{
4
  .low = (FUSE_CKSEL0 & FUSE_CKSEL2 & FUSE_CKSEL3 & FUSE_SUT0 & FUSE_SUT1), //Clock set to 8MHz internal RC oscillator CKSEL[0010], Start-up Time with BOD enabled SUT[00]
5
  .high = (HFUSE_DEFAULT & FUSE_BODLEVEL0 & FUSE_BODLEVEL1), // BOD-Level set to ~4.3V BODLEVEL[100]
6
  .extended = (EFUSE_DEFAULT)
7
};
8
9
#include <avr/interrupt.h>
10
11
12
void init_timer1(void)
13
{
14
  DDRB |= (1<<DDB3);                // Port !OC1B set output
15
  PORTB &= ~(1<<PB3);                // Set PB3 off
16
  GTCCR = (1<<PWM1B) | (1<<COM1B0);        // PWM-Mode, !OC1B set on compare match, Cleared when TCNT1 = 0
17
  TCCR1 = (1<<CTC1) | (1<<CS12) | (1<<CS11);    // timer on, timer cleared on compare match with OCR1C, prescaler 1/32 => F_TIMER = 125kHz
18
  OCR1C = 199;                  // F_PWM = 625Hz
19
  OCR1B = 99;                    // PWM 50% duty cycle on startup | Inversion of PWM signal by driver
20
}
21
22
int main(void)
23
{
24
  cli();
25
  CLKPR = 0b10000000;    // Clock Prescaler Change enabled
26
  CLKPR = 0b00000001;    // Clock Prescaler set to division by 2, thus setting F_CPU to 4 MHz
27
  init_timer1();
28
  sei();
29
    while(1)
30
    {
31
        
32
    }
33
}

Ich würde mich sehr freuen, wenn mir jemand den entscheidenden Tipp 
geben könnte, an welcher Stelle ich etwas falsch mache und wo ich 
nachlesen kann, wie man es richtig macht.

Mit freundlichen Grüßen und Dank schon im Voraus für eure Hilfe
Florian

von foo (Gast)


Lesenswert?


von Florian W. (Firma: Pesch Marinescheinwerfer) (seematzfw)


Lesenswert?

Diesen Thread hatte ich auch schon gefunden, allerdings betrifft das 
Problem lediglich ATtiny45er der ersten Generation. Zu Testzwecken hatte 
ich das tatsächlich auch einmal ausprobiert, woraufhin die PWM 
abgeschaltet wurde und der PB3 einfach dauerhaft auf high war.

von Martin (Gast)


Lesenswert?

Ich würde den PWM Modus und nicht den CTC Modus verwenden

von S. Landolt (Gast)


Lesenswert?

Ihr Programm, auf Assembler umgesetzt, läuft bei mir mit Tastverhältnis 
50 % auf einem ATtiny85-20PU von 0739 (wenn ich Letzteres richtig 
entziffere).

von N. G. (newgeneration) Benutzerseite


Lesenswert?

Florian W. schrieb:
> FUSES =
> {
>   .low = (FUSE_CKSEL0 & FUSE_CKSEL2 & FUSE_CKSEL3 & FUSE_SUT0 &
> FUSE_SUT1), //Clock set to 8MHz internal RC oscillator CKSEL[0010],
> Start-up Time with BOD enabled SUT[00]
>   .high = (HFUSE_DEFAULT & FUSE_BODLEVEL0 & FUSE_BODLEVEL1), //
> BOD-Level set to ~4.3V BODLEVEL[100]
>   .extended = (EFUSE_DEFAULT)
> };

ich habe mit so etwas noch nie gearbeitet. Trotzdem glaube ich, dass es 
keine &s sondern | sein müssen, kann das sein?

Und kann man damit überhaupt die Fuses verändern?

von S. Landolt (Gast)


Lesenswert?

Da bei ihm das Tastverhältnis falsch ist, die Frequenz aber stimmt, 
werden die Fuses wohl passen, wie und warum auch immer. Es sei denn, die 
Stromversorgung spielt mit dem BOD zusammen irgendeinen Streich.
Ich vermute eher, dass neue Programmversionen nicht geflasht werden.

von foo (Gast)


Lesenswert?

N. G. schrieb:
> ich habe mit so etwas noch nie gearbeitet. Trotzdem glaube ich, dass es
> keine &s sondern | sein müssen, kann das sein?

Da war mal irgendwas mit gesetzte Fuses sind 0, nicht gesetzte sind 1

Die Defines in den Headern sind jedenfalls so:
1
#define FUSE_CKSEL2      (unsigned char)~_BV(2)

also negiert.

> Und kann man damit überhaupt die Fuses verändern?

Kann man, da das in einer getrennten Section abgelegt wird, die avrdude 
(frisst neuerdings ELF) anscheinend wieder auslesen kann.

von N. G. (newgeneration) Benutzerseite


Lesenswert?

foo schrieb:
> N. G. schrieb:
>> ich habe mit so etwas noch nie gearbeitet. Trotzdem glaube ich, dass es
>> keine &s sondern | sein müssen, kann das sein?
>
> Da war mal irgendwas mit gesetzte Fuses sind 0, nicht gesetzte sind 1

Oh, stimmt, erwischt. Mein Fehler -.-

> Die Defines in den Headern sind jedenfalls so:
...
> also negiert.
>
>> Und kann man damit überhaupt die Fuses verändern?
>
> Kann man, da das in einer getrennten Section abgelegt wird, die avrdude
> (frisst neuerdings ELF) anscheinend wieder auslesen kann.

Oh, auch was neues. Wieder was gelernt. Danke

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.