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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Ahhh, jetzt ja.
Vielen Dank für die Erklärung!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.