Forum: Mikrocontroller und Digitale Elektronik AtTiny85 FastPWM


von Bohlen (Gast)


Lesenswert?

Programmiere mit dem Arduino einen AtTiny85, leider bekomme ich FastPWM 
nicht eingestellt, dass es mit OCR0A als Top läuft, messe keine Frequenz 
an PB0.

[CODE]
void setup(){
  DDRB = (1 << PB0);
  TCCR0A = ((1 << COM0A1) | (1 << WGM01) | (1 << WGM00));
  TCCR0B = ((1 << WGM02)|(1 << CS01));
  OCR0A =  26;

}
[CODE]

Ganz durchgeblickt hab ich den FastPWM leider nicht, aber mit WGM0x in 
Modus 7 ist OCR0A = TOP, also müsste eine Frequenz von 38462Hz ankommen.
((Clock [8.000.000]/ Prescaler [8])/OCR0A [26])

Nur wie würde ich jetzt den DutyCycle einstellen, wennn OCR0A jetzt TOP 
ist?

von spess53 (Gast)


Lesenswert?

Hi

>Nur wie würde ich jetzt den DutyCycle einstellen, wennn OCR0A jetzt TOP
>ist?

OCR0B. Ausgang OC0B.

MfG Spess

von Bohlen (Gast)


Lesenswert?

Vielen Dank, das war der kleine Anstoß der mir gefehlt hat!
Ausgang OC0A fällt in diesem Modus ja leider weg.

Dann kleine Frage am Rande:
Gibt es eine bessere Möglichkeit den Ausgang OC0B zu schalten, als mit 
COM0B0 und COM0B1 zu arbeiten oder den Ausgang als Eingang zu schalten?
Es geht mir um das Schalten von Infrarot-Signalen.

von c-hater (Gast)


Lesenswert?

Bohlen schrieb:

> Gibt es eine bessere Möglichkeit den Ausgang OC0B zu schalten, als mit
> COM0B0 und COM0B1 zu arbeiten oder den Ausgang als Eingang zu schalten?

Nein. Es gibt nicht nur keine bessere, sondern sogar überhaupt keine 
andere Möglichkeit.

Allerdings: Was zum Teufel gefällt dir an der DDR-Lösung eigentlich 
nicht?

von Oldie (Gast)


Lesenswert?

Hallo Bohlen (Gast),

ich habe kürzlich was Ähnliches gemacht - Tiny 25 und 85
haben ja nur unterschiedliche Speichergröße.

Ich war leider nur zu faul, die Bits in den TCCR0x-Registern
im ASM-Text "ordentlich" zu benennen...

Funktioniert recht gut, aber vielleicht kommt uns zusammen noch
eine bessere Idee!

Hier meine passenden ASM-Code-Ausschnitte:
1
.include "tn25def.inc"      ; Prozessor-Typ  ATTiny25
2
.equ CLKHZ  = 8000000    ; Prozessor-Takt 8 MHz intern
3
.equ OUT_IR = 1        ; IR-Output  -> PortB-1
4
5
Timr0_Ini:         ; Für IR-Timing 38 kHz
6
  ldi  Tmp0, CLKHZ/38000  ; etwa (!) 38 kHz
7
  out  OCR0A, Tmp0     ; 8000000 / 38000 = 210
8
  lsr  Tmp0       ; 210 / 2 = 105
9
  mov  Tmp1, Tmp0     ; 105
10
  lsr  Tmp1      ; 52
11
  lsr  Tmp1       ; 26
12
  add  Tmp0, Tmp1     ; 105+26 = 131 OFF / 79 ON 
13
  out  OCR0B, Tmp0     ; = 37,6% d.c.
14
15
16
; Die folgenden Code-Schnipsel sind im Timer0 - Overflow - Interrupt 
17
; (der kommt im 38 kHz-Takt!). Der µC sollte gleichzeitig also nicht 
18
; zuuu viele weitere Aufgaben haben...: 
19
20
IR_ON:          ; PWM-Ausgang einschalten
21
  ldi  Tmp0,  0b00110011  ; Mode 7 = PWM: OC0B coupled, 
22
  out  TCCR0A, Tmp0    ; 
23
  ldi  Tmp0,  0b00001001  ; Mode 7 = PWM: Counter full Clk
24
  out  TCCR0B, Tmp0    ;   PW-max = OCR0A, PW = OCR0B
25
26
IR_OFF:          ; PWM-Ausgang ausschalten  
27
  ldi  Tmp0,  0b00000011  ; Mode 7 = PWM: OC0B decoupled, 
28
  out  TCCR0A, Tmp0    ;   PW-max = OCR0A, PW = OCR0B
29
  cbi  PortB, OUT_IR    ; decoupled Output OC0B = LOW
30
31
IR_END:          ; IRQ abschalten, IR-Bits = 0
32
  ldi  Tmp0,  0b00000011  ; Mode 7 = PWM: Output decoupled, 
33
  out  TCCR0A, Tmp0    ;  PW-max = OCR0A, PW = OCR0B
34
  cbi  PortB, OUT_IR    ; decoupled Output OC0B = LOW
35
  ldi  Tmp0,  0b00001000  ; Mode 7 = PWM: Counter Stopp!
36
  out  TCCR0B, Tmp0    ;  
37
  in  Tmp0, TIMSK
38
  andi Tmp0, ~(1 << TOIE0)  ; IRQ = Off 
39
  out  TIMSK, Tmp0

von Karol B. (johnpatcher)


Lesenswert?

Oldie schrieb:
> Funktioniert recht gut, aber vielleicht kommt uns zusammen noch
> eine bessere Idee!

Und was heißt besser? Was sind denn deine/eure Erwartungen?

Mit freundlichen Grüßen,
Karol Babioch

von Oldie (Gast)


Lesenswert?

@ Karol Babioch

Machst du auf Anhieb immer alles unverbesserbar perfekt?

Z.B. könnte bei mir das

cbi  PortB, OUT_IR

 überflüssig sein, da ich den OC0B-Portpin im Low-Zustand von
der PWM-Funktion entkopple. Vielleicht reicht es, wenn vorher
mal der Portpin als "normaler" Ausgang auf NULL gesetzt wurde?

Ist also mehr eine "Angst"-Zeile...

(Wenn er NICHT definitiv NULL ist und bleibt, ist aber irgendwann
die Batterie schnell leer und vielleicht die IR-LED kaputt.)

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.