Forum: Mikrocontroller und Digitale Elektronik ATtiny13 im Fast PWM-Mode 7 als Rechteckgenerator


von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

Hallo zusammen,

ich möchte den ATtiny13 der sich im Auslieferungszustand befindet
( FUSES High = $FF ; Low = $6A ) im Fast PWM-Mode 7 als
symetrischen Rechteckgenerator betreiben.

Habe dazu folgendermaßen laut Datenblatt initialisiert :

;
;Fast PWM-Mode ( 7 ) initialisieren als symetrischen Rechteckgenerator
;
ldi  A,TCCR0B    ;Timer/Counter Control RegisterB laden...
ori  A,1<<WGM02    ;...nur einzelnes Bit...
out  TCCR0B,A    ;...aendern...
ldi  A,TCCR0A    ;...Timer/Counter Control RegisterA laden...
ori  A,1<<WGM00 | 1<<WGM01 | 1<<COM0A0 ;...Bits aendern...
out  TCCR0A,A    ;...und somit Fast PWM-Mode ( 7 )...
clr  A      ;...mit Portpinn toggeln einstellen um...
out  OCR0A,A    ;...symetrisches Rechteck zu erzeugen das...
    ;...Output Compare RegisterA mit Null laden.


Wundere mich nun das ich nur ca. 76 Khz heraus bekomme
anstatt ca. 600Khz.

Wo ist mein Gedanken oder Übersetzungsfehler im Datenblatt ?

Hierzu der Datenblattabschnitt der dies beschreibt ( Seite 64 )

...
A frequency (with 50% duty cycle) waveform output in fast PWM mode can 
be achieved by setting OC0x to toggle its logical level on each Compare 
Match (COM0x1:0 = 1).
The waveform generated will have a maximum frequency of fOC0 = 
fclk_I/O/2 when OCR0A is set to zero. This feature is similar to the 
OC0A toggle in CTC mode, except the double buffer feature of the Output 
Compare unit is enabled in the fast PWM mode.

Bernd_Stein

von holger (Gast)


Lesenswert?

>Wundere mich nun das ich nur ca. 76 Khz heraus bekomme
>anstatt ca. 600Khz.


Nach doch mal die CKDIV8 Fuse weg.

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

holger schrieb:
>>Wundere mich nun das ich nur ca. 76 Khz heraus bekomme
>>anstatt ca. 600Khz.
>
>
> Nach doch mal die CKDIV8 Fuse weg.
>
Entschuldigung,

die ca. 76kHz hatte ich gemessen als CKDIV8 nicht programmiert war
( Systemtakt 9,6MHz ).

Mit programmierter CKDIV8 Fuse wie im Auslieferungszustand
( Systemtakt 1,2MHz ) hatte ich 9,66kHz mit meinem Multimeter im 
20kHz-Bereich gemessen. Der nächste Meßbereich wäre 200Khz.
Habe auch mit einem Analog-Osziloskop gemessen ( errechnet 9,433kHz ).

Bernd_Stein

von spess53 (Gast)


Lesenswert?

Hi

>ldi  A,TCCR0B    ;Timer/Counter Control RegisterB laden...

Bist du dir sicher, das du das:

ldi  A,0x33

willst? Denn nichts anderes macht die Zeile.

MfG Spess

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

spess53 schrieb:
> Hi
>
>>ldi  A,TCCR0B    ;Timer/Counter Control RegisterB laden...
>
> Bist du dir sicher, das du das:
>
> ldi  A,0x33
>
> willst? Denn nichts anderes macht die Zeile.
>
> MfG Spess
>
Danke,

da kann ja nur Mist bei rumkommen. Aber besser als

in A,TCCR0B

denn da tut sich nichts am PWM-Pinn, obwohl dies ja richtig sein müsste.
Dachte erst mein Oszi spinnt wieder, aber das Testsignal ist i.O.

Wahrscheinlich ist irgend etwas beim runterladen schiefgelaufen.
Lade einfach das Programm noch mal runter und messe wieder.
Verify sagt zwar alles OK aber mal sehen.

