Forum: Mikrocontroller und Digitale Elektronik Mein Durchblick mit der PWM-Timer 0


von Rolf H. (flash01)


Lesenswert?

Hallo Leute,
schon im alten Jahr habe ich erste Gehversuche mit der
Pulsweitenmodulation am Tiny13 realisiert. Muß mir aber zugestehen,
daß heute vieles wieder weg ist.
Nun fange ich nochmal an, auch ohne Englischkenntnisse
und will es begreifen lernen.
Zur Hilfe das Tutorial, Bücher in Assembler und aus dem Datenblatt
über den Tiny13 die vielen grafischen Darstellungen
in den 70er Seiten.
Seite 5 Register Summary (fand ich sehr wichtig)
darauf hatte mich mal Hannes Lux hingewiesen.
Seite 65 FastPWM-Mode, Timing Diagramm
Seite 72 Mode Bit (WGM02, 01, 00)
Als letztes habe ich mir eine Tabelle erstellt, um festzuhalten
wie ich das Register TCCR0A setze, bzw. die Compare-Register
OCR0A und OCR0B setze.

Nun hier ein einfaches Programm, wo ich dran verzweifle!


; Projekt: Projekttiny 13                        Datum: 27.03.2013

; Datei: FastPWM-Test02.asm

; Test Mode 3 = Fast PWM

;Takt an PB0=OC0A und PB1=OC0B Periode=0,21ms

.include "tn13def.inc"

  .def   akku=r16

  ldi   akku,0x03      ;0b0000 0011
  out   DDRB,akku      ;PB1=OC0B und PB0=OC0A als Output


  ldi   akku,(1<<COM0A1)|(COM0B1)|(1<<WGM01) |(1<<WGM00)
  out   TCCR0A,akku    ;Einstellungen für den Fast PWM-Modus3 laden
                       ;und ins Timer/Counter Control Register 0A 
übertragen

  ldi   akku,(1<<CS00) ;no Prescale
  out   TCCR0B,akku

.equ WertA = 100
.equ WertB = 20



  ldi akku,WertA        ;Wert für OCR0A laden  =100
  out OCR0A,akku       ;und in Output Compare Register A laden
                       ;oder Vergleichsregister

  ldi akku,WertB        ;Wert für OCR0B laden  =20
  out OCR0A,akku       ;und in Output Compare Register B laden
                       ;oder Vergleichsregister
Warte:
rjmp Warte             ;Endlosschleife

.EXIT


Das Ganze lief gestern soweit, daß an den Outputs
OC0A und OC0B Takte in unterschiedl. Impulsbreite auf dem Skop
zu sehen war. (Periode=ca. 0,21ms) Kein ext. Quarz ist also ok!
Seit heute sind nur noch Takte an PB0 zu sehen, PB1 liegt auf LOW!
Ich hab den Tiny gewechselt...es bleibt dabei.
Auf dem Skop ist sichtbar, wie sich Impulse an PB1 (OC0B)
bilden und verschwinden
Kann mir das nicht erklären.
TCCR0A hab ich doch richtig gesetzt
WGM01 und WGM00 sind gesetzt. Aus der Tabelle im Datenblatt S.72
geht hervor, daß es sich um den FastPWM-Mod handelt.
Was mach ich nur verkehrt.

Grüße

Rolf

von Karl H. (kbuchegg)


Lesenswert?

>   ldi   akku,(1<<COM0A1)|(COM0B1)|(1<<WGM01) |(1<<WGM00)

                               |
                               |
                               v

  ldi   akku,(1<<COM0A1)|(1<<COM0B1)|(1<<WGM01) |(1<<WGM00)

schreibs nicht so 'dicht'!
1
  ldi   akku, (1 << COM0A1) | (COM0B1) | (1 << WGM01) | (1 << WGM00)

jetzt fällt eher auf, dass da 1 Ausdruck dabei ist, der optisch anders 
aussieht. Schreibst du alles in einer Wurscht dahin, dann siehst du 
nicht, wo die einzelnen Wörter oder 'Phrasen' anfangen und wo sie 
aufhören. Nur leider wurde dein Hirn seit Kindesbeinen im 
Lesen-Unterricht genau darauf getrimmt: Leerräume trennen Wörter.

Unterschätze niemals den Unterschied, den eine leicht lesbare 
Schreibweise ausmachen kann.

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


Lesenswert?

Rolf H. schrieb:
> ldi akku,WertB        ;Wert für OCR0B laden  =20
>   out OCR0A,akku       ;und in Output Compare Register B laden

Der Kommentar stimmt, aber die Programmzeile schreibt auch in OCR0A. 
Ändere das mal in OCR0B.

