Das ganze Verfahren ist keine gute Idee.
Wenn du alles auf dem CTC Modus mit Pin Toggeln aufbaust, musst du
höllisch aufpassen, dass du die Zuweisungen an das OCR0A Register beim
richtigen Timer Durchlauf machst.
Ich bin zwar dafür, gewisse Dinge mit dem Timer zu erledigen. Wenn es
aber nur darum geht, ein Servo in eine bestimmte Position zu fahren,
dann brauchst du es nicht mit so einem Verfahren machen. Denn genauer
als mit 2 fixen _delay_us, die du (samt Pulspin-Umschaltung) in einer
Schleife 150 mal wiederholst, wird das auch nicht. Das eine hängt von
der Taktfrequenz genauso ab, wie das andere.
D.h. so
1 | int main(void)
|
2 | {
|
3 | DDRB |= (1 << PB0)|(1<<PB1)|(1<<PB2); // PB0, PB1 und PB2 als Ausgänge
|
4 |
|
5 | isOffen = 0;
|
6 |
|
7 | while(1)
|
8 | {
|
9 | if (Klappe_oeffnen && !isOffen) // warte auf startsignal
|
10 | {
|
11 | PORTB |=(1<<PB1); // Ausgang Spannung Servo EIN
|
12 | for( i = 0; i < 150; ++i )
|
13 | {
|
14 | PORTB |= (1<<PB0);
|
15 | _delay_us( 1000 );
|
16 | PORTB &= ~(1<<PB0);
|
17 | _delay_ms(19);
|
18 | }
|
19 | PORTB &=~(1<<PB1); // Ausgang Spannung Servo AUS
|
20 | isOffen = 1;
|
21 | }
|
22 |
|
23 | if (!Klappe_oeffnen && isOffen)
|
24 | {
|
25 | PORTB |=(1<<PB1); // Ausgang Spannung Servo EIN
|
26 | for( i = 0; i < 150; ++i )
|
27 | {
|
28 | PORTB |= (1<<PB0);
|
29 | _delay_us( 2000 );
|
30 | PORTB &= ~(1<<PB0);
|
31 | _delay_ms(18);
|
32 | }
|
33 | PORTB &=~(1<<PB1); // Ausgang Spannung Servo AUS
|
34 | isOffen = 0;
|
35 | }
|
36 | }
|
37 | }
|
Wenn man nicht damit leben kann, dass die Steuerung nicht auf ein
Schaltsignal reagiert, sondern dass das das Servo erst seine Endstellung
erreichen muss, dann baut man das eben ein bischen um, so dass die
for-Schleifen in Form eines Zählers in der Hauptschleife aufgehen. Ist
nicht wirklich wahnsinnig schwierig, diese Transformation zu machen. Ist
der Zähler ungleich 0, dann schaltet man die SPannungs Versorgung ein
und entscheidet anhand des Steuereingangs, in welche Richtung verfahren
werden soll, generiert 1 entsprechenden Puls und zählt den Zähler um 1
runter. Ist der Zähler 0, so wird dem Servo der Saft abgedreht. Bleibt
nur noch den Steuereingang zu überwachen und wenn sich da eine
Veränderung ergibt, dann setzt man den Zähler auf 150.