Bis gleich

Bernd_Stein

von spess53 (Gast)


Lesenswert?

Hi

- Du willst PWM-Mode 7. Warum setzt du dann nur WGM02 und WGM00?

Mal zu deiner Information: Im PWM-Mode 7 ist OCR0A der Top-Wert des 
Timers. Also der Wert, bis zu dem der Timer zählt, bis er wieder von 
Null anfängt. Deine Zuweisung OCR0A ist daher Nonsens. Das 
Tastverhältnis wird in diesem Mode durch OCR0B eingestellt. Der Wert 
darf natürlich nicht größer als OCR0A sein.

Wenn du wirklich nur ein symmetrisches Rechtecksignal erzeugen willt, 
solltest du CTC (Mode 2) benutzen. Und lies dir noch mal den Abschnitt 
'Modes of Operation' im Datenblatt durch.

MfG Spess

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Angehängte Dateien:

Lesenswert?

Nee, das half auch nichts. Laut Simulator sind auch alle Bits gesetzt 
worden wie sie sollen ( mit dem IN-Befehl natürlich ).
Seltsam ist nur das seit der Umstellung von LDI auf IN auch die 
Programmlauf-LED nicht mehr blinkt, was ja bedeutet das der
Timer Overflow Interrupt nicht ausgeführt wird.

Nachdem ich im Simulator gesehen habe das das Zählerregister TCNT0 nicht 
hoch gezählt wurde, war klar das noch zusätzlich das Bit CS00 im TCCR0B
gesetzt werden muß, damit der Timer überhaupt zählen kann und somit auch 
der Teilerfaktor gleich eins ist.

Danke das wars ca. 625kHz mit dem Oszi.

Bernd_Stein

von spess53 (Gast)


Lesenswert?

Hi

>Danke das wars ca. 625kHz mit dem Oszi.

Glaubst du. So richtig hast du nicht verstanden was da passiert.

MfG Spess

von Bernd S. (Firma: Anscheinend Corner-Cases ;-)) (bernd_stein)


Lesenswert?

spess53 schrieb:
> Hi
>
> - Du willst PWM-Mode 7. Warum setzt du dann nur WGM02 und WGM00?
>
Denke ich habe WGM02, 01 und 00 gesetzt.
>
...
> Deine Zuweisung OCR0A ist daher Nonsens
...

Nicht laut Datenblatt ( siehe oben im Thread ).
Jetzt funktioniert die Sache ja wie im Datenblatt beschrieben.
Habe diese Antwort leider zu spät gelesen, deshalb ist meine vorletzte 
Antwort wahrscheinlich etwas unverständlich, da es so aussieht als ob 
ich auf diese Frage antworten würde.
>
> Wenn du wirklich nur ein symmetrisches Rechtecksignal erzeugen willt,
> solltest du CTC (Mode 2) benutzen. Und lies dir noch mal den Abschnitt
> 'Modes of Operation' im Datenblatt durch.
>
Nein, das möchte ich nicht direkt,
eigentlich geht es mir um diese Sache wo es einmal im Datenblatt auf der 
Seite 64 unten im Abschnitt heißt wenn OCR0A = 0 ist,
dann gibt es nur ein Spike.

Und zum anderen halt die Geschichte,
wenn OCR0A = 0 und COM0x1:0 = 1 dann symetrischer Rechteckgenerator.

Wie Du wieder einmal liest halte ich mich sehr lange an einer Sache auf,
weil immer noch vieles aus dem Datenblatt für mich unverständlich ist
und ich ausserdem fürchterliche Fehler mache.

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.)

Bernd_Stein

von spess53 (Gast)


Lesenswert?

Hi

>Seite 64 unten im Abschnitt heißt wenn OCR0A = 0 ist,
>dann gibt es nur ein Spike.

Das gilt nur wenn OCR0A als Compare-Register fungiert. Aber das tut es 
im Mode 7 nicht. Dort ist OCR0A der Top-Wert des Timers. Das sind zwei 
paar Schuhe.

MfG Spess

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.