von Karl H. (kbuchegg)


Lesenswert?

Matthias Sch. schrieb:
> Rolf H. schrieb:
>> ldi akku,WertB        ;Wert für OCR0B laden  =20
>>   out OCR0A,akku       ;und in Output Compare Register B laden
>
> Der Kommentar stimmt, aber die Programmzeile schreibt auch in OCR0A.
> Ändere das mal in OCR0B.

Ich würde sogar sagen:
Lass all diese Kommentare weg. Sie führen dich beim Programmlesen und 
Fehlersuche nur auf eine falsche Fährte. Erklären tun sie ohnehin 
nichts, sind also sinnlose Kommentare. Wenn im Kommentar genau das 
gleiche steht, wie im Code (nur in dem einen Fall als deutscher Satz und 
im anderen Fall als Assmebler-Anweisung), dann ist das ein sinnloser 
Kommentar.

Nur leider ist es meistens so, dass man sich als Programmierer in erster 
Linie ganz automatisch an den Kommentaren orientieren wird und nicht an 
dem, was im Code steht.

Das hier

  ldi   akku,0x03      ;0b0000 0011

ist zb ein sinnloser Kommentar. Er erklärt mir nichts. Und wenn es mir 
an dieser Stelle wichtig ist, zu wissen, das da Bit 0 und Bit 1 auf 1 
gesetzt werden, dann schreib ich das gleich im Code

  ldi   akku, (1<<PB0) | (1<<PB1)

oder (weniger gut)

  ldi   akku, 0b00000011

und schon braucht niemand diesen Kommentar, weil genau dasselbe schon im 
Code steht.

Das hier
  out   DDRB,akku      ;PB1=OC0B und PB0=OC0A als Output

ist hingegen ein guter Kommentar. Er erzählt mir was, was ich nicht im 
Code sehen kann. Er erklärt mir, warum da Bit 0 bzw. Bit 1 auf 1 (also 
Output) gesetzt werden. Eben weil da die Spezialausgänge OC0A bzw. OC0B 
beheimatet sind.

generell: Im Kommentar steht das 'Warum'. Im Code steht das 'Wie'

von nobi (Gast)


Lesenswert?

in der Zeile
<< ldi   akku,(1<<COM0A1)|(COM0B1)|(1<<WGM01) |(1<<WGM00) <<

ist ein kleiner Fehler (COM0B1) >(1<<COM0B1)

von Rolf H. (flash01)


Lesenswert?

danke für Eure schnellen Antworten...so ein Sch.!
Ist mir doch nicht aufgefallen.
Das mit den vielen Kommentaren hat Karl Heinz Recht.
Werde das etwas umstellen.

Hab den Skop gleich nochmal angeschmissen.
OCR0A in OCR0B korrigiert und es läuft.
Hier nochmal die Änderungen:

.include "tn13def.inc"

  .def   akku=r16

  ldi   akku,0x03
  out   DDRB,akku      ;PB1=OC0B und PB0=OC0A als Output


  ldi   akku,(1<<COM0A1) | (1<<COM0B1) | (1<<WGM01) | (1<<WGM00)
  out   TCCR0A,akku    ;Einstellungen für den Fast PWM-Modus3 laden
                       ;und ins Timer/Counter Control Register 0A 
übertragen

  ldi   akku,(1<<CS00) ;no Prescale
  out   TCCR0B,akku

.equ WertA = 100
.equ WertB = 20



  ldi akku,WertA       ;Wert für OCR0A laden  =100
  out OCR0A,akku       ;und in Output Compare Register A laden
                       ;oder Vergleichsregister

  ldi akku,WertB       ;Wert für OCR0B laden  =20
  out OCR0B,akku       ;und in Output Compare Register B laden
                       ;oder Vergleichsregister
Warte:
rjmp Warte
.EXIT


Danke nochmals....es ist doch die FastPWM, oder?

Man liest wenig über WGM02, WGM01, WGM00

MOD0 = 000 = Normal hier können PB0+PB1 als ganz normale Pins verw.
MOD1 = 001 = PWM (Phase Correct) wo ist der Unterschied zu FastPWM?
Indem der Timer von 0 -255 hochläuft u. wieder zurück nach 0 läuft,oder?
MOD2 = 010 = CTC  das muß ich noch ergründen!
MOD3 = 011 = Fast PWM die meine ich zu verstehen!
MOD4 = 100 = Reserved ich glaube, ab hier ist Schluß beim Tiny13

MOD5 = 101 bis MOD7 = 111
Wenn ich mal mit den Tiny2313 und seinen Timer1 anfange, werde ich
ganz schön Kopfschmerzen bekommen.

