Hallo, ich habe ein kleines Board mit einem Atmega8 µC und eine billig Servo (der an nem Servotester getestet wurde) Ich möchte über den Pin0 an Port C den Servo steuern und habe dabei folgendes Programm (siehe Anhang) Den Servo versorge ich extern mit 5V und die Steuerleitung (hier oragen) ist direkt am PC0 angeschlossen. Am Anfang soll der Servo in der Mitte stehen (1,5 ms Impulsbreite) und beim Drücken der Taster in den beiden Endstellungen (1 ms und 2 ms Impulsbreite) Leider funktioniert das ganze nicht, und der Servo wackelt einfach gegen einen Anschlag und will weiter. Hab ich etwas grundlegendes falsch? Vielleicht habe ich ja einen Fehler, den ich schon nicht mehr sehe und würde mich freuen, wenn jemand schnell über den Code schaut. Falls noch Infos fehlen bitte fragen. Die Frequenz des Chips mit 6 MHz sollte auch stimmen. Danke
@Simon Ich kann dir nicht weiter helfen aber vllt. kannst du nach Anpassung das hier verwenden. #define F_CPU 16000000UL #include <avr/io.h> #include <avr/delay.h> #include <avr/interrupt.h> void timer_initialisierung(void) { DDRD |= (1<<PD5); PORTD |= (1<<PD5); TCCR1A = ((1<<WGM11)|(0<<WGM10) |(1<<COM1A1) ); TCCR1B = ((1<<WGM13)|(0<<WGM12)| (0<<CS12) | (1<<CS11) | (0<<CS10)); OCR1A = 10000; ICR1 = 20000; } int main (void) { volatile uint16_t i = 1500; DDRD = 0x00; timer_initialisierung(); OCR1A = i; while (1) { if( (PIND & (1<<PIND2))) // Taster 1 Nach rechts + { if (i >= 2100) { i = 2100; } else { i++; } OCR1A = i; _delay_us(250); } else if( (PIND & (1<<PIND3))) // Taster 2 Nach links - { if (i <= 900) { i = 900; } else { i--; } OCR1A = i; _delay_us(250); } else if( (PIND & (1<<PIND4))) { i = 1500; OCR1A = i; // Taster 3 Neutral position } else OCR1A = 0; } }
Hi, läuft der Atmega mit nem Quarz? Weil mit dem internen Oszillator kannst du garnicht auf 6 MHz kommen. Der hat 8 MHz und standardmäßig sind die Fuses so gesetzt, dass er einen Prescaler von 8 benutzt --> 1MHz. lg Chris
Du setzt zwei mal Pins von PortB als Ausgang, aber nicht von PortC
1 | ... |
2 | // Definiere Port C 0, 1, 2 als Ausgang |
3 | DDRB |= (1<<0); |
Hi >Den Servo versorge ich extern mit 5V und die Steuerleitung (hier oragen) >ist direkt am PC0 angeschlossen. Die Massen sind aber verbunden? MfG Spess
Also erstmal Danke, für die schnellen Antworten: 1. Die Ausgänge sind nun auch auf Port C gesetzt. Mit DDRC |= (1<<0); (also hier für PC0) 2. Es ist ein 6Mhz Quarz angeschlossen und die Fuse ist auf ext.Quarz eingestellet. Habe gerade bei einer Recherche festgestellte, dass eingentlich noch Kondensatoren dazugehören (hab den Teil mit dem Quarz nicht selbst entworfen und ihn einfach übernommen) Daher sollte ich vielleicht die Fuse wieder auf internen Oszillator stellen. Habe ihn jetzt auf 1MHz intern gestllt und werde das Programm nochmal testen. 3. Ich versorge den Servo mit einer 5V Spannungsquelle (Netzteil) und schließe eigentlich nur die Signalleitung direkt an den Pin des µC.
Simon Ang schrieb: > 3. Ich versorge den Servo mit einer 5V Spannungsquelle (Netzteil) und > schließe eigentlich nur die Signalleitung direkt an den Pin des µC. Du musst Masse vom µC und Masse von der 5V-Quelle die den Servo versorgt verbinden.
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.