Hallo zusammen, ich habe große Probleme mit meinen Servo :/ Leider läuft es nicht und ich bin schon fast am verzweifeln. Ich hab mich am Tutorial gehalten aber leider bewegt sich das Ding kein bisschen. Servo sollte nicht defekt sein. Per Soft PMW gehts. Danke schon mal für euro Hilfe. Julian #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> ISR( TIMER1_COMPA_vect ) // Interruptbehandlungsroutine { OCR1A = 2500-OCR1A; // Das Servosignal wird aus der Differenz von // Periodenlänge (2500*0,008ms=20ms) und letztem // Vergleichswert (OCR1A) gebildet } int main (void) { DDRD = 0b11111100; PORTD = (1<<PD1) | (1<<PD0); // Pullup für PD0 und PD1 TCCR1A = (1<<COM1A0); // Togglen bei Compare Match TCCR1B = (1<<WGM12) | (1<<CS11); // CTC-Mode; Prescaler 8 TIMSK = (1<<OCIE1A); // Timer-Compare Interrupt an OCR1A = 2312; // Neutralposition ((2500-2312)*0.008ms)=1,5ms) sei(); // Interrupts global an while( 1 ) { if ( !(PIND & (1<<PIND0)) ) { // Impuls-Zeit verlängern cli(); OCR1A = OCR1A + 3; sei(); _delay_ms(50); } if ( !(PIND & (1<<PIND1)) ) { // Impuls-Zeit verkürzen cli(); OCR1A = OCR1A - 3; sei(); _delay_ms(50); } } return 0; }
> Ich hab mich am Tutorial gehalten aber leider bewegt sich das > Ding kein bisschen. Dann Kreise den Fehler ein. Erste Frage dazu wäre: Kommt am Ausgang überhaupt ein Signal raus? Das kannst du ja ganz einfach mit einer LED feststellen. Die muss sichtbar flimmern. Oder du schließt ein wie auch immer geartetes Frequenzmessgerät an. Sollte etwa 50Hz anzeigen.
Es kommt leider nichts an.... :/ Angeschlossen wird doch über PB1 (OC1A) oder bin ich da schon verkehrt?
Julian schrieb: > Per Soft PMW gehts. ^^^ [...] > TCCR1B = (1<<WGM12) | (1<<CS11); // CTC-Mode; Prescaler 8 ^^^^^^^^ Fällt dir da nichts auf? Vor allem unter dem Aspekt, dass Timer1 nicht nur einen PWM-Modus beherrscht, sondern sogar gleich drei verschiedene? Da ist es ziemlich unsinnig, die Sache per Software in ISRs abzuhandeln, wenn der Timer das wunderbar ganz alleine kann... Tipp: Du mußt ihn nur einmal initialisieren und kannst dann sogar zwei Servos damit steuern.
okay, das klingt ja schon mal super :) habe es jetzt so geschrieben: TCCR1A = (1<<COM1A0); // Togglen bei Compare Match TCCR1B = (1<<CS11); TIMSK = (1<<OCIE1A); // Timer-Compare Interrupt an jetzt blinkt sie. Hatte auch noch vergessen port B auf Ausgang zu setzen. Servo funktioniert immer noch nicht. Ich denke es liegt nun an der Periodenlänge. Könnt ihr mir dazu noch ein Tipp geben? Benutze einen Quarz 8MHz.
> Könnt ihr mir dazu noch ein Tipp geben?
Ja, das Datenblatt lesen, da steht alles wichtige drin. Insbesondere
unter den Stichwörtern Fuses, Clock Source, CLKDIV8, Prescaler und
natürlich Timer.
Julian schrieb: > jetzt blinkt sie. Blinkt oder flimmert? Zufaellig mit ca. 1/8 der gewuenschten Frequenz? Dann weiter wie Stefan Us schrieb. wendelsberg
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.