Hallo!
Kann mir bitte jamend mal den Code für die Ansteuerung eines Servos aus
der Artikelsammlung erklären? Ich wollte jetzt auch mal den Timer im CTC
Mode nutzen. Es wird noch immer nur die lange Pausenzeit (und zwar im
Timer1_COMPA Interrupt)ins OCR1A geladen, aber wo wir die kurze Zeit für
den Impuls an den Servo geladen? Was übersehe ich hier??
Viele Grüße Michael
1 | #define F_CPU 1000000UL
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <avr/interrupt.h>
|
5 | #include <util/delay.h>
|
6 |
|
7 | ISR( TIMER1_COMPA_vect ) // Interruptbehandlungsroutine
|
8 | {
|
9 | OCR1A = 2500-OCR1A; // Das Servosignal wird aus der Differenz von
|
10 | // Periodenlänge (2500*0,008ms=20ms) und letztem
|
11 | // Vergleichswert (OCR1A) gebildet
|
12 | }
|
13 |
|
14 |
|
15 | int main (void)
|
16 | {
|
17 | DDRB = 0b11111100;
|
18 | PORTB = (1<<PB1) | (1<<PB0); // Pullup für PB0 und PB1
|
19 |
|
20 | TCCR1A = (1<<COM1A0); // Togglen bei Compare Match
|
21 | TCCR1B = (1<<WGM12) | (1<<CS11); // CTC-Mode; Prescaler 8
|
22 | TIMSK = (1<<OCIE1A); // Timer-Compare Interrupt an
|
23 |
|
24 | OCR1A = 2312; // Neutralposition ((2500-2312)*0.008ms=1,5ms)
|
25 |
|
26 | sei(); // Interrupts global an
|
27 |
|
28 | while( 1 ) {
|
29 |
|
30 | if ( !(PINB & (1<<PINB0)) ) { // Impuls-Zeit verlängern
|
31 | cli();
|
32 | OCR1A = OCR1A + 3;
|
33 | sei();
|
34 | _delay_ms(50);
|
35 | }
|
36 |
|
37 | if ( !(PINB & (1<<PINB1)) ) { // Impuls-Zeit verkürzen
|
38 | cli();
|
39 | OCR1A = OCR1A - 3;
|
40 | sei();
|
41 | _delay_ms(50);
|
42 | }
|
43 | }
|
44 |
|
45 | return 0;
|
46 | }
|