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?
Hi >Nur wie würde ich jetzt den DutyCycle einstellen, wennn OCR0A jetzt TOP >ist? OCR0B. Ausgang OC0B. MfG Spess
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.
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?
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 |
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
@ 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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.