Mist, Hardware ist ja BP3, also OC2 !!! -- Richtig!?
Ich habe jetzt den
L293D (PWM) an (Atmega PB2, also OC1B und den
Servo an PB1, also OC1A.
Könntest du mir die Hardwarebasierende Ansteuerung des Servo mittels OC1A erläutern?
Mist, Hardware ist ja BP3, also OC2 !!! -- Richtig!?
Das hier sollte einfach auf einen ATM8 umzuschreiben sein:
Bascom benötigt für den ATM8 nicht die Definitionen der WGM..., die sind bereits im .dat drin, können also entfallen. Was geändert werden muss, ist die Pindefinition für OC1B.Code:$Regfile = "m32def.dat" $crystal = 16000000 $hwstack = 48 $swstack = 32 $framesize = 32 ' ### Reine Hardware-Pulserzeugung für ein einzelnes Servo, jitterfrei ### Const WGM10 = 0 Const WGM11 = 1 Const WGM12 = 3 Const WGM13 = 4 Servopin Alias PortD.4 Config Servopin = Output ' OC1B als Ausgang Servo_Pos Alias Compare1B ' Stellposition des Servos Servo_Pos = 3000 ' Defaultposition, 2000 = 1ms, 4000 = 2ms TCCR1A = Bits(WGM11 , WGM10 , COM1B1) ' Mode 15, Fast PWM, CTC TCCR1B = Bits(WGM13 , WGM12 , CS11) ' Mode 15, Prescaler 8 COMPARE1A = 39999 ' Obere Zählgrenze Enable Compare1A Enable Interrupts Do For Servo_Pos = 2000 To 4500 ' Testcode, wechselweise Endpositionen anfahren Waitus 80 Next Servo_Pos For Servo_Pos = 4500 To 2000 Step -1 Waitms 1 Next Servo_Pos Loop End 20ms_Tick_ISR: ' ISR wir alle 20ms aufgerufen, kann für weitere Zwecke verwendet werden Return
Dankeschön.
Soweit verstehe ich das. Die "20ms-Tick-ISR" muss doch aber aber auch aufgerufen werden?
Was ich gerade gar nicht verstehe sind OC1A und OC1B wie stehen die jetzt mit den Timern in Verbindung?
Muss ich den Timer1 im o.g. Code nicht konfigurieren?
Und: was mache ich jetzt mit meinem L293D, den habe ich sonst immer über Compare1a angesprochen!?
Ich bringe gerade alles durcheinander!
Danke.
Geändert von spelli2001 (11.09.2012 um 23:29 Uhr)
Die PWM muss per Timer2 gemacht werden. Der Code zeigt einzig, wie man mit dem 16Bit Timer1 ein Servo im Hardwaremode als Fast-PWM ansteuert. Compare1A ist der neue Top-Wert, damit der Zähler eben nicht bis 65535, sondern nur bis 39999 zählt. Denn sonst wären es keine 20ms Wiederholrate, sondern entsprechend mehr. Compare1B sorgt dann für den eigentlichen Servoimpuls.
Du musst noch ein On Compare1A 20ms-Tick-ISR einfügen, das hat sich beim Editieren aus dem Staub gemacht. Timer1 wird direkt über die Timerregister eingestellt, mit dem Config-Befehl könntest Du den Modus 15 nicht einstellen.
Okay. Ich dachte OC1A wäre Timer1 und OC1B Timer2...
Folglich hatte ich auch Compare1A und Compare1B zugeordnet...
Das "Config Timer1 =" fällt weg, da Hardware?
Über "On Timer1 20ms_Tick_ISR" rufe ich die Routine auf?
Wie spreche ich denn dann über den Timer2 den L293D an? Dafür hatte ich immer Compare1A verwendet??????
Wie gesagt, eine PWM auf Timer2, sollte ganz normal per Config Timer2 gehen, muss man nur aufpassen, weil's da kein Compare..A oder B gibt, da's nur ein PWM-Kanal ist.
Config Timer1 fiel weg, da über TCCR1A und TCCR1B der Timer eingestellt wurde.
So Servo läuft soweit! Vielen Dank MagicWSmoke für deine geduldige und ausführliche Erklärung!
An Timer2 mache ich morgen ran!
Ah, Also wird die Timer2 PWM über "OC2" an PB3 des ATM8 ausgegeben?
Lesezeichen