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
Gast
#3025088
@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;
}
}
Gast
#3025091
Ach ja ist für einen Atmega 32 mit externen Quarz 16 Mhz
Gast
#3025103
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
Gast
#3025113
Du setzt zwei mal Pins von PortB als Ausgang, aber nicht von PortC
1 | |
2 | |
3 | |
Gast
#3025132
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.
Gast
#3025588
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.
Gast
#3025593
Ok Danke für den Tipp.
Es funktoiniert endlich. Vielen Dank für die Kommentare!
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.