Hallo Rubi.
Um ein Modellbauservo Anzusteuern müssen sich deine Impulse min. alle 20ms (soweit ich mich erinnere) erfolgen.
Zunächst musst du dich auf eine PWM "Betriebsart" einigen.
Soweit ich mich aus dem Datenblatt schla gemacht habe gibt es über vier Stück:
1: Normale Mode
2: Clear Timer on Compare Match (CTC) Mode
3: Fast PWM Mode
4: Phase Correct PWM Mod
und noch ein paar wenige.
Erklärung: ATMEGA8535 Datenblatt Seite 99 - 104
Übersicht: ATMEGA8535 Datenblatt Seite 133
Für uns Interessant ist aber nur der FAST PWM MODE!
Dies erklärt dir schonmal, warum "WGM10" und "WGM11" in "TCCR1A" auf "1" gesetzt werden müssen.
Beim Fast PWM Mode zählt der Counter von 0 bis zur Obergrenze.
( beim 8 Bit timer ist die Obergrenze "volle 8 Bit", also 256.
beim 16 Bit kannst du zwischen 8, 9 und 10 Bit wählen.
Der Counter zählt also ständig von 0 bis Obergrenze und fängt dann wieder von neu an.
Erreicht er in dieser Zeit den wert von OCR1A bzw. OCR1B oder auch OCR1C ( beim Mega128 ), dann schaltet er auf High, bzw auf Low, je nach Invertierung des PWM signals.
Kurze Rede Langer Sinn:
Deine Kompunenten berechnen Sich bei FAST PWM wie Folgt:
f.PWM = f.CPU/(N*(1+TOP))
N ist der prescaler, den kannst du in TCCR1B mit den "CS"-Bits Festlegen. ( 1, 8, 64, 256, oder 1024 )
ATMEGA8535 Datenblatt Seite 111.
TOP die Obergrenze.
Die Obergrenze wird je nach gewählten PWM 8,9 oder 10 Bit festgelegt.
Nachsehen kannst du das im
ATMEGA8535 Datenblatt auf seite 133.
Hier sieht man auch dass man auch andere Werte für TOP selbst definieren kann.
zB kann man in ICRn den gewünschten Wert schreiben,
Aber so genau geht es ja bei den Servos nicht.
Ach ich fang schonwieder an so viel zu labern, dabei wolltest du ja nur den Code 
Also:
folgende Gleichung:
f.PWM = f.CPU/(N*(1+TOP))
alle 20ms muss eine neue Flanke kommen.
20ms = 0,020s, und i Hz ist ja 1/secunde.
Also bruachen wie 1/0,020s, macht 50Hz.
mit 10 Bit PWM und 265er Prescaler komm ich auf ca. 61Hz.
also sieht das so aus:
Code:
#include <io.h>
{
TCCR1A = (1<<WGM12)|(1<<WGM11)|(1<<WGM10)|(1<<COM1A1)|(1<<COM1B1);
//"(1<<WGM12)|(1<<WGM11)|(1<<WGM10)" bedeutet 10Bit FAST PWM Mode
//"(1<<COM1A1)|(1<<COM1B1)"Ausgang A und B sind nicht invertiert.
// Es wird also so lange High gehalten, bis der Counter den wert OCR1A bzw. OCR1B überschreitet.
TCCR1B = (1<<CS12);
//Prescaler = 256
for (;;) {
OCR1A = "Wert"; //
OCR1B = "Wert"; //
}}
Ich hoffe ich konnte helfen.
Du kannst eigentlich alles in den Datenblättern erfahren.
---Ich weiss, dass sagt dir jeder, und ich weiss auch dass man da nur was rauslesen kann, wenn man eine gewisse Grundahnung hat, und ich hoffe die hast du jetzt. zumindest über PWM.
Und ich hoffe auch dass ich keinen MIST erzählt habe 
Gruß
Franz
Lesezeichen