Hallo allerseits, ich habe unter http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung ein Beispiel für eine Servo Ansteuerung gefunden und folgendermaßen verändert: #include <avr/io.h> //Grundfunktionen #ifndef F_CPU //Vordefinieren für delay.h #define F_CPU 1000000UL //Definition von F_CPU in Herz #endif #include <util/delay.h> //Warteschleifen #include <stdint.h> //Variablen #include <avr/interrupt.h> //Interruptroutinen ISR(TIMER1_COMPA_vect) { OCR1A=2500-OCR1A; //Das Servosignal wird aus der Differenz von Periodenlänge ((2500*0,008ms)=20ms) //und letztem Vergleichswert (OCR1A) gebildet } int main (void) //Hauptfunktion { //Anfang der Hauptfuktion unsigned int direction = 1; DDRB=0b11111100; //Alles Ausgänge bis auf PB0 und PB1 PORTB=0b00000011; //Pullup für PB0 und PB1 TCCR1A=0b01010000; //Tooglen von PB3 TCCR1B=0b00001010; //CTC-Mode und; Prescaler 8; Prozessortakt TIMSK=0b01000000; //Interrupt OCR1A=2250; //Startposition ganz link bzw. ganz rechts, werde ich noch herausfinden sei(); //Interrupt an while(1) { if ( (OCR1A < 2375) && (direction == 1) ) { cli(); OCR1A=OCR1A+5; sei(); _delay_ms(50); //Verlangsamung der Veränderung } if ( (OCR1A == 2375) && (direction == 1) ) { direction = 0; } if ( (OCR1A > 2250) && (direction == 0) ) { cli(); OCR1A=OCR1A-5; sei(); _delay_ms(50); //Verlangsamung der Veränderung } if ( (OCR1A == 2250) && (direction == 0) ) { direction = 1; } } return 0; } Ich möchte also, dass mein Servo periodisch zwischen den Stellungen ganz links und ganz rechts hin und her fährt. Was ich an dem Beispiel aber noch nicht verstanden habe: An welchem Pin wird die Steuerleitung des Servos angeschlossen? An einem der PB Pins 2 - 7? Denn bei mir tut sich noch nichts am Servo. Was mache ich falsch? LG Mark
Ich bin noch recht neu im Umgang mit µCs und habe hier zum Spielen ein STK500 Board. Könnte das oben beschriebene Problem vielleicht damit zusammenhängen, dass ich den Taktgeber (d. h. Quarz oder interner RC Oszillator, etc.) nicht explizit vorgegeben habe? Woher weiß ich überhaupt mit welcher Frequenz mein Programm läuft? Oder wie müsste ich vorgehen um den internen 1MHz Takt auszuwählen? LG Mark
> Woher weiß ich > überhaupt mit welcher Frequenz mein Programm läuft? Normalerweise, weiss man was man eingestellt hat, bzw. welcher Quarz da drann hängt :-) Kannst du an irgendeinem Pin eine LED anschliessen? (ICh gah mal davon aus, dass du das am Pin 2 vom Port B (also PB2) machen kannst Probier mal folgendes Programm aus
1 | #define F_CPU 1000000UL
|
2 | |
3 | include <avr/io.h> |
4 | #include <util/delay.h> //Warteschleifen |
5 | |
6 | int main() |
7 | {
|
8 | DDRDB = 0xFF; |
9 | |
10 | while( 1 ) { |
11 | PORTB |= ( 1 << PB2 ); |
12 | _delay_ms( 1000 ); |
13 | PORTB &= ~( 1 << PB2 ); |
14 | _delay_ms( 1000 ); |
15 | }
|
16 | }
|
Und schalte auf jeden Fall die Optimierung des Compilers auf -Os Blinkt die LED im Sekundentakt (1 Sek ein, 1 Sek aus)? Wenn ja, dann läuft dein µC mit 1Mhz.
Dank eurer Tipps (Link zu Fuses Doc. und LED Bsp) weiß ich nun ganz sicher, dass der interne Oszillator arbeitet. Der extern aufgesteckte Quarz macht nämlich genau 4 Mhz und die LED blinkt im 1 Sek. Takt. Nun denn, vielleicht kann mir einer verraten, ob und wie ich das obige Bsp. modifizieren müsste, um den Servo mit dem Signal zu versorgen. LG Mark
Wäre für jeden weiteren Tipp dankbar!!!
Versuche doch mal überhaupt das Programm an sich zum laufen zu bringen. Wenn du das geschafft hast, modifizier den Code. Das Steuersignal liegt an PB3, wenn ich meinen Code da gerade überschau.
hast du es inzwischen zum laufen gebracht? interessiert mich wegen meinem artikel. MfG Inox
Hallo Daniel, meine Anwendung läuft mittlerweile. Ich benutze jetzt allerdings den 16Bit Timer im PWM Mode. Mit deiner Anwendung hatte ich zuletzt noch Schwierigkeiten gehabt. Das liegt aber wohl eher an mir als an deinem Code. Mark
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.