von Karl H. (kbuchegg)


Lesenswert?

Rolf H. schrieb:

> Danke nochmals....es ist doch die FastPWM, oder?
>
> Man liest wenig über WGM02, WGM01, WGM00
>
> MOD0 = 000 = Normal hier können PB0+PB1 als ganz normale Pins verw.
> MOD1 = 001 = PWM (Phase Correct) wo ist der Unterschied zu FastPWM?
> Indem der Timer von 0 -255 hochläuft u. wieder zurück nach 0 läuft,oder?
> MOD2 = 010 = CTC  das muß ich noch ergründen!
> MOD3 = 011 = Fast PWM die meine ich zu verstehen!
> MOD4 = 100 = Reserved ich glaube, ab hier ist Schluß beim Tiny13

Sag mal, welches Datenblatt benutzt du eigentlich?
http://www.atmel.com/Images/doc2535.pdf

Im ABschnitt über den Timer 0, Unterpunkt "Register Description" gibt es 
eine wunderbare Tabelle (Seite 71, Tabelle 11-8), in der alle Modi samt 
den dafür zu setzenden WGM Bits aufgelistet sind.

Dieses Unterkapitel "Register Description" ist das wichtigste, wenn es 
(in dem Fall) um den Timer geht. Dort sind alle Register aufgeführt, mit 
allen Bits und was sie bedeuten. Und meistens sind die Zusammenhänge von 
mehreren Bits in Form von Tabellen aufgeführt.
Alles was man über den Timer auf technischer Bit-Ebene wissen muss 
zusammengefasst auf 8 Seiten inklusive Tabellen, wenn mehrere Bits 
zusammenspielen.
Hat man erst mal übernasert, was welcher Modus macht, dann braucht man 
nur noch diese 8 Seiten und ganz selten in Ausnahmefällen die 
vorhergehende langatmige Erklärung der Modi.

Ein derartiges Unterkapitel gibt es in jedem Hauptkapitel des 
Datenblatts. Hast du dir im PDF-Reader das Inhaltsverzeichnis anzeigen 
lassen?

von Karl H. (kbuchegg)


Lesenswert?

> Nun fange ich nochmal an, auch ohne Englischkenntnisse
> und will es begreifen lernen.

Wenn deine Attitüde ist "Ich kann kein Englisch, daher interessiert mich 
das alles nicht was dort steht" - dann wirst du Schiffbruch erleiden! 
Das ist so sicher wie das Amen im Gebet.

Aber glücklicherweise handelt es sich hier um eine technische 
Dokumentation, welche logischerweise kein geschliffenes Englisch eines 
Oxford-Literaturstudenten verwendet, sondern ein ganz einfaches 
Englisch. Und da musst du durch! Wenn Japaner und Chinesen es schaffen, 
dieses Englisch zu lesen und zu verstehen, dann schaffst du das auch. Am 
Anfang wird es vielleicht ein wenig holprig sein, aber es werden eh 
immer wieder dieselben Phrasen benutzt, so dass man schnell auf einem 
Level ist, das auch lesen zu können. Auf jeden Fall ist das für dich als 
Deutsch Sprechender um Größenordnungen einfacher als es für Chinesen 
ist, deren Muttersprache von Natur aus schon mal komplett anders 
funktioniert als Englisch. Dagegen sprichst du ja schon fast mit deinem 
Deutsch einen englischen Dialekt.

Ein Atmel Datenblatt im Englischen zu lesen (und etwas anderes gibt es 
nicht) hat weniger mit Können zu tun, sondern viel mehr mit Wollen!
Zudem musst du nichts Schreiben sondern nur Lesen, was von Haus aus 
schon mal um einiges einfacher ist.

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


Lesenswert?

Rolf H. schrieb:
> MOD1 = 001 = PWM (Phase Correct) wo ist der Unterschied zu FastPWM?
> Indem der Timer von 0 -255 hochläuft u. wieder zurück nach 0 läuft,oder?

So isses, die PWM Signale werden dann beim Hochlaufen gesetzt (gelöscht) 
und beim Runterlaufen gelöscht (gesetzt). Die PWM Frequenz ist halb so 
gross wie bei Fast PWM. Phase Correct ist vor allem dann praktisch, wenn 
du Motore oder so etwas ansteuern willst. Mit zwei OCR als invertiertes 
Paar ist die Brückenansteuerung praktisch fertig.

von Querleser (Gast)


Lesenswert?

Rolf H. schrieb:
> Hallo Leute,
> schon im alten Jahr habe ich erste Gehversuche mit der
> Pulsweitenmodulation am Tiny13 realisiert. Muß mir aber zugestehen,
> daß heute vieles wieder weg ist.
> Nun fange ich nochmal an, auch ohne Englischkenntnisse
> und will es begreifen lernen.

