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
Hallo Jörg, Das TimerControlregister ist doch folgendermaßen aufgebaut: Bit 7
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.