Danke, genau das war es.
So:
Code:
while(servo<servo_maxLinks)
{
servo=servo+1;
delay(100);
}
funktioniert es.
Nun werd ich mal testen, wieviel Verzögerung da wirklich nötig ist, die 100 nicht.
@SprinterSB das wird im Rest des Programmes erledigt, neben diversen anderen Sachen.
Aktuell (das Programm ist für meinen NiboBee) kann es folgendes:
Servoposition auf dem Display ausgeben, Tooltips (mit welchem Fühler man was bewegt) ausgeben, alle 10s die Akkuspannung messen (brauche ich, da LiPo-Akku), nach rund einer Minute die Displaybeleuchtung ausschalten (das baue ich inzwischen gewohnheitsmässig ein, wo es Sinn macht), inklusive Wiedereinschalt- Funktion.
Beim Start wird zuerst die Akkuspannung geprüft und ausgegeben, das Display aufgebaut, danach fährt das Servo zuerst in die Mitte (um Eventualitäten auszuschliessen), dann einmal voll rechts, einmal voll links, wieder zur Mitte, und dann kann man es mittels dem Rechten Fühler beliebig bewegen. Mit dem Linken Fühler lässt es sich jederzeit wieder in Mittelstellung fahren, ausserdem kann der in der zweiten Stellung die Display-Beleuchtung wieder aktivieren.
Da der Sensor noch immer auf dem Wege zu mir ist, beschäftige ich mich eben damit, wie man später beim fahren am effentivsten die Umbebung nach Hindernissen absucht, und ich glaube, mit diesem Ansatz wird das ganz gut klappen.
Die Servosteuerung selber sieht so aus:
Code:
TCCR2 = (1 << WGM21) | (1 << CS20); // CTC-Mode, no prescaling, no OC2-PIN!
OCR2 = 208; // 36kHz @15MHz
TIMSK |= (1 << OCIE2);
In der ISR dann:
Code:
ISR (TIMER2_COMP_vect)
{
if(count_serv>servo) PORTC &= ~(1<<PC3); else PORTC |= (1<<PC3);
if(count_serv<1440) count_serv++; else {count_serv=1; if(p) p--;};
}
Ich glaube, der Code stammt im wesentlichen von Radbruch, ich hab ihn halt eingebaut und, wo nötig, etwas modifiziert.
Nun kann man das Servo bequem über die Variable servo in beliebige Positionen fahren, 100 ist ca. Mitte.
Da ich den vollen Weg nicht brauchen kann, habe ich mir die drei Konstanten
servoMitte //für die tatsächliche Mittelstellung
servo_maxLinks // für den maximal erlaubten Ausschlag nach links
servo_maxRechts //für den Maximalausschlag Rechts
definiert, da mein Servo später einen IR-Sensor bewegen soll.
Durch die bei mir nötig gewordene Umlenkung (das Servo bewegt den Sensor über Gestänge und Umlenkhebel) komme ich halt auf _meine_ individuellen Wege, die man in dem Programm bequem mit den drei konstanten anpassen kann.
Lesezeichen