Forum: Mikrocontroller und Digitale Elektronik Modelbau Servo Code aus der Artikelsammlung


von Michael (Gast)


Lesenswert?

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
}

von Noch einer (Gast)


Lesenswert?

>Es wird noch immer nur die lange Pausenzeit...

Nö.

Am Anfang steht 2315 in OCR1A
Nach dem ersten Durchlauf steht 185 in OCR1A
OCR1A = 2500-2315
Nach dem zweiten Durchlauf steht wieder 2315 in OCR1A
OCR1A = 2500-185

von Michael (Gast)


Lesenswert?

Ahhh, jetzt ja.
Vielen Dank für die Erklärung!

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
Noch kein Account? Hier anmelden.