Vielen Dank für diese Fehlerbeschreibung. Ohne diese könnte man dein 
Problem auch gar nicht verstehen.

Karl Heinz Buchegger schrieb:
> Wenn Japaner und Chinesen es schaffen,
> dieses Englisch zu lesen und zu verstehen, dann schaffst du das auch.

Das nennt man vergleichende Diskriminierung. Da steht zwar nicht "du 
Depp" aber jeder weis, was gemeint ist.

Fazit: ungeübte TOs bieten versierten Foristen jene Hebel, an denen sie 
lustvoll ansetzen können.

von Karl H. (kbuchegg)


Lesenswert?

Querleser schrieb:

> Das nennt man vergleichende Diskriminierung. Da steht zwar nicht "du
> Depp" aber jeder weis, was gemeint ist.

Nein. Da steht:
Fang endlich an! Setz dich auf deinen Arsch und fang einfach mal an das 
Englisch mit Wörterbuch und Online-Übersetzungshilfen zu entziffern. Von 
deinem ewigen Rumgejammere, dass du nicht Englisch kannst, wirds auch 
nicht besser. Deswegen ändert sich nichts. Atmel wird wegen dir keine 
deutschsprachigen Datenblätter rausbringen. Also setz dich auf deinen 
Hintern und versuch wenigstens das Kapitel das ich dir genannt habe zu 
lesen und zu verstehen. Du wirst sehen - so schwer ist das gar nicht.

von Karl H. (kbuchegg)


Lesenswert?

Querleser schrieb:

> Fazit: ungeübte TOs


ungeübte TOs geben vor allen Dingen so Sätze von sich, wie
> Man liest wenig über WGM02, WGM01, WGM00
> MOD4 = 100 = Reserved ich glaube, ab hier ist Schluß beim Tiny13

die sich mit einem Blick ins Datenblatt in 5 Sekunden als kompletter 
Blödsinn entlarven lassen. Ich weiß nicht, was dir das sagt. Aber mir 
sagt es, dass er noch nie ins Datenblatt geschaut hat ausser vielleicht 
mal drübergescrollt.

von Querleser (Gast)


Lesenswert?

Rolf H. schrieb:
> Muß mir aber zugestehen,
> daß heute vieles wieder weg ist.

Der TO kämpft mit anderen Problemen.

von Karl H. (kbuchegg)


Lesenswert?

Querleser schrieb:
> Rolf H. schrieb:
>> Muß mir aber zugestehen,
>> daß heute vieles wieder weg ist.
>
> Der TO kämpft mit anderen Problemen.

Und?
Was pflaumst du mich jetzt an?

von Rolf H. (flash01)


Lesenswert?

Karl Heinz Buchegger schrieb:
> Aber mir
>
> sagt es, dass er noch nie ins Datenblatt geschaut hat ausser vielleicht
>
> mal drübergescrollt.

Halt, das stimmt nicht ganz so!

Jetzt habe ich das Datenblatt ab Register Description von
Karl Heinz überscrollt und es deckt sich mit meinem von der Fa. 
Reichelt.

Alle grafischen Blätter mit Texte habe ich ausgedruckt.
Mein Buch "Technisches Englisch" von Hofacker-Verlag liegt hier neben
mir und  werde mir die Mahnungen zu Herzen nehmen.
Letztlich gehöre ich nicht zu den Menschen, die da denken
"ach lass ihn doch schreiben, ich machs doch wie ich es will"
Zum Schluß ...ich glaube, ich gehöre zu den ältesten Mitgliedern
in diesem Forum.

Das Ganze hat mich gestern sehr bewegt und dachte immer wieder,
warum hast du nur das mit dem "Englisch" angedeutet.

Ein frohes Ostern wünsche ich

Rolf

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


Lesenswert?

Als gut brauchbares Wörterbuch im Internet hat sich bei mir auch 
http://dict.leo.org bewährt.

von Rolf H. (flash01)


Lesenswert?

Hallo Matthias,
danke für Deine Anregung.
Habe noch ne Idee.
In den Favoriten schlummert bei mir der Google Übersetzer.
Den hab ich in einer Registerkarte geöffnet und das Datenblatt
vom Tiny13 in der nächsten Registerkarte.
Den englischen Text kopieren...und in der Registerkarte von Google
einfügen. Die Übersetzung ist was holprig aber man versteht ganz
gut, was gemeint ist.
 Somit kann ich eine ganze Textabhandlung übersetzen.
Für besondere Fachwörter habe ich immer noch das Buch.

Grüße

Rolf

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.