Hallo Zusammen, ich versuche gerade den PWM meines ATTiny26 zur Servosteuerung zu gebrauchen. Leider komme ich dabei nicht ganz so weit (wenigstens zuckt der Servo beim Programmiervorgang ein bisschen also der funktioniert zumindest). Folgenden Code habe ich verfasst: int main(void) { wdt_disable(); DDRB = 0xff; PORTB = 0xff; DDRA = 0xff; PORTA = 0x0; TCCR1A = (1<<COM1A1) | (0<<COM1A0) | (1<<PWM1A); TCCR1B = (1<<CS13) | (1<<CS12) | (0<<CS11) | (0<<CS10); // weder die erste noch die zweite Zuweisung zu TIMSK funktionieren bin mir nicht ganz sicher, ob die Interrupts an oder aus sein müssen. TIMSK |= (1<<OCIE1A) | (1<<TOIE1); //TIMSK &= ~B00111100; sei(); OCR1A = 148; OCR1C = 156; // Berechnung der Frequenz: 16 MHz Quartz (Fuses korrekt gesetzt) Teiler auf 2048 eingestellt, also 7812,5 mal pro Sekunde wird bis 156 (OCR1C) hochgezählt (7812,5/156 ~ 50 Hz). Um etwa 1 ms High zu bekommen muss OCR1A daher auf 148 (Differenz 8) gesetzt werden (1,024 ms). while (1); } Ich habe die Steuerleitung des Servos an PB1 gehängt, sollte also eigentlich funktionieren. Ich bin schon einigermaßen erfahren im Umgang mit Mikrocontrollern, PWM ist halt leider etwas neu. Wäre super, wenn mir jemand einen Tipp geben könnte was ich falsch mache... Viele Grüße, Daniel
> bin mir nicht ganz sicher, ob die Interrupts an oder aus sein müssen.
Wenn Du die Interrupts aktivierst, müssen auch entsprechende
Interrupt-Handler vorhanden sein. Wenn nicht, dann gibts bei jedem
Interrupt-Ereignis nen RESET. Wenn Du also nirgends in Deinem Programm
die ISRs zu den aktivierten Interrupts definiert hast, dann dürfte es
kein Wunder sein, dass der Servo nur zuckt... Aber da Du kein
vollständiges Programm geschickt hast, kann man da nicht mehr zu sagen.
Danke für die schnelle Antwort. OK, d.h. es ist auch möglich ohne aktivierte Interrupts den PWM zu betreiben, also mach ich sie aus. Um ehrlich zu sein ist das bisher mein vollständiges Programm (bis auf die includes). Ich drehe den Servo gerade per Hand (natürlich ohne Strom) auf eine zufällige Position. Dann müsste sich der Servo ja (wenn der PWM funktioniert) auf eine andere Position drehen und dort bleiben, oder? Daniel
> OK, d.h. es ist auch möglich ohne aktivierte Interrupts den PWM zu > betreiben Die Compare-Einheiten (und bei entsprechender Konfiguration die dazugehörigen Ausgangspins) sind zusammen mit den Timern völlig unabhängige Peripherie-Einheiten. Die laufen, einmal initialisiert, immer weiter, bis man die Einstellungen ändert (oder den µC ausschaltet, schlafen schickt, kaputthaut o.ä.), und dabei ist es völlig egal, was man währenddessen im Programm macht. Interrupts brauchste nur dann, wenn bei einem Ereignis auch etwas gemacht werden soll, was die Hardware nicht alleine kann.
aber das programm müsste prinzipiell alles machen, um den PWM A korrekt zu initialisieren. Bei gegebenen 16MHz müsste also ein etwa ein 20ms/1ms PWM an Pin PB1 zur Verfügung stehen, oder? Obwohl mir die Antwort auf die Frage eigentlich nicht viel weiterhilft da es ja leider nicht funktioniert...;-( Viele Grüße, Daniel
Dein Programm funktioniert. Gibt kurze High-Impulse aus. wdt_disable(); hab ich weggelassen Von Servos habe ich keine Ahnung
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.