Forum: Mikrocontroller und Digitale Elektronik Hardware PWM, hab ich das nun so richtig begriffen?


von M. M. (mrmcchicken)


Lesenswert?

Hallo. Ich benutze in einem Projekt den Hardware PWM des ATTiny2313, 
genauer gesagt 3 Kanäle davon. Mit einer Menge Zeit, und Try 'n Error 
habe ich es auch irgendwie hinbekommen das ganze zum laufen zu bringen.
Leider würde ich auch nun gerne ganz begreifen, was ich da angestellt 
habe.

Für den Dritten Kanal ist der Code Sinngemäß gleich.
Der Code für die ersten 2 Kanäle lautet wie folgt:
1
 ;/////////// Timer0 & PWM/////////////////////////////////////////
2
 ldi temp0, (1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00)
3
 out TCCR0A, temp0
4
 
5
 ldi temp0, (1<<CS00)
6
 out TCCR0B, temp0
7
8
 ldi temp0, 0xff
9
 out OCR0A, temp0
10
 ldi temp1, 0xff
11
 out OCR0B, temp1
12
 ;////////////////////////////////////////////////////////////////

So wie ich es nun verstanden habe passiert folgendes:

1. Mit dem Setzen von COM0A1/COM0B1 ist der Zustand der Pins OC0A/OC0B 
nicht mehr vom PORT abhängig. Außerdem sind die Pins (OC0A/OC0B) LOW 
wenn der Timer den Wert aus OCR0A/OCR0B erreicht und HIGH wenn TOP (laut 
Datenblatt) erreicht wird.

2. Durch das setzen von WGM00/WGM01 wird der Timer in den CTC Mode 
gestzt.
Hierbei habe ich nun ein kleines Verständnisproblem. Im CTC Mode wird ja 
eigentlich der Timer zurückgesetzt sobald der Timer den Wert aus OCR0A 
erreicht. Wenn es in meinem Fall so wäre, dann würde der Timer ja bei 
bestimmten OCR0A Werten nicht mehr bis OCR0B zählen können, da dieser 
zurückgesetzt wird. Außerdem werden die Pins OC0A/OC0B erst gesetzt wenn 
der Timer den TOP Wert erreicht. Das könnte dann ja nie passieren da der 
Timer vorher zurückgesetzt wird.

3. Der Rest ist nur Vorteiler setzen etc.

Ich hoffe mir kann jemand die Zusammenhänge erklären, dass ich besser 
begreifen kann was da eigentlich genau passiert.

MfG

von spess53 (Gast)


Lesenswert?

Hi

>2. Durch das setzen von WGM00/WGM01 wird der Timer in den CTC Mode
>gestzt.

Nein. WGM00=1 und WGM01=1 ist Fast PWM.

MfG Spess

von M. M. (mrmcchicken)


Lesenswert?

Ah! Gut, das erklärt das nun. Das Bedeutet, dass der Timer bis 
OCR0A/OCR0B zählt und wenn er dort ankommt setzt er OC0A/OC0B = 0. 
Sobald er bei 0xFF ankommt gibt es wider eine 1 Auf OC0A/OC0B richtig?

von flieger (Gast)


Lesenswert?

M. M. schrieb:
> Ah! Gut, das erklärt das nun. Das Bedeutet, dass der Timer bis
> OCR0A/OCR0B zählt und wenn er dort ankommt setzt er OC0A/OC0B = 0.
> Sobald er bei 0xFF ankommt gibt es wider eine 1 Auf OC0A/OC0B richtig?

Tust du raten (entschuldige das "tust", da ich mich nicht zwischen 
ratest oder rätst entscheiden konnte) oder beziehst du dich auf eine 
Stelle im Datenblatt und wenn ja auf welche?

von M. M. (mrmcchicken)


Lesenswert?

flieger schrieb:
> oder beziehst du dich auf eine Stelle im Datenblatt und wenn ja auf welche?

Seite: 68 & 73 - 75
Das Mit dem CTC Mode war blöd verguckt.

von S. Landolt (Gast)


Lesenswert?

> Tust du raten...
Was dem einen sein Datenblatt, ist dem anderen sein Duden, also 'Rätst 
Du?'
Aber wie wär's mit 'Raten Sie?' oder gar dem fiderizianischen Er: 'Rät 
Er?' - das klänge doch wirklich exklusiv!

von S. Landolt (Gast)


Lesenswert?

Und hier kommt noch das fehlende 'r'. Peinlich.

von Kai M. (kai_mauer)


Lesenswert?

S. Landolt schrieb:
> Peinlich.

Absolut.

von S. Landolt (Gast)


Lesenswert?

>> Peinlich.
> Absolut.
Weiß auch nicht, was los ist, passiert mir in letzter Zeit öfters.
Ich kam nur darauf, weil ich heute, durchaus mit Genuss, die 
Grimm-Verfilmungen im Kinderkanal sah - ob da ein Zusammenhang besteht?

von Oldie (Gast)


Lesenswert?

Bei den meisten AVRs ist es außerdem noch nötig, beim
Initialisieren der Ports die benutzten CMPxy-Outputs auch
als Output zu setzen. (DDR-Bit = 1)

Sonst wird es nix mit "Override normal Port Function"..

Wirst du aber wohl instinktiv richtig gemacht haben.

von F. F. (foldi)


Lesenswert?

S. Landolt schrieb:
> passiert mir in letzter Zeit öfters.

Du Grammatik Genie. Ich kann diese selbsternannten Verbesserer nicht 
leiden.
Wenn man schon so auf die Kacke haut, dann sollte es auch spritzen.

von Matthias S. (Firma: matzetronics) (mschoeldgen)


Lesenswert?

M. M. schrieb:
> Sobald er bei 0xFF ankommt gibt es wider eine 1 Auf OC0A/OC0B richtig?
Beachte bitte, was dazu auf Seite 69 des DB steht:
(Zitat]:

The extreme values for the OCR0A Register represents special cases when 
generating a PWM waveform output in the fast PWM mode. If the OCR0A is 
set equal to BOTTOM, the output will be a narrow spike for each MAX+1 
timer clock cycle. Setting the OCR0A equal to MAX will result in a 
constantly high or low output (depending on the polarity of the output 
set by the COM0A1:0 bits.)
[/Zitat]

Gerade 0xFF ist also nicht wirklich ein geeigneter Wert, um PWM Ausgang 
zu erzeugen, die Ausgänge sind dann konstant auf high oder low.

: Bearbeitet durch User
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.