Forum: Mikrocontroller und Digitale Elektronik Verständnissfrage PWM-Tutorial


von Flo S. (tuxianer)


Lesenswert?

hi,
ich lede gerade das PWM Tutorial durch und an der Stelle bin ihc etwas 
verwirrt.



Das Beispiel zeigt den Modus 14. Dabei wird der Timer-Endstand durch das 
Register ICR1 festgelegt. Weiters wird die Funktion des OC1A Pins so 
festgelegt, dass der Pin bei einem Timer Wert von 0 auf 0 gesetzt wird 
und bei Erreichen des im OCR1A Registers festgelegten Wertes auf 1 
gesetzt wird. Der Vorteiler des Timers, bzw. der ICR-Wert wird zunächst 
so eingestellt, dass eine an PB1 angeschlossene LED noch blinkt, die 
Auswirkungen unterschiedlicher Register Werte gut beobachtet werden 
können. Den Vorteiler zu verringern ist kein Problem, hier geht es aber 
darum, zu demonstrieren wie PWM funktioniert.

und das:

    ;
    ; der Compare Wert
    ; Wenn der Zähler diesen Wert erreicht, wird mit
    ; obiger Konfiguration der OC1A Ausgang abgeschaltet
    ; Sobald der Zähler wieder bei 0 startet, wird der
    ; Ausgang wieder auf 1 gesetzt


wiedersprechen die sich nicht?


Das letztztere scheint zu stimmen. Oder?


Wird bei erreichen des Compare Wertes der Port nun auf 0 oder 1 
geschaltet?


Ichwürde sagen auf 0 oder?

von Karl H. (kbuchegg)


Lesenswert?

Florentin Schirmer wrote:

> wiedersprechen die sich nicht?

Du hast recht. Das ist ein Fehler im Tutorial.

>
>
> Das letztztere scheint zu stimmen. Oder?

Ja. Im Zweifel gilt: ins Datenblatt schauen. Die im Programm
benutzte Konfiguration mit den Angaben dort vergleichen, dann
weist du es genau.

>
> Wird bei erreichen des Compare Wertes der Port nun auf 0 oder 1
> geschaltet?

Mit der Konfiguration wird der Port-Ausgang beim Compare
Wert auf 0 geschaltet. So wie es im Datenblatt angegeben
ist.

Der einleitende Text im Tutorial wurde korrigiert.

von Flo S. (tuxianer)


Lesenswert?

ok dann ist ja gut ich bin nämlich fast verzweifelz drann...des weiteren 
finde ich es schade, das im Tut nicht genau erläutert wir was damit 
genau gemacht wird:

    ldi      temp1, 1<<COM1A1 | 1<<WGM11
    out      TCCR1A, temp1

    ldi      temp1, 1<<WGM13 | 1<<WGM12 | 1<<CS12
    out      TCCR1B, temp1


gut manches kann man den vorherigen Tuts entnehmen aber nicht alles. Es 
steht zwar im ganzen da was gemacht wird aber nicht welches Bit was 
bewirkt.

von Karl H. (kbuchegg)


Lesenswert?

Florentin Schirmer wrote:
> ok dann ist ja gut ich bin nämlich fast verzweifelz drann...des weiteren
> finde ich es schade, das im Tut nicht genau erläutert wir was damit
> genau gemacht wird:
>
>     ldi      temp1, 1<<COM1A1 | 1<<WGM11
>     out      TCCR1A, temp1
>
>     ldi      temp1, 1<<WGM13 | 1<<WGM12 | 1<<CS12
>     out      TCCR1B, temp1
>
>
> gut manches kann man den vorherigen Tuts entnehmen aber nicht alles. Es
> steht zwar im ganzen da was gemacht wird aber nicht welches Bit was
> bewirkt.

Ach komm.
Ein wesentlicher Bestandteil des Tutorials ist es auch, sich
im Datenblatt über die Bedeutung der Bits zu informieren.
Niemand hat nämlich Lust, das Datenblatt ins Tutorial zu kopieren.
Und wenn es auch nur auszugsweise ist.

Aber es steht dir natürlich frei, im Datenblatt die Bedeutung
der Bits nachzuschlagen und das Tutorial zu ergänzen. Dann wirst
du grade bei den Timern sehr schnell merken, dass da eine Menge
übernommen werden müsste.

von Flo S. (tuxianer)


Lesenswert?

ok ist ja gut ;-)


das verstehe ich auch nicht:

    ldi      temp1, 0x02
    out      DDRB, temp1


schaltet man den Ausgang nicht mit 0xFF?

von Troll B. (blaubeer)


Lesenswert?

Florentin Schirmer wrote:
> ok dann ist ja gut ich bin nämlich fast verzweifelz drann...

Nunja, das Tutorial enthält aber bedeutend weniger Fehler als mancher 
Beitrag hier.

> des weiteren
> finde ich es schade, das im Tut nicht genau erläutert wir was damit
> genau gemacht wird:
>
>     ldi      temp1, 1<<COM1A1 | 1<<WGM11
>     out      TCCR1A, temp1
>
>     ldi      temp1, 1<<WGM13 | 1<<WGM12 | 1<<CS12
>     out      TCCR1B, temp1
>
>

Dazu gibt es das Datenblatt. Dort kann man die Bitnamen und ihre 
Bedeutung nachlesen. Ohne Datenblatt geht es nicht, schon alleine 
deshalb, weil die unterschiedlichen AVR-Typen unterschiedlich mit 
Features ausgestattet sind. Timer 1 ist auch nicht bei allen Typen 
gleich.

> gut manches kann man den vorherigen Tuts entnehmen aber nicht alles. Es
> steht zwar im ganzen da was gemacht wird aber nicht welches Bit was
> bewirkt.

Das steht aber im Datenblatt. Und etwas Mitarbeit des Lernenden sollte 
man wohl voraussetzen dürfen, oder?

Ich kenne auch nicht alle Features des Timer1 genau, denn meist komme 
ich mit den Basic-Features aus, die es dann ermöglichen, quasi 
gleichzeitig mehrere Features des Timers zu nutzen (ICP, CompA, CompB, 
Ovf). Für Hardware-PWM sind meist die 8-Bit-Timer ausreichend.

MfG, Troll Blaubär

von Troll B. (blaubeer)


Lesenswert?

Florentin Schirmer wrote:
> ok ist ja gut ;-)
>
>
> das verstehe ich auch nicht:
>
>     ldi      temp1, 0x02
>     out      DDRB, temp1
>
>
> schaltet man den Ausgang nicht mit 0xFF?

Du erinnerst mich an jochen.

Mit $ff setzt Du alle Bits des Bytes.
Mit $02 setzt Du nur Bit 1 (0..7) des Bytes, weil Du vermutlich nur PD1 
als Ausgang brauchst und die anderen Pins Eingang bleiben sollen.

Du solltest mit der Lektion "Bits & Bytes" beginnen, aber dafür hat 
vermutlich mangels allgemeinen Bedarfs noch Niemad ein Tutorial 
geschrieben.

MfG, trollig blaues Bärli

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.