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
voidinit_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
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
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.
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?
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.
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.
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