Forum: Mikrocontroller und Digitale Elektronik ATTINY45 PWM Erzeugung Hilfe erbeten


von Thorsten M. (cortex_user)


Lesenswert?

Hallo,

da der Code mangels Debug Möglichkeiten fehlerfrei sitzen sollte wärer 
gut, wenn jemand mit viel Ahnung ihn mal schreiben könnte. Die Timer 
sind ja nicht so ganz trivial und meine Portierung vom AVR328 auf den 
Attiny stellt mich vor einige Fragen, weil ich im Datenblatt auch noch 
rumrätsel

Timer 0 ist reserviert für die millis(), die ich auch brauche. Bleibt 
Timer 1

Ich brauche für IR eine Freq von 40khz mit DC 50%. Also Compare Register 
A (er hat ja 2, also wähle ich A) auf die Hälfte eines Überlaufs setzen 
und den Überlauf und ggf Prescaler so, dass 38khz bei 8Mhz entstehen. 
Das drehe ich ggf noch später. Aber wie müssen die Register beschrieben 
werden?

Könnte das mal jemand, der sich gut auskennt richtig aufschreiben?

Der Code ist noch falsch aber so war es beim ProMini richtig.
1
__attribute__((always_inline)) inline void Freq40khzEnable()
2
{
3
  DDRB   |= (1 << PB1);  /* Pin B1 (11) auf Output schalten */
4
  TCCR1  = (1 << WGM01) | (1 << COM1A1);   
5
  TCCR1  = (1 << CS10);                 
6
  OCR1A   = 99;                           /* 25us */
7
  TCNT1   = 0;                            /* Reset Timer1 Counter */
8
}
9
10
__attribute__((always_inline)) inline void Freq40khzDisable()
11
{
12
  /*  OC2B Pin = INT 1 Pin (PD 3)
13
  OC2A Pin = MOSI Pin (PB 3)  */
14
15
  TCCR1  = 0;                      /* Prescaler 1 und Timer stoppen */
16
  TCCR1  = 0;                      /* Normal Port Operation */
17
  PORTB   &= ~(1 << PB1);           /* PB1 Low */
18
}

: Bearbeitet durch User
von Thorsten M. (cortex_user)


Angehängte Dateien:

Lesenswert?

Code für den 328P, lauffähig und ausprobiert:
1
/* ------------------------------------------------
2
  Startet oder stoppt den Timer 2
3
    INTs müssen im Aufrufer abgeschaltet sein!
4
------------------------------------------------- */
5
6
__attribute__((always_inline)) inline void Freq40khzEnable()
7
{
8
  /*  OC2B Pin = INT 1 Pin (PD 3)
9
  OC2A Pin = MOSI Pin (PB 3)  */
10
11
  DDRB   |= (1 << PB3);          /* Pin B3 (11) auf Output schalten */
12
  TCCR2A  = (1 << WGM21) | (1 << COM2A0); /* CTC (MODE_2) + Toggle OC2A */
13
  TCCR2B  = (1 << CS20);                  /* Clock /1 => Timer2 */
14
  OCR2A   = 99;                           /* 25us */
15
  TCNT2   = 0;                            /* Reset Timer2 Counter */
16
}
17
18
__attribute__((always_inline)) inline void Freq40khzDisable()
19
{
20
  /*  OC2B Pin = INT 1 Pin (PD 3)
21
  OC2A Pin = MOSI Pin (PB 3)  */
22
23
  TCCR2B  = 0;                      /* Prescaler 1 und Timer stoppen */
24
  TCCR2A  = 0;                      /* Normal Port Operation */
25
  PORTB   &= ~(1 << PB3);           /* PB3 Low */
26
}

: Bearbeitet durch User
von Georg M. (g_m)


Lesenswert?


von Thorsten M. (cortex_user)


Lesenswert?

Danke, gar nicht gefunden bei der Suche :-)

von Thorsten M. (cortex_user)


Lesenswert?

Hier stehts auch, sogar für meine Anwendung IR Impulse zu senden.

https://github.com/kshitijl/attiny-ir-remote/blob/master/transmitter-ctc-toggle.c

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.