Forum: Mikrocontroller und Digitale Elektronik PWM mit attiny24 und Timer1


von Jay (Gast)


Lesenswert?

Hallo Leute,
ich bin ein wenig am Anfang was PWM angeht, aber habe mir schon mehrere 
Tage die Finger wund gesucht. Ich möchte gerne eine LED am attiny24 
dimmen. Ich habe mir schon ein schönes Programm geschrieben, wofür ich 
auch eine Tastenentprellung, und damit Timer0 genutzt habe. Das hat 
leider nicht funktioniert, darum wollte ich erstmal testen ob die PWM 
mit einem Festwert funktioniert. Leider tut sie das nicht und ich wollte 
mich an euch wenden.

Hier das Programm:
1
#define F_CPU 1000000UL
2
3
#include <stdint.h>
4
#include <avr/io.h>
5
#include <util/delay.h>
6
#include <avr/interrupt.h>
7
8
#include <avr/io.h>
9
10
int main(void)
11
{
12
  
13
   // OC1A auf Ausgang
14
  DDRB |= (1<<PB2);
15
16
  // Was die einzelnen Einstellungen genau bedeuten steht im Datenblatt
17
  //
18
  // Timer 1 einstellen
19
        //  
20
        // Modus 10: Phase Correct PWM, Top von ICR1
21
        //
22
        // >> WGM13    WGM12   WGM11    WGM10
23
        //       1        0       1        0
24
        //
25
        // Timer Vorteiler: 1
26
  //
27
        // >> CS12     CS11    CS10
28
        //      0        0       1
29
        //
30
        //  Steuerung des Ausgangsport: Set at BOTTOM, Clear at match
31
  //
32
        // >> COM1A1   COM1A0
33
        //      1        0
34
 
35
  TCCR1A = (1<<COM1A1) | (1<<WGM11);
36
  TCCR1B = (1<<WGM13) | (1<<CS11);
37
  
38
  // Den Endwert (TOP) für den Zähler setzen
39
   // Der Zähler zählt bis zu diesem Wert
40
  // Hier kann man unter anderem die Frequenz der PWM einstellen
41
    ICR1 = 0x0080;
42
43
  
44
    while(1)
45
    {
46
      OCR1A = 10;
47
    }
48
}

die 1MHz brauche ich um den µC auch noch bei 1,8V betreiben zu können.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

avr/io.h includierst du zweimal, aber das ist kein Problem. Was ich 
komisch finde, das du in der while-Schleife den Compare-Wert setzt. Das 
musst du nicht machen, damit schreibst den ja ständig neu da rein. Also 
mal raus aus der while-Schleife. Aber das ist auch nicht das Problem. 
Ich würde einfach mal probieren, ob der Timer überhaupt läuft. Also 
stell ihn einfach mal auf Normal-Mode und lass den Overflow Interrupt 
zu. In diesem Interrupt toggelst du einfach mal eine LED. Einfach um zu 
sehen, ob der Timer überhaupt etwas macht. Wenn er das macht, lässt du 
den Timer in dem Modus und lädst irgend eine zahl in OCR1A und lässt 
diesen Interrupt zu und führst wieder den selben Code aus, wie schon 
vorher im Overflow Interrupt. Also nach und nach vorhangeln. Weil 
eigentlich sollte der Code soweit laufen, ich hoffe, du hast exakt 
diesen Code auch probiert und hast nicht aus einem Projekt einiges 
weggelassen.


MfG Dennis

Edit:

Da ist es mir doch gerade aufgefallen. Du nutzt einfach den falschen 
Pin. PB2 ist OC0A. PA6 ist OC1A. Dann sollte alles laufen.

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.