Forum: Mikrocontroller und Digitale Elektronik attiny2313 ctc mode auf timer0 mit ocr0b


von Jörg Hermann (Gast)


Lesenswert?

hallo spezialisten!

ich habe ein grosses problem mit dem ctc mode vom attiny2313. ich habe
rtfm mehrfach gemacht und verstehe es immer noch nicht.
zunächst eine übersicht was ich vorhabe, dann das problem, meine
beobachtung und die belohnung:

folgende fern-ziele möchte ich erreichen:

1) 4 unabhängige amplitudenmodulierte 400 hz sinus mit min. 7 bit
amplituden auflösung.

2) 2 gleich amplitudenmodulierte 400 hz sinus mit 3 - 4 bit amplituden
auflösung.

zum experimentieren soll zuerst ein kanal auf einem attiny2313 funzen.
ich benutze absichtlich den 8 bit timer 0, um ein gefühl für die
mögliche auflösung und das zeitverhalten zu bekommen. später soll dann
alles auf 16 bit timern laufen, evtl. auf einen pwm3.

hw: attiny2313, quarzfrequenz 4 mhz, ckdiv8 inaktiv.
sw: avr-gcc 4.0.1, binutils 2.15.97, avr-libc 1.4.3 auf mandrake linux
2006.

laut doku 2543h-avr-02/05 hat der timer 0 zwei unabhängige oc register.
bei mir ist nur der oc0b pin verfügbar:

// set oc0b as output pin
DDRD |= (1 << PD5);

TCCR0A = 0x21; // mode 1 pwm phase correct on oc0b/db5
TCCR0B = 1; // prescaler = 1 => 4 mhz/510 = 7,8 khz = 127 usec period
OCR0B = 127; // 50% duty cycle

je nach wert von ocr0b ändert sich das tastverhältnis - soweit fein und
verstanden! nun im ctc mode eine frequenz mit 400 hz erzeugen:

// set oc0b as output pin
DDRD |= (1 << PD5);

TCCR0A = 0x12; // mode 2 ctc on oc0b/db5
TCCR0B = 3; // prescaler = 64
OCR0B = 77; // 4 mhz / 2  64  (1 + 77) = 400,64 hz

mit meinem hameg 312 messe ich am oc0b 158 hz = 6,33 msec periode,
unabhängig vom wert von ocr0b??????

in http://www.mikrocontroller.net/articles/AVR_PWM fand ich unter ctc
folgende bemerkung:
Für PWM:
Wenn eingestellt ist, daß der OC Ausgang bei jedem Match umschaltet
(toggle) entspricht der eingestellt Wert dem Pulsweitenverhältnis.
Bei OCRnx=128 des 8 Bit T/C wäre also etwa die Hälfte der Zeit der Pin
eingeschaltet.
Allerdings kann das beim T/C 0 des tiny2313 nur der Ausgang A (OC0A).
Also ins Datenblatt gucken!

der erste satz stimmt imho nicht, durch toggle ist das
pulsweitenverhältnis immer 50%. im ctc modus lässt sich die frequenz
durch den wert im ocr genau einstellen.
den zweiten hinweis aufgegreifend habe ich folgendes probiert:

OCR0A = 77;
und bekomme exakt 400 hz auf oc0b!??!??!?!?!??!?!?!??!

habe ich die doku von atmel falsch verstanden?
oder ist die doku falsch oder noch schlimmer - der chip?!?!?
kann mir jemand diese zusammenhänge erklären?

sachdienliche hinweise, die zum verständnis führen, werden mit
flüssig-naturalien belohnt!

buenas noches,
jörg

von Jack B. (jackbraun)


Lesenswert?

Hallo Jörg,

Das TimerControlregister ist doch folgendermaßen aufgebaut:
Bit  7

von Jack B. (jackbraun)


Lesenswert?

Ups
nochmal von vorn
Bit7    Bit 6    Bit 5   bit 4   bit 3   bit 2   bit 1   bit 0
COM0A1  COM0A0   COM0B1  COM0B0    -       -     WGM01   WGM00

Wenn jetzt in oberen Nibble eine 2 steht ist COMA1 und COMA0 0,
d.h. der Port ist im normalen Modus (PWM für 0C0A ausgeschaltet).

Außerdem die Bits WGM02 in TCCR0A und WGM01 in TCCR0B beachten.
Sie wirken nämlich zusammen. Also nochmal Datenblatt ab S.73

Gruß Jack

von Jörg H. (dr_coolgood)


Lesenswert?

hallo jack,

da alle pins an meinem probanden von display, usi/spi und uart belegt
werden, habe ich nur den oc0b pin frei für meine experimente.

das erste beispiel mit pwm habe ich nur eingebracht, weil dort das
pulsbreitenverhältnis an pin oc0b wie erwartet vom wert des registers
ocr0b gesteuert wird. ich möchte aber an pin oc0b eine frequenz von 400
hz anstehen habe, also habe ich den ctc mode gewählt.

da ich den oc0a pin nicht nutzen kann, sind com0a1 und com0a0 in tccr0a
0. com0b1/0 stehen auf toggle 0c0b on compare match.
die wgm bits stehen auf mode 2, ctc.
der prescaler ist 64, damit ergeben sich für mich:

tccr0a 00010010 = 12h
tccr0b 00000011 = 3
ocr0b = 77

rechnerisch ergibt sich für eine frequenz von 400 hz ein wert von 77
für das ocr0b. das habe ich eingesetzt und als ergebnis eine frequenz
von 158 hz bekommen - falsch! dann habe ich den wert 77 in das ocr0a
geschrieben und bekomme meine 400 hz!

d. h. im ctc mode wird die frequenz an pin oc0B durch das register
ocr0A kontrolliert.

wenn man es ganz genau nimmt, kann man das aus tabelle 40 auch
herauslesen. dort steht, dass der top wert aus dem ocra genommen wird.

ergo ist im ctc mode nur die hälfte der outputs nutzbar? ist das
wirklich so? oder habe ich noch ein tiefes verständnisproblem?

gruss
jörg

von Jack B. (jackbraun)


Lesenswert?

Hallo Jörg,
nach der Tabelle zu urteilen, scheint es so zu sein. Aber das ganze ist
ja noch komplizierter, weil OCR0A/B 16Bit-Register sind. Vielleicht
liegt da der Hund begraben. Ich habe den ATmega32 mal in
Bascom programmiert, und habe mir die ganze Bitwühlerei erspart.
Ich werde mal versuchen den ATtiny mit Bascom zu programmieren, aber
dazu muß ich mir erst noch einen Adapter zusammenlöten, weil ich den
nur als SMD vorliegen habe.

Gruß Jack

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.